2016-12-16 23 views
-1

"gata"が導入されるまで読み込まれた単語の文字列を記憶する二元配列を動的に作成する関数があります。二次元配列の動的割り当て

問題は、それがクラッシュすると、私はラインが

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

problems.Whatの1本のラインが間違っているかもしれないと思うことでしょうか?

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

です**新しく**存在しますか? – Fennekin

+1

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

+3

@Fennekinはnijaの編集がありましたか?私は '新しい'を見ません。 –

答えて

1

主要な問題は、buff自動ローカル変数と初期化されていないままである

while(strcmp(buff,"gata")) 

です。内容を使用してundefined behaviorを呼び出します。あなたはそれを使用する前にbuffを初期化する必要があります。

  • scanf("%100s", buff);off-by-oneを行く可能性を開く、と述べ

    は、そのscanf("%99s", buff);を作ります。

  • dim++;は、ポインタが指す値ではなく、ポインタ自体をインクリメントします。
+0

それは問題ではありません。動的割り当ては、私はそれを修正する方法がわかりません。 – NickName

+0

@ニックネーム:ポインタがインクリメントされると、その値は定義されていないか無意味です。割り当てが行われたときにdimが参照されているので、クラッシュを説明することができます。 – francis

+1

@francis努力してくれてありがとうございますが、OPの前のコメントからわかるように、_OP_には何の影響も及ぼしませんが、他の提案は受け入れられないようです。 :) –