メモリ領域について

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

メモリ領域について

#1

投稿記事 by pblc » 14年前

main関数のみのあるプログラムで二次元配列の要素数を500から1000にした所、セグメンテーション違反が起こったので
配列の宣言をstaticにしたら正しくコンパイルされたのですが、いまいち正しくコンパイルされた理由がわかりません。
静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
ちなみに処理系はgccです。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: メモリ領域について

#2

投稿記事 by beatle » 14年前

pblc さんが書きました:静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
静的領域は実行可能ファイルをメモリにロードする段階でサイズがはっきり分かりますから、それにあわせて領域が確保されます。
したがって、基本的にいくらでも静的領域に変数を確保することができます。

対照的に、スタック領域はメモリへのロード段階でははっきりした使用量が分かりません。動的に使用量が変化するからです。
ですから、通常はリンク時に決め打ちした容量でスタック領域が確保されます。
実行時にその領域を飛び出すくらい多く変数を確保するとだめになります。

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

Re: メモリ領域について

#3

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

補足的に書くとWindows/Linux/MacなどのOSの場合の話はサイズだけですが、マイコンなどの場合はリンク時に明示的にスタックで使用するメモリの場所やサイズを決めてやる必要がある上にかなり小さくなることが多いです。
それとスタックは再帰呼び出しが深くなる毎に消費するので、再帰呼び出し関数内のローカル変数は大きものはほぼ取れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

pblc

Re: メモリ領域について

#4

投稿記事 by pblc » 14年前

なるほど…。変数が動的か静的かぐらいの違いかと思っていたけれど、
やっぱりそれに合わせてメモリの確保の仕方も変わってくるんですね。
お二方ありがとうございました。

閉鎖

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