2017-10-16 120 views
1

目前我在下面有下面的代碼。 char **arr最初設置爲NULL。然後在從文件讀取時以文字形式存儲。我只是隨機選擇了一個像5000這樣的大數字,因爲我不知道如何正確地做malloc業務,即使在網上查找並嘗試學習之後。如何從文件讀取(未知長度)時正確使用malloc和空閒char **?

而且,當我嘗試freechar **arr(我的代碼的最後一節),有時我得到segmentation faults,有時abort traps等。如果有人可以告訴我怎麼做這樣的事情正確,將不勝感激!謝謝!

char **arr = NULL 

File *fp = fopen("file.txt", "r") 
char string[3000]; 
char counter = 0; 


//to store 
while(fscanf(fp, "%s", string)!=EOF){ 
    arr = realloc(arr, 5000); //arbitrarily used a large number like 5000 
    arr[counter] = malloc(5000); 
    strcpy(arr[counter++], string); 
} 

//to free 

for(i=0; i<counter; i++){ 
    free(arr[i]) 
} 
free(arr); 
+1

可能重複[如何獲取文件的大小在C?](https://stackoverflow.com/questions/238603/how-can-i-get-a-files-size-in-c) –

+0

使用[GCC](http://gcc.gnu.org/)編譯所有警告和調試信息:'gcc -Wall -Wextra -g',然後**使用調試器**'gdb'和[valgrind]( http://valgrind.org/)。另請閱讀[malloc](http://man7.org/linux/man-pages/man3/malloc.3.html)和相關文檔 –

+0

請提供一些[MCVE]的解釋。你的修復我的代碼問題是脫節 –

回答

4

請勿使用任意數字。

傳遞給realloc的size參數是要分配的新字節數。在你的情況下,它可能是(counter + 1) * sizeof(char *)字節。如果該文件包含大約一千多字,則5000將不夠。更何況你打電話realloc第一次電話後不改變大小。

而且不要使用malloc調用的任意值。請使用strlen(string) + 1,或者如果可用,則可以使用strdup代替。


最後,不要重新分配回你傳遞的指針realloc變量。如果realloc失敗並返回NULL您將失去原始指針。

而是使用你O原來的指針變量分配backt之前檢查一個臨時變量:

char **temp = realloc(arr, ...); 
if (temp == NULL) 
{ 
    // ERRORO: Do something appropriate 
} 

arr = temp; 
+1

我會建議,而不是像'newsize = 4 * oldsize/3 + 10;'進展,並與'newsize'的'realloc'。當然,應該明確保留當前分配的大小。 –

+0

@Someprogrammerdude最後一個意思是什麼?不要重新分配變量...等 – novice

+0

@novice更新了一個例子 –

1

檢查函數getline的manual(),這個函數分配線適合你,如果*爲NULL。使用這個函數可能是一個正確的方法,而不是使用strlen和fscanf。