弹性数组(柔性数组、灵活数组)

弹性数组
C99中,结构中的最后一个元素允许是未知的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组,可变长数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔型数组成员的结构用malloc函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔型数组的预期大小。

为什么结构中的柔性数组成员前面必须至少有一个其他成员?
可变长数组
C89标准规定,数组大小必须是在编译时刻确定的;在C99中,这个标准项被扩展,可以使运行时刻确定的值。也就是说,可变长数组和C++本身没有关系,只要是支持C99的的就可以使用可变长数组,包括支持C99的C编译器。
结构体定义:
typedef struct st_type
{
int ncnt;
int item[0];
}type_a;
(有些编译器会报错无法编译,可以改成:)
typedef struct st_type
{
int ncnt;
int item[];
}type_a;
这样我们就可以定义一个可变长的结构,用sizeof(type_a)得到的只有4,就是sizeof(ncnt)=sizeof(int)那个0个元素的数组没有占用空间,而后我们可以进行变长操作了。
C语言版: type_a *p = (type_a)malloc(sizeof(type_a)+100*sizeof(int));
C++语言版:type_a * p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];
这样就产生了一个长尾100的type_a类型的东西用p->item[n]就能简单地访问可变长元素,原理十分简单,分配了sizeof(type_a)多的内存后int item[];就有意义了,他指向的是int ncnt后面的内容,是没有内存需要的,而在分配时多分配的内存就可以由其来操作,是个十分好用的技巧。
释放
C语言版:free(p);
C++语言版:delete[] p;

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值