C语言奇技淫巧之-柔性数组

C语言奇技淫巧之-柔性数组

简介

柔性数组(flexible array)这个概念指的是数组元素数量未定义的数组。柔性数组位于结构体(struct)内,称为柔性数组成员。其定义为:结构体内最后一个元素允许是未知大小的数组,这个数组称为柔性数组成员,也就是说,结构体中柔性数组成员前面必须至少有一个其他成员。

柔心数组定义

柔性数组成员定义如下:

typedef example
{
	int a;
	int array[]
}t_ex;

此时的结构体大小是多少?5? 8? 还是n?
都不对,sizeof(t_ex)结果是4!
为什么会是4?举个不恰当的例子,把结构体看作是一个单位,在定义结构体的时候,这个单位的大小就已经规定好了,里面有多少编制也已经定好了,不会在进行扩编。而编制是不包括柔性数组成员的,柔性数组成员就是编外人员,或者说外包(bushi)。

柔性数组使用

柔性数组成员使用:使用时必须用指针且分配好地址空间。用malloc进行动态内存分配,且分配的大小要大于结构体的大小:

typedef example
{
	int a;
	int array[]
}t_ex;
//为柔性数组成员申请10个元素
t_ex *p=(t_ex *)malloc(sizeof(t_ex)+10*sizeof(int));

那么,申请完空间之后,*p的大小是多大呢?是44吗?
又错了!!!
sizeof(*p)结果是4!!!上一章已经讲过,柔性数组成员是编外人员,是外包,招再多也不会进入编制!(好惨)所以sizeof(*p)就是4。
虽然,柔性数组成员不在编制内,但是却可以调用:

typedef example
{
	int a;
	int array[]
}t_ex;
//为柔性数组成员申请10个元素
t_ex *p=(t_ex *)malloc(sizeof(t_ex)+10*sizeof(int));

p->array[0]=100;

因为是使用malloc动态开辟的空间,所以使用完一定要释放掉,使用free§将空间释放;如果不释放,很可能会出现一个经典bug:内存泄漏!

参考

C语言深度解剖

  • 11
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值