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

柔性数组(flexible array)

柔性数组从C99开始支持使用

1.柔性数组的概念

概念:

结构体中,结构体最后一个元素允许是未知大小的数组,这就叫[柔性数组]的成员

struct S
{int n;char arr[]; //数组大小未知(柔性数组成员)
};

柔性数组的特点:

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

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

struct S
{int n;char arr[]; 
};
int main()
{  printf("%zu\n", sizeof(struct S););   //4return 0;
}

由图可知sizeof计算时不会包含柔性数组的大小

2.如何给柔性数组开辟空间呢?

如果结构体中有柔性数组,那么系统应该这么帮结构体开辟空间

怎样使用:

#include <stdio.h>
#include <stdlib.h>typedef struct S
{int n;char arr[];
}S;int main()
{//sizeof(char)*10 根据需求改变,柔性数组就是可变数组S* ptr = (S*)malloc(sizeof(S) + sizeof(char) * 10);if (ptr == NULL){perror("S::malloc");return 1;}//ptr->n = 4;int i = 0;for (i = 0; i < 10; i++){ptr->arr[i] = 'a';}for (i = 0; i < 10; i++){printf("%c ", ptr->arr[i]);}// free(ptr);// ptr = NULL;//增容S* pc = (S*)realloc(ptr, sizeof(S) + sizeof(char) * 20);if(pc == NULL){perror("S::realloc");return 1;}else{ptr = pc;}free(ptr);ptr = NULL; return 0;
}

3.如果我们给柔性数组申请了动态内存会不会改变结构体大小?

不会!!!

#include <stdio.h>
#include <stdlib.h>typedef struct S
{int n;char arr[];
}S;int main()
{//sizeof(char)*10 根据需求改变,柔性数组就是可变数组S* ptr = (S*)malloc(sizeof(S) + sizeof(char) * 10);if (ptr == NULL){perror("S::malloc");return 1;}printf("%zu", sizeof(S));free(ptr);ptr = NULL;return 0;
}

运行结果:

形式如图所示:

可以看到申请了空间之后还是4字节

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

4.使用字符型指针代替柔性数组

typedef struct S
{int n;char* str;
}S;int main()
{printf("%zu", sizeof(S));return 0;
}

运行结果:

进行代替

#include <stdio.h>
#include <stdlib.h>typedef struct S
{int n;char* str;
}S;int main()
{S* ptr = (S*)malloc(sizeof(S));if (ptr == NULL){perror("malloc");return 1;}ptr->n = 4;ptr->str = (char*)malloc(sizeof(char) * 10);if (ptr->str == NULL){perror("ptr->str::malloc");return 1;}int i = 0;for (i = 0; i < 10; i++){ptr->str[i] = 'a';}for (i = 0; i < 10; i++){printf("%c ", ptr->str[i]);}//增容char* pc =(char*)realloc(ptr->str, sizeof(char) * 20);if(pc != NULL){ptr->str = pc;}else{perror("pc::realloc");return 1;}//释放顺序不要弄反,也可以先释放pc//如果先释放ptr,ptr->str就没有了free(ptr->str);ptr->str = NULL;free(ptr);ptr = NULL;return 0;
}

这个形式如图:

5.柔性数组的好处

虽然用char* str也可以实现,但是有弊端

使用柔性数组的好处:

->1.malloc 只需要使用一次

->2.free 只需要使用一次

->3.空间是连续的

与char* str相比

不容易出错

内存碎片少,空间利用率高

效率高(访问速度相对快)

相关文章:

柔性数组(flexible array)

柔性数组从C99开始支持使用 1.柔性数组的概念 概念&#xff1a; 结构体中&#xff0c;结构体最后一个元素允许是未知大小的数组&#xff0c;这就叫[柔性数组]的成员 struct S {int n;char arr[]; //数组大小未知(柔性数组成员) }; 柔性数组的特点&#xff1a; 结构体中柔性…...

服务器配置路由

translator 在Linux系统中&#xff0c;通过ip route add命令添加的路由规则通常不会永久保存&#xff0c;它们只会在当前会话中生效。当系统重新启动后&#xff0c;这些临时添加的路由规则会丢失。 要求在开关机之后仍然保留这条路由&#xff0c;需要将路由规则永久保存。在大多…...

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…...

[code snippet] 生成随机大文件

[code snippet] 生成随机大文件 一个无聊的测试代码&#xff0c;因为要测试大文件的网络传输&#xff0c;就写了一个随机大文件生成脚本&#xff0c;做个备份。 基本上都是 GPT 生成的&#xff0c;哈哈。 C# 代码 namespace ConsolePlayground;internal class BigFileGenera…...

计算机网路面试HTTP篇三

