柔性数组(Flexible Array)也叫伸缩性数组,其实就是变长数组,反映了C语言对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求。比如我们需要在结构体中存放一个动态长度的字符串,这时候,柔性数组可以大显身手了。
C99使用不完整类型来实现柔性数组,标准形式如下:
struct MyStruct
{
int a;
double b;
char c[]; // or char c[0]; 也可以用其他数据类型;
};
c不占用MyStruct的空间,只是作为一个符号地址存在,而且必须是结构体的最后一个成员。
#include
#include
#include
using namespace std;
typedef struct Mystruct{
int a;
double b;
char c[];
}ms, *pms;
int main(){
char c1[] = "Short string.";
char c2[] = "This is a long string.";
pms pms1 = (pms)malloc(sizeof(ms) + strlen(c1) + 1);
if(NULL != pms1){
pms1->a = 1;
pms1->b = 11;
strcpy(pms1->c, c1);
}
cout << "pms1: " << endl << pms1->a << " "
<< pms1->b << " " << pms1->c << endl;
pms pms2 = (pms)malloc(sizeof(ms) + strlen(c2) + 1);
if(NULL != pms2){
pms2->a = 2;
pms2->b = 22;
strcpy(pms2->c, c2);
}
cout << "pms2: " << endl << pms2->a << " "
<< pms2->b << " " << pms2->c << endl;
return 0;
}
总结:
柔性数组的主要作用为:1.方便管理内存缓冲区 2. 减少内存碎片化