Zachowanie stosu (rośnie lub rośnie) zależy od interfejsu binarnego aplikacji (ABI) i sposobu organizacji stosu wywołań (inaczej rekordu aktywacji).
Przez cały okres swojego życia program musi komunikować się z innymi programami, takimi jak system operacyjny. ABI określa, w jaki sposób program może komunikować się z innym programem.
Stos dla różnych architektur może rosnąć w obie strony, ale w przypadku architektury będzie spójny. Sprawdź ten link wiki. Ale o wzroście stosu decyduje ABI tej architektury.
Na przykład, jeśli weźmiesz MIPS ABI, stos wywołań jest zdefiniowany jak poniżej.
Rozważmy, że funkcja „fn1” wywołuje „fn2”. Teraz ramka stosu widziana przez 'fn2' wygląda następująco:
direction of | |
growth of +---------------------------------+
stack | Parameters passed by fn1(caller)|
from higher addr.| |
to lower addr. | Direction of growth is opposite |
| | to direction of stack growth |
| +---------------------------------+ <-- SP on entry to fn2
| | Return address from fn2(callee) |
V +---------------------------------+
| Callee saved registers being |
| used in the callee function |
+---------------------------------+
| Local variables of fn2 |
|(Direction of growth of frame is |
| same as direction of growth of |
| stack) |
+---------------------------------+
| Arguments to functions called |
| by fn2 |
+---------------------------------+ <- Current SP after stack
frame is allocated
Teraz możesz zobaczyć, że stos rośnie w dół. Tak więc, jeśli zmienne są przydzielone do lokalnej ramki funkcji, adresy zmiennych faktycznie rosną w dół. Kompilator może zdecydować o kolejności zmiennych do alokacji pamięci. (W twoim przypadku może to być „q” lub „s”, które jest pierwszą przydzieloną pamięcią stosową. Ale generalnie kompilator dokonuje alokacji pamięci stosu zgodnie z kolejnością deklaracji zmiennych).
Ale w przypadku tablic alokacja ma tylko jeden wskaźnik, a pamięć, która ma zostać przydzielona, będzie faktycznie wskazywana przez pojedynczy wskaźnik. Pamięć musi być ciągła dla tablicy. Tak więc, chociaż stos rośnie w dół, w przypadku tablic stos rośnie.