如果 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
,它接受缓冲区的大小作为参数。
考虑这个代码片段:
#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
,它接受缓冲区的大小作为参数。