【问题标题】:Why doesn't gets() take a char pointer argument if it can take a char array?如果 gets() 可以采用 char 数组,为什么不采用 char 指针参数?
【发布时间】:2017-09-17 21:22:05
【问题描述】:

考虑到这段代码sn-p:

#include <stdio.h>

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

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

【问题讨论】:

标签: c stdin gets


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2020-06-05
    • 2021-11-19
    • 2016-07-13
    • 2021-01-26
    • 2013-06-27
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多