题目并不是特别新鲜,不过这个题目在面试上肯定能筛选一大波人,特别是,有的题目大家看到很多次,但是每次都是简单看看,没有深入分析,结果笔试遇到差不多一样的题目时,自己又傻逼了。
搞C语言,看内存地址是一个非常重要的分析方法,而用gdb看内存,我觉得是十分方便、简单、有效的。
之前写过union相关的文章
题目如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
union{
int a[2];
long b;
char c[4];
}s;
s.a[0] = 0x39;
s.a[1] = 0x38;
printf("%lx\n",s.b);
printf("%c\n",s.c[0]);
return 0;
}
先不说答案
我们先用gdb 看看内存信息,这种如果不能马上下判断的题目,看内存是最舒服的。
我发一个gdb相关的文章,写得非常不错,大家可以看看。
https://blog.csdn.net/awm_kar98/article/details/82840811
嗯,然后先运行起来
先确认几个长度大小
搞清楚这个东西之前,再复习之前说的大小端的内容
然后再我们看内存
这个和 s.a 是对应上的
我们系统默认都是使用的小端模式,也就是数据的低位在低地址,高位在高地址。
也就是说s.b 的值是
0x0000003800000039
所以,这段代码的输出是
完
推荐阅读: