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

news2024/11/24 17:42:08

前言

也许你从来没有听说过柔性数组(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.coloradmin.cn/o/1494671.html

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

相关文章

LinkedList集合源码分析

LinkedList集合源码分析 文章目录 LinkedList集合源码分析一、字段分析二、构造函数分析三、方法分析四、总结 看到实现了Deque 就要联想到这个数据结构肯定是属于双端队列了。Queue 表示队列&#xff0c;Deque表示双端队列。 一、字段分析 LinkedList 字段很少&#xff0c;就…

Vector Search和专用Search Nodes:现已正式发布

我们非常高兴地推出了 Atlas Vector Search 和 Search Nodes 的正式发布版本 (GA)&#xff0c;为 Atlas 平台增添了更多价值。 自从在公开预览版中发布 Atlas Vector Search 和带有 Search Nodes 的专用基础架构以来&#xff0c;我们注意到&#xff0c;对于使用向量优化搜索节…

【数据集】MSWEP(多源加权集合降水)再分析数据

MSWEP全球降水数据 数据概述数据下载参考数据概述 MSWEP(Multi-Source Weighted-Ensemble Precipitation)降水数据集是一种高分辨率、全球覆盖的降水数据产品,它融合了多种来源的降水信息,包括卫星遥感数据、雷达观测、地面气象站观测数据以及数值天气预报模型的输出。MSW…

C switch 语句

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case&#xff0c;且被测试的变量会对每个 switch case 进行检查。 语法 C 语言中 switch 语句的语法&#xff1a; switch(expression){case constant-expression :statement(s);break; /* 可选的 */ca…

Redis线程模型解析

引言 Redis是一个高性能的键值对&#xff08;key-value&#xff09;内存数据库&#xff0c;以其卓越的读写速度和灵活的数据类型而广受欢迎。在Redis 6.0之前的版本中&#xff0c;它采用的是一种独特的单线程模型来处理客户端的请求。尽管单线程在概念上似乎限制了其扩展性和并…

C++ 之AVL树

AVL树 AVL树的基本概念AVL树的平衡因子、AVL树的旋转avl的双旋旋转的4种情况 AVL树的基本概念 AVL树的平衡因子、 AVL树的旋转 当平衡因子的高度差过大时&#xff0c;就要选择。所谓的选择其实也是一种压扁的操作 在本例中 新插入的蓝色结点使得不在平衡。 我们看上图就能…

【CSP试题回顾】201604-1-折点计数

CSP-201604-1-折点计数 解题代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;int n, pointSum;int main() {cin >> n;vector<int>myData(n);for (int i 0; i < n; i){cin >> myData[i];}// 统…

深色系可视化界面看腻了,来点浅色系?安排,20页来了。

只要不放在大屏上展示&#xff0c;贝格前端工场还是非常推崇浅色系的可视化界面&#xff0c;把它作为配色的首选 。浅色系可视化界面具有以下几个优势&#xff1a; 清晰明了 浅色系界面通常使用明亮的颜色&#xff0c;如白色、浅灰色等&#xff0c;使界面元素更加清晰可见。这…

文件MD5校验码的安全性及重要性

title: 文件MD5校验码的安全性及重要性 date: 2024/3/6 18:13:20 updated: 2024/3/6 18:13:20 tags: MD5原理文件校验下载验证数据库一致性安全性保障计算方法MD5安全防护 文件MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常用的哈希算法&#xff0c;用于验证…

Docker部署(ruoyi案例接上篇Docker之部署前后端分离项目)实施必会!!!!

文章目录 Docker部署前端 Docker部署前端 接上篇博主已经部署好后端Docker部署后端&#xff0c;现在来讲解怎么部署前端 MySQL和redis是不依赖其他任何一个东西的&#xff0c; ruoyi-admin是因为你启动项目的时候是必须连接数据库的 现在去单独启动它 docker start ruoyi-a…

Python爬虫:设置随机 User-Agent

Python爬虫&#xff1a;设置随机 User-Agent 在Python中编写爬虫时&#xff0c;为了模拟真实用户的行为并防止被服务器识别为爬虫&#xff0c;通常需要设置随机的User-Agent。你可以使用fake-useragent库来实现这一功能。首先&#xff0c;你需要安装fake-useragent库&#xff…

【web网页制作】html+css网页制作企业网站办公用品主题(3页面)【附源码】

企业网站目录 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、用品展示Page3、关于我们 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码4.1 主页模块源码4.2 源码获取方式 作者寄语 涉及知识 办公用品企业主题HTML网页制作&#xff0c;…

进程调度算法(先来先服务/短作业优先)代码实现

最近在复习408操作系统进程时&#xff0c;决定用代码模拟调度算法来熟悉详细过程! 选择两个好写点的算法进行练习!!! 以下代码使用c语言。优先队列和队列直接使用STL容器!!! 引入头文件 #include<iostream> #include<queue> #include<map> using namespace …

【漏洞复现】ShopXO任意文件读取漏洞

Nx01 产品简介 ShopXO是一套开源的企业级开源电子商务系统&#xff0c;包含PC、H5、微信小程序、支付宝小程序、百度小程序等多个终端&#xff0c;遵循Apache2开源协议发布&#xff0c;基于ThinkPHP5.1框架研发。该系统具有求实进取、创新专注、自主研发、国内领先企业级B2C电商…

基于stm32的电压采样与质量检测系统

150基于stm32的电压采样与质量检测系统[proteus仿真] 电压检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个基于stm32的电压采样与质量检测系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xf…

RK356X RK3588 单独编译kernel 与烧录

RK356X RK3588 单独编译kernel 与烧录 可以快速提高我们开发与调试速度 网上可查到的方法如下&#xff1a; RK3568 Android12&#xff1a; 1.添加kernel-4.19/makekernel.sh #!/bin/sh make -j24 ARCHarm64 CC../prebuilts/clang/host/linux-x86/clang-r416183b/bin/clang …

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

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

裸机编程的几种模式、架构、缺陷

目录 裸机编程模式/架构 1&#xff1a;初始化代码的编写 裸机编程模式/架构 2&#xff1a;轮询模式 裸机编程模式/架构 3&#xff1a;轮询加中断执行模式 裸机编程模式/架构 4&#xff1a;中断定时器主循环的前后台架构 裸机编程模式/架构 5&#xff1a;前后台 状态机架构…

c1-周考2

c1-第二周 9月-技能1.一个岛上有两种神奇动物&#xff0c;其中神奇鸟类2个头3只脚&#xff0c;神奇兽类3个头8只脚。游客在浓雾中看到一群动物&#xff0c;共看到35个头和110只脚&#xff0c;求可能的鸟类和兽类的只数2.构建一个长度为5的数组&#xff0c;并且实现下列要求3.构…

外包干了10天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…