弹性数组
C99中,结构中的最后一个元素允许是未知的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组,可变长数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔型数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔型数组的预期大小。
为什么结构中的柔性数组成员前面必须至少有一个其他成员?
可变长数组
C89标准规定,数组大小必须是在编译时刻确定的;在C99中,这个标准项被扩展,可以使运行时刻确定的值。也就是说,可变长数组和C++本身没有关系,只要是支持C99的的就可以使用可变长数组,包括支持C99的C编译器。
结构体定义:
typedef struct st_type
{
int ncnt;
int item[0];
}type_a;
(有些编译器会报错无法编译,可以改成:)
typedef struct st_type
{
int ncnt;
int item[];
}type_a;
这样我们就可以定义一个可变长的结构,用sizeof(type_a)得到的只有4,就是sizeof(ncnt)=sizeof(int)那个0个元素的数组没有占用空间,而后我们可以进行变长操作了。
C语言版: type_a *p = (type_a)malloc(sizeof(type_a)+100*sizeof(int));
C++语言版:type_a * p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];
这样就产生了一个长尾100的type_a类型的东西用p->item[n]就能简单地访问可变长元素,原理十分简单,分配了sizeof(type_a)多的内存后int item[];就有意义了,他指向的是int ncnt后面的内容,是没有内存需要的,而在分配时多分配的内存就可以由其来操作,是个十分好用的技巧。
释放
C语言版:free(p);
C++语言版:delete[] p;