【发布时间】:2013-06-29 08:06:39
【问题描述】:
我写了一个这样的动态数组:
#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);
【问题讨论】:
-
零空间开销?您完全处于 Dennis Ritchie(K&R 中的“R”)所说的“与实施毫无根据的亲密关系”的领域。
-
这不就是灵活数组成员的用途吗?
-
@CarlNorum:好点。这是 C89 还是 C99?
-
@CarlNorum,我想要一个“动态”数组,比如 C++ 中的 std::vector。
-
@JoeZ,例如一个 int 数组:
int* arr = dynarray_new()。之后我们可以调整 arr 的大小并使用arr[i]来访问它。
标签: c malloc dynamic-arrays strict-aliasing