【问题标题】:what if we link both same name variable with different data type?如果我们将两个相同名称的变量与不同的数据类型联系起来怎么办?
【发布时间】:2017-04-12 04:48:52
【问题描述】:

我试过下面的代码 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

我得到了这段代码的奇怪输出,有人能解释一下它是怎么产生的吗?

【问题讨论】:

  • 这个程序的行为是undefined。也请不要发布代码图片。
  • @n.m.好的,我更改了代码感谢您的建议
  • 当你对你的编译器撒谎时,它会因为没有做你所期望的而得到回报。

标签: c linux gcc linker ld


【解决方案1】:

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

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

1078263808 值是双精度 42 的浮点表示。

注意:foo1 中的 x 和 y 记忆是连续的。

【讨论】:

  • 我对你了解甚少,但仍然对为什么 x=0 和 y=1078263808 感到困惑?能详细解释一下吗?我没有得到这一行“1078263808 值是双精度 42 的浮点表示。” ! @Rajeshkumar
  • 这是一个非常明确的答案。为了强制执行它,您可以生成一个地图文件来展示 x 和 y 的各自位置。此外,您还可以编写另一个小程序,通过强制转换 (printf("%ld\n" (int) (42.0)) 将 42.0 (double) 编码为 1078263808。
猜你喜欢
  • 2020-05-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多