【发布时间】:2021-12-24 01:05:23
【问题描述】:
我正在阅读 Computer Systems: A Programmer's Perspective,我遇到了以下 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;
}
Bar.c:
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 是否盲目地写入了 x 存储在 ELF 中的位置,而 y 恰好在它旁边并被覆盖?尽可能详细。
【问题讨论】: