Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果我们用不同的数据类型链接两个相同的名称变量呢?_C_Linux_Gcc_Linker_Ld - Fatal编程技术网

C 如果我们用不同的数据类型链接两个相同的名称变量呢?

C 如果我们用不同的数据类型链接两个相同的名称变量呢?,c,linux,gcc,linker,ld,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; } 输出: $ gcc -o myprog foo1.c foo2.c $ ./myprog x = 0 y = 1078263808 这段代码的输出很奇怪,有人能解释一下它是怎么来的吗 在

我尝试了下面的代码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;
}
输出:

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

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

在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内存是连续的。

此程序的行为是连续的。另外,请不要发布代码的图像。@n.m.好的,我在代码中做了更改,谢谢你的建议。当你对编译器撒谎时,它会通过不做你所期望的事情而得到自己的回报。我有点理解你,但仍然弄不明白为什么x=0和y=1078263808?你能详细解释一下吗?我没有得到这行“1078263808值是42的浮点表示形式,在双精度中。”@拉杰什库马蒂斯是一个非常明确的答案。若要强制执行,您可以生成一个地图文件来演示x和y的各自位置。此外,您还可以制作另一个小程序,通过强制转换(printf(“%ld\n”(int)(42.0))来显示1078263808中的42.0(double)编码。
$ gcc -o myprog foo1.c foo2.c
$ ./myprog
x = 0
y = 1078263808