当前位置:网站首页>union中有struct的情况-从内存分析
union中有struct的情况-从内存分析
2022-07-30 05:39:00 【Linke66】
union中的每个成员共用一块内存,且首地址相同;
这块内存必须大于等于union中最大成员的字节数。
举个例子:
union U中有两个成员,
一个是int型的a,4个字节;
一个是结构体STU,考虑对齐,16个字节。
struct STU {
int b;
long long c;
};
union U{
int a;
STU stu;
};
首先使用结构体初始化union U,查看其内存分布情况:
U u;
STU m_stu;
m_stu.b = 6;
m_stu.c = 66;
u.stu = m_stu;
cout << "struct 中 (int)b=" << u.stu.b << " (long)c=" << u.stu.c << endl;
内存分布情况如下图,union的初始地址是0x007CF9E8,分配了16个字节的内存;
前面4个字节存放成员(int)b,后面四个字节是对齐的4个字节;
再往后面8个字节的内存存放(long long)c;
所以b=6;c=66;
下面用union另一个成员(int)a来初始化union U;
u.a = INT_MAX;
cout << "(int)a=" << u.a << endl;
cout << "struct 中 (int)b=" << u.stu.b << " (long)c=" << u.stu.c << endl;
内存中的情况如下图
所以输出为:
下面做一个测试,考虑以下代码
现在union中两个成员,结构体STU类型的stu和int型的a都为4个字节;
我们先初始化stu的四个成员为字符’a’,那么查看stu的四个字符成员,自然都是’a’;
接下来我们将使用union U中的a成员,初始化为1111638594,即16进制的 42 42 42 42,而字符’B’的ascii码为42(16进制),那么这个时候假如我们去输出结构体的4个成员,它会是什么呢?结果在下面。
struct STU {
char ch1;
char ch2;
char ch3;
char ch4;
};
union U{
int a;
STU stu;
};
int main() {
U u;
STU m_stu;
m_stu.ch1 = 'a'; //ascii为97,即16进制61
m_stu.ch2 = 'a';
m_stu.ch3 = 'a';
m_stu.ch4 = 'a';
u.stu = m_stu;
cout << "struct 中 (char)ch1=" << u.stu.ch1
<< " (char)ch2=" << u.stu.ch2
<< " (char)ch3=" << u.stu.ch3
<< " (char)ch4=" << u.stu.ch4
<< endl;
u.a = 1111638594;//16进制为 42 42 42 42 ,ascii为42对应的字符是B
cout << "(int)a=" << u.a << endl;
cout << "struct 中 (char)ch1=" << u.stu.ch1
<< " (char)ch2=" << u.stu.ch2
<< " (char)ch3=" << u.stu.ch3
<< " (char)ch4=" << u.stu.ch4
<< endl;
}
根据上面的分析,我们不难分析出,这时候输出结构体的4个成员,都是字符‘B’
边栏推荐
- 839. 模拟堆
- create-nuxt-app创建出来的项目没有server
- 配环境 / 初步测试
- asyncawait和promise的区别
- 【图像处理】基于中轴变换实现图像骨架提取附matlab代码
- Different lower_case_table_names settings for server (‘1‘) and data dictionary (‘0‘) 解决方案
- Graphic mirror symmetry (schematic diagram)
- 从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
- ClickHouse 数据插入、更新与删除操作 SQL
- More fragrant open source projects than Ruoyi in 2022
猜你喜欢
随机推荐
2022年SQL经典面试题总结(带解析)
Different usage scenarios of subqueries as retrieval tables and the question of whether to add aliases
号称年薪30万占比最多的专业,你知道是啥嘛?
Pytorch to(device)
2022年比若依更香的开源项目
【Koltin Flow(一)】五种创建flow的方式
报错:npm ERR code EPERM
MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
ezTrack-master使用教程
MySQL模糊查询性能优化
从底层结构开始学习FPGA(6)----分布式RAM(DRAM,Distributed RAM)
Error: listen EADDRINUSE: address already in use 127.0.0.1:3000
[GLib] What is GType
图形镜像对称(示意图)
406.根据身高重建队列
It is enough for MySQL to have this article (37k words, just like Bojun!!!)
postman 请求 post 调用 传 复合 json数据
“tensorflow.keras.preprocessing“ has no attribute “image_dataset_from_directory“
SRA数据下载方法总结
使用DataEase开源工具制作一个高质量的数据大屏








