В C основной скомпилирован так же, как и любая другая функция: любые переменные, объявленные в главном, будут «выделены» в стеке. Фрейм стека - это часть стека, которая используется одним вызовом функции. Рамка содержит слоты для всех локалей, используемых внутри функции. Эта память считается временной, поскольку, когда функция возвращается, этот кадр будет выскользнут из стека.
Компилятор C назначит статический адрес глобальным переменным. Этот адрес считается частью двоичного «изображения» и как таковой имеет статическое местоположение в памяти. Компилятор C знает размер каждого типа, поэтому он может выделять соответствующее пространство в макете памяти двоичного файла для каждой глобальной переменной. Затем любой код, который обращается к этой переменной, просто ссылается на этот адрес.
Вы можете проверить адрес переменной с кодом, как это:
#include<stdio.h>
int i;
void foo(int n)
{
if(n > 2)
return;
printf("From foo &n = %xd\n", &n);
printf("From foo &i = %xd\n", &i);
foo(n+1);
}
int main()
{
printf("&i = %xd\n", &i);
foo(0);
return 0;
}
Выполнение этого кода производит вывод, подобный:
./a.out
&i = 600934d
From foo &n = 38bc4efcd
From foo &i = 600934d
From foo &n = 38bc4eccd
From foo &i = 600934d
From foo &n = 38bc4e9cd
From foo &i = 600934d
Есть две вещи, которые вы должны заметить здесь:
- Адрес i является постоянным каждый раз, когда он ссылается
- Адрес n (переменная, локальная для функции
foo
, изменяется при каждом вызове foo. Фактически, он будет уменьшаться каждый раз, так как стек растет вниз.
Пожалуйста, внесите свой вопрос. Двойные пробелы разрывают линию. –
как-то у меня такое ощущение, что ваш вопрос неоднозначен, а ваше имя и описание вопроса непоследовательны. – 2009-06-06 16:16:44
Если речь идет о распределении памяти для разных областей на C, тогда заголовок должен быть отредактирован в соответствии с этим. – Doug