【C语言】还有柔性数组?

前言

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~


目录

前言

柔性数组

柔性数组的特点

柔性数组的使用

不使用柔性数组


柔性数组

如下代码int a[0]就是柔性数组

struct st_type
{int i;//柔性数组前面至少要有一个其他成员int a[0];//柔性数组成员//int a[];
};

柔性数组的特点

  • 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
  • sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
  • 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

柔性数组的使用

  1. 使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片
  2. 把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。
struct st
{int a;int arr[];
};int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));//              malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)//判断if (ps == NULL){return 1;}//使用ps->a = 100;for (int i = 0; i < 10; i++){ps->arr[i] = i;}//若数组空间不够//用realloc函数重新分配struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));if (ptr != NULL){ps = ptr;//再次赋值给ps}else{perror("realloc");}//继续使用for (int i = 0; i < 15; i++){ps->arr[i] = i;}//打印for (int i = 0; i < 15; i++){printf("%d ",ps->arr[i]);}//释放free(ps);ps = NULL;return 0;
}

对比 不使用柔性数组

不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间

#include <stdio.h>
#include<stdlib.h>
struct st
{int a;int* arr;
};
int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址struct st* ps = (struct st*)malloc(sizeof(struct st));//判断if (ps == NULL){return 1;}//使用ps->a = 100;//再次使用malloc函数给数组arr开辟空间ps->arr = (int*)malloc(10 * sizeof(int));if (ps->arr == NULL){perror("malloc-2");return 1;}//使用for (int i = 0; i < 10; i++){ps->arr[i] = i;}//数组空间不够// 利用realloc函数扩大int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));if (ptr == NULL){perror("realloc");return 1;}else{ps->arr = ptr;}//初始化前15个元素for (int i = 0; i < 15; i++){ps->arr[i] = i;}//打印for (int i = 0; i < 15; i++){printf("%d ", ps->arr[i]);}//释放free(ps->arr);ps->arr = NULL;free(ps);ps = NULL;return 0;
}

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

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

相关文章

Java基于微信小程序的旅游出行必备小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢&#xff1f; RabbitMQ在接收到消息后&#xff0c;默认并不会立即进行持久化&#xff0c;而是先把消息暂存在内存中&#xff0c;这时候如果MQ挂了&#xff0c;那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。 队列和交换机的…

【论文阅读】Usenix Security 2023 你看不见我:对基于激光雷达的自动驾驶汽车驾驶框架的物理移除攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.作者贡献4.主要图表5.结论 一.论文信息 论文题目&#xff1a; You Can’t See Me: Physical Removal Attacks on LiDAR-based Autonomous Vehicles Driving Frameworks&#xff08;你看不见我:对基于激光雷达的自动驾驶汽车驾驶…

如何搭建Nacos集群

1.搭建Nacos集群 众所周知&#xff0c;在实际的工作中&#xff0c;Nacos的生成环境下一定要部署为集群状态 其中包含3个nacos节点&#xff0c;然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。 我们计划的集群结构&#xff1a; 我就直接在本机上开三个Nacos来搭…

Linux网络编程(五-IO模型)

目录 一、同步I/O 二、异步I/O 三、阻塞I/O 四、非阻塞I/O 五、信号驱动I/O ​六、多路复用IO 一、同步I/O 在操作系统中&#xff0c;程序运行的空间分为内核空间和用户空间&#xff0c; 用户空间所有对io操作的代码(如文件的读写、socket的收发等)都会通过系统调用进…

纯css+html实现拟态开关按钮面板

适合智能家居的开关面板UI 参考&#xff1a;https://drams.framer.website/

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

springboot+vue+mysql项目使用的常用注解

实体类常用注解 Data Data 是一个 Lombok 提供的注解&#xff0c;使用 Data 注解可以简化代码&#xff0c;使代码更加简洁易读。 作用&#xff1a;自动为类生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依赖 <depende…

Linux高级编程:网络

回顾&#xff1a; 进程间的通信&#xff1a; 同一主机内通信&#xff1a; 传统的进程间通信方式&#xff08;管道、信号&#xff09;&#xff1b; IPC对象&#xff08;共享内存&#xff0c;消息队列&#xff0c;信号量集&#xff09;&#xff1b; 不同主机间进程的通信&#…

