ページ 11

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

Posted: 2014年7月03日(木) 16:04
by 暇大生
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の使い方が間違っているのでしょうか?

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

Posted: 2014年7月03日(木) 16:27
by h2so5
sizeofの使い方が間違っています。

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

Posted: 2014年7月03日(木) 16:49
by 暇大生

コード:

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.
というエラー文です。

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

Posted: 2014年7月03日(木) 16:56
by box
暇大生 さんが書きました:

コード:

	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を使った構造体の動的確保

Posted: 2014年7月03日(木) 17:09
by 暇大生
box さんが書きました: iが0のとき、mallocすることに何か意味があるのでしょうか。

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

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


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

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

Posted: 2014年7月03日(木) 18:06
by ISLe()
エラーメッセージが出る原因は理解できたのでしょうかね。

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を使った構造体の動的確保

Posted: 2014年7月03日(木) 20:33
by 暇大生
エラー文理解できました。
やはりsizeof周辺でしたね。

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

Posted: 2014年7月03日(木) 23:13
by ISLe()
暇大生 さんが書きました:エラー文理解できました。
やはりsizeof周辺でしたね。
確かにsizeofが書いてある辺りですけどね。