C程序中的fgets突然退出

时间:2014-10-26 17:21:41

标签: c fgets

为什么以下代码在运行时突然退出而不打印任何输出???

FILE *file;

file=fopen("filename","r");
 char *line;
 while (fgets(line,1000,file)!=NULL) {
   int i=0;
    int l=sizeof(line);
    printf("%d\n",l);
  }

3 个答案:

答案 0 :(得分:5)

char *line;

这是一个char指针,没有指向任何内存..

fgets(line,1000,file)!=NULL

在这里,您尝试将从file中读取的字符串存储在其中,而不是为其分配内存

要纠正这一点,在执行fgets()之前执行malloc()分配内存

line = malloc(1000);

或者,将line变量声明为char数组,如此

char line[1000];

答案 1 :(得分:1)

你的程序说:从文件中读取一堆数据,并将其写在程序存储器的随机部分(堆栈,堆,代码,等等......)。不是一件好事。

一种解决方法,将char *line更改为char line[1000+1]

此处无需使用指针或动态分配。

第二个错误,在引用指针时不要使用sizeof(line)。它并不像你想的那样工作。 strlen(line)更合适。通常,您最好使用公共常量来分配缓冲区大小并从文件中读取。

const int MAXLINESIZE = 1000;

char line[MAXLINESIZE+1];

fgets(line, MAXLINESIZE, file)

答案 2 :(得分:0)

请注意读取数组大小的新安全方法。这只会读取一个数组,因此您将知道它是一个数组而不是一个指针。它具有内置的安全功能。

#include "stdlib.h"  // _countof() definition location

// unlike sizeof, _countof works here for both narrow- and wide-character strings.

 _TCHAR arr[20], *p; 

//sizeof(arr) = 40 bytes 
//_countof(arr) = 20 elements

// In C++, the following line would generate a compile-time error:    
// printf( "%d\n", _countof(p) ); 
// error C2784 (because p is a pointer) 

如果你计划使用C,你可以看到_countof(数组名称)是一个更好的选择。它也不受宽字符的影响;与sizeof()不同,返回数组中正确数量的元素。