如果我们将两个同名变量连接到不同的数据类型,该怎么办?

问题描述:

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

我得到这个代码怪异的输出可有人解释它怎么会来?

+2

此程序的行为是[未定义](https://en.m.wikipedia.org/wiki/Undefined_behavior)。也请不要发布代码图片。 –

+0

@ n.m。好的,我改变了代码感谢您的建议 –

+0

当你撒谎你的编译器,它会得到自己的回不到你所期望的。 –

在foo1.c你有两个变量x和y每一个都具有4个字节完全8个字节。在foo2.c中,您将x变量设为double。

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

1078263808值漂浮在双42点表示。

注:X &在foo1Ÿ回忆是连续的。

+0

我几乎没有得到你,但仍然困惑为什么x = 0和y = 1078263808?可以详细解释一下吗?我没有得到这一行“1078263808值是浮点数42的双倍表示。” ! @Rajeshkumar –

+0

这是一个非常明确的答案。为了执行它,您可以生成一个映射文件来演示x和y的相应位置。更超过你可以让另一个小程序来显示,42.0(双)铸造(的printf( “%LD \ N”(INT)(42.0))在1078263808进行编码。 –