質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

2507閲覧

ポインタである構造体の要素もポインタである時の動的メモリの設定及び解放の仕方

6666musan

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2018/12/07 17:19

編集2018/12/07 18:40

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ループ変数j を使いまわししてしまっているため、一番外のループがきちんと動きません

投稿2018/12/08 01:08

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

sizeof(one)はポインタ1個分のサイズになるので
sizeof(one_p)にしましょう

投稿2018/12/07 17:48

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

6666musan

2018/12/07 18:42

ご指摘ありがとうございます。指摘をいただいた箇所を修正しましたが、同じエラーメッセージが出てきます。
guest

0

もう一か所
one = malloc(2 * sizeof(one));

one = malloc(2 * sizeof(one_p));
にしてください。

投稿2018/12/07 23:11

tatsu99

総合スコア5438

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問