链接c文件时覆盖变量

我有两个文件:

fir.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双精度(link here)中的“6”的二进制表示

0x01000000 00011000 00000000 00000000 00000000 00000000 00000000 00000000存储在“x”

HEX = 0x4018000000000000

由于第一个程序只看到int部分

0x01000000 00011000 00000000 00000000

= 0x40180000

由于“%x”显示十六进制“40180000”已打印.

顺便说一句:为了确保你的结果再现了.

点赞