c - 链接 c 文件时覆盖变量

标签 c linker double overwrite

我有两个文件:

冷杉.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/

相关文章:

c++ - 在 VS2010 C++ 中从 'double' 转换为 'int'

c# - 使用特殊分隔符将字符串转换为 double

c - 为什么信号处理程序进入无限循环? - SIGSEGV

c - 使用与二进制相关的 fread 和 fwrite

创建不需要 DLL 或库的 .exe

visual-c++ - LNK2019 - Visual Studio 2013 - 尽管定义了所有符号仍出错

javascript - 计算最接近的首选十进制结果的 double 值

c - 远程 gdb 的最佳 gui

c - C中这个奇怪的函数定义语法是什么?

c++ - 为静态链接构建 Boost (MinGW)