下班写文章难免会有些出错,也感谢那些在后台留言指出错误的读者;表驱那篇推文存在数组越界问题,可以通过预先开辟一个大数组的方式解决,但这样解决方式会存在资源浪费问题,如果想不浪费资源来解决数组溢出的问题,那就来看看柔性数组怎么样!
|简单介绍
C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。 柔性数组的特点:
结构体中柔性数组成员前面必须至少有一个其他成员。
sizeof返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用malloc()函数进行内存的动态分配。
#includetypedef struct { int length; intarr[]; }data_t; int main() { data_t data1; printf("sizeof:%d ",sizeof(data1)); return 0; }
注意:在DEV CPP中,屏蔽了第五行并不会报错!
| 简单使用
#include#include typedef struct { int length; int arr[]; }data_t; int main() { //为结构体及其柔性数组成员申请一块连续的空间 data_t *p=(data_t*)malloc(sizeof(data_t)+10*sizeof(int)); if(NULL==p) { printf("malloc error "); return 0; } p->length=10; for(int i=0;i length;i++) { p->arr[i]=i;//赋值 printf("%d ",p->arr[i]); } printf(" "); //重新调整所申请的空间,将柔性数组调整为40 p=(data_t*)realloc(p,sizeof(int)+40); if(NULL==p) { printf("malloc error "); return 0; } p->length=40; for(int i=0;i length;i++) { p->arr[i]=i;//赋值 printf("%d ",p->arr[i]); } printf(" "); //释放内存 free(p); p=NULL; return 0; }
| 优势总结
柔性数组的特点在于只需要用一次malloc创建就可以,而且和结构体是在同一块连续的空间,对比在结构体中放指针成员而言,可以减少内存碎片化,因为malloc申请的内存位置是任意的;柔性数组申请的内存更加集中,有利于查找使用;柔性数组只用开辟一次,有利于提高访问速度;用malloc函数进行动态内存申请时,柔性数组的大小应该大于结构体的大小以便于柔性数组适应预期大小。 --END--
-
内存
+关注
关注
8文章
3017浏览量
73993 -
C语言
+关注
关注
180文章
7604浏览量
136636 -
函数
+关注
关注
3文章
4326浏览量
62558 -
数组
+关注
关注
1文章
416浏览量
25939 -
结构体
+关注
关注
1文章
130浏览量
10840
原文标题:C语言|柔性数组
文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论