我写了一个这样的动态数组:
#include <stdlib.h>
typedef struct {
size_t capacity;
size_t len;
} __dynarray_header;
void* dynarray_new() {
__dynarray_header* header = malloc(sizeof(__dynarray_header));
header->capacity = 0;
header->len = 0;
return header + 1;
}
可以通过[]
操作访问动态数组。调整大小时,我可以__dynarray_header*)array - 1
用来检索容量和长度信息。
这个想法在小测试中有效。然而,GCC 警告要打破严格的混叠。
我还发现了一些没有-fno-strict-aliasing
编译器选项(带-O3
优化)的大型项目段错误。
我知道什么是严格混叠,以及为什么我的代码会破坏严格混叠。
我的问题是:有没有比我上面展示的更好的方法来实现支持[]
操作和动态调整大小的动态数组?
额外的:
使用此动态数组的演示程序:
int* arr = dynarray_new();
arr = dynarray_resize(sizeof(int) * 2);
arr[0] = 1;
arr[1] = 2;
arr = dynarray_resize(sizeof(int) * 4);
arr[2] = 3;
arr[3] = 4;
dynarray_free(arr);