柔性数组实现

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. 减少内存碎片,由于结构体的柔性数组和结构体成员的地址是连续的,即可一同申请内存,因此更大程度地避免了内存碎片。另外由于该成员本身不占结构体空间,因此,整体而言,比普通的数组成员占用空间要会稍微小点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值