El comportamiento de la pila (creciendo o disminuyendo) depende de la interfaz binaria de la aplicación (ABI) y de cómo se organiza la pila de llamadas (también conocido como registro de activación).
A lo largo de su vida, un programa está obligado a comunicarse con otros programas como OS. ABI determina cómo un programa puede comunicarse con otro programa.
La pila para diferentes arquitecturas puede crecer de cualquier manera, pero para una arquitectura será consistente. Consulte este enlace wiki. Pero, el crecimiento de la pila lo decide la ABI de esa arquitectura.
Por ejemplo, si toma MIPS ABI, la pila de llamadas se define a continuación.
Consideremos que la función 'fn1' llama a 'fn2'. Ahora el marco de pila visto por 'fn2' es el siguiente:
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
Ahora puede ver que la pila crece hacia abajo. Entonces, si las variables se asignan al marco local de la función, las direcciones de la variable en realidad crecen hacia abajo. El compilador puede decidir el orden de las variables para la asignación de memoria. (En su caso, puede ser 'q' o 's' el primero en asignar memoria de pila. Pero, generalmente, el compilador hace la asignación de memoria de pila según el orden de la declaración de las variables).
Pero en el caso de las matrices, la asignación tiene un solo puntero y la memoria que se debe asignar será en realidad apuntada por un solo puntero. La memoria debe ser contigua para una matriz. Entonces, aunque la pila crece hacia abajo, para las matrices la pila crece.