<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif;">32位机(little endian) 下例的输出结果是什么?</span>
#include <stdio.h> union A { int i; char c[2]; }; int main() { A a; a.c[0] =10; a.c[1] =1; printf("%d", a.i); return 0; }
有很大的平台相关性,编译器。。。。。
GCC下测试结果:随机数
栈区初始化为随机数。
QT下测试结果:266
栈区也默认初始化为0!!!!!
VC++6.0下测试结果:0xCCCC010A=-859045622
对于未赋值的字节块,编译器在调试版本(DEBUG)会自动填充0xCC,因此本题涉及的内存实际上是这样的:
地址 0 1 2 3
数据 0x0A 0x01 0xCC 0xCC
解释:union关键字的特征是,一个union只配备一个足够大的空间来容纳最长长度的数据成员。
所以题目中A.i是int型的,占据4个字节,A.c是2长度的char型数组,占据2个字节,这样A就占据了4个字节。
在main函数中:
A a这行代码结束后,a指向的内存为:cc cc cc cc(在vc++6.0编译环境下,未初始化)
a.c[0]=10;这行代码结束后,a指向的内存为:0a cc cc cc
a.c[1]=1;这行代码结束后,a指向的内存为:0a 01 cc cc
在小端模式下,a.i=0xcccc010a
通过int格式规范,可知a.i=-859045622。打印结果也是如此。
出现这个“不尽人意”的结果,因为通过A a这行代码产生一个union后没有进行初始化。
如果初始化了,那么a.i=0x0000010a=256+10=266
#include <stdio.h> union A { int i; char c[2]; }; int main() { A a; a.i=1111;//无论怎样的一个小于65535的正数,最终结果都一样 a.c[0] =10; a.c[1] =1; printf("%d", a.i); return0; }同上。
#include <stdio.h> union A{ int i; char c[2]; }; int main(){ static A a; a.c[0] = 10; a.c[1] = 1; printf("%d", a.i); return 0; }
这道题目确实比较厉害,抓住人的心理,有的人一开始就计算,殊不知高16位未初始化,它在栈中,这样就中了圈套了,下面的题目做了个小改动,让它出去全局静态数据区,这样就比较原始了,内存空间一开始就初始化为0。
一个诡异的发现,如果把程序改为:
#include <stdio.h> union { int i; char c[2]; }A; void main() { A.c[0]=10; A.c[1]=1; printf("%d", A.i); }
输出结果是0x0000010A=266! 相对于直接初始化