简介
柔性数组(flexible array)这个概念指的是数组元素数量未定义的数组。柔性数组位于结构体(struct)内,称为柔性数组成员。其定义为:结构体内最后一个元素允许是未知大小的数组,这个数组称为柔性数组成员,也就是说,结构体中柔性数组成员前面必须至少有一个其他成员。
柔心数组定义
柔性数组成员定义如下:
typedef example
{
int a;
int array[]
}t_ex;
此时的结构体大小是多少?5? 8? 还是n?
都不对,sizeof(t_ex)结果是4!
为什么会是4?举个不恰当的例子,把结构体看作是一个单位,在定义结构体的时候,这个单位的大小就已经规定好了,里面有多少编制也已经定好了,不会在进行扩编。而编制是不包括柔性数组成员的,柔性数组成员就是编外人员,或者说外包(bushi)。
柔性数组使用
柔性数组成员使用:使用时必须用指针且分配好地址空间。用malloc进行动态内存分配,且分配的大小要大于结构体的大小:
typedef example
{
int a;
int array[]
}t_ex;
//为柔性数组成员申请10个元素
t_ex *p=(t_ex *)malloc(sizeof(t_ex)+10*sizeof(int));
那么,申请完空间之后,*p的大小是多大呢?是44吗?
又错了!!!
sizeof(*p)结果是4!!!上一章已经讲过,柔性数组成员是编外人员,是外包,招再多也不会进入编制!(好惨)所以sizeof(*p)就是4。
虽然,柔性数组成员不在编制内,但是却可以调用:
typedef example
{
int a;
int array[]
}t_ex;
//为柔性数组成员申请10个元素
t_ex *p=(t_ex *)malloc(sizeof(t_ex)+10*sizeof(int));
p->array[0]=100;
因为是使用malloc动态开辟的空间,所以使用完一定要释放掉,使用free§将空间释放;如果不释放,很可能会出现一个经典bug:内存泄漏!
参考
C语言深度解剖