当前位置: 首页 > news >正文

柔性数组详解+代码展示

系列文章目录

🎈 🎈 我的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标准

  • 错误处理:

在使用mallocrealloc分配内存后,应检查返回值以确保分配成功。
如果分配失败(返回NULL),则应采取适当的错误处理措施。

五、柔性数组的优点

  • 内存管理简化:

柔性数组使得内存分配和释放更加简洁,减少了内存碎片,
提高了内存利用率。

  • 访问效率提高:

由于柔性数组与结构体其他成员在同一内存块中,
因此访问柔性数组元素时具有更高的局部性,提高了访问速度。


总结

柔性数组是C语言中一种强大的工具,允许开发者创建可变大小的结构体,以适应不同的数据需求。
通过谨慎而有效地使用柔性数组,可以编写出更加灵活、高效且内存安全的代码。

END

每天都在学习的路上!
On The Way Of Learning

http://www.lryc.cn/news/496427.html

相关文章:

  • 前端入门指南:Webpack插件机制详解及应用实例
  • C++备忘录模式
  • 【Electron学习笔记(四)】进程通信(IPC)
  • Java 中的 remove 方法深度解析
  • 企业品牌曝光的新策略:短视频矩阵系统
  • 【初阶数据结构与算法】二叉树顺序结构---堆的应用之堆排、Top-K问题
  • vue3 + ts 使用 el-tree
  • Create Stunning Word Clouds with Ease!
  • html+css网页设计 旅游 马林旅行社5个页面
  • python selenium(4+)+chromedriver最新版 定位爬取嵌套shadow-root(open)中内容
  • React基础教程(11):useCallback记忆函数的使用
  • arp-scan 移植到嵌入式 Linux 系统是一个涉及多个步骤的过程
  • 【Linux】常用命令一
  • 在鲲鹏麒麟服务器上部署MySQL主从集群
  • Siknhorn算法介绍
  • 群控系统服务端开发模式-应用开发-邮箱短信通道功能开发
  • [docker中首次配置git环境]
  • 书生浦语·第四期作业合集
  • 5G学习笔记之PRACH
  • Ubuntu24.04配置DINO-Tracker
  • 抓包之查看websocket内容
  • 【Leetcode Top 100】21. 合并两个有序链表
  • 账本模型
  • openwrt利用nftables在校园网环境下开启nat6 (ipv6 nat)
  • 24.12.02 Element
  • 记录QT5迁移到QT6.8上的一些问题
  • 清理Linux/CentOS7根目录的思路
  • 【LInux】kvm添加u盘启动引导
  • .net XSSFWorkbook 读取/写入 指定单元格的内容
  • GaussDB(类似PostgreSQL)常用命令和注意事项