Выделение памяти для сегмента данных происходит неправильно для каждой статической и глобальной (неинициализированная / инициализированная переменная)
Я пытаюсь понять, как распределение памяти работает для любого кода C, который выполняется или компилируется.
Я написал следующие 5 отдельных небольших кодов, которые помогут мне понять процесс выделения памяти.
segment_size1.c
int main(){ printf("hellow world"); return 0; }
segment_size2.c
//Adding uninitialized static int variable This would increase the size of BSS by 4 bytes. int main() { static int mystatic; printf("Hellow world"); return 0; }
segment_size3.c
// Adding initialized static int variable, this would increase the size of initialized data // segment by 4 bytes. int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
segment_size4.c
// Adding un-initialized global int variable, this would increase the size of BSS segment by 4 bytes. int myglobal; int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
segment_size5.c
// Adding initialized global int variable, this would increase the size of data segment by 4 bytes. int myglobal; int myglobal2 = 500; int main() { static int mystatic; static int mystatic1 = 100; printf("Hellow world"); return 0; }
Насколько я понимаю, если мы скомпилируем вышеуказанные файлы, то после компиляции сегмент_сайта2.с размер BSS должен увеличиваться на 4 байта, а после компиляции сегмент_сайз3.с размер данных должен увеличиваться на 4 байта. Но когда я нажал команду размера, я получил следующие результаты,
size segment_size1 segment_size2 segment_size3 segment_size4 segment_size5
text data bss dec hex filename
1217 560 8 1785 6f9 segment_size1
1217 560 8 1785 6f9 segment_size2
1217 564 12 1793 701 segment_size3
1217 564 12 1793 701 segment_size4
1217 568 16 1801 709 segment_size5
Здесь мы можем ясно видеть, что bss и сегмент данных одновременно обновляются после компиляции сегмент__размера3. Как это возможно?
1 ответ
Мы ясно видим, что bss и сегмент данных одновременно обновляются
Это различие между тем, где сохранены начальные значения!= 0 и где статические / глобальные переменные
Перед основным выполнением начальные значения!= 0 копируются в глобальные / статические переменные, глобальные / статические переменные, имеющие начальное значение 0, также, конечно, устанавливаются в 0