すでに述べたように、サイズはOS固有です。たとえば、Visual Studioを使用するWindowsの場合、デフォルトのスタックサイズは1MBです。
msdn
Linuxでは、次のコマンドで現在のコマンドを表示できます。
ulimit -s or -a
私のLinuxmint64ビットでは、8192KBを示しています。
メモリにロードされたときのすべてのプログラムには、いくつかのセグメントがあります。アセンブリでは、.data、.codeなどのプレフィックス(intelx86)を使用してそれぞれを示すことができます。
これは、いくつかのサブセクションを持つデータセグメントです。スタックとヒープの両方が、他のいくつかに加えてその一部です。
スタックは暗黙的に大きくなることもあります。つまり、別の関数呼び出しを行うと、アクティベーションレコードがスタックにプッシュされ、スタックのメモリをより多く使用します。そのため、プログラムが割り当てられたスタックを使い果たすと、無限再帰によってクラッシュが発生します。
関数呼び出しが戻ると、そのアクティベーションレコードがポップされ、スタックが縮小します。
対照的に、ヒープは反対方向から成長し、動的に割り当てられたすべてのメモリを含みます。
これらの2つのセグメントが反対方向に成長する理由は、それらを組み合わせたメモリの使用率を最大化するためです。コメントで述べたように、これはAC標準ではありませんが、ほとんどの一般的なOSにはこれが実装されていることに注意してください。
------スタックが開始します-----------スタックが下に成長します
--------互いに交差しない限り、プログラムは実行できます。
-------ヒープが開始します------------ヒープが上向きに成長します
プログラムがヒープを使用しない場合、スタックはヒープのメモリも含めて最大のメモリを利用できます。プログラムが再帰呼び出しをほとんど行わず、最小限のローカル変数を使用する場合(つまり、スタックに使用するメモリが少ない場合)、ヒープを最大限に活用できます。
データセグメントの他の部分は、初期化されていない静的変数などのフィールドを含む可能性のあるBSSなどです。