为了账号安全,请及时绑定邮箱和手机立即绑定

共用体的定义不是说只能存在一种吗,同一个空间不可能同时存在两个数据吧?

共用体的定义不是说只能存在一种吗,同一个空间不可能同时存在两个数据吧?

开满天机 2022-05-12 13:11:13
#include <iostream>#include <string>#include <iomanip>using namespace std;struct S{int num;string name;char sex;char job;union{int grade;char position[10];}category;}person[2];int main(){ int i;for(i=0;i<2;i++){cin>>person[i].num>>person[i].name>>person[i].sex>>person[i].job;if(person[i].job=='s') cin>>person[i].category.grade;else if (person[i].job=='t') cin>>person[i].category.position;else cout<<"input error!";}cout<<endl<<"No. Name sex job grade/position"<<endl;for(i=0;i<2;i++){if (person[i].job=='s')cout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.grade<<endl;elsecout<<person[i].num<<setw(6)<<person[i].name<<" "<<person[i].sex<<" "<<person[i].job<<setw(10)<<person[i].category.position<<endl;}return 0;}我开追踪检测的时候,发现共用体的实际情况跟定义的都不一样的,你看看那个图片——是追踪的过程的值,我们可以发现person[0].category.grade跟person[1].category.position都存在,但共用体的定义不是说只能存在一种吗,同一个空间不可能同时存在两个数据吧,,这里搞不明啊,请高手指点下!!
查看完整描述

3 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

person[0] 和 person[1] 是结构数组元素,不是共用体成员。
共用体成员指:
int grade;
char position[10];
grade 和 position 共享。
--------------------------------------------------
person[0]的grade 和 person[0]的 position 共享。
person[1]的grade 和 person[1]的 position 共享。
person[0]的东西 和 person[1]的东西 不 共享。

查看完整回答
反对 回复 2022-05-16
?
弑天下

TA贡献1818条经验 获得超8个赞

两个数组元素,占用两块不同的内存空间
而共用体中的成员,才占用同一块内存空间
category的成员grade和position才是共用体的两个成员,占用同一块内存,意味着任何成员的值取决于 成员的类型和最后一次对这块内存作的操作。
最后一次操作来确定这段二进制最终是什么值
成员的类型用来让编译器解释二进制的值
有点绕口,希望可以帮到你。

查看完整回答
反对 回复 2022-05-16
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

共用体的实质是所有成员共用同一段内存.所以对其中某个成员的值进行修改的话,其他成员的值也就相应有了变化.
比如之前你在某个地方将person[0].category.position[0]的值设为了'a',而后来又在某个地方写了person[0].category.grade=49.这时候如果你printf("%c",person[0].category.position[0]);的话,就会显示'1',这就是因为person[0].category.position[0]和person[0].category.grade的低位字节共用了同一块内存.

查看完整回答
反对 回复 2022-05-16
  • 3 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信