Поведение стека (рост или уменьшение) зависит от двоичного интерфейса приложения (ABI) и того, как организован стек вызовов (также известный как запись активации).
На протяжении всей своей жизни программа обязана взаимодействовать с другими программами, такими как ОС. ABI определяет, как программа может взаимодействовать с другой программой.
Стек для разных архитектур может расти в любом случае, но для архитектуры он будет согласованным. Пожалуйста, проверьте эту ссылку в вики. Но рост стека определяется ABI этой архитектуры.
Например, если вы возьмете MIPS ABI, стек вызовов определяется следующим образом.
Давайте рассмотрим, что функция «fn1» вызывает «fn2». Теперь кадр стека, который видит 'fn2', выглядит следующим образом:
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
Теперь вы можете видеть, что стек растет вниз. Таким образом, если переменные размещены в локальном фрейме функции, адреса переменных фактически растут вниз. Компилятор может выбрать порядок переменных для выделения памяти. (В вашем случае это может быть либо 'q', либо 's', которое является первой выделенной памятью стека. Но, как правило, компилятор выделяет память стека в соответствии с порядком объявления переменных).
Но в случае массивов выделение имеет только один указатель, и память, которую необходимо выделить, будет фактически указана одним указателем. Для массива память должна быть непрерывной. Итак, хотя стек растет вниз, для массивов стек растет вверх.