C 中的通用动态数组,不存储容量且不需要结构

2026-06-13 1 阅读 alurm
C 中的通用动态数组,不存储容量且不需要结构体 以下标头显示了使用两个指针的数组在 C 中创建通用动态数组的方法:第一个指针存储动态数组的长度;第一个指针存储动态数组的长度。第二个指针指向数据。所以,int *vec[2] = { 0 };是一个空的动态整数数组。结构体 *people[2] = { 0 };是一个空的动态数组。 (uintptr_t)vec[0] 是数组的长度,vec[1] 是数组。 vec_push 宏将一个值压入动态数组的末尾,并在成功时返回 true。此代码是带有语句表达式的 C23(GNU C 功能)。为什么这很有趣首先,不使用结构,因此您不必为它们发明名称(例如,没有 IntVec )。由于指针用于存储动态数组的长度(作为 uintptr_t ),因此这依赖于实现定义的行为,即从指针读取的 uintptr_t 长度必须与存储的长度相同。其次,容量根本不被存储。相反,当 vec 的长度为零或 2 的幂时,它会根据需要进行计算。在这种情况下,调用 realloc 时,容量等于大于长度的下一个 2 的幂。缺点是“保留”元素更加困难:在推送期间,当长度达到 2 的幂时,无论如何都会调用 realloc 来获取下一个 2 的幂,因此实际上会丢弃更大的手动保留。