Для глобальных определений, которые имеют одно и то же имя, мы выделяем память для каждого из них?
Будут ли линкеры влиять на то, как мы распределяем память для этих глобальных символов?
Вот что я подумал о возможных способах решения этой проблемы:
1. Сначала мы выделяем память для глобальных переменных, когда встречаем их в программе. (Каждое определение будет иметь память.) Затем компоновщики разрешат глобальные символы.
2.После того, как компоновщики разрешат глобальные символы с одинаковыми именами, определенными в нескольких местах, мы выделяем память только для одного определения.
Один из них правильный?
Пример:
b.c
#include <stdio.h>
#include "a.c"
void f(void);
int x = 15213;
int main()
{
f();
printf("x = %d\n", x);
return 0;
}
a.c
#include <stdio.h>
int x;
void f()
{
printf("x in f = %d\n", x);
x = 15212;
}
Приведенный выше код скомпилирован и запущен без каких-либо ошибок или предупреждений.
Вот что я получаю:
x in f = 0
x = 15212
У нас есть одно определение х в памяти или два?
Один быстрый вопрос, связанный с этим:
Глобальные и статические переменные хранятся в Сегменте данных (DS) при инициализации и начинаются с блока по символу (BSS) при неинициализации. Несмотря на то, что данные в BSS не инициализированы, они всегда будут иметь значение по умолчанию вместо значения мусора. Это правильно?