有什么好的例子可以说明结构体和联合体的区别吗? 基本上我知道struct使用了它成员的所有内存,而union使用了最大的成员内存空间。还有其他操作系统级别的差异吗?
当前回答
“union”和“struct”是C语言的构造。谈论它们之间的“操作系统级别”差异是不合适的,因为如果您使用一个或另一个关键字,则是编译器产生不同的代码。
其他回答
在编写下面给出的字节排序函数时,联合非常方便。这在结构体中是不可能的。
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.
从技术上讲,非指:
假设:椅子=记忆块,人=变量
结构:如果有3个人,他们可以坐在相应大小的椅子上。
工会:如果有3个人,只有一张椅子可以坐,所有人都需要在他们想坐的时候使用同一把椅子。
技术上讲是指:
下面提到的程序对结构和联合进行了深入研究。
struct MAIN_STRUCT
{
UINT64 bufferaddr;
union {
UINT32 data;
struct INNER_STRUCT{
UINT16 length;
UINT8 cso;
UINT8 cmd;
} flags;
} data1;
};
MAIN_STRUCT size =sizeof(UINT64) for bufferaddr + sizeof(UNIT32) for union + 32 bit for padding(取决于处理器架构)= 128 bits。 对于结构,所有成员连续获取内存块。
Union获得一个最大大小成员的内存块(这里是32位)。 在联合内部还有一个结构体(INNER_STRUCT),它的成员获得一个总大小为32位(16+8+8)的内存块。在联合中,可以访问INNER_STRUCT(32位)成员或data(32位)。
有什么好的例子可以说明结构体和联合体的区别吗?
下面是来自嵌入式系统应用的真实例子。它只使用联合,但它清楚地显示了联合的功能。
I2C通信协议的写函数在从传递给它的数组中检索数据时使用联合类型,用于数据存储。
union data
{
uint32_t packet;
uint8_t packetbyte[4];
} txdata;
通过指针传递给write函数的数组包含一个字节大小的元素。在for循环中,这些字节分四个步骤逐一提取,并存储到txdata的各个元素中。packetbyte成员。
循环结束后,txdata。数据包包含4个字节的数据,这些数据被连续存储到txdata联合中。作为通过通信总线发送数据的最后一步,txdata。数据包被写入32位缓冲区,在被写入后,32位缓冲区启动写序列。然后通过txdata重置内容。在next for循环开始执行之前,Packet = 0。
通过这种方式,I2C主机可以重新传输32位数据包,直到发送通过的输入数据并终止写入功能。
结构是不同数据类型的集合,其中可以驻留不同类型的数据 每一个都有自己的内存块。
当我们确定一次只使用其中一个变量,并且希望充分利用当前内存时,我们通常使用联合,因为它只获得一个等于最大类型的内存块。
struct emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:=>5字节。
union emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:4字节。
结构分配其中所有元素的总大小。
一个联合只分配它最大的成员所需要的内存。