C语言——柔性数组

news2024/11/28 6:53:50

目录

    • 0. 前言
    • 1. 思维导图
    • 2. 柔性数组的特点
    • 3. 柔性数组的使用
    • 4. 柔性数组的优势
    • 5. 结语

0. 前言

柔性数组是在C99标准时引入:

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

代码示例:

typedef struct flexible_arr
{
	int a;
	char b;
	char arr[];//数组大小未知 -- 柔性数组成员
}type_a;
//上下两种写法都是一个意思
typedef struct flexible_arr
{
	int a;
	char b;
	char arr[0];//数组大小未知 -- 柔性数组成员
}type_a;

1. 思维导图

在这里插入图片描述

2. 柔性数组的特点

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

  • sizeof返回的这种结构大小不包括柔性数组的内存。
    在这里插入图片描述

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

3. 柔性数组的使用

#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
	int a;
	char b[];
}S;
int main()
{
	//使用malloc为柔性数组进行动态内存分配
	S* ps = (S*)malloc(sizeof(S) + sizeof(char) * 5);
	if (ps == NULL)
	{
		perror("malloc fail");
		return 1;
	}
	ps->a = 10;
	//柔性数组的使用
	for (int i = 0; i < 5; i++)
	{
		ps->b[i] = 'A';
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%c ", ps->b[i]);
	}
	//扩容
	S*tmp = (S*)realloc(ps, sizeof(S) + 10 * sizeof(char));
	if (tmp != NULL)
	{
		ps = tmp;
	}
	else
	{
		perror("realloc fail");
		return 1;
	}
	//当向内存申请空间后,该结构体大小还是原来的大小
	printf("%zd\n", sizeof(S));
	//释放内存
	free(ps);
	ps = NULL;
	return 0;
}

4. 柔性数组的优势

上面的代码,结构体里面的柔性数组,我们其实也可以替换成指针的写法。
代码示例:

