Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么';t gets()如果可以接受字符数组,是否接受字符指针参数?_C_Stdin_Gets - Fatal编程技术网

C 为什么';t gets()如果可以接受字符数组,是否接受字符指针参数?

C 为什么';t gets()如果可以接受字符数组,是否接受字符指针参数?,c,stdin,gets,C,Stdin,Gets,考虑此代码段: #include <stdio.h> int main() { char *s; gets(s); printf("%s",s); return 0; } #包括 int main() { char*s; 获取(s); printf(“%s”,s); 返回0; } 在这种情况下,在stdin输入一些输入后,我得到一个运行时错误。但是,如果将s声明为数组,s[size],则没有问题。但是考虑到gets原型,char*gets(char*s)它是否应

考虑此代码段:

#include <stdio.h>

int main()
{
  char *s;
  gets(s);
  printf("%s",s);
  return 0;
}
#包括
int main()
{
char*s;
获取(s);
printf(“%s”,s);
返回0;
}

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

函数要求
gets
指向可以接受字符串的字符数组。但在本例中,
s
未初始化。因此,
获取
尝试取消对未初始化指针的引用。这引起了人们的注意

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

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

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


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

您没有为
s
分配任何要指向的内存。
s=malloc(BUFSIZE)1)您是否阅读了文档?它需要一个
字符*
。2) 永远不要使用
获取
它已从标准中删除,如果您试图使用它,每个现代图书馆都会发出警告。