为什么以下代码在运行时突然退出而不打印任何输出???
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);
}
答案 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()不同,返回数组中正确数量的元素。