0长度的数组
在标准的C/C++中,长度为0的数组是不被允许的,它算是一个C/C++扩展,VS系列编译器不完全支持这个扩展,
GUN编译器完全支持这个扩展,你可以合法的声明长度为0的数组,但这种声明的最典型的用法就是位于数组中的最后一项,为了方便内存缓冲区的管理,例如:
struct Line{
uint32_t length;
char contents[0];
};
在结构体中,长度为0的数组不会占用存储空间 ,在上述例子中 sizeof(Line)=4
在申请内存空间时,缓冲区的空间可以和结构体的空间一起申请,一次操作就可以完成.例如
uint32_t length = 10;
struct Line *pLine = (struct Line *)malloc(sizeof (struct Line) + length);
pLine->length = length;
上述代码就动态地为结构体申请了长度(length)为10byte的缓冲区,而且由于是同一次malloc操作,缓冲区与结构体的内存地址是连续的
综上所述,比起在结构体中定义一个指针指向另一片缓冲区地址的做法,使用长度为0的数组有以下好处:
- 指针本身需要占用内存,而长度为0的数组不需要
- 长度为0的数组定义出的缓冲区可以和结构体处在同一片连续地址中,只要一次malloc操作和free操作.如果用指针,需要分别申请和释放结构体内存和指针指向的内存块,至少需要两次以上的内存操作

浙公网安备 33010602011771号