gets函数的问题

来源:互联网 发布:sql2000数据库无法启动 编辑:程序博客网 时间:2024/05/18 00:36


问题:

#include"stdio.h"

int main()
{
char str1[1];
gets(str1);
printf("%s\n",str1);
return 0;
}
为啥我字符串长度限定为1,输入的时候我输入的字符数超过1了,其余的还能打出来?

回答:

呆兔子tbc | 九级
str属于局部变量,局部变量储存在程序的占空间中。
对于32位的程序,栈空间是严格4字节对齐的。
换句话说,如果局部变量占用的内存空间不是4的整数倍,编译器就会把它处理成4的整数倍
具体而言,局部变量 str[1]和str[4]是完全等价的。
如果你输入一个较长的字符串,肯定要出错。

另外,gets函数存在缓冲区溢出漏洞,使用gets函数的程序有缓冲区溢出的风险
如果读入str的是一个精心构造的字符串,就会引起缓冲区溢出,导致程序流程改变。

回答者: dry_land | 四级

错误的做法不一定都会导致不愉快的结果。。你若在linux下这样做肯定会报告段错误。。。 

原创粉丝点击