- ベストアンサー
メモリ
メモリについての概念がまだ少しわかりません。 先日ファイルから文字列を読み込む課題が与えられたとき メモリについて注意しなさいといわれました。 このメモリというのは 例えばファイル内の文字を配列に代入していくときに char str[100]と大目に配列のサイズをとっておくと メモリの無駄になり mallocで無駄の無い量のメモリをとるという意味合いでしょうか? 教えて下さい。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
メモリについて注意という場合、次の点を考えましょう。 (1)量 質問者さんが気にしている問題でもあります。 (2)場所 ざっと3種類あります。 A.スタック プロシージャ内に普通に定義したものはこれで、自動変数とも 呼ばれます。スタックには限度があるので、あまり大量のデータは 使用しないほうが良いでしょう。 B.静的領域 大域変数と言われる物です。プロシージャ外に定義したものです。 あっ、これはC言語の話ですよ。C++は違います。サイズは固定で、 ディスク上にある実行形式ファイル内に最初から存在します。 C.動的領域 mallocなどで、プログラムが確保したメモリです。当然ですが、 確保する前には存在しませんし、メモリ解放後も消滅します。 ディスク上にある実行形式ファイル内には存在しません。 それぞれに特徴があります。詳しいことは調べてみてください。 ファイルの読み込み領域として使うには何処が最適かを考察して みましょう。 (1)サイズ 入出力回数を減らすには1回の入出力の容量を大きくする。 (2)初期値 ファイル内のデータで上書きされるので、初期値を持つ必要はない。 (3)プログラム本体 少ない容量のほうが、ディスクスペース、プログラムロードの点で有利 先ず、自動変数や動的領域は初期値が取れません。しかし、この場合 初期値は不要です。次にサイズですが、静的領域を大きく取ると、 プログラム本体も(コード+データ)なので、大きくなります。 また、スタックには限界があるので、大きな領域は取れません。 となると、導かれる解決は動的領域となりますね。 まあ、100バイトくらいですと、何処にあっても大差ないのですが、 こういう所に神経が通っているかどうかが、大切なんです。
その他の回答 (3)
- asuncion
- ベストアンサー率33% (2127/6289)
>#3さん >A.スタック >B.静的領域 > 大域変数と言われる物です。プロシージャ外に定義したものです。 >C.動的領域 関数内部のstatic変数は、どこに属しますか? >動的領域は初期値が取れません。 callocで確保した領域については、どうなりますか?
- SilverThaw
- ベストアンサー率32% (260/806)
ちょっと違うような気がします。 例えば、1文字しか使用ないことがわかっているのに、100文字分の配列を取っていたら99文字分のメモリは無駄になります。 逆に、100文字分入力することがわかっているのに、その格納先が10文字分しかなければ明らかに、領域が足りず誤動作(バグ)の元となります。 ですので、必要なデータとそれらを使用(格納)するメモリ(変数)の大きさについて注意するようにということだと思います。
- Gotthold
- ベストアンサー率47% (396/832)
char str[100]; なのにstrに100文字以上の文字列を格納したら バッファオーバーフローが起こるよってことじゃない?
お礼
ありがとうございました