Le comportement de la pile (grandir ou diminuer) dépend de l'interface binaire de l'application (ABI) et de l'organisation de la pile d'appels (aka enregistrement d'activation).
Tout au long de sa vie, un programme est tenu de communiquer avec d'autres programmes comme OS. ABI détermine comment un programme peut communiquer avec un autre programme.
La pile pour différentes architectures peut croître dans les deux sens, mais pour une architecture, elle sera cohérente. Veuillez vérifier ce lien wiki. Mais la croissance de la pile est décidée par l'ABI de cette architecture.
Par exemple, si vous prenez l'ABI MIPS, la pile d'appels est définie comme ci-dessous.
Considérons que la fonction 'fn1' appelle 'fn2'. Maintenant, le cadre de pile tel que vu par 'fn2' est le suivant:
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
Vous pouvez maintenant voir que la pile se développe vers le bas. Ainsi, si les variables sont allouées à la trame locale de la fonction, les adresses de la variable croissent en fait vers le bas. Le compilateur peut décider de l'ordre des variables pour l'allocation de mémoire. (Dans votre cas, ce peut être «q» ou «s» qui est la première mémoire de pile allouée. Mais, généralement, le compilateur fait l'allocation de mémoire de pile selon l'ordre de la déclaration des variables).
Mais dans le cas des tableaux, l'allocation n'a qu'un seul pointeur et la mémoire à allouer sera en fait pointée par un seul pointeur. La mémoire doit être contiguë pour un tableau. Ainsi, bien que la pile augmente vers le bas, pour les tableaux, la pile grandit.