链接c文件时覆盖变量

链接c文件时覆盖变量,c,linker,double,overwrite,C,Linker,Double,Overwrite,我有两个文件: 杉木 而且: 第c节 链接并编译这两个文件后,我将打印x,并将0作为输出。 而且,在打印了y之后,我得到了4018000作为输出。 我知道x会覆盖y,但为什么我会得到这些值​​? 这到底意味着什么?首先,我非常确定您在printf中使用的是“%x”,而不是“%d”。其次,我非常确定它是4018000,而不是4018000(额外的零) 假设这是真的,下面是获得该值的地方: 在第一个程序中,x和y以整数(4字节)的形式存储在内存中,彼此相邻。第二个程序链接到第一个程序的“x”,并将其

我有两个文件:

杉木

而且:

第c节

链接并编译这两个文件后,我将打印
x
,并将0作为输出。 而且,在打印了
y
之后,我得到了
4018000
作为输出。
我知道
x
会覆盖
y
,但为什么我会得到这些值​​? 这到底意味着什么?

首先,我非常确定您在printf中使用的是“%x”,而不是“%d”。其次,我非常确定它是4018000,而不是4018000(额外的零)

假设这是真的,下面是获得该值的地方:

在第一个程序中,x和y以整数(4字节)的形式存储在内存中,彼此相邻。第二个程序链接到第一个程序的“x”,并将其视为双精度(8字节),不为第二个程序分配新内存

现在是IEEE双精度()

0x01000000000110000000000000000000000000000000000000000000000000000000000000000000000000000存储在“x”处

十六进制=0x4018000000000000

因为第一个程序只看到int部分

0x01000000000110000000000000000000000

=0x40180000

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


顺便说一句:复制您的结果只是为了确保。

这意味着您的程序格式不正确和/或行为未定义。您定义了两个同名的全局变量,或者定义了两种不同类型的同一变量,这取决于您如何看待它,但无论如何都是不允许的。这意味着您正在做一些不应该做的事情ng.停下来吧。它为什么会做一些看起来很奇怪的事情并不重要。当你这样做时,你的链接器不会抱怨吗?一个你不完全理解的警告是一个错误,简单明了。实际上,一个好的答案是:
int x = 7;
int y = 5;
int main()
{
    p2();
    printf("%d\n", x);
    return 0;
}
double x;
void p2()
{
    x = 6;
}