【C语言进阶】柔性数组

news2024/11/17 21:16:45

在这里插入图片描述
在这里插入图片描述

目录

  • 一:柔性数组的特点
  • 二:柔性数组的使用
  • 三:模拟实现柔性数组

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

以下是柔性数组的两种写法:

//写法一:
struct S
{
	int n;
	char c;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

//写法二:
struct S
{
	int n;
	char c;
	char arr[0];//0也说明它的大小是未知的 - - 柔性数组成员
};

一:柔性数组的特点

  • 结构体中的柔性数组成员前面必须至少一个其他成员
  • sizeof返回的这种结构体大小不包括柔性数组的大小
  • 包含柔性数组成员的结构体malloc函数进行动态内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
//利用malloc进行空间分配
struct S
{
	int n;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的
	return 0;
}

二:柔性数组的使用

#include <stdio.h>
#include <stdlib.h>

struct S
{
	int n;
	char arr[];//数组大小没有写说明它的大小是未知的 - - 柔性数组成员
};

int main()
{
	printf("%d\n", sizeof(struct S));
	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(char));//后面的10 * sizeof(char)就是为arr数组开辟的
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = 'a';
	}
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ps->arr[i]);
	}
	//增容
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps = ptr;
	}
	//释放
	free(ps);
	ps = NULL;
	return 0;
}

三:模拟实现柔性数组

struct S
{
	int n;
	char* arr;
};

int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S));
	if (ps == NULL)
	{
		perror("malloc");
		return 1;
	}
	//为arr开辟指向的空间
	ps->arr = (char*)malloc(sizeof(char) * 10);//开辟10个字符型的空间
	if (ps->arr == NULL)
	{
		perror("malloc");
		return 1;
	}
	//使用
	ps->n = 100;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		ps->arr[i] = 'a';
	}
	for (i = 0; i < 10; i++)
	{
		printf("%c ", ps->arr[i]);
	}
	//增容
	char* ptr = (char*)realloc(ps->arr, sizeof(char) * 20);
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps->arr = ptr;
	}
	//使用
	for (i = 0; i < 20; i++)
	{
		*((ps->arr)+i) = 'b';
	}
	for (i = 0; i < 20; i++)
	{
		printf("%c ", *((ps->arr) + i));
	}
	//释放
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

 常规的柔性数组,只需要malloc一次,free一次,并且空间是连续的,而模拟实现的柔性数组需要malloc两次,free两次,并且空间可能不连续。malloc的次数越多,越容易出错,可能出现忘记释放导致内存泄漏问题。此外,malloc的次数越多,产生的内存碎片就越多,内存利用率就会下降,造成内存空间浪费,malloc次数越少,产生的北村碎片就越少,内存利用率就会增加,会避免内存空间浪费。并且空间连续的情况下,访问数据的时候效率就会更高。

 今天的分享到这里就结束啦!如果觉得文章还不错的话,记得三连支持一下小恐龙,您的支持就是小恐龙前进的动力!


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python笔记 · 鸭子类型 / Duck Typing

1. 问题的由来 我初次意识到鸭子类型在存在是在学习Sklearn时&#xff0c;在《Hands-On Machine Learing》一书的第二章&#xff0c;作者提供了一个自定义的Tansformer&#xff0c;使用自定义Transformer的好处在于&#xff1a;你既可以实现自己需要的数据处理逻辑&#xff0c…

【应用】SpringCloud -- Gateway

SpringCloud -- GatewayGateway 网关概述Gateway 的功能Gateway 核心概念Gateway 网关搭建Gateway 的配置及使用predicate 断言filter 过滤器GlobalFilter 全局过滤器Gateway 的几点问题过滤器执行顺序跨域问题Gateway 网关概述 Gateway 的功能 在微服务当中&#xff0c;有很…

PG15 pg_basebackup 代码解析

背景 先前 PG 版本 pg_basebackup 的代码较为复杂&#xff0c;pg_basebackup 在备份过程中做了很多事情&#xff0c;但这部分代码逻辑没有完全解耦&#xff0c;导致一个文件里包含了很多功能的逻辑&#xff0c;影响了代码的可读性和可修改性。 因此&#xff0c;PG 15 针对这部…

模电学习3. 差模、共模干扰与安规电容

模电学习3. 差模、共模干扰与安规电容一、简介1. 安规2. 电源安规标准二、差模干扰与共模干扰1. 共模干扰2. 差模干扰&#xff08;1&#xff09;定义&#xff08;2&#xff09;来源与特性3. 测量4. 消除电源线路中的差模干扰&#xff08;1&#xff09;差模电容5. 消除电源线路中…

TOOM加强网络舆情监控制定处置预案,抓好舆情监控管理?

舆情预案是指根据对未来舆情发展趋势的预测&#xff0c;制定预先准备的舆情处置方案&#xff0c;以应对可能出现的舆情危机。舆情预案包括舆情预警体系、舆情应对策略、应对措施等内容&#xff0c;旨在在舆情危机发生前进行有效的预防和准备&#xff0c;避免舆情危机扩大&#…

95. BERT预训练数据代码

为了预训练之前实现的BERT模型&#xff0c;我们需要以理想的格式生成数据集&#xff0c;以便于两个预训练任务&#xff1a;遮蔽语言模型和下一句预测。一方面&#xff0c;最初的BERT模型是在两个庞大的图书语料库和英语维基百科的合集上预训练的&#xff0c;但它很难吸引这本书…

Zookeeper 教程

