0长度数组(柔性数组)的用法

零长度数组(柔性数组)的用法在前面的文章中的dnw源代码,使用了这样一个结构体:structptest{intadouble b

零长度数组(柔性数组)的用法

   在前面的文章中的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”的首地址。