题目并不是特别新鲜,不过这个题目在面试上肯定能筛选一大波人,特别是,有的题目大家看到很多次,但是每次都是简单看看,没有深入分析,结果笔试遇到差不多一样的题目时,自己又傻逼了。
搞C语言,看内存地址是一个非常重要的分析方法,而用gdb看内存,我觉得是十分方便、简单、有效的。
之前写过union相关的文章
C语言,使用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相关的文章,写得非常不错,大家可以看看。
GDB调试器原来那么简单
https://blog.csdn.net/awm_kar98/article/details/82840811
嗯,然后先运行起来
先确认几个长度大小
搞清楚这个东西之前,再复习之前说的大小端的内容
C语言验证大小端的几个方法
然后再我们看内存
这个和 s.a 是对应上的
我们系统默认都是使用的小端模式,也就是数据的低位在低地址,高位在高地址。
也就是说s.b 的值是
0x0000003800000039
所以,这段代码的输出是
完
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