柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:
本篇文章我们就来一起学习柔性数组。
什么是柔性数组?
C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。
柔性数组的特点:
结构体中柔性数组成员前面必须至少有一个其他成员。
sizeof返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用malloc()函数进行内存的动态分配。
例子:
//微信公众号:嵌入式大杂烩 #include#include #include typedefstruct_data { intlen; charval[]; }data_t; intmain(intarc,char*argv[]) { data_ttest_data1={0}; printf("sizeof(data_t)=%ld ",sizeof(data_t)); char*src_data="helloflexiblearr"; //为结构体及其柔性数组成员申请一块连续的空间 intlen=strlen(src_data)+1; data_t*p_test_data2=(data_t*)malloc(sizeof(data_t)+sizeof(char)*len); if(NULL==p_test_data2) { printf("mallocp_test_data2error "); returnEXIT_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; return0; }
编译、运行:
下面我们一起通过实例来认识柔性数组的优点。
柔性数组与指针的区别?
上一节的协议格式结构体其实可以又如下两种创建方式:
value字段以柔性数组的方式定义:
typedefstruct_protocol_format { uint16_thead; uint8_tid; uint8_ttype; uint8_tlength; uint8_tvalue[]; }protocol_format_t;
value字段以指针的方式定义:
typedefstruct_protocol_format { uint16_thead; uint8_tid; uint8_ttype; uint8_tlength; uint8_t*value; }protocol_format_t;
(1)结构体占用空间
柔性数组的方式结构体占用较指针的方式少。
柔性数组方式:
指针方式:
(2)代码简洁及访问速度方面
柔性数组的方式相对与指针的方式更为简洁,柔性数组的方式只需要申请一次空间,给结构体申请空间的同时也给柔性数组申请空间;而指针的方式,除了给结构体申请空间之外,还得给结构体里的指针成员申请空间。
柔性数组方式:
指针方式:
使用指针的方式写代码会比柔性数组的方式会繁琐一些,特别地,如果在释放内存的时候把顺序弄反了,则结构体里的指针成员所指向的内存就释放不掉,会造成内存泄露。
柔性数组的方式只需要申请一次空间,是一块连续的空间;而指针的方式,申请的两块空间不是连续的。连续的内存有益于提高访问速度。
当然,前面介绍柔性数组的时候有说到,柔性数组是在C99标准及之后才有的,如果你的编译器还是比较古老的,那还是选用指针的方式,通用性也会比较好。
审核编辑:刘清
-
指针
+关注
关注
1文章
480浏览量
70581 -
编译器
+关注
关注
1文章
1636浏览量
49172 -
C99
+关注
关注
0文章
4浏览量
6173
原文标题:柔性数组在实际项目中的应用?
文章出处:【微信号:wenzi嵌入式软件,微信公众号:wenzi嵌入式软件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论