在C99标准中引入了柔性数组,在结构体中,我们需要将柔性数组放在所有成员的最后一位(也就是说,一个结构体中。只能有一个柔性数组)。下面是一些使用柔性数组的时候需要注意的一些事情。
1.柔性数组必须是结构体最后一个成员
2.柔性数组不能作为结构体指针的指向类型,因为结构体的长度不包括柔性数组的长度,使用时需要通过指针偏移来访问柔性数组
3.柔性数组需要动态开辟空间,也要记得及时释放。防止内存泄漏。如果结构体也是malloc在堆上的话,记得先释放柔性数组。
4.注意数组越界问题
下面给一个小demo吧,大家也可以在自己电脑上运行一下。
typedef struct flexarr{
int first;
short flexarray[0];
}flexarr;
这个是结构体的定义,然后下面是main函数(首先我们看一下我们定义的结构体的大小)
int main(){
flexarr temp;
printf("%d",sizeof(temp));
}
结果有点意外,是8。我们上篇博客说到,柔性数组不占大小。但为什么是8呢,因为字节对齐的缘故,该结构体成员类型中最大的数据类型所占字节大小为double(8),所以结果必须是8的整数被即4+4=8。字节对齐方式的话和编辑器,操作系统有关。可以自己去设置┗|`O′|┛ 嗷~~。所以大家得出的结构可能会不一样,vs,clion或者命令行可能有差异。我们求同存异吧。
下来我们申请一个结构体大小然后并为其赋初值,最后将其释放。
int main(){
flexarr *temp=(flexarr*)malloc((sizeof(flexarr)+sizeof(short)*5));
temp->flexarray[0]=0x1234;
temp->flexarray[1]=0x1234;
temp->flexarray[2]=0x1234;
temp->flexarray[3]=0x1234;
temp->flexarray[4]=0x1234;
printf("%x",temp->flexarray[4]);
free(temp->flexarray);
free(temp);
}