我正在阅读《计算机系统:程序员的视角》,我发现了以下 C 文件:
Foo.c:
void f(void);
int x = 15213;
int y = 15212;
int main()
{
f();
printf("x = 0x%x y = 0x%x \n", x, y);
return 0;
}
条形图:
double x;
void f()
{
x = -0.0;
}
使用 gcc -o foobar foo.c bar.c 编译并给出以下输出:
x = 0x0 y = 0x80000000
哇。因此,由于 int 是 4 个字节,而 double 是 8 个字节(无论如何在我的系统上)并且 x 的强符号在 Foo.c 中,x 被分配了 -0.0 的十六进制表示,这反过来也覆盖了 y!
所以我想了解更多这方面的信息。为什么标准的 C 类型安全措施在这里不起作用? 0x0000000080000000是不是盲目写到ELF中存放x的地方,y恰好在旁边被覆盖了?请尽可能详细。
最佳答案
你有没有注意到,当你编译的时候,这个警告就来了。
/usr/bin/ld: Warning: alignment 4 of symbol `x' in /tmp/cciNZgVG.o is smaller than 8 in /tmp/cc8pYw6O.o
这是未定义的行为。不要忽视警告。它会根据您分配的值生成答案。
关于全局变量的 C ld 链接时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29471626/