文章下方附学习资源,自助领取
柔性数组在实际中应用还是挺多的,看过上一篇文章分享一种灵活性很高的协议格式(附代码例子)的小伙伴不知有没有注意到我们有使用了柔性数组:
本篇文章我们就来一起学习柔性数组。
C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。
柔性数组的特点:
例子:
// 微信公众号:嵌入式大杂烩
#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;
}
编译、运行:
下面我们一起通过实例来认识柔性数组的优点。
点击获取1V1嵌入式学习规划,现在还送100G精选学习资料。咨询学习嵌入式物联网开发
上一节的协议格式结构体其实可以又如下两种创建方式:
typedef struct _protocol_format
{
uint16_t head;
uint8_t id;
uint8_t type;
uint8_t length;
uint8_t value[];
}protocol_format_t;
typedef struct _protocol_format
{
uint16_t head;
uint8_t id;
uint8_t type;
uint8_t length;
uint8_t *value;
}protocol_format_t;
柔性数组的方式结构体占用较指针的方式少。
柔性数组方式:
指针方式:
柔性数组的方式相对与指针的方式更为简洁,柔性数组的方式只需要申请一次空间,给结构体申请空间的同时也给柔性数组申请空间;而指针的方式,除了给结构体申请空间之外,还得给结构体里的指针成员申请空间。
柔性数组方式:
指针方式:
使用指针的方式写代码会比柔性数组的方式会繁琐一些,特别地,如果在释放内存的时候把顺序弄反了,则结构体里的指针成员所指向的内存就释放不掉,会造成内存泄露。
柔性数组的方式只需要申请一次空间,是一块连续的空间;而指针的方式,申请的两块空间不是连续的。连续的内存有益于提高访问速度。
当然,前面介绍柔性数组的时候有说到,柔性数组是在C99标准及之后才有的,如果你的编译器还是比较古老的,那还是选用指针的方式,通用性也会比较好。
作者:嵌入式微处理器
本文转载自“嵌入式微处理器”,如有侵权,请联系删除
原文链接:柔性数组在实际项目中的应用?
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
页面更新:2024-03-31
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号