Выделение памяти для сегмента данных происходит неправильно для каждой статической и глобальной (неинициализированная / инициализированная переменная) - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь понять, как работает распределение памяти для любого кода C, который выполняется или компилируется.

Я написал следующие 5 отдельных небольших кодов, которые помогут мне понять процесс выделения памяти.

  1. segment_size1.c

    int main(){
        printf("hellow world");
        return 0;
    }
    
  2. 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;
    }
    
  3. 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;
    }
    
  4. 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;
    }
    
  5. 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 Ответ

0 голосов
/ 09 января 2019

Мы ясно видим, что сегмент bss и data одновременно обновляется

Это различие между тем, где сохранены начальные значения! = 0, и статическими / глобальными переменными

Перед выполнением main начальные значения! = 0 копируются в глобальные / статические переменные, глобальные / статические переменные, имеющие начальное значение 0, также устанавливаются в 0, конечно,

...