我对一件事感到好奇,以下代码完美无缺。
#include <stdio.h>
int main()
{
FILE * fp = fopen("test.txt", "r");
char line[100];
while( fgets(line, sizeof(line), fp) != NULL )
fputs(line, stdout);
fclose(fp);
return 0;
}
但为什么不可能改为使用:
char *line;
不会导致fgets崩溃?
答案 0 :(得分:3)
有可能。只需将其指向一些有效的内存即可。
char line[100];
char* linep = line ;
while( fgets(linep, sizeof(line), fp) != NULL )...
如果你不指定linep到linep,那么linep指向随机内存,你不能使用它。
答案 1 :(得分:3)
fgets
崩溃,因为它将结果写入未分配的内存。
没有任何进一步的内存分配,char *line
指向“无”。如果您的编译器将未初始化的值设置为null
或任何随机内存,它指向某些,但不指向任何有效的内存位置 - 0
位于系统上或不在系统上的任何位置。
即使fgets
没有崩溃,也无法预测在未定义的行为(What is undefined behavior?)中写入未分配的内存时的效果
答案 2 :(得分:1)
char *line
和char line[100]
并不一样。
第一个是指向char
的指针,我们不知道它是单个字符还是指向的字符数组。第二个是数组。
fgets
需要有效的位置才能写入。在这种情况下,char *line
没有任何有效的位置指向,而char line[100]
是一个有效的char数组位置