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

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

ただいまの
回答率

90.34%

  • C

    4010questions

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

  • C++

    3792questions

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

  • 配列

    547questions

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

  • ポインタ

    119questions

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

  • デバッグ

    104questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 101

6666musan

score 4

前提・実現したいこと

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/08 03:42

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

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    4010questions

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

  • C++

    3792questions

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

  • 配列

    547questions

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

  • ポインタ

    119questions

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

  • デバッグ

    104questions

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