考虑此代码段:
#include <stdio.h>
int main()
{
char *s;
gets(s);
printf("%s",s);
return 0;
}
在stdin
输入一些输入后,我遇到了运行时错误。但是,如果将s
声明为数组s[size]
,则没有问题。但考虑到gets
原型,char *gets(char *s);
不应该有效吗?
答案 0 :(得分:2)
gets
函数希望s
指向可以接受字符串的字符数组。但在这种情况下,s
未初始化。所以gets
尝试取消引用未初始化的指针。这会调用undefined behavior。
如果您要将s
设置为指向预先存在的数组,或者您使用malloc
来分配空间,那么您可以成功写入。
相反,如果将s
定义为数组,则在传递给gets
时,它会衰减到指向数组第一个元素的指针。然后gets
能够写入数组。
但请注意,gets
不安全,因为它不会尝试验证传递给它的缓冲区的大小。如果用户输入的字符串大于缓冲区,gets
将写入缓冲区的末尾,再次调用未定义的行为。
您应该使用fgets
,它接受缓冲区的大小作为参数。