【C语言】柔性数组(打开前所未见的大门)
文章目录
- 前言
- 柔性数组
- 1.1 概念
- 1.2 柔性数组的特点
- 1.3 柔性数组的使用
- 1.4 柔性数组的优势
- 总结
前言
说到柔性数组,相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系,相信本章能够带你从到认识到掌握柔性数组,做一个充满知识的man/woman。
在此处,我先透露一下,本次的知识点需要结合结构体和动态内存开辟的知识点。如果对这两个知识点不是很熟悉的读者,可以翻阅我之前写过的文章。
那么话不多说,就让我们开启柔性数组的学习之旅吧!!!🎶🎶🎶
柔性数组
也许你从来没有听过柔性数组这个概念,但是它确实是真实存在的。
1.1 概念
在C99中,结构体中最后一个成员允许使用未知大小的数组,这个就叫做柔性数组成员。
例如:
struct st_type
{int i;int arr[0];//柔性数组成员
};
上述代码可能有的编译器会报错导致程序无法正常执行,可以改成以下代码:
struct st_type
{int i;int arr[];//柔性数组成员
};
看到这里,你心中可能会用这样一个疑问:柔性数组有什么优势或者特点呢?值得我去学习。那么,接下来我们就来聊一聊柔性数组的特点。
1.2 柔性数组的特点
- 结构体中柔性数组成员前面至少有一个其他成员
- sizeof返回这种结构体的大小时,是不包含柔性数组的大小
- 包含柔性数组成员的结构体用malloc函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小
这里解释一下特点1和特点2:
根据柔性数组的定义,你会发现它的数组元素个数竟然是0,放到正常的场景下这是不可能的,这也就从侧面说明了没有人知道它真实的大小(当然,这是建立在程序员还未决定柔性数组成员的大小的条件下)。那竟然不知道它真实的大小,如果整个结构体有且仅有这么一个成员的话,那么连同这个结构体大小也是未知的了,故此我们做出了一种方案:在一个包含着柔性数组的结构体中,其前面必须至少得存在一个算得出来大小的成员。这样我们就在忽略柔性数组大小前提下,可以得出该结构体大小。另外sizeof在计算这种结构体时,不包含柔性数组成员的大小也是出于这方面的考虑。
例子:
#include<stdio.h>
struct test
{char c;int arr[];//柔性数组成员,其前面有一个已知大小的成员
};int main()
{printf("%zd\n",sizeof(struct test));//这里输出的是1return 0;
}
1.3 柔性数组的使用
代码1:
#include<stdio.h>
#include<stdlib.h>
typedef struct st_type
{int i;int arr[];
}type_a;int main()
{//因为我们需要对柔性数组成员的大小进行提前设定type* pa = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));if(pa == NULL){perror("malloc");return 1;}//业务处理pa->i = 100;for(int i = 0; i<100; i++){pa->arr[i] = i + 1;}free(pa);pa = NULL;return 0;
}
这样柔性数组成员arr,相当于获得了100个整型元素的连续空间。
相信看到这里的读者,已经感受到了柔性数组的魅力了。其能够克服普通数组无法改变其自身大小的缺点,能灵活变化自身元素的个数。
1.4 柔性数组的优势
可能有的读者突发奇想,你这个功能我不用柔性数组也能实现啊。
代码展示:
#include<stdio.h>
#include<stdlib.h>typedef struct st_type
{int i;int* arr;
}type_a;int main()
{type_a* pa = (type_a*)malloc(sizeof(type_a));pa->i = 100;pa->arr = (int*)malloc(sizeof(int)*(p->i));//业务处理for(int i = 0; i < pa->i; i++){pa->arr[i] = i + 1;}//释放空间free(pa->arr); free(pa);pa->arr = NULL;pa = NULL;return 0;
}
上述代码可以同样完成任务,但是第一种写法有两种好处:
第一个好处是:方便内存释放
如果我们代码是在一个给别人用的函数中,你在里面做了两次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体的内存,但是用户并不知道这个结构体内成员也需要进行free,所以你不能指望用户来发现这件事。所以,如果我们把结构体的内存以及其成员要的内存一次性分配好的话,并返回给用户一个指针,用户就可以根据这个给指针正确的找到并且使用动态开辟的空间,之后再只需使用一次free就可以把所有的内存给释放掉了。
第二个好处是:有利于内存的访问速度
连续的内存有益于访问速度的提升,也有利于减少内存碎片。(其实,我个人感觉也没有提升多少,反正你跑不了要用做偏移量做加法来寻址)
总结
好了,到这里我们就把柔性数组的知识点全部讲完了,也相信大家对柔性数组有一定的认识了。所谓的柔性数组,就像是一块具有柔性的布料,可以在一定的环境下随意改变它的长度,使其符合我们的预期,达到我们想要的效果。
相关文章:
【C语言】柔性数组(打开前所未见的大门)
文章目录 前言柔性数组1.1 概念1.2 柔性数组的特点1.3 柔性数组的使用1.4 柔性数组的优势 总结 前言 说到柔性数组,相信有很多学过C语言的读者都不知道这是个什么东西。不过没有关系,相信本章能够带你从到认识到掌握柔性数组,做一个充满知识…...
设计模式17-适配模式
设计模式17-适配模式 动机定义与结构C代码推导总结应用具体应用示例 动机 在软件系统中由于应用环境的变化常常需要将一些现存的对象。放到新的环境中去应用。但是新环境要求的接口是这些现存对象所不满足的。那么这种情况下如何应对这种迁移的变化?如何既能利用现…...
react ant Input defaultValue={value}设置了value值以后,但是defalult没有赋值上,输入框也没有显示
在 React 中,defaultValue 是一个非受控属性,而 value 是一个受控属性。这两个属性都可以用于设置 Input 组件的值,但是它们的工作方式有所不同。 value:这是一个受控属性,意味着输入框的值由 React 状态控制。每当状态…...
大模型开发如何把一段文字变成一组token?
在大模型开发中,将一段文字变成一组token通常称为"tokenization"(分词)。这是自然语言处理中的一个关键步骤,主要是将连续的文本划分成离散的单元(token),这些单元可以是单词、子词或…...
【MSYS】Windows Terminal 集成
Windows Terminal 集成 MSYS2安装在默认位置C:\msys64打开Windows Terminal打开JSON配置文件文件。 添加如下配置: "profiles": {"defaults": {},"list": [{"guid": "{71160544-14d8-4194-af25-d05feeac7233}"…...
Python酷库之旅-第三方库Pandas(056)
目录 一、用法精讲 211、pandas.Series.truncate方法 211-1、语法 211-2、参数 211-3、功能 211-4、返回值 211-5、说明 211-6、用法 211-6-1、数据准备 211-6-2、代码示例 211-6-3、结果输出 212、pandas.Series.where方法 212-1、语法 212-2、参数 212-3、功能…...
ZBrush入门使用介绍——4、笔刷选项说明
大家好,我是阿赵。 这次来看看ZBrush的笔刷的选项用法。 一、选择笔刷 点击笔刷,可以打开笔刷选择面板。 在最上面的Quick Pick,有最近使用过的笔刷,可以快速的选择。下面有很多可以选择的笔刷。但由于笔刷太多,…...
Java每日一练,技术成长不间断
目录 题目1.下列关于继承的哪项叙述是正确的?2.Java的跨平台特性是指它的源代码可以在多个平台运行。()3.以下 _____ 不是 Object 类的方法4.以下代码:5.下面哪个流类不属于面向字符的流()总结 题目 选自牛…...
传知代码-上下位关系自动检测方法(论文复现)
代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 Hearst patterns revisited: Automatic hypernym detection from large text corpora[1] 提出的文本中上位词检测方法。 在自然语言处理中,上下位关系(Is-a Relations…...
从零开始的MicroPython(二) GPIO及代码应用
上一篇:http://t.csdnimg.cn/mg2Qt 文章目录 ESP32(NodeMCU-32S)简介引脚注意事项 类与对象的概念MicroPython的GPIO使用文档解释machine.PinPin.irq 点灯 ESP32(NodeMCU-32S) 简介 NodeMCU-32S 是安信可基于 ESP32-32S 模组所设计的核心开发板。该开发板延续了 N…...
嵌入式day15
数组指针 能够指向整个数组 一维数组: &a,考察a的数据类型 int(*p)[10]:表示一个指向长度为10的一维整型数组的指针 二维数组: 指向函数的指针 函数的函数名,即为函数的入口地址&#x…...
【电池管理系统(BMS)-01】 | 电池管理系统简介,动力电池和储能电池区别
🎩 欢迎来到技术探索的奇幻世界👨💻 📜 个人主页:一伦明悦-CSDN博客 ✍🏻 作者简介: C软件开发、Python机器学习爱好者 🗣️ 互动与支持:💬评论 &…...
C++ STL partial_sum 用法
一:功能 计算部分和,即遍历序列中每个元素,计算前 i 个元素的累加和,并将结果存在 i 的位置上。 二:用法 #include <iostream> #include <vector> #include <numeric>int main() {std::vector<…...
诚宜开张圣听不应妄自菲薄
拾人牙慧孜孜不倦 青山依旧在几度夕阳红朝闻道夕死可矣 青山依旧在几度夕阳红 安能以血补天我计不成乃天命也臣本布衣躬耕南阳大丈夫宁死不辱尔要试我宝剑是否锋利吗又待怎样休教天下人负我竖子不足与谋皇天不佑天下英雄唯使君与操尔青光殷殷其灿如炎备不量力欲申大义于天下我…...
Vue3 加载条(LoadingBar)
效果如下图:在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小,单位 pxnumber2falsecolorLoading加载中颜色string‘…...
《CSS创意项目实战指南》:点亮网页,从实战中掌握CSS的无限创意
CSS创意项目实战指南 在数字时代,网页不仅是信息的载体,更是艺术与技术的融合体。通过CSS,你可以将平凡的网页转变为引人入胜的视觉盛宴,让用户体验跃升至全新高度。《CSS创意项目实战指南》正是这样一本引领你探索CSS无限可能的…...
[FBCTF2019]RCEService (PCRE回溯绕过和%a0换行绕过)
json格式输入ls出现index.php 这道题原本是给了源码的,BUUCTF没给 源码: <?phpputenv(PATH/home/rceservice/jail);if (isset($_REQUEST[cmd])) {$json $_REQUEST[cmd];if (!is_string($json)) {echo Hacking attempt detected<br/><br/…...
vue3后台管理系统 vue3+vite+pinia+element-plus+axios上
前言 项目安装与启动 使用vite作为项目脚手架 # pnpm pnpm create vite my-vue-app --template vue安装相应依赖 # sass pnpm i sass # vue-router pnpm i vue-router # element-plus pnpm i element-plus # element-plus/icon pnpm i element-plus/icons-vue安装element-…...
Mysql的事务隔离级别实现原理
一、事务隔离级别 mysql支持四种事务隔离级别: 读未提交:一个事务可以读取到另一个事务还未提交的数据;读已提交:一个事务可以读取到另一个事务已经提交的数据;可重复读:同一个事务中,无论读取…...
计算机体系结构:缓存一致性ESI
集中式缓存处理器结构(SMP) 不同核访问存储器时间相同。 分布式缓存处理器结构(NUMA) 共享存储器按模块分散在各处理器附近,处理器访问本地存储器和远程存储器的延迟不同,共享数据可进入处理器私有高速缓存…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
