2014-03-14 30 views
0

在我的程序中,我從.txt文件接收文本。下面是一行文字的例子:realloc的問題 - 「無效的下一個大小」

12X15 DE3 DS4 dn9 g2,7 m5,9 m3,1 h2,2

我想使用的strtok()分手的每塊文本;然後我將把每個塊作爲一個元素放入一個數組中。所以一串字符串。

這是到目前爲止我的代碼:

void parseFile(char ** argv) { 
    FILE *textFile; 
    char *string; 
    char **lineToken; 
    int i; 

    textFile = fopen(argv[1], "r"); 
    lineToken = malloc(sizeof(1)); 
    string = malloc(sizeof(MAX_CHAR)); 

    while(fgets(string, MAX_CHAR, textFile) != NULL) { /* Get first line of text */ 
     lineToken[0] = strtok(string, " "); /* Put first element in lineToken[0] */ 
     for(i = 1; i; i++) { 
      /* Realloc because total number of elements is unknown */ 
      lineToken = realloc(lineToken, i + 1); 

      /* Put new strtok'd string into lineToken[i] */ 
      lineToken[i] = strtok(NULL, " "); 
     } 

     for(i = 0; i; i++) { 
      move(i, 0); 
      printw("%s", lineToken[i]); 
      refresh(); 
     } 
    } 
    free(lineToken); 
    free(string); 
} /* End of function */ 

但我不斷收到這樣的realloc錯誤:

*** glibc detected *** ./bin/a3RunMe: realloc(): invalid next size: 0x01f2a270 *** 
Aborted 
+0

當然你的意思是'printf'而不是'printw'。 – ajay

+0

我的歉意。我正在使用ncurses庫,因此在屏幕上打印文本需要printw。 – Plaidypus

回答

3

這是最有可能的問題:

lineToken = malloc(sizeof(1)); 

在這裏,您分配整數文字的大小,但是lineToken至少需要sizeof(*lineToken)(或sizeof(char *))字節。整數的大小和指針的大小可能不一樣,特別是在64位平臺上(其中int是四個字節,指針是八個字節)。

所以,當你做

lineToken[0] = strtok(string, " ") 
你寫超出了所分配的(緩衝區溢出),並覆蓋由分配器放在那裏的數據

還有一個問題,realloc調用將分配i + 1字節。因此,即使您在32位平臺上(其中int的大小恰好與指針的大小相同),您也將在循環的第一次迭代中將指針從四個字節重新分配給兩個字節。


您還有其他的問題,這樣的循環:

for(i = 1; i; i++) 

記住,在C的所有非零值是真實的,當將i永遠在循環零?

+0

好的,我修復了循環的迭代。我認爲「string!= NULL」的條件應該就足夠了。現在,隨着realloc電話...你會推薦我放在那裏?我假設你明白我想要做什麼? – Plaidypus

+0

@ user2359287請記住,您正在分配sizeof(char *)個字節的倍數,所以sizeof(char *)*(i + 1)'。 –

+0

這很有道理。我添加了你的建議和它的工作原理!感謝大家的幫助。 – Plaidypus

1

for循環是無限的......

for(i = 1; i; i++) 
{ 
     lineToken = realloc(lineToken, i + 1); /* Realloc because total number of elements is unknown */ 
     lineToken[i] = strtok(NULL, " "); /* Put new strtok'd string into lineToken[i] */ 
} 

條件i是始終計算爲TRUEi != 0

您可能會一直在循環中增加和分配,因此出現此錯誤。

相關問題