c语言中的柔性数组

目录

1.柔性数组的特点

2.柔性数组的创建和简单使用

 3.柔性数组的优势


何为柔性数组(Flexible Array)

柔性数组在C语言的 C99 标准中,引入的新特性。结构中的最后一个元素的大小允许是未知的数组,即为柔性数组。

struct S {int i;int arr[];   //柔性数组成员/*int arr[0];*/ //这两种写法都可以,具体看编译器
};

1.柔性数组的特点

  • 柔性数组不能单独的出现在结构体之中,至少要包含一个及以上其它成员,且要在末尾
  • 利用sizeof计算的结构体大小,并不会去计算柔性数组的大小
  • 包含柔性数组成员的结构体要利用malloc来进行动态内存分配,且分配的内存大小要大于结构体内存大小,来达到预期的所需内存的大小。

2.柔性数组的创建和简单使用

创建

struct S {int i;int arr[];  
};
int main() {struct S *s = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));
//使用malloc创建了一个大小为:       (结构体本身大小) + 柔性数组你所期望的大小struct S *s = (struct S*)malloc(sizeof(struct S)+10*sizeof(int));//调整柔性数组大小return 0;
}

 

这就是为什么柔性数组为什么要在成员末尾的原因,只有它在末尾,开辟内存的大小变化时,柔性数组的大小才会随着变化,这就是所谓的柔性数组

 简单使用

                                                                   代码一

struct S {int i;int arr[];  
};
int main() {struct S *p = (struct S*)malloc(sizeof(struct S)+5*sizeof(int));if(p == NULL)return 1;//业务处理p->i = 100;for (int i = 0; i < 100; i++){p->arr[i] = i;}//释放空间free(p);p = NULL;return 0;
}

 3.柔性数组的优势

在上柔性数组的简单使用中,我们的代码换种写法也可以达到跟柔性数组一样的功能

把柔性数组成员换成:指针变量

                                                                  代码二

struct S {int i;int *parr;
};
int main() {struct S* p = (struct S*)malloc(sizeof(struct S));if (p == NULL)return 0;p->parr = (int*)malloc(5 * sizeof(int));//多一次malloc就必然要多一次检查和内存释放if (p->parr == NULL)                         return 0;//业务处理p->i = 100;for (int i = 0; i < 100; i++){p->parr = i;}//释放空间free(p->parr);  //得先释放结构体成员parr所指向的空间p->parr = NULL;free(p);        //在释放p,若顺序弄错造成内存泄露p->parr = NULL;return 0;
}

说白了就是利用结构体里的指针paar再去开辟一块动态内存空间 

代码一比代码二优势的地方在于:

   优势 1 :方便内存释放

使用了较少次的malloc,这样使后面的内存释放得到了方便,且也不容易造成内存泄漏

   优势 2 :提升性能

连续的内存有益于提⾼访问速度,也有益于减少内存碎⽚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287623.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

更高效稳定 | 基于ACM32 MCU的编程直流电源应用方案

随着电子设备的多样化发展&#xff0c;面对不同的应用场景&#xff0c;需要采用特定的供电电源。因此&#xff0c;在电子产品的开发测试过程中&#xff0c;必不可少使用编程直流电源来提供测试电压&#xff0c;协助完成初步的开发测试过程。 编程直流电源概述 编程直流电源结构…

[Linux]知识整理(持续更新)

前言 Linux的目录结构 Linux的目录结构是一个树型结构 Windows 系统可以拥有多个盘符, 如 C盘、D盘、E盘 Linux没有盘符这个概念, 只有一个根目录 /, 所有文件都在它下面 Linux路径的描述方式 第一章 基本命令 命令格式 例:ls –la /etc 说明: 1)个别命令使用不遵循…

大语言模型(LLM)token解读

1. 什么是token&#xff1f; 人们经常在谈论大模型时候&#xff0c;经常会谈到模型很大&#xff0c;我们也常常会看到一种说法&#xff1a; 参数会让我们了解神经网络的结构有多复杂&#xff0c;而token的大小会让我们知道有多少数据用于训练参数。 什么是token&#xff1f;比…

gitee拉取与推送

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 一&#xff0c;从本地推送项目到gitee1.首先我们在gitee上创建一个仓库2.clone远程仓库到本地3.git的三板斧3.1. add - 将代码添加到本地仓库3.2. commit …

信息系统项目管理师——第8章项目整合管理(一)

选择题大概考3-4分&#xff0c;需要背诵课文并加以理解。案例题主要是考实施整体变更控制流程。论文考的比较少。 整合管理概述❤❤❤ 项目整合管理是指对项目管理过程组内各过程及活动进行识别、定义、组合、统一和协调的过程。在项目全过程中起到统一、合并、沟通及建立联系…

docker安装elasticseachkibana

1.docker安装es 创建本机挂载目录&#xff0c;与容器上目录映射 /Users/wangpei/2024/mydata/elasticsearch conf下创建yml文件 echo "http.host : 0.0.0.0" >> /Users/wangpei/2024/mydata/elasticsearch/config/elasticsearch.yml 安装容器&#xff1a; d…

计算机网络:物理层 - 编码与调制

