前提・実現したいこと
C言語で構造体の要素を用いて簡単な計算ができるコードを書いています。
構造体も、さらにその要素もポインタにしているため、動的メモリ確保を行っていますが、おそらくメモリを解放する際に、”Aborted (コアダンプ)”というエラーが出てしまいます。
そこでデバッグを行ったところ 、以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
warning: Heap block at 00BD17E8 modified at 00BD17F8 past requested size of 8
該当のソースコード
#include <stdio.h> #include <stdlib.h> typedef struct{ int *u, *v; }one_p; int main(void){ int i, j, k; //i,jはfor()分用のインデックス、kは計算の入れ子 one_p *one; for(j = 0; j < 2 ; j++){ printf("iter_%d\n", j); one = malloc(2 * sizeof(one)); for(i = 0; i < 2 ; i++){ one[i].u = malloc(10 * sizeof(one_p)); one[i].v = malloc(10 * sizeof(one_p)); } for(i = 0; i < 2 ; i++){ for(j = 0; j < 10 ; j++){ one[i].u[j] = 2*j; one[i].v[j] = j; } } for(i = 0; i < 2 ; i++){ for(j = 0; j < 10 ; j++){ k = one[i].u[j] - one[i].v[j]; printf("i=%d, j=%d, u=%d, v=%d, k=%d,%p, %p\n", i, j, one[i].u[j], one[i].v[j], k, &one[i].v[j], &one[i].u[j]); } } printf("\n"); for(i = 0; i < 2 ; i++){ free(one[i].u); free(one[i].v); } free(one); } return 0; }
試したこと
マロックの仕方に問題があるのか、それともfreeの()内の表記の仕方に問題があるのか、原因がわからないです。
プログラムの出力結果は以下のようになります。
iter_0
i=0, j=0, u=0, v=0, k=0,00BD1670, 00BD1810
i=0, j=1, u=2, v=1, k=1,00BD1674, 00BD1814
i=0, j=2, u=4, v=2, k=2,00BD1678, 00BD1818
i=0, j=3, u=6, v=3, k=3,00BD167C, 00BD181C
i=0, j=4, u=8, v=4, k=4,00BD1680, 00BD1820
i=0, j=5, u=10, v=5, k=5,00BD1684, 00BD1824
i=0, j=6, u=12, v=6, k=6,00BD1688, 00BD1828
i=0, j=7, u=14, v=7, k=7,00BD168C, 00BD182C
i=0, j=8, u=16, v=8, k=8,00BD1690, 00BD1830
i=0, j=9, u=18, v=9, k=9,00BD1694, 00BD1834
i=1, j=0, u=0, v=0, k=0,00BD16F0, 00BD16B0
i=1, j=1, u=2, v=1, k=1,00BD16F4, 00BD16B4
i=1, j=2, u=4, v=2, k=2,00BD16F8, 00BD16B8
i=1, j=3, u=6, v=3, k=3,00BD16FC, 00BD16BC
i=1, j=4, u=8, v=4, k=4,00BD1700, 00BD16C0
i=1, j=5, u=10, v=5, k=5,00BD1704, 00BD16C4
i=1, j=6, u=12, v=6, k=6,00BD1708, 00BD16C8
i=1, j=7, u=14, v=7, k=7,00BD170C, 00BD16CC
i=1, j=8, u=16, v=8, k=8,00BD1710, 00BD16D0
i=1, j=9, u=18, v=9, k=9,00BD1714, 00BD16D4
warning: HEAP[a.exe]:
warning: Heap block at 00BD17E8 modified at 00BD17F8 past requested size of 8
Program received signal SIGTRAP, Trace/breakpoint trap.
0x77011f40 in ?? ()
(gdb)
補足情報(FW/ツールのバージョンなど)
windows10, エディタ:ATOM
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。