質問: プログラムを作成して実行するとそのプロッセスがもつ固有の仮想メモリが存在しますよね?? 疑問なのが int func(int x, int y){ return x + y; } このように関数を作った場合、int x, int y は自動変数(スタック)に積まれますよね?? スタックはプロッセスがもつ仮想メモリ内に存在するものなのですか?? また、静的変数はメモリ上のどこに存在するのでしょう??スタックではないですよね? ローカル変数やパラメータの変数も基本的には自動変数に確保されるんですよね?? では、C言語のプログラミングにおける、変数宣言のほとんどはスタック上に確保しているということですよね? また、malloc()などにおけるビープ領域とはメモリ上のどこでしょうか?? これはスタック上ですか??(なんか違いそうですが・・・) 疑問がたくさんあってすいません。 どなたか教えてください!!
回答: (以下は、一般的なOS上での振る舞いとして解釈下さい) > > プログラムを作成して実行するとそのプロッセスがもつ固有の仮想メモリが存在しますよね?? > > > OSは、プロセスごとに独立した仮想メモリ(空間)を割り当てます。また、仮想メモリ空間を用途別に下記のように分類します。 * スタック領域 * ヒープ領域 * 静的データ領域 > > このように関数を作った場合、int x, int y は自動変数(スタック)に積まれますよね?? > > > 大抵のケースで、はい。ただし関数引数の場合は、レジスタ渡しと併用されることが多いです。 > > スタックはプロッセスがもつ仮想メモリ内に存在するものなのですか?? > > > 前述の通り、はい。 > > また、静的変数はメモリ上のどこに存在するのでしょう??スタックではないですよね? > > > 前述の通り、それ専用の領域が存在します。 > > ローカル変数やパラメータの変数も基本的には自動変数に確保されるんですよね?? > > > 正確に表現するならば「自動変数に確保」ではなく、「ローカル変数は自動変数の一種であり、それはスタック領域に確保されるケースが多い」です。また「関数パラメータの変数では、スタック領域またはレジスタ渡しが行われ」ます。 > > C言語のプログラミングにおける、変数宣言のほとんどはスタック上に確保しているということですよね? > > > プログラムに依存しますが、概ねYESです。 > > また、malloc()などにおけるビープ領域とはメモリ上のどこでしょうか?? > > > 前述の通り。 > > これはスタック上ですか??(なんか違いそうですが・・・) > > > 前述の通り、スタック領域とヒープ領域は別物です。