struct和union分析

来源:互联网 发布:中国在中东知乎 编辑:程序博客网 时间:2024/06/13 03:35
struct
空结构体大小,依据编译器的不同而不同,gcc中为0,且不同的结构体变量地址相同;而在g++中为1,不同的结构体变量地址也不同。没有谁对谁错,现代编译器中认为空结构体大小为1较为合理。

柔性数组
即数组大小待定的数组。
规则:结构中最后一个元素允许是未知大小的数组;
      结构中的柔性数组成员前面必须至少一个其他成员。
typedef struct flex
{
int len;
int array[];
}SoftArray;
array[]0个元素没有占用空间,所以sizeof(SoftArray)=4。
分配内存空间操作如下:
SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray)+10*sizeof(int));
此时sizeof(*sa)仍为4,柔性数组只是编外人员,不占用结构体的编制。只是说在使用柔性数组时需要把它当成结构体的一个成员而已,仅此而已。

union
只分配最大域的空间,所有域共享这个空间
union维护足够的空间来置放多个数据成员的“一种”,而不是为每个数据成员配置空间,在union中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。
   大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放 在高地址中。 
   小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放 在低地址中。 
union 型数据所占的空间等于其最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。
union c
{
    int i;;
    char c;
};
union c cc;
cc.i = 1;
printf("%d\n",cc.c);    //若为1,则为小端模式;为0,则为大端模式
原创粉丝点击