Zookeeper 教程Zookeeper 概述分布式应用Zookeeper 架构图ZooKeeper当中的主从与主备&#xff1a;Zookeeper的特性分布式应用的优点分布式应用的挑战什么是Apache ZooKeeper&#xff1f;ZooKeeper的好处Zookeeper 基础ZooKeeper的架构层次命名空间Znode的类型Sessions&#xff…

九龙证券|外资放大招,400亿巨头狂飙!这只翻倍股却突然崩了

昨日超级“开门红”之后&#xff0c;今天上午港股又有多只重磅个股大幅涨超10%。 今日上午&#xff0c;港股整体窄幅震荡&#xff0c;上午收盘&#xff0c;恒生指数微跌0.05%&#xff0c;恒生科技指数涨0.22%。 职业板块方面&#xff0c;媒体、软件服务、电信等涨幅居前&#…

【BLE】ANCS(Apple Notification Center Service)

目录1. 前言1.1 名词解释1.2 ANCS概述2. ANCS的特征2.1 通知源2.2 控制点和数据源2.3 获取通知属性2.4 获取应用属性2.5 执行通知操作2.6 通知操作3. 更多详情参考1. 前言 1.1 名词解释 NP(Notification Provider)&#xff1a;消息提供者&#xff0c;指的是ANCS服务的生产者&…

【JavaSE】入门概述(1~41)

1.Java视频及配套资料下载指南 2.Java基础学习导读 Java语言的三个层面 基本语法&#xff1a;变量、运算符、流程控制、数组面向对象&#xff1a;把数据及对数据的操作方法放在一起&#xff0c;作为一个相互依存的整体——对象高级应用&#xff1a;多线程、集合、IO流、网络…

性能怪兽-Nginx常用配置指北

目录 安装 Nginx操作命令 https反向代理 负载均衡 轮询 加权轮询 最少连接 加权最少连接 IP Hash 普通 Hash 动静分离 资源压缩 缓冲区 缓存机制 解决跨域 防盗链设计 配置SLL证书 性能优化 打开长连接配置 开启零拷贝技术 开启无延迟或多包共发机制 调整W…

Python连接Liunx中mysql数据库-增删改查

上一篇文章已经讲解了如何连接liunx中的mysql数据库&#xff0c;如果没有连接好数据库的话&#xff0c;可以看这一篇文章 增删改查Mysql中查询操作1.创建游标2.定义一个sql的查询语句3.调用游标内的sql语句执行操作4.打印出查询结果5.完整代码6.指定查询Mysql中新增操作1.单条数…

jupyter 常用记录

安装windows环境下 运行cmd 然后&#xff1a;在命令提示窗口输入pip install jupyter,然后回车&#xff1b;完成后运行 jupyter notebook 前言 提起jupyter notebook&#xff0c;应该很多学习过Python的同学都不陌生。虽然用jupyter notebook的同学相对较少&#xff0c;但是提…

Java多级缓存是为了解决什么的?

前言 提到缓存&#xff0c;想必每一位软件工程师都不陌生&#xff0c;它是目前架构设计中提高性能最直接的方式。 缓存技术存在于应用场景的方方面面。从网站提高性能的角度分析&#xff0c;缓存可以放在浏览器&#xff0c;可以放在反向代理服务器&#xff0c;还可以放在应用…

使用JINJA2模板部署自定义文件(RH294)

在ansible中有许多模板可以用于修改现有的文件比如—— lineinfile和blockinfile但是&#xff01;我们还有一种更加便捷而且牛皮的方法为其构建模板在部署该文件是自动为受管主机自定义次模板配置文件而这些模板中非常有名的就是 JINJA2ansible将Jinja2模板系统用于模板文件 并…

Java设计模式-职责链模式Chain of Responsibility

介绍 职责链模式&#xff08;Chain of Responsibility Pattern&#xff09;, 又叫 责任链模式&#xff0c;为请求创建了一个接收者对象的链(简单示意图)。这种模式对请求的发送者和接收者进行解耦。职责链模式通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理…

C语言#include的用法详解

#include叫做文件包含命令&#xff0c;用来引入对应的头文件&#xff08;.h文件&#xff09;。#include 也是C语言预处理命令的一种。#include 的处理过程很简单&#xff0c;就是将头文件的内容插入到该命令所在的位置&#xff0c;从而把头文件和当前源文件连接成一个源文件&am…

Oracle数据库故障处理-存储单块读hang分析处理

1 故障描述 2023年1月27日下午接到业务反馈数据库存在大量的锁表阻塞信息&#xff0c;并且业务的页面以及数据库的一些查询均处于阻塞状态&#xff0c;简单的查询sql也需要查询很长时间且未返回结果,数据库hang状态。 2 故障原因分析 2.1 数据库层面分析 接到业务反馈后&am…

如果放在几年前,无法想到互联网会蜕变成今天这样一副模样

如果放在几年前&#xff0c;你是万万无法想到互联网会蜕变成今天这样一副模样。尽管如此&#xff0c;这样一种蜕变却在真实地发生着。不知道你有没有发现就连前两年火爆的短视频人们都懒得刷了。所有的这一切都在告诉我们&#xff0c;互联网正在发生一场深刻而又彻底的嬗变。如…

SQL Server数据库版本总结

一、为什么要写这篇文章 之所以专门写一篇文章来整理归纳SQL Server各个版本的功能区别&#xff0c;是因为遇到过两次真实的客户案例&#xff0c;因为数据库版本选取不当&#xff0c;导致生产系统宕机的情况。 案例一 某客户安装了 32位 版本的SQL Server 2008 R2 数据库&…