Mallocエラー:誤チェックサムのために解放されたオブジェクト
質問
私の実施テールのための代入を行います。しています正常に動作してしまうすることで知られているエラーからの無料。
見えないことに気づいたり、トラックでパターンなものでは一致しています。
たとえば、私は私のプログラムとして"尾-24ます。"Iるのでしょうのことがないよう、正しい情報のチェックサムエラーで同一回線上に複数の運行しています。しかし、異なるファイルも異なるのオンライン印刷に戻ってしまうかもしれませんな。
あらゆるアイデアなどの問題にハマっていうデバッグで時間を無駄.
ここでは、加害コード:
ラインとして定義されてchar**ったmallocとして:
lines = (char**) malloc(nlines * sizeof(char *));
void insert_line(char *s, int len){
printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
if(processed > numlines -1){//clean up
free(*(lines+slot));
*(lines + slot) = NULL;
}
*(lines + slot) = (char *) malloc(len * sizeof(char));
if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
strcpy(*(lines+slot),s);
slot = ++processed % numlines;
}
解決
ご務については、書面を超えて、割り当てられたラインバッファです。
のサイズをライン引数として渡した("len"も含まれませんNULターミネーター.を呼び出すときはmallocのコピーライン(""s")に割り付けておく必要がありま余分なバイト文字列のターミネーター:
*(lines + slot) = (char *) malloc((len + 1) * sizeof(char));
他のヒント
まで一貫して再現の問題は特定の入力パラメータ、デバッグのようになります:
- 最初にデバッグ、精密無料の一因とされる問題です。
- しての記憶が無いたmalloc投稿内容の投稿者.
- 次に、デバッグ、場所、メモリはmalloc投稿内容の投稿者.
- インセンティブのビューアメモリに割り当てられたブロックのメモリを消費します。注の両方の開始と終了のブロックです。があると思われ"特別な価値という ガードブロック 直前、直後のブロックです。
- 今の段階を通じて、コードまでメモリが無い.あごのコードが誤って上書きのガードブロックです。 を侵しています。
この問題をもつことになるかもしれないのに、全く異なるのです。でもここまでくるともはや業務用、エラーのコードで上書きのガードブロックできます。
私の最初の質問はどうでしょ算len?はそれだけでstrlenやかに室内を\0にターミネーター?と思いますの行き過ぎを生じさせご配分おstrcpy.悪い行動が起こるための単語の境界と表示されます。また、チェックを使用してください。ソース文字列がnullの場合終了します。の場合は間違い、読む側か終了します。その後strcpyがランダムに上書きする。
*(lines + slot) = (char *) malloc(len * sizeof(char));
if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
strcpy(*(lines+slot),s);
しょう:
lines[slot] = (char *) malloc((len + 1) * sizeof(char));
if(lines[slot] == NULL) exit(EXIT_FAILURE);
if(strlen(s) <= len){
strcpy(lines[slot],s);
}
else{
/* do something else... */
}
の一般的な形で、私にも積極的あるいは複数タイルの変化にも少し読みやすくするために、わかりやすく、角英数字で入力して下さい耐ます。
ポインタを演算は有効ですが、楽しいものに行きたいという意図がもう少し明確にご利用の場合は配列形式のように:
free(lines[slot]);
lines[slot] = NULL;
の代わりに
free(*(lines+slot));
*(lines + slot) = NULL;
いいものをご利用の少ない統計情報にけで十分です。データ構造と通過しておaccessorsとmutators.なりより明らかにな行動が起きているのを防ぐようなこと:
static int numlines = 0;
void insert_line(char *s, int len){
int numlines = 5;
ご紹介ができるスコーピング問題は、この悲惨なデバッグ.
いnlinesとnumlines同じ価値とは?
は、呼び出し側のinsert_lineできるの末尾にNULLを渡す場合は、長さの第二のパラメータ?
私のプレの設定顔は丸ですがこれら二つの線のように不審くれた。
*(lines + slot) = (char *) malloc(len * sizeof(char));
if((lines + slot) == NULL) exit(EXIT_FAILURE);
最初に割り当てのmallocを lines[slot]
そのままチェック (lines+slot)
, 場合、後者がNULLの場合、逆参照は、NULLポインタを!
る場合にもライン[スロット](*(ライン+スロット))がnullでない場合は、メモリリークするには、以下の方法がありますを割り当てた結果、malloc()です。
思 lines
は char
*lines[]"をスロット内の境界!
同意したレモの容疑で約者回線で接する"また"車とはなかった。を共有しなければならな信用のための発見はこのバグ。
*(lines + slot) = some value
if((lines + slot) == NULL) then die
should be
if(*(lines + slot) == NULL) then die