【BUG日志001】数组溢出

bug来源

#include<stdio.h>
#include<string.h>
int main()
{
  char username[10];
  char password[6];
  printf("请输入用户名")
  gets(username)
  printf("请输入密码")
  gets(password)
//省略其他部分

问题

在输入用户名admin和密码123456之后,用户名变量username不能正常输入数据。

原理

gets函数在接收标准输入后会自动在字符数组后面加上\0作为结束符,由于字符数组password定义时分配的内存空间少于实际需要输入的空间,导致结束符\0输入到了字符数组username初始内存位置。username内存空间内实际内容是\0dmin,输出\0即无内容。

C语言分配内存的顺序

定义的局部变量在栈区,先定义,后分配(栈:先进后出的数据结构)。先定义的先入栈(在栈内不分配空间),出栈的时候后入栈的先分配,分配的地址要比先分配的地址大。


image.png

puts函数输出原理

puts函数输出一个字符串,从字符数组的首地址开始,到内存中读取到\0为止,最后输出\n
所以在输出username时,首地址即是\0,所以只会输出换行符\n

解决办法

增加字符数组定义长度。

char username[10];
//char password[6];
char password[7];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容