我正在尝试在使用GCC编译后在Windows 7(64位,如果重要)上运行此代码。如果我将bufsize声明为int,程序将冻结,Windows会通知我它已停止工作。如果我使用 #define bufsize 123 它工作正常,如果我自己用数字替换bufsize,它工作正常。我在这里缺少什么?
int main(int argc, char* argv[]) {
char* filename = argv[1];
FILE* problem = fopen(filename, "r");
if (!problem) {
printf("File doesn't exist\n");
exit(1);
}
char* line;
while (fgets(line, bufsize, problem) != NULL) {
printf(line);
}
return 0;
}
答案 0 :(得分:2)
line
是一个指针,但它无处指向(或者,更好的是,它尚未初始化且其值不确定且无法使用)。指向无处的指针并不是非常有用。
分配一些内存并使line
指向该内存。记得在不再需要时释放内存。
line = malloc(200);
if (line == NULL) { /* something went wrong, the pointer is pointing nowhere */ }
/* ... use allocated memory ... */
free(line);
哦...... bufsize
值应与您分配的字节数相匹配。
另外#include <stdlib.h>
因为malloc()
和free()
在那里有原型。
答案 1 :(得分:1)
您尚未为line
指向的缓冲区分配空间。
你应该这样做:
line = malloc(bufsize);
并使用:
释放它free(line);
答案 2 :(得分:1)
bufsize
是您应该分配并传递给fgets
的缓冲区的大小。您根本没有分配任何缓冲区,然后您正在向fgets
说谎,告诉它您正在传递某个特定大小的缓冲区。无论您使用的是什么大小或如何将其传递给fgets
- 只要您没有分配任何缓冲区,您的代码就会崩溃或表现得不可预测。
只要缓冲区大小不是很大,就可以将其声明为本地数组,而不是动态分配它
char line[bufsize];
while (fgets(line, bufsize, problem) != NULL) {
printf(line);
}
答案 3 :(得分:0)
char* line = malloc(bufsize);