c上的fgets错误和字符串声明样式

时间:2014-05-27 14:40:08

标签: c

我对一件事感到好奇,以下代码完美无缺。

#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崩溃?

3 个答案:

答案 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 *linechar line[100]并不一样。 第一个是指向char的指针,我们不知道它是单个字符还是指向的字符数组。第二个是数组。

fgets需要有效的位置才能写入。在这种情况下,char *line没有任何有效的位置指向,而char line[100]是一个有效的char数组位置