昨日の補充
初期化を行っている2つの変数
(global_initialized_varとstatic_initialized_var)の
メモリアドレスは低位に、つまり『データセグメント』に確保されている。0x080497ecぐらい
初期化を行っていない2つの変数
(global_varとstatic_var) bssセグメントに確保されている
bssセグメントはデータセグメントの直下にあるため、bssセグメントに確保された変数のアドレスは先ほどの変数のアドレスより少し高位。0x080497f8
この2つのメモリセグメントはコンパイルを行えばすぐにそのサイズを確定されるため、『隣接』する。
『だから、記憶領域を無駄無く使える』
ヒープを指すポインタ変数(heap_var_ptr) = (int *) malloc(4) は,malloc()関数によって割り当てたメモリ、 bssセグメントの直下に位置しているヒープセグメントのサイズが固定されていないのは、実行時に動的なメモリ割り当てを可能にするため。0x0804a008
最後に stack_var のような変数は非常に大きい(高位)なアドレスにあります。なぜなら、これらの変数がスタックセグメントに位置しているからです。
スタックもヒープセグメントのどちらも(サイズが)固定されていないが、ヒープセメントがメモリアドレスの低位から高位に向かって成長する一方で、スタックセグメントはメモリアドレスの高位からヒープセグメントのある低位に向かって成長するようになっている。0xbffff814
『なぜなら』
双方のメモリセグメントともに記憶領域を無駄にせずに、成長させる必要があるからです。
function(){int stack_var;} int main()のように、function()関数から先に定義してもその情報を格納するためのあたらなスタックフレームが作成される。
といった方が分かりやすい。
と思います。