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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值