Функции не используют фиксированные области памяти для своих переменных. Каждый раз, когда вызывается функция, она получает новые области памяти для использования для своих переменных.
Способ, которым большинство систем реализует это, заключается в том, что вся программа имеет зарезервированную область памяти, называемую стек, Существует указатель стека (SP), который указывает текущую часть стека, где используется. Всякий раз, когда функция запускается, она меняет SP так, чтобы он указывал на новую область в стеке. Затем он сохраняет все свои локальные переменные в местоположениях относительно нового значения SP, таких как SP + 4, SP + 8, SP + 24 и т. Д. Когда функция возвращается, она восстанавливает SP к своему предыдущему значению.
Таким образом, c
при каждом вызове reverseSentence
находится в другом месте.
Чаще всего указатель стека начинается с некоторого высокого адреса, определяемого операционной системой и программным загрузчиком, и он растет «вниз», что означает, что, когда функции требуется больше места в стеке, она вычитает некоторое число из указателя стека, чтобы получить более низкое значение адрес. Когда функция возвращается, она меняет ее, добавляя тот же номер (или загружая предыдущее значение указателя стека из места, где оно было сохранено).