Мы говорим, что глобальные переменные и статические переменные всегда инициализируются равными 0. Тогда мой вопрос: почему у нас есть отдельные секции в двоичном файле для инициализированных и неинициализированных данных.
Я написал следующий код -
int i;
int j=0;
static int k;
static int l=0;
int main()
{
static int m=0;
static int n;
printf("%d, %d\n",i,j);
printf("%d, %d\n",k,l);
printf("%d, %d\n",m,n);
return 0;
}
И вывод был -
0, 0
0, 0
0, 0
Я проверил вывод objdump секции bss, и только этот раздел содержал переменные.Но по ссылке -
http://www.cprogramming.com/tutorial/virtual_memory_and_heaps.html
Как правило, в каждом процессе виртуальная память, доступная этому процессу, называется его адресным пространством.Адресное пространство каждого процесса обычно состоит из 6 разделов, которые показаны на следующем рисунке: раздел среды - используется для хранения переменных среды и аргументов командной строки;стек, используемый для хранения памяти для аргументов функций, возвращаемых значений и автоматических переменных;куча (свободное хранилище), используемая для динамического выделения, две секции данных (для инициализированных и неинициализированных статических и глобальных переменных) и текстовая секция, где хранится фактический код.
Итак, я просто запутался,Если у нас есть два раздела данных, почему все данные помещаются в раздел .bss?А также я хочу понять, что содержит .data.
Может кто-нибудь помочь мне в этом?