3

私はvalgrindを使用していますが、何らかの理由で、Cで同じサイズの2つの文字列を含む単純な文字列コピーを使用するとメモリエラーが発生し続けます。

影響を受けるコードは次のとおりです。

node->entry = (char*)malloc(strlen(string)*sizeof(char));
strcpy(node->entry, string);

文字列は次のとおりです。char*string="HelloThere"。エラーは次のとおりです。サイズ2の無効な書き込み

==2035==    at 0xD494: memmove$VARIANT$sse42 (mc_replace_strmem.c:987)
==2035==    by 0x100001793: __inline_strcpy_chk (_string.h:94)
==2035==    by 0x100001699: createList (main.c:10)
==2035==    by 0x100001BE6: main (main.c:132)
==2035==  Address 0x10000c0fa is 10 bytes inside a block of size 11 alloc'd
==2035==    at 0xB823: malloc (vg_replace_malloc.c:266)
==2035==    by 0x100001635: createList (main.c:9)
==2035==    by 0x100001BE6: main (main.c:132)

助けてくれてありがとう!

4

2 に答える 2

5
malloc(strlen(string)*sizeof(char));

あなたはエンディング'\0'を考慮に入れていません。だからそれはすべきだった(strlen(string) + 1)


サイドノート:

type *x;
x = malloc(size * sizeof(*x))

よりもはるかに保守しやすい

type *x;
x = (type *)malloc(size * sizeof(type));

あなたは自分自身を3回繰り返さないからです。

于 2012-09-14T14:48:16.383 に答える
4

あなたのコードは壊れています:

  1. 文字列終了文字にスペースを割り当てる必要があります。そうしないと、strcpy()割り当てられていないメモリに書き込みが行われ、バッファオーバーフローのバグが発生します。
  2. malloc()の戻り値をCでキャストしないでください。
  3. メモリに書き込む前に、割り当てが成功することを確認する必要があります。

さらに、これsizeof (char)は常に1であるため、関与する必要はありません。使用するだけです:

node->entry = malloc(strlen(string) + 1);

または、strdup()上記のすべてを組み合わせているので、持っているかどうかを確認してください。

一般的なケースでは、@ Shahbazが指摘したように、型名を繰り返さsizeofないように、左側のポインターを逆参照した結果に演算子を使用することをお勧めします。

type *x;
x = malloc(amount * sizeof *x);

また、これは関数ではないことに注意してくださいsizeof。括弧は、引数が型名である場合にのみ必要であり、その場合は、先ほど説明したように、避ける必要があります。

于 2012-09-14T14:48:17.240 に答える