首页 文章详情

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

嵌入式Linux | 466 2021-08-29 18:28 0 0 0
UniSMS (合一短信)

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


搞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语言
我的知识小密圈
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter