零长度数组(柔性数组)的用法
在前面的文章中的dnw源代码,使用了这样一个结构体:
struct ptest{ int a; double b; char *c;};指针成员c指向字符串。这种方法会造成字符串与结构体分离,malloc和free对内存管理产生碎片,也不利于操作。
如果我们把字符串和结构体连接在一起,字符串位置紧接着结构体,这样修改代码:
char Str[] = "hello world";
struct ptest *Test = (struct ptest*)malloc(sizeof(struct ptest)+strlen(Str)+1);//+1是因为strlen不计算结束符
strcpy(Test+1,Str)
(char*)(Test+1)就是字符串“hello world”的地址了。c就成了多余的东西,可以去掉。然而,直接使用(char*)(Test+1)很不方便。于是,这种既能直接引用字符串,还不占用结构体空间,能灵活分配数据域大小的要求,柔性数组就能够满足。
在这个结构体中,c是柔性数组成员,如果把Test指向的动态内存分配看作一个整体,c就是一个长度可以变化的柔性数组,c在结构体中长度为0,不占用Test的空间,Test->c就是“hello world”的首地址。