C/C++ union

理解C语言中union数据结构的内存分配与特性

叙述原因:

union data{

int a;
double b;
};

对于union,实际中用的并不多,之前也知道怎样计算union的单元(在字对齐的基础上取最大成员所占的内存大小),比如

union data{

int a;
char b[5];
};  最大为5个字节,但为了字对齐,需要是4的倍数,sizeof(data)大小就是8,其他复杂的结构大家可以网上搜一搜,一般考的可能就是这样。

 

问题1:

union各数据单元的内存地址是否相同?

本人设想拥有最大元素的内存单元,那么各元素的地址是相同的。结果也验证了正确性。

union data{

int a;
char b;
double c;
char ch[5];
}; 

union data d;
d.a = 10;
printf("%d %d %d %d\n",&d,&d.a,&d.b,&d.c,d.ch); 4个结果全部相同。

问题2:

union data{

int a;
double b;
}; 如果设置了d.a = 10,那么d.b = ???

是不是有点蒙?如果按照 内存地址相同,说明是共享了同一块数据单元, d.b的值应该也是 10

但是 d.b != 10 。

同理如果设置了d.b = 10,那么d.a =?? 结果是d.a = 0 

但是对于特殊情况,如果data的结构是

union data{

int a;
char b;
}; 

 如果设置了d.a = 10,那么d.b =??? 其实这个时候 a.b = 10 原因是 这两个类型在C语言中的内存结构是一样的,但是 int float double却不相同。

这也就是要强调 对于结构体你用的什么赋值,就采用哪一个变量,否则值可能得不到。。

我的想法是: 他们内存的数据是一样,但是不同类型读取数据的方式不同,导致了数据与赋值数据不同。主要是数据的读取方式和对内存数据的组织方式

 

转载于:https://www.cnblogs.com/ShalenChe/p/5377160.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值