ページ 1 / 1
メモリの動的確保について
Posted: 2014年12月15日(月) 08:48
by きみまろ
int i;
char *str;
scanf("%d",&i);
str = (char *)malloc(sizeof(char) * i);
printf("%d",sizeof(str));
これを実行してiに100 と代入しているのですが、
結果は4になります。
これでいいのですか?
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 09:03
by Blue
char * のサイズですから、100ではなく、4(→環境に寄ります)です。
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 11:56
by softya(ソフト屋)
mallocしたサイズを調べる方法をC言語は提供しておりません。
自分で確保したんだから自分で覚えておきなさいという設計思想です。
sizeof()は基本的の静的なサイズを調べるためのものです。
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 17:41
by きみまろ
なるほど。
今回はmallocの戻り値がNULLかチェックしてませんが、
実際にNULLでなかったから100バイト分の領域は確保できている(半角英数字であれば100文字分)と
考えていいのですか?
もし、領域を別の値に変更したいときは
free()で1度解放してから、またmallocすればいいのですか?
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 18:00
by milfeulle
はい、NULLでなければ領域は確保されています。
メモリ自体の確保が済めばfreeするまで自由に書き換えられますから、値を変更するごとにfreeする必要はないですよ。
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 18:15
by MoonGate
きみまろ さんが書きました:なるほど。
もし、領域を別の値に変更したいときは
free()で1度解放してから、またmallocすればいいのですか?
大は小を兼ねますので小さい領域が必要な場合はそのまま使い回しでも問題ありません。
サイズ変更する場合、reallocという便利な関数があります。
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 20:01
by softya(ソフト屋)
100バイトに100文字入れたら文字列の終端文字であるナル文字が入れれませんよ。
文字列として処理しないなら良いですが。
Re: メモリの動的確保について
Posted: 2014年12月15日(月) 20:50
by きみまろ
みなさん、ありがとうございます。
とても勉強になりました。
今まで大量のデータを扱うときは
無駄に
str[1000]としていました。
最近になって便利なmallocを知ったのですが、
イマイチ理解出来なくて。。。
今後、活用していきたいと思います。