当前位置: 首页 > 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.jsqmd.com/news/1009752/

相关文章:

  • 3步搭建Windows专业级Syslog日志服务器:Visual Syslog Server终极指南
  • 让数据分析长出牙齿:可操作、可归因、实时驱动业务增长
  • 5分钟快速上手:uBlock Origin终极隐私保护指南
  • 从Windows Defender到Android沙箱:ASLR技术在不同平台(Win11/Android 13)的实现差异与安全效果实测
  • 从SQL到Cypher:你的思维转换指南(附Neo4j通用语法对照表与避坑点)
  • GitHub功能大揭秘:多领域平台服务与知识地图工具的实用指南
  • 2026年专业的重庆案件代理刑事律师/重庆刑事辩护律师哪家有实力 - 行业平台推荐
  • Bregman生成器与TMLE:凸优化与概率建模的核心工具
  • 拼多多爬虫:5分钟快速部署的电商数据自动化采集完整方案
  • Android Studio中文界面如何配置?3分钟实现母语开发环境的完整指南
  • metadef架构与算子原型定义,以及如何进行元定义库在CANN分层架构中的角色
  • 告别网盘下载龟速!八大网盘直链下载助手,让你的文件下载飞起来!
  • AI Act高风险系统合规实操指南:从判定到上市前审查
  • ShardingSphere实战:Sharding-JDBC和Sharding-Proxy到底怎么选?从性能测试结果看真实场景选择
  • 别再傻傻分不清了!用PyTorch代码实战带你搞懂KL散度与交叉熵的区别
  • B站成分检测器终极指南:5分钟快速上手,让评论区用户身份一目了然
  • JWST发现高红移小红点的宇宙学意义与物理本质
  • 内存池学习笔记
  • 别再到处找freeglut了!Windows下用Visual Studio 2022配置OpenGL ES开发环境(附3.0稳定版下载)
  • 2026年靠谱的浙江混凝土/泡沫混凝土厂家精选合集 - 品牌宣传支持者
  • LabelImg汉化包替换后总报错?可能是你的PyQt5资源编译姿势不对(附完整排错流程)
  • 解锁创维盒子E900V22C的完全体:开启adb root权限后,这5个玩法让旧盒子焕发新生
  • 机器学习落地前的四道业务安检门
  • 从Docker镜像到生产环境:kkfileview与Nginx反向代理配置的细节全解析
  • 大模型MoE架构中2%参数如何实现高效调度
  • 别再用L298N了?ESP32驱动电机方案对比:DRV8833、TB6612、L298N谁更香
  • 2026年北京及北方市场正规铁艺制品选购全解析:从工艺参数到工程案例的行业观察 - 优质品牌商家
  • DeepSeek OCR本地部署:文档识别成本降低96%的工程实践
  • 2026上海会展保洁公司怎么选?标杆推荐与实操推荐 - 优质品牌商家
  • AI模型选型的真成本:Fine-tuning、蒸馏与迁移学习的产线级ROI对比