C语言中,该共用体的大小为何是12?

发布网友

我来回答

8个回答

热心网友

所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为:
union 共用体名
{成员表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先看一个小例子。

union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*结构体* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
运行程序输出:
15,8
程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的共用体类型实际占用存储空间为其最长的成员所占的存储空间。
对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。

可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为:
union data /*共用体*/
{
int a;
float b;
double c;
char d;
}mm;
其成员引用为:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
运行程序输出为:
6
6 7.2
3 4.2,=
程序最后一行的输出是无法预料的。其原因是连续做mm.d='W';mm.b=34.2;两个连续的赋值语句最终使共用体变量的成员mm.b所占四字节被写入34.2,而写入的字符被覆盖了,输出的字符变成了符号“ =”。事实上,字符的输出是无法得知的,由写入内存的数据决定。
例子虽然很简单,但却说明了共用体变量的正确用法。

热心网友

正常来说是返回10的但是编译器要对齐存储空间,不方便后面变量的操作,所以干脆分配12个,其实最后两个是没有用的!

热心网友

因为里面有成员的sizeof是4, 所以默认对齐到4的整数倍

热心网友

编译器默认采用4字节对齐

#pragma pack(push,1) //改用1字节对齐
union uOne4All
{
char nVal[10];
int lVal;
long dVal;
};
#pragma pack(pop)

这样就是 10 了

热心网友

是10的么 一楼的错了 这是共用体 不是结构体 结构体才是16
这个是10
共用体中变量所占的内存长度等于最长的成员的长度
结构体变量所占内存长度等于各成员所占的内存长度之和

我的上面等于10 这个或许是编译器的原因 理论上是上面所说的

热心网友

char nVal[10];
int lVal;
long dVal;
这三个变量共用一块内存,union的大小为这三个变量中最大的。你是不是觉得它的大小应该是10,但是C++中有一个对齐机制,申请的一块内存必须是某一个数字的整数倍。你的编译器默认是4,因为10不是4的整数倍,所以这个union的大小会自动增加到12.
使用预编译可以改变这个对其的值
#pragma pack(push,1)
union uOne4All
{
char nVal[10];
int lVal;
long dVal;
};
#pragma pack(pop)
这样就表示设置对其方式为1个字节,你的联合体的大小就会变成10.

热心网友

根据最长的算啊 10

热心网友

你确定是12不是16?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com