为什么get()如果可以采用char数组则不会使用char指针参数?

时间:2017-04-21 02:51:45

标签: c stdin gets

考虑此代码段:

#include <stdio.h>

int main()
{
  char *s;
  gets(s);
  printf("%s",s);
  return 0;
}

stdin输入一些输入后,我遇到了运行时错误。但是,如果将s声明为数组s[size],则没有问题。但考虑到gets原型,char *gets(char *s);不应该有效吗?

1 个答案:

答案 0 :(得分:2)

gets函数希望s指向可以接受字符串的字符数组。但在这种情况下,s未初始化。所以gets尝试取消引用未初始化的指针。这会调用undefined behavior

如果您要将s设置为指向预先存在的数组,或者您使用malloc来分配空间,那么您可以成功写入。

相反,如果将s定义为数组,则在传递给gets时,它会衰减到指向数组第一个元素的指针。然后gets能够写入数组。

但请注意,gets不安全,因为它不会尝试验证传递给它的缓冲区的大小。如果用户输入的字符串大于缓冲区,gets将写入缓冲区的末尾,再次调用未定义的行为。

您应该使用fgets,它接受​​缓冲区的大小作为参数。