Es gibt zwei große Speicherbereiche, den Heap und den Stack. Auf dem Stack werden Rücksprungadressen, Parameter und lokale Variablen abgelegt. Auf dem Heap die globalen, Arrays, Objekte (bei Konstanten bin ich mir nicht sicher) etc.
Der Stack arbeitet nach dem FiLo Prinzip: First in, last out. Also wie ein Stapel. Bekanntestes Beispiel ist wohl ein Tellerstapel, den Teller den ich als erstes hinstelle, kann ich nur als letztes wegnehmen, wenn ich alle anderen erst wieder runtergenommen habe. Das Betriebssystem reserviert pro Thread, wenn nicht anders angegeben 1 MB (oder waren es zwei?).
Auf den Heap kann ich "wahlfrei" über die Adresse zu greifen. Wie groß der nun ist, kann ich allerdings nicht sagen. Er wird wahrscheinlich dynamisch angepasst werden, je nach dem wie viel Speicher deine Anwendung braucht, kann also wachsen. Sprich, dine anwendung vordert ihn von windows an und windows gibt dir einen gültigen Adressbereich zurück. Im Gegensatz zum Stack, kann der Heap auch fragemntiert sein, was sich aus dem Prinzip ergibt, wie er verwaltet wird. Wobei der Heap von dem einem Ende des Adressbereiches wächst und der Stack von dem anderen. Insgesamt steht deiner Anwendung unter 32-Bit Windows ein 4 GB großer Adressraum zur Verfügung. Da man mit 32 Bit $00000000 bis $FFFFFFFF speicheradressen ansprechen kann. Wobei effektiv nutzen kann er da von nur 2 GB, der Rest wird für Systemcode benötigt, der in den Adressraum deiner Anwendung gemappt wird.
So, das ist alles, was ich über den Heap und den Stack weiß. Ich hoffe, ich habe nicht zu viel Mist erzählt. Man möge mich verbessern und ergänzen, falls dem so sein sollte.