C语言中的柔性数组你真的了解吗
程序员文章站
2022-06-03 23:01:57
目录柔性数组概念:特点:与指针动态开辟的比较指针动态开辟柔性数组指针动态开辟的缺点总结柔性数组概念:柔性数组就是一种特殊的数组它也是结构体最后一个成员也就是说,它存在结构体最后一个成员的位置上特点:1...
柔性数组概念:
柔性数组就是一种特殊的数组
它也是结构体最后一个成员
也就是说,它存在结构体最后一个成员的位置上
特点:
1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小
#include<stdio.h> struct s { int n ; int arr[0];//或者int arr[]; }; main() { printf("the size of the structure is %d",sizeof(struct s)); return 0; }
2.在结构体中,如果存在柔性数组,就必须满足它的前面含有其它的成员,来申请空间,,因为他的大小本身是未知的,不计算大小。
3.包含柔性数组的结构体要靠malloc去动态申请这块空间,这就体现了柔性数组的柔,也就是可以控制大小,且分配的空间一定满足大于其它成员的大小。
与指针动态开辟的比较
在日常的编程中,有时候需要在结构体中存放一个长度动态的数组
一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该数组所在的动态内存空间
指针动态开辟
#include<stdio.h> struct s { int n; int* arr; }; int main() { struct s* ps = (struct s*)malloc(sizeof(struct s)); ps->n = 100; ps->arr = (int*)malloc(40); free(ps->arr); ps->arr = null; free(ps); ps = null; return 0; }
通过柔性数组来实现如下:
柔性数组
#include<stdio.h> struct s { int n; int arr[0];//柔性数组 }; int main() { struct s* ps = (struct s*)malloc(sizeof(struct s)+40); //使用 //改变申请的空间 struct s* tmp= (struct s*)realloc(ps, sizeof(struct s)+80); if (tmp == null) { return; } if (tmp != null) { ps = tmp; } return 0; }
指针动态开辟的缺点
1.此方式会多次进行开辟于释放动态申请的空间,就容易会导致错误
2.容易出现内存碎片
当指针动态开辟的足够多的时候,中间就会出现很多内存碎片,每个内存碎片不连续
就会导致空间的浪费
3.相较于柔性数组,cpu访问的速度要慢一些
cpu访问内存大部分在访问一个空间后,就会访问相邻的空间,就不一次性访问下一个连续的空间,这就会导致,在一定程度上的降速。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!