【C语言】变长结构体

变长结构体并非结构体大小可变,而是通过结构体中未指定长度的数组来访问额外数据。其好处包括内存管理的便利性和减少碎片化。应用包括Socket通信数据包传输、数据包解析等场景。

什么叫变长结构体?

其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据。

struct Var_Len_Struct
{
     int nsize;
     char buffer[0];
};

那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。更为巧妙的是,我们甚至可以用nsize存储字符串buffer的长度。

变长结构体的好处体现在哪?

引出部分如果说定义定长数组浪费空间,定义一个指针不也能指向变长的数据域部分吗?

是的,是可以实现的。那么我们就对比下有什么不同。

   <1> 存储大小方面:指针的方式需要多开辟存储空间。

   <2> 数据连续存储方面:指针明显数据域是单独开辟的空间,与前的nsize不在连续的存储区域,而数组则在连续的存储空间下。

   <3>释放内存方面:显然指针的方式,需要先释放数据域部分,才能释放指向结构体的指针变量;而数组可以直接释放。

总结如下:

  • 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)。

  • 而如果使用数组,那么只需要一次就可以全部分配出来,反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。

  • 其实变长结构体就是分配一段连续的的内存,减少内存的碎片化,简化内存的管理。

变长结构体的应用

<1>Socket通信数据包的传输;

<2>解析数据包,如笔者遇到的问题。

<3>其他可以节省空间,连续存储的地方等。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值