Как глобальные переменные хранятся в памяти? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть следующий код:

#include <stdio.h>
int g_a;
int g_b;
int g_c;

int main()
{
    printf("Hello world\n");
    return 0;
}

И создайте его с помощью gcc

gcc -o global global.c

Наконец, я использую objdump для просмотра адреса глобальных переменных

objdump -t global

И посмотрите результат:

00004020 g_b
00004024 g_a
00004028 g_c

Почему глобальные переменные хранятся в адресах, как указано выше? Я имею в виду глобальные переменные должны храниться в порядке g_a, g_b, g_c

1 Ответ

4 голосов
/ 16 октября 2019

глобальные переменные должны храниться в следующем порядке: g_a, g_b, g_c

Нет, порядок, в котором они выделяются памяти, никак не влияет на доступ к ним или нет. .

Если вы хотите, чтобы они были в определенном порядке, вы можете сделать это, поместив их в struct и объявив что-то вроде:

#include <stdio.h>

typedef struct {
    int g_a;
    int g_b;
    int g_c;
} tOrderGuaranteed;

tOrderGuaranteed myStruct;

int main()
{
    printf("Hello world\n");
    // Use 'myStruct.g_a' rather than 'g_a'.
    return 0;
}

Но, как уже говорилось, этоПохоже, это вам не особо выгодно, тем более что компилятор может свободно вставлять отступы по своему усмотрению между этими элементами и после них.

При условии, что вы используете g_b для доступа к этому (исходный неструктура)переменная, а не какой-то странный (неопределенное поведение) вариант, такой как *(&g_a+1), ваш код будет работать нормально независимо от того, как все расположено в памяти.

...