下班写文章难免会有些出错,也感谢那些在后台留言指出错误的读者;表驱那篇推文存在数组越界问题,可以通过预先开辟一个大数组的方式解决,但这样解决方式会存在资源浪费问题,如果想不浪费资源来解决数组溢出的问题,那就来看看柔性数组怎么样!
| 简单介绍
C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作 柔性数组 。 柔性数组的特点:
结构体中柔性数组成员前面必须至少有一个其他成员。
sizeof返回的这种结构大小不包括柔性数组的内存。
包含柔性数组成员的结构用malloc()函数进行内存的动态分配。
#includetypedef struct { int length; int arr[]; }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--
全部0条评论
快来发表一下你的评论吧 !