我有一个函数,可以动态创建一个bisimentional数组,该数组会记住一串单词,直到引入“ gata”为止。

问题是它崩溃了,我认为这条线

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


可能是问题之一。这条线怎么了?

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;
}

最佳答案

主要的问题是

  while(strcmp(buff,"gata"))


其中,buff是自动局部变量,并且未初始化。使用内容调用undefined behavior。您需要先初始化buff,然后再使用它。

那就是


scanf("%100s", buff);开启了off-by-one,使之成为scanf("%99s", buff);的可能性。
dim++;增加指针本身,而不是指针所指向的值。

关于c - 二维数组的动态分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41188897/

10-11 23:22
查看更多