关于创新工场的一道笔试题

<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! 相对于直接初始化

你可能感兴趣的:(创新工场)