柔性数组详解+代码展示

系列文章目录
🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼
🎉🎉我的C语言初阶合集:C语言初阶合集,希望能帮到你!!!😍 😍
🔍🔍我的C语言进阶合集:我的C语言进阶合集,期待你的点击!!!🌈🌈
文章目录
- 系列文章目录
- 前言
- 一、柔性数组的定义
- 二、柔性数组的语法
- 三、柔性数组的使用
- 四、柔性数组的注意事项
- 五、柔性数组的优点
- 总结
- END
前言
各位博友,大家好呀!👋 今天我给大家带来的是关于C语言柔性数组📝的深度总结,希望对大家有所帮助!😊
一、柔性数组的定义
柔性数组是
C99标准中定义的一种结构体特性,允许结构体的最后一个成员是一个未指定大小的数组。
这种数组在结构体实例化时,根据需要进行内存分配。
二、柔性数组的语法
- 柔性数组的声明方式如下:
struct StructName
{int StructMember;int Array[]; // 柔性数组
};
或者,柔性数组的长度可以写成0:
struct StructName
{int StructMember;int Array[0]; // 柔性数组,长度写成 0
};
三、柔性数组的使用
柔性数组本身不占用结构体的空间,因此在使用前需要为其动态分配内存。
通常使用malloc函数进行内存分配,并且分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
- 示例代码:
#include <stdio.h> // 包含标准输入输出库,用于打印信息
#include <stdlib.h> // 包含标准库,用于动态内存分配和释放// 定义一个名为 Array的结构体,用于存储整型数组
struct Array
{int length; // 存储数组的长度int data[]; // 柔性数组,用于存储实际的整数数据
};int main()
{// 定义数组的大小int sz = 5;// 动态分配内存,大小为 Array结构体加上 sz 个整数的大小struct Array* ptr = (struct Array*)malloc(sizeof(struct Array) + sz * sizeof(int));// 如果内存分配失败,打印错误信息并退出程序if (ptr == NULL){perror("malloc");return 1;}// 设置数组的长度ptr->length = sz;// 初始化数组,将每个元素设置为其索引值for (int i = 0; i < sz; i++){ptr->data[i] = i ;}// 打印数组中的每个元素,使用 ptr->length 作为循环条件for (int i = 0; i < ptr->length; i++){printf("%d ", ptr->data[i]);}// 释放之前分配的内存,并把指针设置为 NULL,避免野指针free(ptr);ptr = NULL;// 程序正常退出return 0;
}
- 示例代码结果:

四、柔性数组的注意事项
- 位置要求:
柔性数组必须是结构体的最后一个成员,前面必须至少有一个其他成员。
- 内存管理:
使用柔性数组时,需要注意内存的动态分配和释放。分配的内存应该大于结构体的大小,以适应柔性数组的预期大小。
释放内存时,使用free函数一次性释放整个结构体所占用的内存。
- 兼容性:
虽然柔性数组是
C99标准的一部分,但并不是所有的编译器都完全支持这一特性。
在使用柔性数组时,应确保目标编译环境支持C99或更高版本的C标准。
- 错误处理:
在使用
malloc或realloc分配内存后,应检查返回值以确保分配成功。
如果分配失败(返回NULL),则应采取适当的错误处理措施。
五、柔性数组的优点
- 内存管理简化:
柔性数组使得内存分配和释放更加简洁,减少了内存碎片,
提高了内存利用率。
- 访问效率提高:
由于柔性数组与结构体其他成员在同一内存块中,
因此访问柔性数组元素时具有更高的局部性,提高了访问速度。
总结
柔性数组是C语言中一种强大的工具,允许开发者创建可变大小的结构体,以适应不同的数据需求。
通过谨慎而有效地使用柔性数组,可以编写出更加灵活、高效且内存安全的代码。
END
每天都在学习的路上!
On The Way Of Learning

