c - 如果我们将两个具有不同数据类型的同名变量链接起来怎么办?

标签 c linux gcc linker ld

我试过下面的代码 foo1.c

#include<stdio.h>
void f(void);
int x = 38;
int y = 39;

int main() {
f();
printf("x = %d\n", x);
printf("y = %d\n", y);
return 0;
}

foo2.c

double x;

void f() {
x = 42.0;
}

输出:

$ gcc -o myprog foo1.c foo2.c
$ ./myprog
x = 0
y = 1078263808

这段代码的输出很奇怪,谁能解释一下它是怎么来的?

最佳答案

在 foo1.c 中,你有两个变量 x 和 y,每个变量有 4 个字节,总共 8 个字节。在 foo2.c 中,您将 x 变量设置为 double。

虽然 foo1(4 字节)中的执行 x 被 foo2(8 字节)中的 x 替换。最终,foo1 中 x & y(共 8 个字节)的内存被 foo2 中的 x(8 个字节)覆盖。

1078263808 value 是 42 的 double float 表示。

注意:foo1 中的 x & y 内存是连续的。

关于c - 如果我们将两个具有不同数据类型的同名变量链接起来怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43360529/

相关文章:

c - 错误: expected ')' before 'n'

c - 数组和表的区别

c - 如何删除此警告 : second parameter of ‘va_start’ not last named argument?

c++ - 使用 gcc 插件插入全局变量声明

c - 打印小数位

linux - 如何检查给定操作(或系统调用)在 Linux 上是否是原子的?

linux - 在 centos 7 中创建虚拟主机的 bash 脚本

linux - 如何使用我们自己的 c 文件的 checkpatch.pl 脚本来验证编码风格

c++ - 如果我针对大小而不是速度进行优化,为什么 GCC 生成的代码速度会快 15-20%?

C float 表示法