当前位置:网站首页>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’
边栏推荐
猜你喜欢
MySQL stored procedure
4、nerf(pytorch)
安装Nuxt.js时出现错误:TypeError:Cannot read property ‘eslint‘ of undefined
Navicat connection MySQL error: 1045 - Access denied for user 'root'@'localhost' (using password YES)
MySql fuzzy query Daquan
cmd(命令行)操作或连接mysql数据库,以及创建数据库与表
Detailed MySQL-Explain
[Other] DS5
[GO Language Basics] 1. Why do I want to learn Golang and the popularization of GO language entry
[Image detection] Research on cumulative weighted edge detection method based on grayscale image with matlab code
随机推荐
【飞控开发基础教程9】疯壳·开源编队无人机-PWM(电机控制)
idea 编译protobuf 文件的设置使用
MySQL user authorization
Falling ants (Peking University entrance exam questions)
MySQL (2)
navicat无法连接mysql超详细处理方法
Solve phpstudy unable to start MySQL service
坠落的蚂蚁(北京大学考研机试题)
Frobenius norm(Frobenius 范数)
MySQL模糊查询性能优化
384.打乱数组
MySQL fuzzy query performance optimization
k折交叉验证(k-fold Cross-validation)
字符串(一) 哈希
HCIP-第九天-BGP(边界网关协议)
cnpm installation steps
flask-socketio实现的网页聊天室(二)
配环境 / 初步测试
The difference between asyncawait and promise
453.最小操作数使数组元素相等