2017-02-26 4 views
2

char**にテキスト入力を割り当てる関数を記述しようとしています。各単語がchar*に格納されている場所。私がこれをしていたときに私はエラーが発生していたので、私は少しのテストプログラムを書いたので、私は十分なメモリを割り当てていないと思った。C - メモリサイズのポインタ

これはうまく動作しますが、文字ごとに次のように割り当てます。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    char **input=NULL; 
    char **help=NULL; 
    char *help2=NULL; 
    for(int i=1;i<300;i++){ 
     help=realloc(input,i*(sizeof(char*))); 
     if (!help) 
      return 0; 
     input=help; 
     for (int j=1;j<5;j++){ 
      help2=realloc(input[i-1],j); 
      if (!help2) 
       return 0; 
      input[i-1]=help2; 
      input[i-1][j-1]='t';  
     } 
    } 
    return 1; 
} 

私はinputは十分なスペースを持っていないためであると考えライン14上のセグメンテーションフォールトを取得します。しかし、キャラクターのサイズが1であり、私はsizeof(char*)を使用したので、それがいかに不十分かはわかりません。どのくらいのメモリを割り当てる必要があり、私は最初の例でそれがうまくいったのですか?ありがとう!

+0

外側ポインタ配列の最初の 'realloc'に余裕を持ったポインタが実際に*確定*しているという保証はありません。 * inner *ループの 'realloc'に渡すと、*未定義の動作*の根拠になります。つまり、 'realloc(input [i-1]、j)'の 'input [i-1]'の初期値は不定です。それを使って*悪い*があります。 – WhozCraig

答えて

1

clangすぐに問題が見つかります。

test(72707,0x7fffe32443c0) malloc: *** error for object 0x7fffe0051090: pointer being realloc'd was not allocated 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

ここに問題があります。

help2=realloc(input[i-1],j); 

inputが割り当てられていますが、いずれの要素も初期化されていません。 reallocmallocのように動作しますが、ポインタがヌルの場合は、input[i-1]に初期化されていないガベージ・ポインタを再割り当てするように要求された場合、そのポインタはフリークします。

代わりに、reallocの要素を試す前に、inputを適切に初期化する必要があります。

Valgrindのようなメモリチェックツールは、この種の間違いを見つけるのに役立ちます。

+1

Iow、 'input = help;'、 'input [i-1] = NULL;'の後 – WhozCraig

+0

これは問題を解決しました! – Roxor9999