2010-06-22 2 views

ответ

3

Сам язык C не предусматривает использование стека вообще - он определяет поведение, а не реализацию.

Однако, в общем случае, стек программа используется для хранения нескольких вещей:

  • объекты, объявленные с auto продолжительности хранения (т. Е обычные, не- static локальных переменных);
  • Функциональные параметры;
  • Адрес возврата (место в коде, где выполнение должно возобновиться после return; или конец текущей функции);
  • Память, выделенная нестандартной функцией alloca();
  • Временные значения, требуемые компилятором, такие как сохраненное содержимое регистров, служебная информация для alloca(), размер массивов переменной длины и промежуточные значения, используемые в расчетах.

Это не исчерпывающий список. В стеке также иногда хранятся другие, более экзотические вещи, такие как Trampolines. В общем, это временная область хранения для рабочих элементов, которая не понадобится после того, как текущая функция вернется к ее вызывающей стороне.

«backtrace» в отладчике показывает некоторые (но не все) содержимое стека.

+0

вы можете pl. дайте мне указатель на alloca()? – KedarX

0

см ссылку ниже, которая может дать вам лучшее представление Variables and Memory

дает трассировки стека перед коррупцией памяти стека happens.that следа серии вызовов функций, которые были вместе с переданными аргументами.

+0

Я думал, что дамп памяти отличается от дампа ядра. Также что такое содержимое стека программ? Скажем, я сделал рекурсивный вызов функции 3 раза, и функция имеет 2 локальные переменные, 2 статические переменные, 2 динамически выделенных указателя и 2 глобальных переменных. –

+0

@Praveen Статические переменные не являются частью фрейма стека, динамически выделенные указатели находятся в куче, а функции не могут иметь глобальных переменных или они не будут глобальными. [Ответ Ори] (http://stackoverflow.com/questions/3090333/what-are-the-exact-contents-of-a-program-stack-in-c/3090400#3090400) охватывает то, что присутствует в кадре стека ; там будет один для каждого звонка –

+0

@Michael Mrozek - За исключением, может быть, вызовов, которые были оптимизированы, встроены или иным образом запущены компилятором ... У компиляторов не требуется реализовать какое-либо конкретное соглашение о вызове или ABI. –

2

Стек - это область памяти, которая содержит подпрограммы, локальные переменные и обратные адреса из подпрограмм.

На многих архитектурах, включая Intel, стек растет сверху вниз - это означает, что указатель стека уменьшается каждый раз, когда данные помещаются в стек.

Типичная последовательность вызова функции будет выглядеть следующим образом:

  • Нажмите на аргументы
  • Перейти к подпрограмме (который выталкивает адрес возврата в стек)
  • В некоторых языках (Pascal, например) базовый указатель помещается в стек.
  • Вызываемая подпрограмма выделяет пространство для стека для локальных переменных.

Чтобы создать трассировку стека, среда выполнения просто сканирует стек, чтобы определить, куда указывают обратные адреса. Я написал «просто», но это не так просто, если базовые указатели не были сохранены в стеке, потому что было бы невозможно определить, где находятся кадры стека, отличные от текущего.

Смежные вопросы