如果 gets() 可以采用 char 数组,为什么不采用 char 指针参数?

Why doesn't gets() take a char pointer argument if it can take a char array?

考虑这个代码片段:

#include <stdio.h>

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

在这种情况下,我在 stdin 输入一些内容后出现运行时错误。但是,如果 s 声明为数组 s[size],则没有问题。但是考虑到 gets 原型,char *gets(char *s); 不应该吗?

gets 函数期望 s 指向可以接受字符串的字符数组。但在这种情况下,s 未初始化。所以 gets 试图解引用一个未初始化的指针。这会调用 undefined behavior.

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

相反,如果 s 被定义为一个数组,当传递给 gets 时,它会衰减为指向数组第一个元素的指针。然后 gets 可以写入数组。

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

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