2016-09-24 12 views
1

2つの異なる配列にそれぞれ100万個のセルを動的に割り当てました。 1つの配列は整数を保持し、1つの配列は固定長の文字列へのポインタを保持します。 gdbを使用してプログラムを実行すると、エラーが発生します:free(): invalid next size (fast)。私は違法な方法で記憶を解放する必要がありますが、私はどのように把握することはできません。 mallocとfreeを使用している場所の下に、私のコードの簡単なスニペットを掲載しました。私が間違ってやっていることを教えてくれますか?ありがとうございました。malloc()とfree()の動的メモリの問題

+1

* 1つの配列は、固定長の文字列へのポインタを保持します。*次に、 'malloc()'を使用しないでください。また、 'malloc()'の戻り値を 'NULL'に照らしてチェックし、' x - > y 'と書くのは恐ろしいです、 'x-> y'だけが良いです。他の演算子と違って、 '.'も同じです。 –

+0

解放関数に正しいポインタを渡したか、2回も実行していませんか? –

+0

@iharob、申し訳ありませんが、将来私は100万個の細胞を使用していないかもしれないと言及しておくべきです、それは入力によって変わるかもしれません。 – TheEyesHaveIt

答えて

2

ちょっと変わったことを除いて(iharobのコメントを参照)、あなたが私たちに示しているコードが正しいように見えます。

エラーは、あなたが私たちに見せているコードにはおそらく含まれていません。

おそらく起こっているのは、あなたの文字の「言葉」を埋めて、wc->allWords[i]のアドレスから20文字以上を格納しているということです。だから、あなたは記憶のブロックの終わりを過ぎて、そして次の記憶ブロックのヘッダーの上に書いています。

次に、解放しようとしているブロックのアドレスは正しいですが、ブロックのヘッダーが破損しているため、free()は失敗します。

+0

ありがとう、私はそれを見ていきます。また、「ヘッダーを傷つけた」とはどういう意味ですか? – TheEyesHaveIt

+1

この場合、「破損」は「上書き」を意味します。 Cランタイムにはいくつかの値が格納されていて、それらの上に文字が書き込まれている可能性があります。 –

+0

あなたは正しかった、問題は他のところでした。 – TheEyesHaveIt