2016-12-11 5 views
1

"done"という単語が導入されるまでいくつかの単語を読んでいます。これらの単語は動的に割り当てられた行列に入れられ、受け取られた各入力で修正されます。 問題は、3ワード後にプログラムがクラッシュし、警告として「メモリ割り当てに失敗しました」というメッセージが表示されることです。 私の再割り当てには何が問題なのですか?アレイの再割り当てが失敗する

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAX_DIM 100 

    int main() 
     { 
      char **words,buff[100]; 
      int i,dim = 0; 
      words = (char**)calloc(dim,dim*sizeof(char*)); 
      while(strcmp(buff,"done")) 
      { 
      printf("the new word : "); 
      scanf("%100s", buff); 
      if(strcmp(buff,"done")) 
       { 
       dim++; 
       words = (char**)realloc(words,dim*sizeof(char*)); 
       if(words == NULL) 
       { 
        printf("Memory allocation failed !\n"); 
        exit(0); 
       } 
       words[dim] = (char*)calloc(MAX_DIM,sizeof(char)); 
       strcpy(words[dim],buff); 
       } 
      } 
      printf("%d", dim); 
      for (i = 0;i < dim;i++) 
      free(words[i]); 
      free(words); 
      return 0; 
     } 
+4

いいえいいえに

for (i = 0;i < dim;i++) free(words[i]); 

からあなたのコードの最後の部分を補正することにより解決することができます!インデックスは0からn-1までですので、 'words [dim]'は範囲外です! –

+2

この 'scanf("%100s "、buff);は' scanf( "%99s"、buff); 'でなければなりません。 Cの "文字列"は ''終止符を保存するために '' char '"を必要とします。または、これを回す:C "文字列"は '0'終端子を格納するために' char'を必要とするので、 'char'はそれほど割り当てられません。 – alk

+0

また、 'sizeof(char)'はdefintionによって '1'と等しくなります。 – alk

答えて

0

私はあなたのコードをコンパイルしました。私が遭遇した問題は、「done」が入力された後にプログラムがクラッシュすることでした。それは

for (i = 0;i < dim;i++) 
    free(&words[i]); 
関連する問題