HTTPS RSA 握手解析 我前面讲&#xff0c;简单给大家介绍了的 HTTPS 握手过程&#xff0c;但是还不够细&#xff01; 只讲了比较基础的部分&#xff0c;所以这次我们再来深入一下 HTTPS&#xff0c;用实战抓包的方式&#xff0c;带大家再来窥探一次 HTTPS。 对于还不知道对称…...

如何不改变 PostgreSQL 列类型#PG培训

开发应用程序并在其背后操作数据库集群时&#xff0c;会遇到一个意想不到的问题是实践与理论、开发环境与生产之间的差异。这种不匹配的一个完美例子就是更改列类型。 #PG考试#postgresql培训#postgresql考试#postgresql认证 关于如何在 PostgreSQL&#xff08;以及其他符合 SQ…...

RocketMQ快速入门:事务消息原理及实现(十)

目录 0. 引言1. 原理2. 事务消息的实现2.1 java client实现&#xff08;适用于spring框架&#xff09;2.2 springboot实现 3. 总结 0. 引言 rocketmq 的一大特性就是支持事务性消息&#xff0c;这在诸多场景中有所应用。在之前的文章中我们已经讲解过事务消息的使用&#xff0…...

Kotlin设计模式:深入理解桥接模式

Kotlin设计模式&#xff1a;深入理解桥接模式 在软件开发中&#xff0c;随着系统需求的不断增长和变化&#xff0c;类的职责可能会变得越来越复杂&#xff0c;导致代码难以维护和扩展。桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过…...

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述 在现代的分布式系统和实时数据处理领域&#xff0c;消息中间件扮演着关键的角色&#xff0c;用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中&#xff0c;Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特…...

【UE5.3】笔记6-第一个简单小游戏

打砖块小游戏&#xff1a; 1、制造一面砖块组成的墙 在关卡中放置一个cube&#xff0c;放这地面上&#xff0c;将其转换成蓝图类,改名BP_Cube&#xff0c;更换砖块的贴图&#xff0c;按住alt键进行拷贝&#xff0c;堆出一面墙&#xff0c;复制出来的会很多&#xff0c;全选移动…...

LeetCode---402周赛

题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对&#xff0c;然后统计符合条件的下标对数目返回。代码如下 class So…...

循环冗余校验

循环冗余校验&#xff08;Cyclic Redundancy Check&#xff0c;简称CRC&#xff09;是一种广泛使用的错误检测编码技术&#xff0c;用于检测数据在传输或存储过程中是否发生错误。CRC通过在数据后面添加一个校验值&#xff08;通常称为CRC码或CRC校验和&#xff09;来实现错误检…...

resample sensor

resample sensor 的一个问题。 背景: 项目要求&#xff0c;发送多个数据到 sensor-hal 上去&#xff0c;发现无论怎样&#xff0c;在 sensor-hal 上都 只有一个数据。 resample sensor 是重新采样&#xff0c;这个怎么理解的&#xff0c;我的理解是&#xff1a; 假设 sensor 采…...

【Linux】多线程的相关知识点

一、线程安全 1.1 可重入 VS 线程安全 1.1.1 概念 线程安全&#xff1a;多个线程并发执行同一段代码时&#xff0c;不会出现不同的结果。常见对全局变量或者静态变量进行操作&#xff0c;并且没有锁的保护的情况下&#xff0c;会出现问题。重入&#xff1a;同一个函数被不同…...

Java反射详解

Java反射 一.什么是反射 我们使用的一些像框架&#xff0c;tomcat&#xff0c;或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名&#xff0c;就可以创建给定类的对象&#xff0c;并调用该对象的方法和属性。这是如何做到的&#xff1f; 当他们加载我们…...

Spring Boot与Apache Kafka集成的深度指南

Spring Boot与Apache Kafka集成的深度指南 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代分布式系统中&#xff0c;消息队列的作用愈发重要&#xff0…...

甄选版“论软件系统架构评估”,软考高级论文,系统架构设计师论文

论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…...

uniapp开发企业微信内部应用

最近一直忙着开发项目&#xff0c;终于1.0版本开发完成&#xff0c;抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品&#xff0c;公司扩展业务&#xff0c;需要在企业微信中开发内部应用。因为工作中使用的是钉钉&#xff0c;很少使用企业微信&#xff0c;对于…...

0122__linux之eventfd理解

linux之eventfd理解-CSDN博客 Linux fd 系列 — eventfd 是什么&#xff1f;-CSDN博客...

数学建模 —— 查找数据

目录 百度搜索技巧 完全匹配搜索&#xff1a;查询词的外边加上双引号“ ” 标题必含关键词&#xff1a;查询词前加上intitle: 搜索文档&#xff1a;空格再输入filetype:文件格式 去掉不想要的&#xff1a;查询词后面加空格后加减号与关键字 知网查文献 先看知网的硕博士…...

