全局变量如何存储在内存中?

时间:2019-10-16 03:58:17

标签: c global-variables objdump

我的代码如下:

#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 个答案:

答案 0 :(得分:4)

  

全局变量应按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)之类的一些奇怪(未定义行为)变量,则无论事物的布局如何,您的代码都能正常工作在内存中。