0

在使用 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

4 回答 4

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()有他们的原型。

于 2010-09-19T17:47:57.660 回答
1

您没有为 指向的缓冲区分配空间line

你应该做:

line = malloc(bufsize);

并使用以下方法释放它:

free(line);
于 2010-09-19T17:44:41.383 回答
1

bufsize是您应该分配并传递给的缓冲区的大小fgets。您根本没有分配任何缓冲区,然后您撒谎fgets告诉它您正在传递某个特定大小的缓冲区。无论您使用什么大小或如何将其传递给它都无关紧要fgets- 只要您不分配任何缓冲区,您的代码就会崩溃或行为不可预测。

只要缓冲区大小不是很大,就可以将其声明为本地数组,而不是动态分配

char line[bufsize];
while (fgets(line, bufsize, problem) != NULL) {        
    printf(line);
}
于 2010-09-19T17:54:55.403 回答
0
char* line = malloc(bufsize);
于 2010-09-19T17:54:09.977 回答