2014-09-10 45 views
1

我有一個過程readTokens(),它接受一個文件和一個數組,並標記文件並將其放入數組中,但當我訪問該數組時,它充滿了最後的元素。爲什麼?這裏是我的readTokens()方法:數組充滿文件中的最後一個元素

void 
readTokens(char *fileName, char** a[]) 
{ 
FILE *fp; 
char *token; 
int count = 0; 

fp = fopen(fileName, "r"); 
if (fp == 0) 
    { 
    fprintf(stderr,"file %s could not be opened for reading\n", fileName); 
    exit(1); 
    } 

token = readLine(fp); 
while(!feof(fp)) 
    { 
    a[count] = token; 
    ++count; 
    free(token); 
    token = readLine(fp); 
    } 

fclose(fp); 
} 
+1

你爲什麼打free()? free()只能在你分配的內存中調用。 – nem035 2014-09-10 16:05:38

+0

很確定這是C,但你應該標記語言。 – crashmstr 2014-09-10 16:06:51

+0

對不起,這是c。我不應該釋放令牌嗎? – 2014-09-10 16:08:02

回答

3

你不應該叫free(token),因爲你還有一個指向它a[count]。既然你釋放了它,那麼這個內存就可以被重用,並且當readLine()讀取下一行時顯然會被使用。所以每次讀取一行時,它都會重用相同的內存,並用下一行覆蓋它。因此,a[]的所有元素都包含指向同一行的指針。

a[count] = token不製作令牌的副本,它只是分配指針。

這一切都假定readLine()使用malloc()爲它讀取的行分配內存。如果沒有,則更糟糕,因爲您不能在內存中調用free(),因爲它沒有與malloc()calloc()分配。

readLine()可能只是使用靜態數組變量,這也可以解釋爲什麼你所有的行都是相同的。如果您不希望它繼續覆蓋該令牌,則需要在readTokens()中複製該令牌。如果您發佈了readLine()的定義,這將有所幫助。

相關問題