当前位置: 首页 > news >正文

高阶C语言补充:柔性数组

C99中,结构体中最后一个元素允许时未知大小的数组,这就叫做柔性数组成员。

vs编译器也支持柔性数组。

之所以把柔性数组单独列出,是因为:

1、柔性数组是建立在结构体的基础上的。

2、柔性数组的使用用到了动态内存分配。

        这使得柔性数组不能单独的放在其他两篇文章当中,因此本文较为剪短,只介绍柔性数组这一个概念。

柔性数组的声明:

1、一定是在结构体中。

2、柔性数组前面一定要有 其他成员。

typedef struct s
{int i;int a[0];//柔性数组成员
}type_a;//若编译器其无法通过,则可以写为:
typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;
柔性数组的特点:

1、结构体中的柔性数组成员前必须至少有一个其他成员。

2、sizeof返回的这种结构体的大小不包括柔性数组的内存。

3、包含柔性数组成员的结构体用malloc函数进行动态内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。

struct S
{int n;int arr[];//柔性数组成员
};//柔性数组成员和int*型成员类似
struct S
{int n;int* arr;
};

异:

1、柔性数组只需要一次malloc就可以完成结构体成员和数组的创建。

2、int*成员需要两次malloc来开辟,两次free来释放。

同:

1、柔性数组和int*成员两个都需要malloc来开辟空间、free释放。

柔性数组的使用
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 40);if (ps == NULL){return 1;}ps->n = 100;int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//调整大小struct S* ptr = (struct S*)realloc(ptr, sizeof(struct S) + 80);if (ptr != NULL){ps = ptr;ptr = NULL;}//释放free(ps);//只需要一次释放ps = NULL;return 0;
}
 int*成员的使用
int main()
{//创建struct S* ps = (struct S*)malloc(sizeof(struct S));//第一次mallocif (ps == NULL){//...return 1;}ps->n = 100;ps->arr = (int*)malloc(40);//第二次mallocif (ps->arr == NULL){//..报错return 1;}//使用int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//扩容int* ptr = (int*)realloc(ps->arr, 80);if (ptr == NULL){return 1;}ps->arr = ptr;ptr = NULL;//释放//两次释放free(ps->arr);free(ps);return 0;
}

1、malloc的次数越多,free的次数越多,越容易造成内存泄漏。

2、malloc的次数越多,造成的内存碎片就越多,程序的性能就越低。

柔性数组的优势
  1. 方便内存的释放。
  2. 连续的内存能提高访问速度

        柔性数组只需要释放一次,不易产生内存泄漏。malloc一次开辟的空间是连续的,对内存的访问速度更高。

        一个结构体中只允许存在一个柔性数组。

 

http://www.lryc.cn/news/486272.html

相关文章:

  • S32K324信息安全-使用IC5000/IC5700进行debug口解锁
  • 简单实现QT对象的[json]序列化与反序列化
  • Unity肢体控制(关节控制)
  • Node.js | Yarn下载安装与环境配置
  • WPF如何全局应用黑白主题效果
  • [Qt] Qt删除文本文件中的某一行
  • 【HarmonyOS学习日志(9)】一次开发,多端部署之界面级一多开发
  • 基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六
  • Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)
  • 解析 Android WebChromeClient:提升 WebView 用户体验的关键组件
  • 【LeetCode热题100】字符串
  • OceanBase 闪回查询
  • C++析构函数详解
  • 【网络安全 | 漏洞挖掘】未授权获取AI聊天内容
  • 时间序列分析——移动平均法、指数平滑法、逐步回归法、趋势外推法等(基于Python实现)
  • opencv(c++)----图像的读取以及显示
  • PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】
  • (笔记)ubuntu20安装jdk7,多版本管理
  • Python系列教程
  • 如何恢復電腦IP地址的手動設置?
  • Linux 下敏感文件路径总结
  • gitlab 服务器集群配置及 存储扩展配置
  • 3D Gaussian Splatting 代码层理解之Part2
  • .length和.length()有什么区别?什么情况下使用哪个?
  • React Native 全栈开发实战班 - 网络与数据之 websock与服务端交互
  • 黑马智慧商城项目学习笔记
  • 计算机网络WebSocket——针对实习面试
  • 请介绍一下Python的网络编程以及如何使用socket模块进行网络通信
  • 【第三课】Rust变量与数据类型(二)
  • vue使用List.reduce实现统计