C语言里写动态数组,通常要定义一个 struct 包含长度、容量和指针。这里介绍一种不用 struct 的写法:把数组声明成两个指针的形式——int *vec[2] = { 0 };,其中 vec[0] 存长度,vec[1] 指向数据。
这种设计的核心是把长度当指针存。用 uintptr_t 类型将长度值转为指针写入 vec[0],读取时再转回整数。程序依赖的假设是:同一个指针地址被转换回整数后,值与原来存储的长度相等——这属于实现定义行为,但在主流编译器上可行。
容量(capacity)在这个实现里根本不存在。当往数组追加数据时,只有在两种情况下才触发扩容:长度为零,或者长度恰好是 2 的幂次。此时申请比当前长度大一倍的内存空间。否则直接复用已有内存,不做任何操作。
这个做法的好处是接口简洁,无需为每种类型单独定义结构体(IntVec、PersonVec 之类)。代价是手动预留空间的语义变得模糊——比如你想提前申请能存 1000 个元素的空间,但如果触发扩容的时机恰好落在 2 的幂次(512→1024),手动预留的量就被覆盖了。这个设计适合追求极简、对容量控制要求不高的场景。
编注:信源为GitHub Gist技术分享,材料侧重实现机制与设计权衡,未涉及性能基准测试或生产环境验证。