2016-12-16 168 views
-1

我有一個函數可以動態地創建一個雙元數組,它存儲一串直到「gata」被引入的單詞。二維數組的動態分配

的問題是,它崩潰,我覺得行

*(*words+*dim-1) = (char*)calloc(MAX_DIM,sizeof(char)); 

可能是problems.What的一個是錯的這條線?

void read_words(char ***words,int *dim) 
    { 
     char buff[100]; 
     *words = (char**)calloc(*dim,*dim*sizeof(char*)); 
     while(strcmp(buff,"gata")) 
     { 
     printf("the new word : "); 
     scanf("%100s", buff); 
     if(strcmp(buff,"gata")) 
      { 
      dim++; 
      *words = (char**)realloc(words,*dim*sizeof(char*)); 
      if(words == NULL) 
      { 
       printf("Memory allocation failed !\n"); 
       exit(0); 
      } 
      *(*words+*dim-1) = (char*)calloc(MAX_DIM,sizeof(char)); 
      strcpy(*(*words+*dim-1),buff); 
      } 
     } 
    } 

int main() 
{ 
    char **words; 
    int i,dim = 0; 

    read_words(&words,&dim); 

    for (i = 0; i < dim; i++) 
    free(&words[i]); 
    free(words); 
    return 0; 
} 
+1

是**新**存在c? – Fennekin

+1

[請參閱此討論,爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

+3

@Fennekin有沒有nija編輯?我看不到'新'。 –

回答

1

的主要問題是與

while(strcmp(buff,"gata")) 

其中buff是一個自動局部變量和左初始化。使用內容調用undefined behavior。在使用之前,您需要初始化buff

這就是說,

  • scanf("%100s", buff);打開了去off-by-one的可能性,使該scanf("%99s", buff);
  • dim++;遞增指針本身,而不是指針指向的值。
+0

這不是問題。動態分配是,我不知道如何解決它。 – NickName

+0

@NickName:指針增加後,其值不確定或無意義。它可以解釋崩潰,因爲當執行分配時暗淡的* dim。 – francis

+1

@francis感謝您的努力,但正如我從前面的OP評論中看到的,它不太可能對_OP_產生任何影響,看起來像其他建議不會被接受。 :) –