2017-02-10 3 views
0
uint32_t * newArr = realloc(myStruct->arr, 2 * muStruct->Capacity * sizeof(myStruct->arr)) 

if (newArr == null) 
{ 
    free(myStruct->arr); 
    return false; 
} 
else 
{ 
    myStruct->arr = newArr; 
    myStruct->Capacity *= 2; 
    ... 

Valgrindのは、このことについてこう述べています。Valgrindは私のrealloc()を好きではありませんか?

Address 0x51f7c80 is 0 bytes after a block size of 80 alloc'd 
    at 0x4C2BB78: realloc (vg_replace malloc.c:785) 

ここで何が起こっていますか?それは私のnewArr == nullのケースですか?

+0

「realloc」については不平を言っていませんが、コードの後半にあります。 –

+0

valgrindの出力の断片は、あなたの 'realloc()'呼び出しに関する苦情ではありません。アクセス違反に関するレポートの補足情報にすぎません。 –

+1

'sizeof(myStruct-> arr)'はポインタのサイズであり、* to *を指している型ではありません。 –

答えて

0

エラーがこのvalgrind article concerning debugging of memory problemsで説明したように、あなたがどこかに、配列の境界を超えて(または書き込み)を読んでいることを示しています

sample2.c:あなたは、図二つに出力から見ることができるように、 2つのアレイ内の 要素513を参照すると、書き込みエラー、読み取りエラー、および 書き込みエラーが発生します。アドレス0x40CA0224のメッセージは、 サイズ512のブロックの後の0バイトであり、 の512バイトの配列の終端を超える記憶域がないことを示します。

これはおそらくあなたのプログラムのどこかにあります。ステートメントif (newArr == null) ... free(myStruct->arr)は正しいIMHOです。

関連する問題