合并有序链表

合并有序链表 图解代码如下 图解 虽然很复杂&#xff0c;但能够很好的理解怎么使用链表&#xff0c;以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…...

【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库

不积跬步&#xff0c;无以至千里&#xff1b;不积小流&#xff0c;无以成江海。大家好&#xff0c;我是闲鹤&#xff0c;微信&#xff1a;xxh_1459&#xff0c;十多年开发、架构经验&#xff0c;先后在华为、迅雷服役过&#xff0c;也在高校从事教学3年&#xff1b;目前已创业了…...

Spark基于DPU的Native引擎算子卸载方案

1.背景介绍 Apache Spark&#xff08;以下简称Spark&#xff09;是一个开源的分布式计算框架&#xff0c;由UC Berkeley AMP Lab开发&#xff0c;可用于批处理、交互式查询&#xff08;Spark SQL&#xff09;、实时流处理&#xff08;Spark Streaming&#xff09;、机器学习&a…...

Mini2440 start.s 修改支持串口输出,方便调试 (四)

经常会遇到点板子的时候&#xff0c;板子没有任何反应&#xff01;怎么知道板子有没有在正常启动&#xff0c;在uboot阶段 start.s 中加入串口打印信息是很有必要的&#xff01; 输出串口信息 ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoo…...

【教程】几种不同的RBF神经网络

本站原创文章&#xff0c;转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…...

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx

【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载&#xff1a; https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括…...

【Java笔记】Flyway数据库管理工具的基本原理

文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理&#xff0c;顺便了解了下基本原理&#xff0c;做个记录。 详细的使用就不写了&#xff0c;网上教程很多…...

国际数字影像产业园创业培训,全面提升创业能力!

国际数字影像产业园作为数字影像产业的创新高地&#xff0c;致力于提供全面的创业支持服务。其中&#xff0c;创业培训作为重要的组成部分&#xff0c;旨在通过系统的课程设置和专业的讲师团队&#xff0c;为创业者提供从基础到进阶的全方位指导&#xff0c;帮助他们在数字影像…...

pyqt5 制作视频剪辑软件,切割视频

该软件用于切割视频&#xff0c;手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下&#xff1a;包含快进、快退、暂停等功能&#xff0c; 代码如下&#xff1a; # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位&#xff0c;将定位到…...

VUE----通过nvm管理node版本

使用 NVM&#xff08;Node Version Manager&#xff09;来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤&#xff1a; 1. 安装 NVM 如果你还没有安装 NVM&#xff0c;可以按照以下步骤进行安装&#xff1a…...

网站制作网站/深圳优化公司

在Qtpro文件中添加Qtgui QImage的帮助中写的很清楚 Header: #include <QImage> qmake: QT gui...

做网站 信科网站建设便宜/成都网站制作费用

关于base64编码Encode和Decode编码的几种方式 Base64是一种能将任意Binary资料用64种字元组合成字串的方法&#xff0c;而这个Binary资料和字串资料彼此之间是可以互相转换的&#xff0c;十分方便。在实际应用上&#xff0c;Base64除了能将Binary资料可视化之外&#xff0c;也…...

域名购买查询/seo权重优化

Algorithm 直接插入排序 算法概述&#xff1a; 把前面的数组排好序&#xff0c;后面的元素插入到排好序的数组中。 实现思路&#xff1a; 把数组分为有序和无序两部分&#xff0c;分别用下标去指向&#xff08;有序&#xff08;j&#xff09;&#xff0c; 无序&#xff08…...

个性网站制作/百度搜索引擎推广步骤

我有一个表单验证问题。下面是提交时发生的逻辑(至少是其中的一部分)。在for循环中&#xff0c;我们检查一个站点访问者可以注册的可能事件数组。如果用户没有检查任何事件(这些是复选框&#xff0c;因为用户可以注册多个事件)&#xff0c;我们应该在下面输入第二条if语句&…...

wordpress 设置数据库/个人免费开发app

文档类1 相关类CDocument类-父类是CCmdTarget类&#xff0c;所以&#xff0c;文档类也可以处理菜单等命令消息。作用保存和管理数据。注意事项&#xff1a;如何解决断言错误2 在视图中显示文档中的数据2.1 CView::OnInitialUpdate作用初始化视图&#xff0c;在附加文档之后&…...

网站做的好是不是影响就大/免费的网站域名查询

C字符串长度定义规范 &#xff08;转载请注明来源于金庆的专栏&#xff09; 因为总是见到C字符串长度相关的错误, 所有定个规范出来, 有利于减少错误. 关键在于C字符串有个结尾0, 处理时需要注意. 定义字符串长度有两种方式, 一种是用字符串的大小, 一种是字符串的长度.字符…...