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

C 语言通用动态数组:无需存储容量和结构体,实现方法大揭秘!

搜索与登录

可搜索代码片段,有[所有代码片段]和[返回 GitHub]等选项,同时提供[登录]和[注册]入口。若在其他标签页或窗口有登录、注销、切换账户等操作,需[重新加载]以刷新会话。

代码片段信息

即时分享代码、笔记和代码片段。代码片段的作者是[@alurm],最后活跃时间为 2026 年 6 月 13 日 08:51。还可进行显示代码片段选项操作,如[下载 ZIP]、[收藏]、[分叉]、[嵌入]等。

选择操作选项

有嵌入、分享、通过 HTTPS 克隆等选项。若选择克隆,可在 `` 处克隆此仓库,也可将 alurm/2ca14be134d719fe7431217a6b18d91e 保存到计算机并在 GitHub Desktop 中使用。

通用动态数组介绍

这是一个用 C 语言实现的通用动态数组,无需存储容量,也不需要结构体。下面的头文件展示了使用两个指针数组创建通用动态数组的方法:第一个指针存储动态数组的长度,第二个指针指向数据。例如,`int *vec[2] = { 0 };` 是一个空的 `int` 类型动态数组,`struct person *people[2] = { 0 };` 是一个空的 `person` 结构体类型动态数组。`(uintptr_t)vec[0]` 是数组的长度,`vec[1]` 是数组本身。`vec_push` 宏用于将一个值添加到动态数组的末尾,成功时返回 `true`。此代码采用 C23 标准,并使用了语句表达式(GNU C 特性)。

方法有趣之处

首先,不使用结构体,无需为它们命名。由于使用指针来存储动态数组的长度(作为 `uintptr_t` 类型),依赖于实现定义的行为,即从指针读取的 `uintptr_t` 长度必须与存储的长度相同。其次,完全不存储容量。当数组长度为零或为 2 的幂时,会按需计算容量,调用 `realloc` 函数将容量设置为大于当前长度的下一个 2 的幂。缺点是“预留”元素变得更加困难,在添加元素时,当长度达到 2 的幂时,无论如何都会调用 `realloc` 函数来分配下一个 2 的幂大小的空间,较大的手动预留实际上会被丢弃。

main.c 文件情况

此文件包含隐藏或双向 Unicode 文本,其解释或编译方式可能与显示内容不同。若要查看,需在能显示隐藏 Unicode 字符的编辑器中打开该文件。文件中展示了代码的具体运行,如创建 `int` 类型和 `person` 结构体类型的动态数组,添加元素,输出元素,缩小数组等操作,最后释放内存。

vec.h 文件情况

此文件同样包含隐藏或双向 Unicode 文本,需在能显示隐藏 Unicode 字符的编辑器中打开。文件中定义了 `vec_push` 宏,用于将值添加到动态数组末尾。当数组长度为零或为 2 的幂时,会重新分配到下一个 2 的幂大小。同时会检查是否溢出,分配内存等操作。

页脚导航

包含[条款]、[隐私]、[安全]、[状态]、[社区]、[文档]、[联系我们]、管理 Cookie、不分享个人信息等导航选项。此时可能无法执行某些操作。

http://www.gsyq.cn/news/1521560.html

相关文章:

  • 3步搭建Windows专业级Syslog日志服务器:Visual Syslog Server终极指南
  • 让数据分析长出牙齿:可操作、可归因、实时驱动业务增长
  • GitHub功能大揭秘:多领域平台服务与知识地图工具的实用指南
  • LabelImg汉化包替换后总报错?可能是你的PyQt5资源编译姿势不对(附完整排错流程)
  • 解锁创维盒子E900V22C的完全体:开启adb root权限后,这5个玩法让旧盒子焕发新生
  • AI资讯简报如何做到真正实用?从信息过载到可执行工作流
  • DeepSeek OCR本地部署:文档识别成本降低96%的工程实践
  • AI模型选型的真成本:Fine-tuning、蒸馏与迁移学习的产线级ROI对比
  • 算法不是AI:普通人可理解的决策流水线
  • 2026双金属耐磨管行业深度分析:电厂、矿山场景下耐用型管材厂商对比与案例解析 - 优质品牌商家
  • 别再被Kafka Kerberos认证的`sasl.kerberos.service.name`搞晕了!一个配置项引发的‘血案’与避坑指南
  • 终极GitHub加速指南:5分钟让你的下载速度飙升10倍
  • 2026亚洲弹性学制EMBA客观测评与理性选型指南
  • 汇编调试不求人:DOSBox搭配Debug命令实战指南(从Hello World到单步追踪)
  • Java 流式编程(Stream)完整详解
  • 从DDR3到DDR4,你的老电脑升级内存划算吗?实测性能提升与兼容性全解析
  • Triton模型服务化与持续可观测性实战指南
  • 在Visual Studio 2022里,用C#和OpenTK 4.x画个会转的彩色立方体(附完整代码)
  • 别再踩坑了!STM32F103C8T6的PB3/PB4/PA15引脚当普通IO口用的完整配置流程(附MDK设置截图)
  • Java中String内部排序方法
  • 别再傻傻分不清了!用大白话和一张图讲透图形渲染里的AABB、KD树和BVH
  • 千脑理论仿真:用皮层柱建模感觉-位置绑定与分布式共识
  • 告别漫长等待!手把手教你用Ansys Speos 2022R2的GPU加速,把光学仿真速度提上来
  • 从MBTI到SCL-90:拆解互联网公司校招测评背后的逻辑,技术/非技术岗如何‘对号入座’
  • STM32新手避坑:为什么我建议你先学标准库,再碰HAL库?
  • 避坑指南:城市热岛研究中,用MODIS和Landsat算地表温度,结果差多少?实测对比来了
  • 保姆级教程:用Cadence 17.2为ESP8266-12F和OpenMV设计无人机供电与WIFI电路
  • 告别黑屏!手把手教你安装配置易至天工ArcGIS影像插件(支持10.2-10.8)
  • 从AMD EPYC到3D V-Cache:手把手拆解Chiplet实战中的封装技术选型(2.5D/3D全解析)
  • Ubuntu 20.04上,放弃Sealos!我用KubeKey 2.0.0快速搞定K8s集群,再部署DeepFlow社区版