C++ 链表OJ

目录 1、2. 两数相加 2、24. 两两交换链表中的节点 3、143. 重排链表 4、23. 合并 K 个升序链表 5、25. K 个一组翻转链表 解决链表题目常用方法&#xff1a; 1、画图 2、引入虚拟"头”结点 便于处理边界情况方便我们对链表操作 3、大胆定义变量&#xff0c;减少连接…

STM32CubeMX软件界面花屏,混乱的解决方案。

添加系统环境变量:J2D_D3D 值:false 即可解决。

MySQL:一行记录如何

1、表空间文件结构 表空间由段「segment」、区「extent」、页「page」、行「row」组成&#xff0c;InnoDB存储引擎的逻辑存储结构大致如下图&#xff1a; 行 数据库表中的记录都是按「行」进行存放的&#xff0c;每行记录根据不同的行格式&#xff0c;有不同的存储结构。 页…

机器学习中类别不平衡问题的解决方案

类别不平衡问题 解决方案简单方法收集数据调整权重阈值移动 数据层面欠采样过采样采样方法的优劣 算法层面代价敏感集成学习&#xff1a;EasyEnsemble 总结 类别不平衡&#xff08;class-imbalance&#xff09;就是指分类任务中不同类别的训练样例数目差别很大的情况 解决方案…

信呼OA普通用户权限getshell方法

0x01 前言 信呼OA是一款开源的OA系统&#xff0c;面向社会免费提供学习研究使用&#xff0c;采用PHP语言编写&#xff0c;搭建简单方便&#xff0c;在中小企业中具有较大的客户使用量。从公开的资产治理平台中匹配到目前互联中有超过1W的客户使用案例。 信呼OA目前最新的版本是…

码住!微信自动回复的实现方式

对于很多企业和个人来说&#xff0c;如何高效地回复微信客户消息是一个非常重要的问题。在这样的需求下&#xff0c;使用微信管理系统的机器人自动回复功能成为了一种不错的选择。 1、自动通过好友 当有大量的好友请求时&#xff0c;手动处理好友申请会变得非常繁琐。而微信管…

C++max函数的使用案例20个

文章目录 1. **基本用法&#xff1a;**2. **比较浮点数&#xff1a;**3. **比较字符串&#xff1a;**4. **使用自定义比较函数&#xff1a;**5. **比较容器中的元素&#xff1a;**6. **使用std::initializer_list&#xff1a;**7. **变长参数版本&#xff08;C11及以上&#xf…

Elasticsearch搜索引擎

目录 初识elasticsearch 了解ES 什么是elasticsearch elasticsearch的发展 搜索引擎技术排名&#xff1a; 总结 倒排索引 正向索引和倒排索引 正向索引 倒排索引 总结 es的一些概念 文档 索引 概念对比 架构 总结 安装es&#xff0c;kibana 安装es 安装kiba…

Redis的三种集群模式(图解)

主从复制模式 一个主节点和多个从节点。主节点提供写入和读取功能&#xff0c;但是从属节点只提供读取功能。 主从复制的数据同步过程如下&#xff1a; &#xff08;1&#xff09;首先主节点启动&#xff0c;然后从属节点启动&#xff0c;从属节点会连接主节点并发送SYNC命令以…

Android多线程实现方式及并发与同步,Android面试题汇总

一. 开发背景 想要成为一名优秀的Android开发&#xff0c;你需要一份完备的知识体系&#xff0c;在这里&#xff0c;让我们一起成长为自己所想的那样。 我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序&#xff0c;再由桌面程序来控制不同的硬件设…

python 蓝桥杯填空题

文章目录 字母数判断列名&#xff08;进制问题&#xff09;特殊日期大乘积星期几 字母数 由于是填空题&#xff0c;那么寻找的话&#xff0c;就直接让每一个位置都是A,通过计算看看是不是结果大于2022即可 判断列名&#xff08;进制问题&#xff09; 这道题目&#xff0c;我们可…