奇怪的fgets()问题

时间:2010-09-19 17:41:38

标签: c fgets

我正在尝试在使用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;
}

4 个答案:

答案 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);