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、不分享个人信息等导航选项。此时可能无法执行某些操作。
