1. 柔性数组定义
typedef struct {
unsigned int len;
unsigned char data[0]; // 定义空数组
} SoftArr;
2. 模拟程序
void testSoftArr() {
printf("softArr len : %llu\n", sizeof(SoftArr));
char *myStr = "hello world";
unsigned int myStrLen = strlen(myStr) + 1;
printf("myStr len: %d \n", myStrLen);
SoftArr *arr = (SoftArr *)malloc(sizeof(SoftArr) + myStrLen);
arr->len = myStrLen;
memcpy_s(arr->data, myStrLen, myStr, myStrLen);
printf("myStr(%s)\n", arr->data);
free(arr);
}
3. 优势
1. 柔性数组成员必须定义在结构体里面且为最后元素
2. 结构体中不能单独只有柔性数组成员
3. 柔性数组不占内存
4. 由于结构体使用指针地址不连续(两次 malloc),柔性数组地址连续,只需要一次 malloc,同样释放前者需要两次,后者可以一起释放。
5. 在数据拷贝时,结构体使用指针时,必须拷贝它指向的内存,内存不连续会存在问题,柔性数组可以直接拷贝。
6. 减少内存碎片,由于结构体的柔性数组和结构体成员的地址是连续的,即可一同申请内存,因此更大程度地避免了内存碎片。另外由于该成员本身不占结构体空间,因此,整体而言,比普通的数组成员占用空间要会稍微小点。