我有两个文件:
冷杉.c
int x = 7;
int y = 5;
int main()
{
p2();
printf("%d\n", x);
return 0;
}
还有:
sec.c
double x;
void p2()
{
x = 6;
}
链接并编译这两个文件后,我正在打印 x
并得到 0 作为输出。
此外,打印 y
后,我得到 4018000
作为输出。
我知道 x
会覆盖 y
,但为什么我会得到这些值 ?这到底是什么意思?
最佳答案
首先,我非常确定您在 printf 中使用的是“%x”而不是“%d”。其次,我非常确定它是 40180000 而不是 4018000(一个额外的零)。
假设这是真的,这里是你得到这个值的地方:
在第一个程序中,x 和 y 作为整数(4 个字节)在内存中相邻存储。第二个程序链接到第一个程序的“x”并将其视为 double (8 字节),不为第二个程序分配新内存。
现在是 IEEE double (link here) 中“6”的二进制表示
0x01000000 00011000 00000000 00000000 00000000 00000000 00000000 00000000 存储在“x”
十六进制=0x4018000000000000
因为第一个程序只看到 int 部分
0x01000000 00011000 00000000 00000000
=0x40180000
因为“%x”向您显示了十六进制“40180000”。
顺便说一句:重现你的结果只是为了确保。
关于c - 链接 c 文件时覆盖变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22589366/