main関数のみのあるプログラムで二次元配列の要素数を500から1000にした所、セグメンテーション違反が起こったので
配列の宣言をstaticにしたら正しくコンパイルされたのですが、いまいち正しくコンパイルされた理由がわかりません。
静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
ちなみに処理系はgccです。
メモリ領域について
Re: メモリ領域について
静的領域は実行可能ファイルをメモリにロードする段階でサイズがはっきり分かりますから、それにあわせて領域が確保されます。pblc さんが書きました:静的変数はメモリを最後まで確保するのでむしろ自動変数より余計にメモリを食うと思うのですが…
それともスタック領域より静的領域のほうがメモリのサイズが大きいということでしょうか?
したがって、基本的にいくらでも静的領域に変数を確保することができます。
対照的に、スタック領域はメモリへのロード段階でははっきりした使用量が分かりません。動的に使用量が変化するからです。
ですから、通常はリンク時に決め打ちした容量でスタック領域が確保されます。
実行時にその領域を飛び出すくらい多く変数を確保するとだめになります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: メモリ領域について
補足的に書くとWindows/Linux/MacなどのOSの場合の話はサイズだけですが、マイコンなどの場合はリンク時に明示的にスタックで使用するメモリの場所やサイズを決めてやる必要がある上にかなり小さくなることが多いです。
それとスタックは再帰呼び出しが深くなる毎に消費するので、再帰呼び出し関数内のローカル変数は大きものはほぼ取れません。
それとスタックは再帰呼び出しが深くなる毎に消費するので、再帰呼び出し関数内のローカル変数は大きものはほぼ取れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
pblc
Re: メモリ領域について
なるほど…。変数が動的か静的かぐらいの違いかと思っていたけれど、
やっぱりそれに合わせてメモリの確保の仕方も変わってくるんですね。
お二方ありがとうございました。
やっぱりそれに合わせてメモリの確保の仕方も変わってくるんですね。
お二方ありがとうございました。