Расположение в памяти аргумента функции - PullRequest
1 голос
/ 11 января 2012

Я готовлюсь к экзамену по UNIX, и есть вопрос о расположении в памяти переменных C. Допустим, у нас есть такой код

char sth;
int some_function(int arg) {
   int some_int;
   // some code here
}

поэтому я предполагаю, что sth находится в куче, some_int в стеке, но где находится arg? Может кто-нибудь объяснить, как управляются переменные C?

Спасибо

Ответы [ 7 ]

4 голосов
/ 11 января 2012

Обратите внимание, что все это зависит от реализации.Стандарт C даже не произносит слова stack, heap и так далее.Это просто говорит о поведении, которое ожидается от переменных в зависимости от их хранения (static, extern, register и т. Д.).

Сказав это, обычно arg будет находиться в кадре стека, который предоставляется для функции.Его область действия ограничена только функцией some_int.

Кстати, sth не в куче, у него статическое глобальное хранилище.

1 голос
/ 11 января 2012

Все здесь полностью зависит от платформы, и на самом деле не о языке C, а о том, как это делает мой компилятор.

sth имеет статическое (глобальное) хранилище, поэтому его, вероятно, нет в куче, а скорее в сегменте глобальных данных. some_int действительно находится в фрейме локального стека some_function. Переменная arg заполняется в some_function, но где она живет, зависит от компилятора и того, что обычно называют «соглашением о вызовах»: она может быть размещена и очищена в кадре стека вызывающей или вызываемой стороны, и вызывающим абонентом или вызываемым абонентом, в зависимости от условных обозначений, либо передается в регистр и вообще не помещается в память.

0 голосов
/ 11 января 2012

зависит от реализации;аргументы могут быть помещены в кадр стека, или они могут быть записаны в регистры, или они могут быть переданы каким-либо другим механизмом.

Определение языка не требует, где должны храниться различные объекты;он только определяет, как должны вести себя эти объекты.

0 голосов
/ 11 января 2012

sth, вероятно, находится в статическом блочном хранилище (он же "BSS", в зависимости от платформы):

Опять же, это полностью "зависит от платформы", но обычно есть четыре области "сегменты ", где вы можете выделить переменное пространство из:

a) Кучи: среда выполнения вашего языка управляет данными" кучи ", например, с помощью вызовов" malloc () "или" new ")

b) Стек: это «автоматические» переменные

c) BSS: неинициализированные (переменные) статические данные

d) Данные: инициализированные (и часто только для чтения) статические данные

http://en.wikipedia.org/wiki/Data_segment

0 голосов
/ 11 января 2012

Аргументы (за очень немногими исключениями) передаются в стек.

Вы должны быть в состоянии проверить, что они в вашей компьютерной архитектуре, просто сделав;

printf("%p - %p\n", &arg, &some_int);

Обычно они должны находиться в нескольких байтах друг от друга.

Редактировать: Как уже отмечалось, sth выделяется не в куче, а в сегменте данных программы, т.е. компилятор уже выделил память во время компиляции.

0 голосов
/ 11 января 2012

sth находится в статической памяти, arg и some_int находятся в стеке. arg копируется ("выталкивается") в стек при вызове some_function. Куча является динамической памятью и содержит данные, выделенные во время выполнения (например, malloc).

0 голосов
/ 11 января 2012

arg будет находиться в стеке (по крайней мере, для настольных платформ).

Прочтите документ под названием «Разбить стек ради удовольствия и прибыли», и вы поймете, как управлять памятью в C.

...