1.空结构体
所谓空结构体,即结构提内没有元素。 在GCC中,空结构体的大小为0;在VC2010中,则不允许出现空结构体。
struct student { } stu;
printf("%d\n",sizeof(stu)); //GCC中打印结果为:0
2.结构体元素的内存对齐
系统在为结构体分配内存的时候,需要考虑内存对齐的问题
int main(void)
{
struct student
{
char c;
int i;
}stu;
printf("size of is %d\n",sizeof(stu)); //打印结果:8.而不是1+4
}
3.弹性数组
结构体的最后一个元素允许是未知大小的数组,即可变长的弹性数组(flexible array)。注意,弹性数组只能是结构体的最后一个元素;同时,在使用sizeof获得结构体大小的时候,弹性数组是不计入的。
int main(void)
{
int i;
int * iarr;
struct FlexArrTest1
{
char c;
int iarr[0];//定义弹性数组的第一种方式:指定数组长度为0
}fat1;
struct FlexArrTest2
{
char c;
int iarr[];//定义弹性数组的第二种方式:不指定数组长度
}fat2; //注意:弹性数组必须是结构体中的最后一个元素。
struct FlexArrTest1 *pFat1=(struct FlexArrTest1 *)malloc(sizeof(struct FlexArrTest1)+100*sizeof(int));
printf("%d\n",sizeof(*pFat1));//sizeof返回的结构体大小,不包括弹性数组。
// VC里打印结果为4。(这里为4而不是1,是因为内存对齐)
iarr=pFat1->iarr;
for(i=0;i<100;i++)
pFat1->iarr[i]=i;
free(pFat1); //free一个pFat1指针,由其所指的对象申请的内存空间也会被回收。
printf("%d\n",iarr[0]); //会打印出一个不正常的数.这是因为:stu中的cc数组空间,已经被回收
return 0;
}