C语言冷门知识之你可能没听过的柔性数组
时间:2022-11-02 11:00:34|栏目:C代码|点击: 次
一、简述
在c99中有明确的规定允许结构体中最后一个数组大小是未知的。
柔性数组其实是结构体中的最后一个数组未说明大小,且结构体中至少包含一个以上其他类型,如
#include<stdio.h> struct hei { int zeng; char shi; int arr[];//或者int arr[0]; }ma; int main() { struct hei ma; return 0 }
二、具体使用
1.用创建柔性数组的方法:
#include<stdio.h> #include<stdlib.h> #include<stdlib.h>//或者是#include<malloc.h>动态内存函数的头文件 struct d { int nb; int nn; int arr[]; }; int main() { struct d *p=(struct d*)malloc(sizeof(struct d)+5*sizeof(int));//分别给结构体中的除了柔 //性数组的其他类型和给柔性数组申请空间 p->nb=100; p->nn=50; for(int i=0;i<5;i++) { p->arr[i]=i;//赋值 printf("%d ",p->arr[i]); } struct d *pp=(struct d*)realloc(p,48); //重新调整所申请的空间,将柔性数组调整为40。 if(pp!=NULL) { p=pp; for(i=5;i<10;i++) { p->arr[i]=i;//赋值 printf("%d ",p->arr[i]); } free(p); p=NULL; } return 0; }
2.用普通的写法
#include<stdio.h> #include<stdlib.h> struct bb { int a; int *arr; }; int main() { struct bb* p=(struct bb*)malloc(sizeof(struct bb)); p->a=20; p->arr=(int*)malloc(5*sizeof(int)); for(int i=0;i<5;i++) { p->arr[i]=i; printf("%d ",p->arr[i]); } int *ptr=(int*)realloc(p->arr,40); if(pp!=NULL) { p->arr=ptr; for(int i=5;i<10;i++) { int t=p->arr[i]=i; printf("%d ",t); } } free(p->arr); p->arr=NULL; free(p); p=NULL; return 0; }
三、柔性数组的特点
1.对比这两种来看,柔性数组的特点在于只需要用一次malloc创建就可以,而普通的解法则需要两
次,因为malloc申请的内存位置是任意的,所以柔性数组可以减少内存碎片化。
2.柔性数组申请的内存更加集中,有利于查找使用。
3.sizeof求结构体大小时所求出的大小没有包括柔性数组的大小。
4.用malloc函数进行动态内存申请时,柔性数组的大小应该大于结构体的大小
以便于柔性数组适应预期大小。
5.柔性数组只用一次开辟,有利于提高访问速度
------------------------------------------------------------------------------------------------------------------
小伙伴们有什么想法可以留言
栏 目:C代码
下一篇:C++实现LeetCode(34.在有序数组中查找元素的第一个和最后一个位置)
本文标题:C语言冷门知识之你可能没听过的柔性数组
本文地址:http://www.codeinn.net/misctech/217968.html