有什么好的例子可以说明结构体和联合体的区别吗? 基本上我知道struct使用了它成员的所有内存,而union使用了最大的成员内存空间。还有其他操作系统级别的差异吗?
当前回答
从技术上讲,非指:
假设:椅子=记忆块,人=变量
结构:如果有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位)。
其他回答
结构是不同数据类型的集合,其中可以驻留不同类型的数据 每一个都有自己的内存块。
当我们确定一次只使用其中一个变量,并且希望充分利用当前内存时,我们通常使用联合,因为它只获得一个等于最大类型的内存块。
struct emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:=>5字节。
union emp
{
char x; //1 byte
float y; //4 byte
} e;
它获得的总内存:4字节。
简单的回答是:结构体是一个记录结构体:结构体中的每个元素分配新的空间。一个结构体
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)),同样有可能添加一些对齐。
联合的用法 当需要特殊类型的对话时,联合经常被使用。 来了解联合的用处。c/c标准库没有定义专门为将短整数写入文件而设计的函数。使用fwrite()会导致简单操作的开销过大。然而,使用联合可以很容易地创建一个函数,该函数将一个短整数的二进制每次一个字节写入文件。我假设短整数是2字节长
示例:
#include<stdio.h>
union pw {
short int i;
char ch[2];
};
int putw(short int num, FILE *fp);
int main (void)
{
FILE *fp;
fp fopen("test.tmp", "wb ");
putw(1000, fp); /* write the value 1000 as an integer*/
fclose(fp);
return 0;
}
int putw(short int num, FILE *fp)
{
pw word;
word.i = num;
putc(word.c[0] , fp);
return putc(word.c[1] , fp);
}
虽然我用短整数调用putw(),但可以使用putc()和fwrite()。但是我想展示一个例子来说明如何使用联合
Union不同于struct,因为Union在其他的上面重复:它重新定义同一个内存,而struct一个接一个地定义,没有重叠或重定义。
结构和联合的区别是什么?
简单的回答是:区别在于内存分配。 解释: 在结构中,将为结构内部的所有成员创建内存空间。 在联合内存空间将只为需要最大内存空间的成员创建。 考虑下面的代码:
struct s_tag
{
int a;
long int b;
} x;
union u_tag
{
int a;
long int b;
} y;
这里在struct和union内部有两个成员:int和long int。在32位操作系统中,int的内存空间为:4字节,long int的内存空间为:8。
因此,对于struct, 4+8=12个字节将被创建,而对于union,将创建8个字节
代码示例:
#include<stdio.h>
struct s_tag
{
int a;
long int b;
} x;
union u_tag
{
int a;
long int b;
} y;
int main()
{
printf("Memory allocation for structure = %d", sizeof(x));
printf("\nMemory allocation for union = %d", sizeof(y));
return 0;
}
裁判:http://www.codingpractise.com/home/c-programming/structure-and-union/