相关文章:
柔性数组详解+代码展示
系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...
前端入门指南:Webpack插件机制详解及应用实例
前言 在现代前端开发中,模块化和构建工具的使用变得越来越重要,而Webpack作为一款功能强大的模块打包工具,几乎成为了开发者的默认选择。Webpack不仅可以将各种资源(如JavaScript文件、CSS文件、图片等)打包成优化后的…...
C++备忘录模式
在读《大话设计模式》,在此记录有关C实现备忘录模式。 场景引入:游戏中的存档,比如打boss之前记录人物的血量等状态。 下面代码是自己根据理解实现的存档人物血量功能。 #include <iostream>using namespace std;//声明玩家类 class …...
【Electron学习笔记(四)】进程通信(IPC)
进程通信(IPC) 进程通信(IPC)前言正文1、渲染进程→主进程(单向)2、渲染进程⇌主进程(双向)3、主进程→渲染进程 进程通信(IPC) 前言 在Electron框架中&…...
Java 中的 remove 方法深度解析
在 Java 编程中,remove方法是一个经常被使用的操作。它可以用于从各种数据结构中移除特定的元素,帮助我们有效地管理和操作数据。本文将深入探讨 Java 中的remove方法,包括在不同数据结构中的应用、使用场景、注意事项以及性能考虑等方面。 …...
企业品牌曝光的新策略:短视频矩阵系统
企业品牌曝光的新策略:短视频矩阵系统 在当今数字化时代,短视频已经渗透到我们的日常生活之中,成为连接品牌与消费者的关键渠道。然而,随着平台于7月20日全面下线了短视频矩阵的官方接口,许多依赖于此接口的小公司和内…...
【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
文章目录 一、堆排引入之使用堆排序数组二、真正的堆排1.向上调整算法建堆2.向下调整算法建堆3.向上和向下调整算法建堆时间复杂度比较4.建堆后的排序4.堆排序和冒泡排序时间复杂度以及性能比较 三、Top-K问题 一、堆排引入之使用堆排序数组 在了解真正的堆排之前,我…...
vue3 + ts 使用 el-tree
实现效果: 代码: <template><!-- el-tree 使用 --><div class"my-tree-container"><el-scrollbar height"100%"><el-tree ref"treeRef" :data"treeData" node-key"id" n…...
Create Stunning Word Clouds with Ease!
Looking to craft breathtaking word clouds? WordCloudStudio is your go-to solution! Whether you’re a marketer, educator, designer, or simply someone who loves visualizing data, this app has everything you need. Download now: https://apps.apple.com/app/wor…...
html+css网页设计 旅游 马林旅行社5个页面
htmlcss网页设计 旅游 马林旅行社5个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#…...
python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
废话不多说,直接开始 本文以无界作为本文测试案例,抓取shadow-root(open)下的内容 shadow Dom in selenium: 首先先讲一下shadow Dom in selenium 版本的区别,链接指向这里 在Selenium 4版本 以及 chrom…...
React基础教程(11):useCallback记忆函数的使用
11、useCallback记忆函数 防止因为组件重新渲染,导致方法被重新创建,起到缓存作用,只有第二个参数变化了,才重新声明一次。 示例代码: import {useCallback, useState} from "react";const App = () =>...
arp-scan 移植到嵌入式 Linux 系统是一个涉及多个步骤的过程
将 arp-scan 移植到嵌入式 Linux 系统是一个涉及多个步骤的过程。arp-scan 是一个用于发送 ARP 请求以发现网络上设备的工具,它依赖于一些标准的 Linux 库和工具。以下是将 arp-scan 移植到嵌入式 Linux 系统的基本步骤: 1. 获取 arp-scan 源码 首先&a…...
【Linux】常用命令一
声明:以下内容均学习自《Linux就该这么学》一书。 Linux中的shell是一种命令行工具,它充当的作用是人与内核(硬件)之间的翻译官。 大多数Linux系统默认使用的终端是Bash解释器。 1、echo 用于在终端输出字符串或变量提取后的值。 echo "字符串…...
在鲲鹏麒麟服务器上部署MySQL主从集群
因项目需求需要部署主从MySQL集群,继续采用上次的部署的MySQL镜像arm64v8/mysql:latest,版本信息为v8.1.0。计划部署服务器192.168.31.100和192.168.31.101 部署MySQL主节点 在192.168.31.100上先创建好/data/docker/mysql/data和/data/docker/mysql/l…...
Siknhorn算法介绍
SiknHorn算法是一个快速求解离散优化问题的经典算法,特别适用于计算离散分布之间的**最优传输(Optimal Transport)**距离; 最优传输问题介绍 计算两个概率分布 P 和 Q 之间的传输成本,通常表示为: 是传输…...
群控系统服务端开发模式-应用开发-邮箱短信通道功能开发
邮箱短信通道主要是将邮箱及短信做归属的。具体见下图: 一、创建表 1、语句 CREATE TABLE cluster_control.nc_param_emailsms (id int(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 编号,email_id varchar(120) CHARACTER SET utf8 COLLATE utf8_general_ci NO…...
[docker中首次配置git环境]
11月没写东西,12月初赶紧水一篇。 刚开始搭建docker服务器时,网上找一堆指令配置好git后,再次新建容器后忘记怎么配了,,这次记录下。 一、git ssh指令法,该方法不用每次提交时输入密码 前期准备࿰…...
书生浦语·第四期作业合集
目录 1. Linux基础知识 1.1-Linux基础知识 1.在终端通过ssh 端口映射连接开发机 2. 创建helloworld.py 3.安装相关包并运行 4.端口映射并访问相关网页...
5G学习笔记之PRACH
即使是阴天,也要记得出门晒太阳哦 目录 1. 概述 2. PRACH Preamble 3. PRACH Preamble 类型 3.1 长前导码 3.2 短前导码 3.3 前导码格式与小区覆盖 4. PRACH时频资源 4.1 小区所有可用PRACH资源 4.2 SSB和RACH的关系 4.3 PRACH时频资源配置 1. 概述 随机接入…...
新国标GB 44263实战:如何用一颗传感器搞定交/直/脉动全波形漏电检测?
第一名背后鲜为人知的“现实”我国已经建成全球规模最大的电动汽车充电网络,国家能源局数据显示,截至2026年1月底,我国电动汽车充电基础设施(枪)总数达到2069.8万个,公共充电设施(枪)…...
YOLOv8鹰眼检测实战:无人机巡检场景下的目标识别应用
YOLOv8鹰眼检测实战:无人机巡检场景下的目标识别应用 1. 无人机巡检的视觉挑战与解决方案 在电力线路巡查、交通监控、农业勘测等场景中,无人机正成为不可或缺的空中巡检工具。然而传统人工分析航拍图像的方式存在效率低下、漏检率高、响应延迟等问题。…...
AI赋能开发:让快马平台智能理解并生成产区标准图交互应用
AI赋能开发:让快马平台智能理解并生成产区标准图交互应用 最近在做一个农产品产区标准查询系统的项目,发现用传统方式开发这类需求特别费时。比如要处理用户自然语言查询、动态生成地图、实现智能推荐逻辑,光写基础代码就得花好几天。后来尝…...
Qwen3-ASR-1.7B实战教程:结合Punctuation Restoration模型提升标点准确率
Qwen3-ASR-1.7B实战教程:结合Punctuation Restoration模型提升标点准确率 语音识别技术已经相当成熟,但识别结果往往缺少标点符号,让长文本阅读变得困难。本文将教你如何将Qwen3-ASR-1.7B语音识别模型与标点恢复技术结合,获得既准…...
Z-Image-Turbo_Sugar脸部Lora赋能网络安全:生成模拟人脸进行隐私保护测试
Z-Image-Turbo_Sugar脸部Lora赋能网络安全:生成模拟人脸进行隐私保护测试 1. 引言:当网络安全遇上AI造脸 你有没有想过,那些用来保护我们手机、门禁的人脸识别系统,到底安不安全?安全研究员们每天都在琢磨这个问题。…...
Vue3项目实战:5分钟搞定DeepSeek API对接,打造你的专属AI聊天助手
Vue3项目实战:5分钟搞定DeepSeek API对接,打造你的专属AI聊天助手 最近在重构个人博客时,突然想到如果能给访客加个智能问答助手应该挺酷的。作为一个长期混迹开源社区的全栈开发者,我习惯性先搜了圈现有方案——结果发现DeepSeek…...
从攻到防:实战演练基于Wireshark与Snort的DoS攻击检测
1. 拒绝服务攻击初探:原理与危害剖析 想象一下周末去热门餐厅吃饭的场景。当所有座位都被占满,门口还不断涌入大量"假顾客"时,真正的食客就会被挡在门外——这就是拒绝服务攻击(DoS)的生动写照。作为网络安…...
实战演练:基于快马平台生成学生成绩排名系统,掌握排序算法应用
最近在做一个学生成绩管理系统的实战项目,其中排序功能是核心模块。通过这个项目,我深刻体会到排序算法在实际应用中的重要性。下面分享一下我的实现思路和经验总结。 学生类设计 首先需要定义一个学生类,包含学号、姓名、各科成绩和总成绩等…...
C语言结构体定义与自增运算符a++详解
有一个结构体名是stu,它当中包含着5个成员,其中一个成员是name,还有一个成员是num,另外一个成员是age,再有一个成员是group,最后一个成员是score。 除了不能初始化这一点外,结构体成员的定义方式…...
开发者的第二曲线:2026年最赚钱的5个技术副业
在技术范式加速重构的2026年,软件质量保障的重要性已从“成本中心”跃升为“价值中心”。对于敏锐的软件测试从业者而言,这不仅是职业的深化,更是将专业壁垒转化为财富增长的绝佳契机。传统的“接私活”模式正在被更具复利效应和杠杆价值的“…...
