Статические переменные в глобальной и локальной области видимости в C

У меня есть следующая программа на C

 #include <stdio.h> 

 static int aa = 10;          

 void func(){
    static int aa = 9;
    printf("%d\n",aa);

}
int main()
{ 
    func();
    return 0;
}

Выход 9.

Когда я использовал команду nm, чтобы увидеть результат, я получил это

0000000000601038 d aa
000000000060103c d aa.2286
0000000000601040 B __bss_start
0000000000601040 b completed.7585
0000000000601028 D __data_start
0000000000601028 W data_start
0000000000400460 t deregister_tm_clones
00000000004004e0 t __do_global_dtors_aux
0000000000600e18 t __do_global_dtors_aux_fini_array_entry
0000000000601030 D __dso_handle
0000000000600e28 d _DYNAMIC
0000000000601040 D _edata
0000000000601048 B _end
00000000004005d4 T _fini

В первых двух строках указано, что обе переменные находятся в сегменте данных, но что это 2286 во втором ряду. На что это указывает?

1 ответ

Решение

Это указывает на локальную статическую переменную aa из сферы funcэта переменная инициализируется динамическим загрузчиком системы только один раз. Он не виден снаружи блока перевода, но также находится в data сегмент, так как это где инициализация выполняется быстро в начале.

Индекс 2286 генерируется случайным образом, так что если вы объявите много переменных с именем aa статически в разных локальных областях, чтобы иметь возможность различать друг друга и в то же время сохранять все в data сегмент.

Другие вопросы по тегам