• ベストアンサー

メモリ

メモリについての概念がまだ少しわかりません。 先日ファイルから文字列を読み込む課題が与えられたとき メモリについて注意しなさいといわれました。 このメモリというのは 例えばファイル内の文字を配列に代入していくときに char str[100]と大目に配列のサイズをとっておくと メモリの無駄になり mallocで無駄の無い量のメモリをとるという意味合いでしょうか? 教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

メモリについて注意という場合、次の点を考えましょう。 (1)量 質問者さんが気にしている問題でもあります。 (2)場所 ざっと3種類あります。 A.スタック  プロシージャ内に普通に定義したものはこれで、自動変数とも  呼ばれます。スタックには限度があるので、あまり大量のデータは  使用しないほうが良いでしょう。 B.静的領域  大域変数と言われる物です。プロシージャ外に定義したものです。  あっ、これはC言語の話ですよ。C++は違います。サイズは固定で、  ディスク上にある実行形式ファイル内に最初から存在します。 C.動的領域  mallocなどで、プログラムが確保したメモリです。当然ですが、  確保する前には存在しませんし、メモリ解放後も消滅します。  ディスク上にある実行形式ファイル内には存在しません。 それぞれに特徴があります。詳しいことは調べてみてください。 ファイルの読み込み領域として使うには何処が最適かを考察して みましょう。 (1)サイズ 入出力回数を減らすには1回の入出力の容量を大きくする。 (2)初期値 ファイル内のデータで上書きされるので、初期値を持つ必要はない。 (3)プログラム本体 少ない容量のほうが、ディスクスペース、プログラムロードの点で有利 先ず、自動変数や動的領域は初期値が取れません。しかし、この場合 初期値は不要です。次にサイズですが、静的領域を大きく取ると、 プログラム本体も(コード+データ)なので、大きくなります。 また、スタックには限界があるので、大きな領域は取れません。 となると、導かれる解決は動的領域となりますね。 まあ、100バイトくらいですと、何処にあっても大差ないのですが、 こういう所に神経が通っているかどうかが、大切なんです。

zaqwe
質問者

お礼

ありがとうございました

その他の回答 (3)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.4

>#3さん >A.スタック >B.静的領域 > 大域変数と言われる物です。プロシージャ外に定義したものです。 >C.動的領域 関数内部のstatic変数は、どこに属しますか? >動的領域は初期値が取れません。 callocで確保した領域については、どうなりますか?

回答No.2

ちょっと違うような気がします。 例えば、1文字しか使用ないことがわかっているのに、100文字分の配列を取っていたら99文字分のメモリは無駄になります。 逆に、100文字分入力することがわかっているのに、その格納先が10文字分しかなければ明らかに、領域が足りず誤動作(バグ)の元となります。 ですので、必要なデータとそれらを使用(格納)するメモリ(変数)の大きさについて注意するようにということだと思います。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

char str[100]; なのにstrに100文字以上の文字列を格納したら バッファオーバーフローが起こるよってことじゃない?

関連するQ&A