2012-02-17 65 views
0

所以我有一些代碼,可以很好地處理小文本文件,但與較大的崩潰。代碼的要點是獲取文件和參數n,解析代碼並將所有內容保存在大小爲n的卡盤中的二維數組中。因此,緩衝區[0] [0]到[0] [n-1]應該保存n個字符,並且緩衝區[1] [0]到[1] [n-1]應該保存下一個n塊,依此類推。我的代碼在文件只有幾個字的情況下工作,但是對於較大的文件,我得到一個錯誤,指出realloc():無效的下一個大小。任何想法爲什麼?這是我的代碼。realloc():無效的下一個大小

void bsort(int n) 
{ 
    int numwords= 0; 
    int numlets=0; 
    char ** buffer=(char**)malloc(numwords*n); 
    while (!feof(stdin)) 
    { 
     char l= getchar(); 
     if (l!= EOF) 
     { 
      if (numlets%n==0) 
      { 
       numwords=numwords+1; 
       buffer=(char**)realloc(buffer,numwords*n); 
       if(!buffer) 
       { 
        printf("Allocation error!"); 
       } 
       buffer[numwords-1]= (char*) malloc (n); 
       buffer[numwords-1][numlets%n]=l; 
       // printf("%c", buffer[numwords-1][numlets%n]); 
       numlets=numlets+1; 
      } 
     } 

     int i,j; 
     for (i=0; i < numwords; i++) 
     { 
      for(j=0; j< n; j++) 
      { 
       printf("%c",buffer[i][j]); 
      } 

     } 
+0

什麼環境? – fazo 2012-02-17 19:22:19

+0

使用linux終端 – user1161080 2012-02-17 19:37:17

+0

你的文件有多大? – fazo 2012-02-17 19:44:10

回答

0

看起來好像每次獲得角色時都要重新分配緩衝區。這對我來說似乎有點不合適。你有沒有想過分配一些空間,做一個memset到\0,並分別管理當前的大小和緩衝區大小?

這可能是realloc首先遇到一個指向沒有指針的問題。如果在第一個字符輸入後失敗,則可能是第一個malloc()有問題。預先分配一些空間可以解決這個問題。

+0

我擁有它的方式,每當我得到一個字符的時候,我就會分配更多的空間。當我不知道我解析的文件中有多少個字符時,我真的不知道如何預先分配空間。當我調試它時,一切正常,直到緩衝區[2] [n-1],並在此之後不會重新分配(在測試中,我運行的只有10個空格,因爲n = 5) – user1161080 2012-02-17 19:27:25

+0

看起來像你'在通過'getchar()'讀入每個字符後重新分配...要預分配,您需要分配一個設置數量,如101個字符左右。我喜歡將'memset()'全部設置爲'\ 0',以確保沒有函數在結尾運行。一旦你讀了100個字符,你就可以在結尾加上100個字符的空格,而把'memcpy()'全部加到新的緩衝區中。它減少了你必須做的分配,但只增加一點點你的工作量。 – 2012-02-17 19:38:15

+0

分配子句在if(numlets%n == 0)內部,所以只有當一個n個字符的塊被解析時纔會這樣。我不認爲一次分配那麼多,因爲我必須在數組的每個部分只保留n個字符 – user1161080 2012-02-17 19:48:57

0

據我所知,malloc(0)不保證返回一個有用的指針,你可以realloc()

documentation只保證malloc(0)返回null或可安全地用於呼叫free()的指針。

相關問題