0
点赞
收藏
分享

微信扫一扫

用gdb搞清楚一道union相关的面试题


题目并不是特别新鲜,不过这个题目在面试上肯定能筛选一大波人,特别是,有的题目大家看到很多次,但是每次都是简单看看,没有深入分析,结果笔试遇到差不多一样的题目时,自己又傻逼了。

搞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调试器原来那么简单

嗯,然后先运行起来

用gdb搞清楚一道union相关的面试题_linux

先确认几个长度大小

用gdb搞清楚一道union相关的面试题_css_02

搞清楚这个东西之前,再复习之前说的大小端的内容

C语言验证大小端的几个方法

然后再我们看内存

用gdb搞清楚一道union相关的面试题_嵌入式_03

这个和 s.a 是对应上的

我们系统默认都是使用的小端模式,也就是数据的低位在低地址,高位在高地址。

也就是说s.b 的值是

0x0000003800000039

用gdb搞清楚一道union相关的面试题_javascript_04

所以,这段代码的输出是

用gdb搞清楚一道union相关的面试题_javascript_05

推荐阅读:

​​专辑|Linux文章汇总​​

​​专辑|程序人生​​

​​专辑|C语言​​

​​我的知识小密圈​​



举报

相关推荐

0 条评论