柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:
本篇文章我们就来一起学习柔性数组。
什么是柔性数组?
c99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。
柔性数组的特点:
结构体中柔性数组成员前面必须至少有一个其他成员。
sizeof返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用malloc()函数进行内存的动态分配。
例子:
// 微信公众号:嵌入式大杂烩#include #include #include typedef struct _data{ int len; char val[];}data_t; int main(int arc, char *argv[]){ data_t test_data1 = {0}; printf(sizeof(data_t) = %ld, sizeof(data_t)); char *src_data = hello flexible arr; // 为结构体及其柔性数组成员申请一块连续的空间 int len = strlen(src_data) + 1; data_t *p_test_data2 =(data_t*)malloc(sizeof(data_t) + sizeof(char) * len); if (null == p_test_data2) { printf(malloc p_test_data2 error); return exit_failure; } // 填充结构体 p_test_data2->len = len; strncpy(p_test_data2->val, src_data, p_test_data2->len); printf(p_test_data2->val = %s, p_test_data2->val); // 释放内存 free(p_test_data2); p_test_data2 = null; return 0;}
编译、运行:
下面我们一起通过实例来认识柔性数组的优点。
柔性数组与指针的区别?
上一节的协议格式结构体其实可以又如下两种创建方式:
value字段以柔性数组的方式定义:
typedef struct _protocol_format{ uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t value[];}protocol_format_t;
value字段以指针的方式定义:
typedef struct _protocol_format{ uint16_t head; uint8_t id; uint8_t type; uint8_t length; uint8_t *value;}protocol_format_t;
(1)结构体占用空间
柔性数组的方式结构体占用较指针的方式少。
柔性数组方式:
指针方式:
(2)代码简洁及访问速度方面
柔性数组的方式相对与指针的方式更为简洁,柔性数组的方式只需要申请一次空间,给结构体申请空间的同时也给柔性数组申请空间;而指针的方式,除了给结构体申请空间之外,还得给结构体里的指针成员申请空间。
柔性数组方式:
指针方式:
使用指针的方式写代码会比柔性数组的方式会繁琐一些,特别地,如果在释放内存的时候把顺序弄反了,则结构体里的指针成员所指向的内存就释放不掉,会造成内存泄露。
柔性数组的方式只需要申请一次空间,是一块连续的空间;而指针的方式,申请的两块空间不是连续的。连续的内存有益于提高访问速度。
当然,前面介绍柔性数组的时候有说到,柔性数组是在c99标准及之后才有的,如果你的编译器还是比较古老的,那还是选用指针的方式,通用性也会比较好。
台湾半导体封测业内忧外患 最怕两“大”
随着不同场景逐步打开 未来机器人服务的领域将会越来越广
欧司朗推出首款板上芯片LED—Soleriq E
嵌入式开发中SD卡的分类及常见属性
德州仪器公布2021年第四季度财报_国巨扩大01005MLCC产品范围和产能
什么是柔性数组?柔性数组有何优点
新唐科技M487KIDAE控制器简介
全国首套复杂地质条件下智能化综放工作面投入生产
叽里呱啦APP的注册登录方式解析
SIM卡座连接器的结构有哪些?
智能孢子捕捉仪的应用是高标准农田建设的关键
基于XL4016降压电路减小输出纹波电压的方法
车床自动上下料装置引进的作用
德赛西威发布2018年上半年财报,1-6月公司实现营业收入28.6亿元
用6C33C—B制作10W单端放大器,6c33 power amplifier
表面缺陷检测仪的原理以及功能的详细介绍
电视蓝海在5G时代卷土重来
贴片三极管丝印所代表的型号是什么?
性能轻松搞定小米6,努比亚Z17明日发布:爱潮流,追时尚!
矿难救援的有力工具,红外热像仪在煤炭行业中有哪些应用?