1

C で strdup() 関数を使用しようとしていますが、malloc に関する奇妙なエラーが発生します。私の凝縮されたコードは次のとおりです。

void loadEntity(FILE *inFP, entity_t *ent, char *token) {
char buffer[100] = "buffer";
if (strcmp(token, "name") == 0) {
  if (fscanf(inFP, "%s", buffer) != 1) {

   fprintf(stderr,"%s\n", "Error reading name.");
   exit(1);
   }

  //For testing purposes
  fprintf(stdout, "Buffer: %s", buffer);

  ent -> name = strdup(buffer);
}
}

結果は次のとおりです。

hw6: malloc.c:2451: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.

バッファ: plane1Aborted (コアダンプ)

結果の最後に向かって、私の fprintf ステートメント (Buffer: plane1) の結果を見ることができます。これは、本来あるべき姿です。入力テキストの最初の行は「name plane1」です。基本的には、トークン名を見て、次の単語を取得し、ent -> name をこれに設定します。シンプルに見えますが、機能していません。if ステートメントを削除しても、同じ結果になることに注意してください。また、単に "strdup("String")" にすると、同じ問題が発生します。

4

3 に答える 3

3

また、単に "strdup("String")" にすると、同じ問題が発生します。

メモリがどこかで破損していると思います。valgrind などを使用してメモリ リークを検出し、そこから移動する必要があります。

于 2012-10-24T05:47:52.653 に答える
1

これは、バッファが小さすぎて fscanf がメモリを破損しているためだと思われます。これの簡単なテストとして %99s を試してください。

また、外部データがバッファ オーバーフローを引き起こす可能性がある、このようなコードは絶対に記述しないでください。そんなコードを見たら燃やせ、火をつけろ!;-)

于 2012-10-24T05:43:16.823 に答える