//指针写法
#include<stdio.h>
#include<stdlib.h>
typedef struct S
{
	int a;
	char* b;
}S;
int main()
{
	//使用malloc为结构体进行动态内存分配
	S* ps = (S*)malloc(sizeof(S));
	if (ps == NULL)
	{
		perror("malloc fail");
		return 1;
	}
	ps->a = 10;
	//再为指针开辟动态内存
	ps->b = malloc(sizeof(S) + sizeof(char) * 5);
	if (ps->b == NULL)
	{
		perror("malloc->b");
		return 1;
	}
	for (int i = 0; i < 5; i++)
	{
		ps->b[i] = 'A';
	}
	for (int i = 0; i < 5; i++)
	{
		printf("%c ", ps->b[i]);
	}
	//扩容
	S*tmp = (S*)realloc(ps, sizeof(S) + 10 * sizeof(char));
	if (tmp != NULL)
	{
		ps = tmp;
	}
	else
	{
		perror("realloc fail");
		return 1;
	}
	//释放内存
	free(ps->b);
	ps->b = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

那么既然,用这种平常的写法就能代替,那还何必用柔性数组呢?难道是为了掉更多的头发吗?针对于这两个例子我们来比较一下:
在这里插入图片描述

  • 好处1:方便内存释放

我们的代码中进行了多次的malloc内存分配,那么我们也要进行相应次数的free释放,次数一旦多了,那么出错的几率也将会提升。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。

  • 好处2:利于访问速度

malloc是在内存中开辟空间是一块一块的开辟,如果连续多次那么就会产生许多内存碎片,这样空间利用率就会降低;连续的内存有益于提高访问速度,也有益于减少内存碎片。

5. 结语

这里的柔性数组的讲解,只是我们写代码的一种方式,并讲解了其好处。但不是说空间不连续就难以写代码了,在平时的大部分代码中,我们创建的变量、数组都不是连续的,我们能能将代码优化,当然是更好的。

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

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

相关文章

leetcode 1011. Capacity To Ship Packages Within D Days(D天内运送包裹的容量)

数组的每个元素代表每个货物的重量&#xff0c;注意这个货物是有先后顺序的&#xff0c;先来的要先运输&#xff0c;所以不能改变这些元素的顺序。 要days天内把这些货物全部运输出去&#xff0c;问所需船的最小载重量。 思路&#xff1a; 数组内数字顺序不能变&#xff0c;就…

【Storm】【一】简介

介绍 1.1 简介 Storm 是 Apache 旗下免费开源的分布式实时计算框架。Storm可以轻松、可靠地处理无限数据流&#xff0c;对实时分析、在线机器学习、连续计算、分布式RPC&#xff0c;ETL等提供高效、可靠的支持。 1.2 什么是分布式计算 分布式计算&#xff0c;将一个任务分解…

云解析专家解密《狂飙》剧中京海市人民政府域名访问真相

这段时间&#xff0c;最火的国产剧当属《狂飙》无疑。尽管不久前迎来了大结局&#xff0c;但这部剧的热度依然不减&#xff0c;成为大家茶余饭后热议的话题。 出于对这部剧的喜爱&#xff0c;小编开启了二刷模式&#xff0c;在重温剧情的同时&#xff0c;对于其中的一些细节也…

Windows 10注册表损坏怎么办?

注册表是一个复杂的数据库&#xff0c;如果不进行维护&#xff0c;它就会填充损坏的和孤立的注册表项。尤其是对Windows进行升级时&#xff0c;损坏或丢失的注册表项也会不断累积&#xff0c;从而影响您的系统性能。如果您的Windows 10系统正在经历注册表损坏的问题&#xff0c…

SpringBoot(powernode)

SpringBoot&#xff08;powernode&#xff09; 目录SpringBoot&#xff08;powernode&#xff09;一、第一个SpringBoot项目二、打jar包启动测试三、个性化banner四、常用注解4.1回顾spring和java的注解4.1.1 spring标注类的注解&#xff1a;4.1.2 spring标注方法的注解&#x…

linux的文件权限介绍

文件权限 在linux终端输入 ls -lh 出现下面界面 介绍 基本信息 其中的开头代表着文件类型和权限 而 root 和kali 则分别代表用户名和用户组名用户名顾名思义就是这个文件属于哪一个用户用户组是说自己在写好一个文件后&#xff0c;这个文件是属于该用户所有&#xff0c;…

剑指 Offer 63. 股票的最大利润

剑指 Offer 63. 股票的最大利润 难度&#xff1a;middle\color{orange}{middle}middle 题目描述 假设把某股票的价格按照时间先后顺序存储在数组中&#xff0c;请问买卖该股票一次可能获得的最大利润是多少&#xff1f; 示例 1: 输入: [7,1,5,3,6,4] 输出: 5 解释: 在第 2 …

尚硅谷《Redis7》(小白篇)

尚硅谷《Redis7 》&#xff08;小白篇&#xff09; 02 redis 是什么 官方网站&#xff1a; https://redis.io/ 作者 Git Hub https://github.com/antirez 03 04 05 能做什么 06 去哪下 Download https://redis.io/download/ redis中文文档 https://www.redis.com.cn/docu…

详解量子计算:相位反冲与相位反转

前言 本文需要对量子计算有一定的了解。需要的请翻阅我的量子专栏&#xff0c;这里不再涉及基础知识的科普。 量子相位反冲是什么&#xff1f; 相位反转&#xff08;phase kickback&#xff09;是量子计算中的一种现象&#xff0c;通常在量子算法中使用&#xff0c;例如量子…

亲测实现PopupWindow显示FlowLayout流式布局带固定文本/按钮(位置可改)

实现&#xff1a;动态绘制并带固定文本/按钮&#xff0c;固定文本/按钮固定在最后一行的右边且垂直居中&#xff0c;若最后一行放不下&#xff0c;则新开一行放到新行的右边且垂直居中&#xff08;新行的行高跟前面的一样&#xff09;&#xff0c;可单选、多选、重置。 注&…

SQL零基础入门学习(六)

SQL零基础入门学习&#xff08;六&#xff09; SQL零基础入门学习&#xff08;五&#xff09; SQL 通配符 通配符可用于替代字符串中的任何其他字符。 SQL 通配符用于搜索表中的数据。 在 SQL 中&#xff0c;可使用以下通配符&#xff1a; 演示数据库 在本教程中&#xff…

robotframework自动化测试环境搭建

环境说明 win10 python版本&#xff1a;3.8.3rc1 安装清单 安装配置 selenium安装 首先检查pip命令是否安装&#xff1a; C:\Users\name>pipUsage:pip <command> [options]Commands:install Install packages.download Do…

掌握这10个测试方法,软件测试已登堂入室

当然还有很多测试方法&#xff0c;这些要根据实际不同应用场景而变化&#xff0c;这里就以键盘为例子进行测试方法的讲解。 1.需求测试 需求这种大家都知道这种主要是就是甲方或者项目经理写的&#xff0c;或者某些人需要什么我们就给什么&#xff0c;一般来讲一个东西给到…

API 接口应该如何设计?如何保证安全?如何签名?如何防重?

说明&#xff1a;在实际的业务中&#xff0c;难免会跟第三方系统进行数据的交互与传递&#xff0c;那么如何保证数据在传输过程中的安全呢&#xff08;防窃取&#xff09;&#xff1f;除了https的协议之外&#xff0c;能不能加上通用的一套算法以及规范来保证传输的安全性呢&am…

训练一个ChatGPT需要多少数据?

“风很大”的ChatGPT正在席卷全球。作为OpenAI在去年底才刚刚推出的机器人对话模型&#xff0c;ChatGPT在内容创作、客服机器人、游戏、社交等领域的落地应用正在被广泛看好。这也为与之相关的算力、数据标注、自然语言处理等技术开发带来了新的动力。自OpenAI发布ChatGPT以来&…

好用的SQL工具盘点:从学习到工作总有一款适合你

标题一.入坑阶段&#xff08;学习入门&#xff09;&#xff1a; 这个阶段一般就是小白&#xff0c;想学习SQL语言&#xff0c;然后到处找软件&#xff0c;找免费破解版找半天&#xff0c;找到了半天安装不下来&#xff0c;还可能把自己电脑搞中毒。 其实对于小白来说&#xf…

Shiro常用的Filter过滤器

Shiro常用的Filter过滤器 核心过滤器&#xff1a;DefaultFilter&#xff0c;配置了的相应路径的相应的拦截器进行处理 常用过滤器 authc&#xff1a;org.apache.shiro.web.filter.authc.FormAuthenticationFilter 需要认证登录才能访问 user&#xff1a;org.apache.shiro.w…

动作识别、检测、分割、解析相关数据集介绍

文章目录动作识别UCF101(UCF101 Human Actions dataset)Kinetics (Kinetics Human Action Video Dataset)动作检测 / 时序动作定位CharadesActivityNetMulti-THUMOSUCF101-24IKEA ASM动作分割Breakfast (The Breakfast Actions Dataset)GTEA (Georgia Tech Egocentric Activity…

谷粒学院项目对应知识点

1、数据库分库分表 1.1、业务分库 按照业务模块将数据分散到不同的数据库服务器&#xff0c;比如用户数据、商品数据、订单数据存放在三个不同的数据库服务器中&#xff0c;分散存储和访问压力。但也会带来一些问题&#xff1a; join 操作问题&#xff1a;业务分库后&#x…

[qiankun]-多页签缓存

[qiankun]-多页签缓存环境功能需求多页签缓存方案方案1.主服务进行html替换方案2.微服务vnode 替换方案3.每个微服务都不卸载微服务加载方式的选择微服务的路由路径选择微服务的缓存工具微服务的容器使用tab作为微服务的挂载容器使用微服务路由作为微服务的挂载容器场景描述微服…