1 概念
struct flexible
{
int len;
char data[0];//不计入内存
//or char data[];
};
结构体中最后一个元素是数组名,不计入内存,即sizeof (struct flexible) = sizeof (int)
。
2 使用
typedef struct flexible
{
int len;
char data[];//不计入内存
//or char data[0];
}Flexible;
Flexible* getEmptyString(int len)
{
//sizeof (Flexible) = 4 = sizeof (int)
(Flexible*) p = (Flexible*)malloc(sizeof(Flexible)+ len + 1);
p->len = len;
p->data[len] = '\0';
return p;
}
3. 与非柔性数组比较
3.1 原来的模型
typedef struct
{
int len;
char* data;//计入内存
}Nonflexible;
3.2 原来模型使用
Nonflexible* getEmptyString(int len)
{
//sizeof (Nonflexible) = 8 if 32 bits computer
(Nonflexible*) p = (Nonflexible*)malloc(sizeof(Nonflexible));
p->data = (char*)malloc(len + 1);
p->len = len;
p->data[len] = '\0';
return p;
}
3.3 对比
- 只用了一次malloc
- 而且内存是连续的,减少内存碎片化
- 网络编程中会使用到柔性数组