0

再割り当てに問題があります。これは、出力から単語を読み取り、EOF が検出された場合に終了する関数です。この関数はメモリ リークを引き起こし、次のプログラムは SIGSEGV または SIGABORT をスローします。何が問題ですか?

int inx=0;
char **wordList=NULL;

int v;
char tmpArr[100];

do
{
  v=scanf("%s",tmpArr);
  if(v!=-1)
  {
    char* word=(char*)malloc(strlen(tmpArr)+1);
    strcpy(word,tmpArr);
    char**more=(char**)realloc(wordList,sizeof(char*)*(inx+1));
    if(more!=NULL) {wordList=more;} else return 1;
    wordList[inx++]=word;
    printf("%d\n",inx);
  }
}
4

1 に答える 1

1
v=scanf("%s",tmpArr); 

上記は、入力文字列が 100 より大きい場合にメモリの上書きを引き起こす可能性があります。fgets(tmpArray,sizeof(tmpArray),stdin)代わりに を使用して、入力を最大バッファ サイズに制限する (または を使用するscanf_s) ことをお勧めします。

malloc が返すものをキャストしないでください。キャストする必要のない void* を返します。キャストすると、stdlib.h を含めるのを忘れた場合にエラーをマスクできます。

char* word = /* (char*) */ malloc(strlen(tmpArr)+1);

新しい文字列を読み取るたびに配列を大きくするのはあまり効果的ではありません。代わりに、一連の文字列ポインターを割り当てるか、できればリストなどの別のデータ構造を使用することを検討してください。

例えば

if ( inx == maxindex  )
{
  char**more=(char**)realloc(wordList,sizeof(char*)*(maxindex + bunch));

  if (more != NULL) 
  {
    wordList = more;
    maxindex += bunch ;
  } 
  else 
  { 
    return 1;
  }
}

...

于 2012-12-14T10:24:03.463 に答える