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

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