您的位置:首页 > 编程语言 > C语言/C++

struct关键字---C语言深度剖析读书笔记9

2013-03-19 16:12 190 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: