2010-09-19 26 views
0

我想在Windows 7(64位,如果它很重要)編譯它與GCC後運行此代碼。如果我將bufsize聲明爲int,則程序會凍結,Windows會通知我它已停止工作。如果我使用 #define bufsize 123 它工作正常,如果我用自己的數字替換bufsize,它工作正常。我在這裏錯過了什麼?奇怪的fgets()問題

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

最大的概念性錯誤,沒有人會指出你的是,你不不需要bufsize變量。您必須將緩衝區大小傳遞給'fgets',但這通常是以sizeof buffer或其他表達式的形式完成的。 – 2010-09-19 18:42:25

回答

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

+0

'malloc(bufsize)',那麼。 – 2010-09-19 18:39:35

1

您還沒有爲line指向的緩衝區分配空間。

你應該這樣做:

line = malloc(bufsize); 

,並免費使用它:

free(line); 
1

bufsize是您應該分配並傳遞給fgets的緩衝區的大小。你根本沒有分配任何緩衝區,然後你說謊fgets告訴它你正在傳遞一些特定大小的緩衝區。無論您使用的是多大,還是如何將它傳遞給fgets - 只要您沒有分配任何緩衝區,代碼就會崩潰或表現出不可預測性。

只要緩衝區的大小不是很大,你可以聲明它作爲一個本地數組,而不是動態分配它

char line[bufsize]; 
while (fgets(line, bufsize, problem) != NULL) {   
    printf(line); 
} 
+0

只是想我會提到這個(VLA)適用於OP已經使用的(混合代碼和聲明)'C99'。 – pmg 2010-09-19 17:59:34