>intの10要素の配列を3つほど宣言し、先頭アドレスを表示させてみたところ、
>たしかに、あとから宣言したものほど、低いアドレスに置かれていますね…
> (linux x86_64, gcc 14.2.1)
>不思議… なんでなのでしょう?
これはCの問題でもOSの問題でもなく、CPUの問題です。
たいていのCPUにはサブルーチンコールのためのCALL命令があり、戻り先をスタックに
積みます。これは機械語レベルの命令なのですが、この時、スタックはアドレスが小さい方に
向けて伸びるCPUが多いと思います。たとえば、おっさんプログラマならだれでも知っている
大昔の8ビットCPU Z80(1976年発表)でも、CALLすると、スタックの先頭を指しているレジスタで
あるSPの値は減ります。
http://www.yamamo10.jp/yamamoto/comp/Z80/instructions/index.php#CALL_RETURN
スタックがどちら向きに伸びるのかは、どっちでもよいようなものではありますが、
限られたメモリの中でプログラムを書く場合、プログラマが管理する領域は上から下に、
スタックは下から上に伸ばすようにしていけば、最後までメモリを使い切れる、という
事情はあったのではないかと思います。
今のCPU/言語でも、ポインタ完全制覇のFig2-3にあるように、malloc()で伸びる領域と
スタックの領域の間には広大な空間があるわけです。
Wikipediaを見てみたら、以下の記述がありました。
| 昔のコンピュータで、ヒープ領域をアドレスの小さいほうから大きいほうへ伸ばし、
| スタックを大きいほうから小さいほうへ伸ばす(そのようにすると、メモリが足りない場合は
| どちらを伸ばす余裕もなく、完全にメモリを使い切って計算続行不可能となる)という
| 設計にした名残りから、アドレスの大きいほうから小さいほうへ伸びるものが多いが、
| PA-RISCは逆である。
逆のものもあるようですね。
もっとも、Cの場合、スタックを「アドレスの小さい方へ」伸ばすようにした結果、
バッファオーバーフロー脆弱性がずいぶんと狙いやすくなった、という実害が出ていますが……