mallocを使った構造体の動的確保

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
暇大生

mallocを使った構造体の動的確保

#1

投稿記事 by 暇大生 » 9年前

mallocを使って構造体を動的に確保したいと思っています。

コード:

#include <stdio.h>
#include <stdlib.h>

typedef struct{
	double n;
}test_t;

int main(){
	test_t *p;
	double j = 0.05;

	for (int i = 0; i < 10; i++){
		p = (test_t*)malloc(sizeof(p) * i);
		p[i].n = j;
		printf("%f\n", p[i].n);
	}
	free(p);
	return 0;
}
for文が始まるたびにmallocでtest_tをひとつ確保して値を入れるだけの簡単なプログラムなのですが、
構造体の中の変数がint型で、入れる値もint型のときはうまくいくのですが、double型になるとうまくいきません。
三回目のforループでプログラムがとまってしまいます。

やはりmallocの使い方が間違っているのでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: mallocを使った構造体の動的確保

#2

投稿記事 by h2so5 » 9年前

sizeofの使い方が間違っています。

暇大生

Re: mallocを使った構造体の動的確保

#3

投稿記事 by 暇大生 » 9年前

コード:

p = (test_t*)malloc(sizeof(test_t) * i);
sizeofこうですね。

書き換えて実行してみたのですが、forが終わった後にデバッグエラーが出ます。
調べてみたのですが、中文サイトばっかでよくわからなかったです。
HEAP CORRUPTION DETECTED: after Normal block (#76) at 0x006F85A0.
CRT detected that the application wrote to momory sfter end of heap buffer.
というエラー文です。

box
記事: 2002
登録日時: 13年前

Re: mallocを使った構造体の動的確保

#4

投稿記事 by box » 9年前

暇大生 さんが書きました:

コード:

	for (int i = 0; i < 10; i++){
		p = (test_t*)malloc(sizeof(p) * i);
iが0のとき、mallocすることに何か意味があるのでしょうか。
暇大生 さんが書きました:

コード:

	free(p);
10回mallocしていて、freeが1回だけでいいのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

暇大生

Re: mallocを使った構造体の動的確保

#5

投稿記事 by 暇大生 » 9年前

box さんが書きました: iが0のとき、mallocすることに何か意味があるのでしょうか。

10回mallocしていて、freeが1回だけでいいのでしょうか。
[/quote]

確かにそうですね。
プログラムはまず全体で何個mallocで増やせばいいかを調べて、
mallocは一度しか呼ばないようにしてみようと思います。


バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
↑名言ですね。

ISLe()

Re: mallocを使った構造体の動的確保

#6

投稿記事 by ISLe() » 9年前

エラーメッセージが出る原因は理解できたのでしょうかね。

malloc/freeは対応している必要がありますが、まとめるかどうかはエラーと関係ないですね。

iが0のとき
13行目は
p = (test_t*)malloc(sizeof(test_t) * i);
となって要素0個分の領域を確保します。
要素を格納する領域は確保していません。
そして
14行目で
p[0].n = j;
添字0(1番目)の要素に値を代入しています。
要素を格納する領域は確保していないにも関わらず、です。

HEAP CORRUPTION DETECTED: after Normal block (#76) at 0x006F85A0.
アドレス0x006F85A0のノーマルブロック(76番)以降にヒープ(メモリ)の破壊を検出しました。
CRT detected that the application wrote to momory after end of heap buffer.
Cランタイムライブラリはアプリケーションがヒープバッファの終端を越えてメモリを書き変えたことを検出しました。

暇大生

Re: mallocを使った構造体の動的確保

#7

投稿記事 by 暇大生 » 9年前

エラー文理解できました。
やはりsizeof周辺でしたね。

ISLe()

Re: mallocを使った構造体の動的確保

#8

投稿記事 by ISLe() » 9年前

暇大生 さんが書きました:エラー文理解できました。
やはりsizeof周辺でしたね。
確かにsizeofが書いてある辺りですけどね。

閉鎖

“C言語何でも質問掲示板” へ戻る