计算机网络&#xff1a;物理层 - 编码与调制 基本概念编码不归零制编码归零制编码曼彻斯特编码差分曼彻斯特编码 调制调幅调频调相混合调制 基本概念 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频和视频&#xff0c;他们可以统称为消息数据&#xf…

EPSON推出的实时时钟模块RX8130CE功耗低至300nA、从容应对各种使用场景

随着科技的进步和消费者需求的不断变化&#xff0c;笔记本电脑市场继续展现出强劲的发展势头一方面移动性和轻薄性成为主流&#xff0c;另外一方面性能在不断提升&#xff0c;功能也日益丰富。实时时钟模组&#xff0c;作为提供时间和定时功能的单元模块&#xff0c;是笔记本电…

JAVA面试大全之集合IO篇

目录 1、集合 1.1、Collection 1.1.1、集合有哪些类&#xff1f; 1.1.2、ArrayList的底层&#xff1f; 1.1.3、ArrayList自动扩容&#xff1f; 1.1.4、ArrayList的Fail-Fast机制&#xff1f; 1.2、MAP 1.2.1、Map有哪些类&#xff1f; 1.2.2、JDK7 HashMap如何实现…

[BT]BUUCTF刷题第8天(3.26)

第8天 Web [CISCN2019 华北赛区 Day2 Web1]Hack World 题目明确提示flag在flag表里的flag列&#xff0c;这里先尝试1 返回&#xff1a;你好&#xff0c;glzjin想要一个女朋友。 再尝试1&#xff0c;返回bool(false) 到这里就感觉是布尔盲注的题目类型了&#xff08;虽然我没…

阿里云2核4G服务器优惠价格30元、165元和199元1年,轻量和ECS

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Java22重磅发布!!!!卷不动了,真的卷不动了。。。。

就在3月19日&#xff0c;Java22重磅发布。Java22新增了12项增强功能&#xff0c;其中包括七个预览特性和一个孵化器特性&#xff0c;这些功能都显著到足以引起JDK增强提案&#xff08;JEPs&#xff09;的关注。它们涵盖了Java语言、其API、性能以及JDK中包含的工具的改进。 真…

代码随想录阅读笔记-二叉树【统一迭代法】

此前我们用递归的方式&#xff0c;实现了二叉树前中后序的遍历&#xff0c;又用栈实现了二叉树前后中序的迭代遍历&#xff08;非递归&#xff09;。之后我们发现迭代法实现的先中后序&#xff0c;其实风格也不是那么统一&#xff0c;除了先序和后序&#xff0c;有关联&#xf…

Redis如何应对缓存穿透问题——Java全栈知识(9)

我们在正常使用缓存的时候的流程大概就是这样的&#xff1a; 请求访问缓存&#xff0c;缓存有数据就返回&#xff0c;缓存无数据就去数据库里面查数据写入到缓存中。 1、缓存穿透问题 但是如果由恶意请求&#xff0c;短时间内大量的访问不存在的数据&#xff0c;这时每个请求…

数据结构

一、栈 先进后出 二、队列 先进先出 三、数组 查询快&#xff0c;增加修改慢 四、链表 查询慢&#xff0c;增加修改慢 五、二叉树 节点&#xff1a; 查找二叉树 二叉查找树的特点 二叉查找树,又称二叉排序树或者二叉搜索树 每一个节点上最多有两个子节点 左子树上所…

算法---动态规划练习-5(下降路径最小和)

下降路径最小和 1. 题目解析2. 讲解算法原理方法一方法二 3. 编写代码法一法二 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 方法一 首先&#xff0c;通过matrix的大小确定矩阵的行数m和列数n。 创建一个大小为(m1) (n2)的二维动态规划数组dp&#xff0c;其中d…

就业班 第二阶段 2401--3.26 day6 Shell初识 连接vscode

远程连接vs_code可能出现的问题 C:\Users\41703\.ssh 验证远程主机的身份&#xff0c;如果连不上vscode&#xff0c;可以尝试删除这里面的公钥代码。 重新安装那个扩展&#xff0c;排除扩展本身的问题 谁连过我&#xff0c;并操作了什么 curl https://gitea.beyourself.org.c…

Django路由

Router介绍 在实际开发过程中&#xff0c;一个Django项目会包含很多的app,这时候如果我们只在主路由里进行配置就会显得杂乱无章&#xff0c;所以通常会在每个app里&#xff0c;创建各自的urls.py路由模块&#xff0c;然后从根路由出发&#xff0c;将app所属的url请求&#xff…

Spring Boot | Spring Boot的“核心配置“与“注解“

目录: Spring Boot的核心配置与注解 &#xff1a;1. 全局配置文件 ( application.properties / application.yaml&#xff1a;创建项目时候自动生成&#xff0c;其会被“自动导入”到“程序”中 )application.properties配置文件application.yaml 配置文件 (推荐使用)当value值…

PSA制氧装置的工作原理及应用解析

PSA制氧装置&#xff0c;即变压吸附制氧装置&#xff0c;是一种广泛应用于工业生产与其他领域的重要设备。该装置基于吸附剂在不同压力下对气体分子吸附能力的差异&#xff0c;通过周期性压力变化来实现氧气的分离与提纯。 工作原理 PSA制氧装置的工作原理主要基于物理吸附与解…