2016-12-16 166 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_产生任何影响,看起来像其他建议不会被接受。 :) –