c语言延长数组程序,C语言中变长数组的使用方法

先说说我的理解:

struct example{

__u16 tag_type;

__u16 tag_len;

char tag_data[0];

} __attribute ((packed));

1. 存在的意义:当结构体的长度变长时,例如里面有一个字符串时,为了方便管理内存。

这个结构体不要用struct example a的方式定义, 而应用struct example *a; a = (struct example *)malloc(sizeof(struct example) + extrasize);的形式。extrasize是想额外申请的空间,就是字符串的长度。

2. 如何使用里面的数据?

前面的数据项不用说了,后面的tag_data直接就是我们申请的额外的地址的开始地址。所以,很好用

3. 如何释放申请的地址空间?

直接free(a)就好。有些人可能认为后面的空间没有释放,其实不然。因为malloc申请的空间系统是需要进行管理的,你申请了多少,当你释放的时候,就释放多少。并不是根据你的数据类型来的,否则你说 char *p; p  = malloc(20); 然后free(p);系统该释放多少空间呢。 至于系统如何管理的,貌似是通过一个链表进行的,记不清了。

4. 附1

为了解决这个疑惑,后来看了几篇文章,感谢他们。

后来就是人提到过有些编译器不支持0长数组,那怎么办呢?很简单,将数组长度定为1即可,这样仅仅浪费一个字节的空间(字节对齐的话另当别论)。这样做还有另外一个好处就是不用记录这个字符串的长度, 因为本来就存了一个字节的空间,可用这一个字节的空间来标识这个字符串是否为空。

5.附2

有人可能会问,为什么最后一个数据项不设置成一个指针呢?char tag_data[0]; 和char *tag_data;有什么区别呢?

第一个问题:最好不要设置成指针,因为这样的话,你得为tag_data指针重新申请空间,申请的空间还不连续;其次,释放的时候很麻烦,必须先释放内部的指针,但是这个往往是人最容易忽略而造成内存呢泄露的原因。

第二个问题:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值