0
点赞
收藏
分享

微信扫一扫

C语言,使用union了解内存


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

代码如下:

#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;
}

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

C语言,使用union了解内存_嵌入式C语言,使用union了解内存_linux_02C语言,使用union了解内存_html_03

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

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

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

C语言,使用union了解内存_软件开发_04C语言,使用union了解内存_软件开发_05C语言,使用union了解内存_软件开发_06

什么是大小端?

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

  • 大端模式(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]​​在高地址,这个没有什么意见吧?

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

C语言,使用union了解内存_c语言_07

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

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

C语言,使用union了解内存_c语言_08

关注公众号,后台回复「​1024​」获取学习资料网盘链接。

欢迎点赞,关注,转发,您的每一次鼓励,我都将铭记于心~

C语言,使用union了解内存_嵌入式_09

嵌入式Linux




举报

相关推荐

0 条评论