メモリの動的確保について

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

メモリの動的確保について

#1

投稿記事 by きみまろ » 10年前

int i;
char *str;
scanf("%d",&i);
str = (char *)malloc(sizeof(char) * i);
printf("%d",sizeof(str));

これを実行してiに100 と代入しているのですが、
結果は4になります。

これでいいのですか?

Blue

Re: メモリの動的確保について

#2

投稿記事 by Blue » 10年前

char * のサイズですから、100ではなく、4(→環境に寄ります)です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メモリの動的確保について

#3

投稿記事 by softya(ソフト屋) » 10年前

mallocしたサイズを調べる方法をC言語は提供しておりません。
自分で確保したんだから自分で覚えておきなさいという設計思想です。
sizeof()は基本的の静的なサイズを調べるためのものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きみまろ

Re: メモリの動的確保について

#4

投稿記事 by きみまろ » 10年前

なるほど。
今回はmallocの戻り値がNULLかチェックしてませんが、
実際にNULLでなかったから100バイト分の領域は確保できている(半角英数字であれば100文字分)と
考えていいのですか?

もし、領域を別の値に変更したいときは
free()で1度解放してから、またmallocすればいいのですか?

アバター
milfeulle
記事: 47
登録日時: 11年前
住所: マリーランド
連絡を取る:

Re: メモリの動的確保について

#5

投稿記事 by milfeulle » 10年前

はい、NULLでなければ領域は確保されています。

メモリ自体の確保が済めばfreeするまで自由に書き換えられますから、値を変更するごとにfreeする必要はないですよ。
ζ*'ヮ')ζプログラミングはみんなで奏でるシンフォニー

MoonGate

Re: メモリの動的確保について

#6

投稿記事 by MoonGate » 10年前

きみまろ さんが書きました:なるほど。
もし、領域を別の値に変更したいときは
free()で1度解放してから、またmallocすればいいのですか?
大は小を兼ねますので小さい領域が必要な場合はそのまま使い回しでも問題ありません。
サイズ変更する場合、reallocという便利な関数があります。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メモリの動的確保について

#7

投稿記事 by softya(ソフト屋) » 10年前

100バイトに100文字入れたら文字列の終端文字であるナル文字が入れれませんよ。
文字列として処理しないなら良いですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きみまろ

Re: メモリの動的確保について

#8

投稿記事 by きみまろ » 10年前

みなさん、ありがとうございます。
とても勉強になりました。

今まで大量のデータを扱うときは
無駄に
str[1000]としていました。
最近になって便利なmallocを知ったのですが、
イマイチ理解出来なくて。。。

今後、活用していきたいと思います。

閉鎖

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