[解決済み] Cプログラムのダブルフリーまたは破損(!prev)エラー
2022-01-29 15:17:01
質問
cプログラムを実行すると、以下のエラーが発生します。
*** glibc detected *** ./a.out: double free or corruption (!prev): 0x080b8008 ***
これはプログラムの最後にfree()が呼ばれたためだと思うのですが、それ以前にmallocされたメモリがどこで解放されているのかが分かりません。以下はそのコードです。
#include <stdio.h>
#include <stdlib.h> //malloc
#include <math.h> //sine
#define TIME 255
#define HARM 32
int main (void) {
double sineRads;
double sine;
int tcount = 0;
int hcount = 0;
/* allocate some heap memory for the large array of waveform data */
double *ptr = malloc(sizeof(double *) * TIME);
if (NULL == ptr) {
printf("ERROR: couldn't allocate waveform memory!\n");
} else {
/*evaluate and add harmonic amplitudes for each time step */
for(tcount = 0; tcount <= TIME; tcount++){
for(hcount = 0; hcount <= HARM; hcount++){
sineRads = ((double)tcount / (double)TIME) * (2*M_PI); //angular frequency
sineRads *= (hcount + 1); //scale frequency by harmonic number
sine = sin(sineRads);
*(ptr+tcount) += sine; //add to other results for this time step
}
}
free(ptr);
ptr = NULL;
}
return 0;
}
でコンパイルされます。
gcc -Wall -g -lm test.c
ヴァルグラインド
valgrind --leak-check=yes ./a.out
を与える。
==3028== Memcheck, a memory error detector
==3028== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==3028== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==3028== Command: ./a.out
==3028==
==3028== Invalid read of size 8
==3028== at 0x8048580: main (test.c:25)
==3028== Address 0x41ca420 is 1,016 bytes inside a block of size 1,020 alloc'd
==3028== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==3028== by 0x80484F8: main (test.c:15)
==3028==
==3028== Invalid write of size 8
==3028== at 0x8048586: main (test.c:25)
==3028== Address 0x41ca420 is 1,016 bytes inside a block of size 1,020 alloc'd
==3028== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==3028== by 0x80484F8: main (test.c:15)
==3028==
==3028==
==3028== HEAP SUMMARY:
==3028== in use at exit: 0 bytes in 0 blocks
==3028== total heap usage: 1 allocs, 1 frees, 1,020 bytes allocated
==3028==
==3028== All heap blocks were freed -- no leaks are possible
==3028==
==3028== For counts of detected and suppressed errors, rerun with: -v
==3028== ERROR SUMMARY: 8514 errors from 2 contexts (suppressed: 14 from 7)
私は自分のメモリを自動的に管理しない言語についてあまり経験がないのですが(それゆえ、少し学ぶためにcでこの練習をしています)、行き詰っています。どんな助けでも感謝します。
このコードは加算型音声合成装置の一部であると想定されています。その点では動作しており、ptrに格納された正しい出力を与えています。
ありがとうございます。
解決方法は?
<ブロッククオートdouble *ptr = malloc(sizeof(double *) * TIME);
/* ... */
for(tcount = 0; tcount <= TIME; tcount++)
^^
-
配列がオーバーしていますよ。を変更するか
<=
から<
またはアロケートSIZE + 1
要素 -
あなたの
malloc
が間違っている場合はsizeof(double)
ではなくsizeof(double *)
-
として
ouah
のコメントで、破損の問題とは直接関係ないのですが、あなたは*(ptr+tcount)
を初期化せずに
-
スタイルノートとして、あなたは
ptr[tcount]
の代わりに*(ptr + tcount)
-
は本当に必要ありません。
malloc
+free
をすでに知っているのでSIZE
関連
-
[解決済み】C 言語の添え字で配列の要素値を代入すると、配列でもポインタでもベクトルでもない値になる
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】strcmpが機能しない
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み] Valgrind 無効な free() / delete / delete[] / realloc() in C
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 error: too few arguments to function `printDay' (C言語)
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】malloc():メモリ破壊
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】スタックスマッシュを検出しました
-
[解決済み】未定義参照 makefile が間違っているのかも?