有什么好的例子可以说明结构体和联合体的区别吗? 基本上我知道struct使用了它成员的所有内存,而union使用了最大的成员内存空间。还有其他操作系统级别的差异吗?
当前回答
Union不同于struct,因为Union在其他的上面重复:它重新定义同一个内存,而struct一个接一个地定义,没有重叠或重定义。
其他回答
简单的回答是:结构体是一个记录结构体:结构体中的每个元素分配新的空间。一个结构体
struct foobarbazquux_t {
int foo;
long bar;
double baz;
long double quux;
}
为每个实例在内存中分配至少(sizeof(int)+sizeof(long)+sizeof(double)+sizeof(long double))字节。(“至少”是因为架构对齐约束可能迫使编译器填充结构。)
另一方面,
union foobarbazquux_u {
int foo;
long bar;
double baz;
long double quux;
}
分配一个内存块并给它四个别名。因此sizeof(union foobarbazquux_u)≥max((sizeof(int),sizeof(long),sizeof(double),sizeof(long double)),同样有可能添加一些对齐。
Union不同于struct,因为Union在其他的上面重复:它重新定义同一个内存,而struct一个接一个地定义,没有重叠或重定义。
结构分配其中所有元素的总大小。
一个联合只分配它最大的成员所需要的内存。
结构是不同数据类型的集合,其中可以驻留不同类型的数据 每一个都有自己的内存块。
当我们确定一次只使用其中一个变量,并且希望充分利用当前内存时,我们通常使用联合,因为它只获得一个等于最大类型的内存块。
struct emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:=>5字节。
union emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:4字节。
在编写下面给出的字节排序函数时,联合非常方便。这在结构体中是不可能的。
int main(int argc, char **argv) {
union {
short s;
char c[sizeof(short)];
} un;
un.s = 0x0102;
if (sizeof(short) == 2) {
if (un.c[0] == 1 && un.c[1] == 2)
printf("big-endian\n");
else if (un.c[0] == 2 && un.c[1] == 1)
printf("little-endian\n");
else
printf("unknown\n");
} else
printf("sizeof(short) = %d\n", sizeof(short));
exit(0);
}
// Program from Unix Network Programming Vol. 1 by Stevens.