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