C语言中的通用动态数组,无需容量和结构体
Hacker News2026年6月13日 02:50
以下头文件展示了一种在C语言中创建通用动态数组的方法,使用两个指针的数组:第一个指针存储动态数组的长度;第二个指针指向数据。因此,int *vec[2] = { 0 }; 是一个空的整数动态数组。struct person *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的幂,因此较大的手动保留实际上会被丢弃。
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