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

#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;
else
cout<<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都存在,但共用体的定义不是说只能存在一种吗,同一个空间不可能同时存在两个数据吧,,这里搞不明啊,请高手指点下!!

开满天机
浏览 116回答 3
3回答

FFIVE

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]的东西 不 共享。

弑天下

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

至尊宝的传说

共用体的实质是所有成员共用同一段内存.所以对其中某个成员的值进行修改的话,其他成员的值也就相应有了变化.比如之前你在某个地方将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的低位字节共用了同一块内存.
打开App,查看更多内容
随时随地看视频慕课网APP