春衣少年当酒歌,起舞四顾以笑和。这篇文章主要讲述柔性数组的介绍和简单使用相关的知识,希望能为你提供帮助。
@TOC
前言也许你从未听说过柔性数组这个概念,但它确实存在。C99中,结构体中的最后一个成员允许是未知大小的数组,这就叫柔性数组成员。
1.柔性数组是什么?结构体中的最后一个成员允许是未知大小的数组,这就叫柔性数组成员。
struct Sint n;
int arr[];
//未知大小的柔性数组成员,数组的大小是可以调整的
;
int main()struct S s;
printf("%d\\n",sizeof(s));
//计算次结构体大小输出 4 并没有计算arr数组的大小
return 0;
我们创建的柔性数组一般用法:
struct Sint n;
int arr[];
;
int main()//创建一个结构体指针ps,给它动态分配4+20个字节的内存
struct S* ps = (struct S*)malloc(sizeof(struct S) + 5*sizeof(int));
return 0;
//可以使用arr这个柔性数组
free(ps);
ps = NULL;
return 0;
2.柔性数组有哪些好处呢?我们先看如下两个代码
- 代码1 使用柔性数组实现功能
struct Sint n; int arr[]; ; int main()//创建一个结构体指针ps,给它动态分配4+20个字节的内存 struct S* ps = (struct S*)malloc(sizeof(struct S) + 5*sizeof(int)); ps-> n = 100; int i = 0 for (i=0; i< 5; i++)ps-> arr[i] = i; //给数组arr赋值 0 1 2 3 4free(ps); ps = NULL; return 0;
- 代码2 使用常用的嵌套指针的方式实现功能
struct Sint n; int* arr; ; int main()struct S* ps = (struct S*)malloc(sizeof(struct S)); ps-> arr = malloc(5*sizeof(int)); int i = 0 for (i=0; i< 5; i++)ps-> arr[i] = i; //给数组arr赋值 0 1 2 3 4//释放两个开辟的内存 free(ps-> arr); ps-> arr = NULL; free(ps); ps = NULL; return 0;
代码1 和 代码2 都可以实现arr数组大小的灵活调整。但是代码1有两个好处:
- 方便内存的释放
如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户,用户调用free可以释放结构体但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以我们把结构体的内存以及成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有内存给释放调。 - 提高访问速度
连续的内存有利于提高访问速度,也有利于减少内存碎片
- 方便内存的释放
- 结构体中的柔性数组成员前面必须有一个其他成员
- sizeof 返回的这种结构大小不包括柔性数组的内容
- 包含柔性数组的成员结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
struct Sint n;
//柔性数组成员前面必须存在的成员
int arr[];
;
int main()//此结构体内存的大小为 4
struct S s;
printf("%d\\n",sizeof(s));
//计算次结构体大小输出 4 并没有计算arr数组的大小
//给它动态分配4+20个字节的内存24>
4
struct S* ps = (struct S*)malloc(sizeof(struct S) + 5*sizeof(int));
return 0;
总结 以上就是今天要讲的内容,本文仅仅简单介绍了柔性数组这块,就是自己平时上课时的笔记和一些心得。
【柔性数组的介绍和简单使用】 希望对看到的大家有所帮助!!!
推荐阅读
- 微服务主流通信协议详解
- 类和对象—3
- Jmeter原理和安装
- 大神带你搭建FTP
- Go 入门很简单(Writer和Reader接口)
- shell中获取Harbor中所有的镜像列表(超实用,建议收藏)
- 3 种工厂模式详解(JS)
- RocketMQ提升性能的几种方式(锁,压缩算法)
- Kubernetes 1.15&1.19 安装及组件关系(证书安装篇)