Организация данных в стеке на C? - PullRequest
1 голос
/ 04 марта 2011

Я изучаю язык Си и у меня есть несколько вопросов. Когда мы объявляем переменную, такую ​​как int i = 0. i имеет адрес в стеке, верно?

Мне интересно, как функция организована в памяти. Например, у меня есть функция:

int myF() {
  int x = 2, y = 3;
  int z = x + y;
  return x;
}

Как этот метод организован в стеке? Я имею в виду, что имя " myF " имеет адрес памяти, как и другие varialbes? И " myF " должен иметь что-то вроде конечного адреса, чтобы указать, где находится конец функции?

Я не прав?

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 04 марта 2011

Диаграмма поможет показать, как она организована:

Макет стека

  • Локальные переменные (например, i в вашем примере) могут находиться в стеке, но это зависит от компилятора. Типичный макет стека покажет область локальных переменных, но, например, некоторые компиляторы могут вместо этого использовать регистр для переменной.
  • Имя myF не имеет адреса, но функция имеет. Адрес обычно будет находиться в отдельной области исполняемого кода.
  • Не существует «конечного адреса» - вместо этого обратный адрес сохраняется вызывающей функцией. Когда myF достигает конца функции и выполняет какие-либо операции очистки, он будет переходить к адресу возврата. На самом деле это может быть проблемой, потому что есть некоторые эксплойты, которые пытаются изменить этот обратный адрес и заставить код переходить во вредоносный код.
1 голос
/ 04 марта 2011

У i есть адрес в стеке, верно?

Не обязательно.

Как этот метод организован в стеке?

Ответ зависит от архитектуры компилятора и процессора.Некоторые компиляторы хранят локальные переменные в стеке.Другие будут использовать регистры.

Проверьте этот вопрос область видимости переменных для дальнейшего обсуждения.

1 голос
/ 04 марта 2011

Обычно код функции хранится отдельно в сегменте памяти только для чтения, и стек («автоматическое хранение») не перекрывается с этим. Также имя myF исключается во время компиляции, и функция становится просто фрагментом кода, начинающимся с некоторого адреса и заканчивающимся специальной инструкцией процессора, означающей «возврат из текущей функции».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...