链接c文件时覆盖变量

时间:2014-03-23 10:02:06

标签: c linker double overwrite

我有两个文件:

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,但为什么我会得到这些值?这究竟是什么意思?

1 个答案:

答案 0 :(得分:2)

首先,我很确定你使用"%x"而不是"%d在你的printf中。其次,我很确定它是40180000而不是4018000(额外的零)。

假设这是真的,在这里你得到这个值:

在第一个程序中,x和y作为整数(4个字节)在内存中彼此相邻地存储。第二个程序链接到第一个程序" x"并将其视为double(8个字节),不为第二个程序分配新的内存。

现在为" 6"的二进制表示在IEEE双精度(link here

0x01000000 00011000 00000000 00000000 00000000 00000000 00000000 00000000存储在" x"

HEX = 0x4018000000000000

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

0x01000000 00011000 00000000 00000000

= 0x40180000

因为"%x"向你展示了十六进制" 40180000"打印出来。

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