查看原文
其他

C 语言,使用 union 了解内存

Linux爱好者 2021-09-08

The following article is from 嵌入式Linux Author 写代码的篮球球痴

今天一个读者朋友给我发的一段代码,这段代码让他有了疑惑。

代码如下:

#include "stdio.h"
int main()
{
    typedef union{
        short i;
        char j[2];
    }DATA;
    DATA a;
    a.j[0] = 10;
    a.j[1] = 1;
    printf("%x\n",a.i);
    return 0;
}

他的几个测试代码以及输出

这里说一个问题,我们从printf上看到的不一定我们想看到的,所以我们需要去变量的内存地址一探究竟,一定要了解内存的布局,对内存有所了解。

上面注释的代码,在我的电脑中运行的结果不相同,所以要看printf的准确输出,应该初始化变量a

使用gdb来查看地址,可以准确看到变量内存中的数据。

什么是大小端?

这个问题在之前的文章说过,这里再重新提一下

  • 大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中

  • 小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中

我们用这个再来看看我们的程序

#include "stdio.h"
int main()
{
    typedef union{
        short i;
        char j[2];
    }DATA;
    DATA a;
    //a.j[0] = 10;
    a.j[1] = 1;
    printf("%x\n",a.i);
    return 0;
}

j[0]在低地址,j[1]在高地址,这个没有什么意见吧?

内存就是一个尺子📏,它是不断变长的,所以这个地址也是慢慢变大的,没有任何问题吧。

然后,我们可以看看现在的输出,从上面的输出可以看到输出100,也就是j[1]在高地址,j[0]在低地址,那这个计算机就是小端模式

也可以通过查看内存地址来确认


- EOF -

推荐阅读  点击标题可跳转

1、CPU是如何制造出来的?高清图解

2、来自 Google 的 TCP BBR 拥塞控制算法深度解析

3、2.3 万 Star!直追微软 Visio,这个简洁实用的在线绘图工具必须推荐给你


看完本文有收获?请分享给更多人

推荐关注「Linux 爱好者」,提升Linux技能

点赞和在看就是最大的支持❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存