结构体中最后一个成员为[0]长度数组的用法 2012-04-27 16:03:58

分类: C/C++

这是个广泛使用的常见技巧,常用来构成缓冲区。比起指针,用空数组有这样的优势: 
1.不需要初始化,数组名直接就是所在的偏移 
2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间。

从herryhuang(Herry)的回复看,你只是看到了表面,并没有想到这种特性是很有利用价值的。“这个数组不占用任何内存”,意味着这样的结构节省空间;“该数组的内存地址就和他后面的元素的地址相同”,意味着无需初始化,数组名就是后面元素的地址,直接就能当做指针使用。

这样的写法最适合制作动态buffer。因为可以这样分配空间: 
malloc(sizeof(struct   XXX)+   buff_len); 
看出来好处没有?直接就把buffer的结构体和缓冲区一块分配了。用起来也非常方便,因为现在kongsuzu其实变成了buff_len长度的数组了。 
这样的好处是: 
一次分配解决问题,省了不少麻烦。大家知道为了防止内存泄漏,如果是分两次分配(结构体和缓冲区),那么要是第二次malloc失败了,必须回滚释放第一个分配的结构体。这样带来了编码麻烦。其次,分配了第二个缓冲区以后,如果结构里面用的是指针,还要为这个指针赋值。同样,在free这个buffer的时候,用指针也要两次free。如果用空数组,所有问题一次解决。 
其次,大家知道小内存的管理是非常困难的,如果用指针,这个buffer的struct部分就是小内存了,在系统内存在多了势必严重影响内存管理的性能。要是用空数组把struct和实际数据缓冲区一次分配大块问题,就没有这个问题。

如此看来,用空数组既简化编码,又解决了小内存碎片问题提高了性能,何乐不为?应该广泛采用。

如果你做过操作系统的开发或者嵌入式开发,这种技巧应该是见得滥了呵呵。

结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理即申请和释放)而如果使用数组,那么只需要一次就可以全部分配出来,(见下面的例子),反过来,释放时也是一样,使用数组,一次释放,使用指针,得先释放结构体内的指针,再释放结构体。还不能颠倒次序。

其实就是分配一段连续的的内存,减少内存的碎片化。

1---结构体中最后一个成员为[0]长度数组的用法相关推荐

  1. 结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  2. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

    结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...

  3. 结构体中string类型成员

    结构体中存在string类型成员 原创 2015年12月21日 17:34:04 标签: 结构体 / string类型成员 / 构造函数 2593 #include <iostream> ...

  4. c结构体中定义的成员指针赋值与结构体指针作为成员函数参数的使用

    c语言定义结构体可以直接声明结构体变量的,如下 struct Student{char *name; int age; }xiaoming 这样以来,我们就定义了一个结构体类型,同时声明了一个结构体变 ...

  5. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  6. 2-结构体的最后一个成员的定义-C语言中的柔性数组-

    深入浅出C语言中的柔性数组 在日常的编程中,有时候需要在结构体中存放一个长度动态的字符串,一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该字符串所在的动态内存空间,例如: [cpp] vi ...

  7. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  8. C语言高级编程:结构体中定义数组的“妙用”

    1. 说明 1)相同类型结构体变量可以直接赋值 2)在结构体中定义一个数组,可以用赋值语句拷贝整个数组,这也是数组间赋值的一个间接实现方式 3)在结构体中定义一个数组,可以传值调用的方法把它传递给函数 ...

  9. c语言结构体定义字符串数组,C语言,结构体中字符串的声明(采用字符指针还是字符数组)...

    结构体中,字符串选项是用字符数组表示好,还是用字符指针表示好? typedef struct person{ char *name; int age; char sex[6]; }: 该结构体中nam ...

最新文章

  1. python语言入门m-Python语言入门详解!快速学成Python!
  2. MyBatis及Spring事务初学总结
  3. .NET Core + Ocelot:API 网关
  4. 遍历这些字符串,如果字符串没有包含数字的,就将字符串中的小写字母转成大写字母并打印字符串
  5. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
  6. c++ release和debug语句分离
  7. 中国经济真相:跑了 1135 家制造企业,我终于明白什么叫自己玩死自己(转)...
  8. 深度神经网络 分布式训练 动手学深度学习v2
  9. 用AD画PCB流程介绍
  10. EXCEL合并单元格自动行高
  11. 【论坛】交通需求管理政策与实践——中国城市交通发展论坛第十一次研讨会讨论精选...
  12. 详细分析本机号码一键登录原理!建议收藏
  13. 【ActiveMQ】JMS中间件ActiveMQ详解
  14. 阿里滑块,X82Y,解决方案
  15. 处理Zabbix历史数据库办法二---使用MySQL表分区
  16. Z-Stack + OSAL操作系统
  17. 证件怎么扫描?手机即可扫描
  18. linux三剑客试题,Linux三剑客(grep、sed、awk)详解
  19. 常用自动门感应器工作原理
  20. Python3.9全部73个内置函数说明

热门文章

  1. Caffe学习系列(16):各层权值参数可视化
  2. Java集合必会14问(精选面试题整理)
  3. MyBatis 源码分析系列文章导读
  4. 浅析Spring事务传播行为和隔离级别
  5. 常用的绘图约定——提高绘图和读图的效率
  6. 图解JVM垃圾回收算法
  7. IDEA 代码生成插件 CodeMaker
  8. 我给媳妇解释设计模式:第一部分
  9. Expectation Maximization-EM(期望最大化)-算法以及源码
  10. Deep learning From Image to Sequence