【发布时间】:2020-01-14 19:46:58
【问题描述】:
我正在研究一种在 C 中创建动态数组的方法,我想出了这个解决方案,作为我希望我的函数/宏如何工作的通用结构:
//dynarray.h
#define dynarray(TYPE)\
struct{\
TYPE *data;\
size_t size;\
size_t capacity;\
}
int dynarray_init_internal(void **ptr, size_t *size, size_t *cap, size_t type_size, size_t count);
#define dynarray_init(ARR, SIZE) dynarray_init_internal(&ARR->data, &ARR->size, &ARR->capacity, sizeof(*ARR->data), SIZE)
//dynarray.c
int dynarray_init_internal(void **ptr, size_t *size, size_t *cap, size_t type_size, size_t count){
*ptr = malloc(type_size*count);
if(*ptr == NULL){
return 1;
}
*size = 0;
*cap = count;
return 1;
}
这是一种可接受的方法来拥有一个通用的函数/宏组合,以一种与类型无关的方式动态分配内存?
我对此的唯一疑问是我不确定这是否是未定义的行为。我想这可以很容易地扩展到动态数组结构通常期望的其他功能。我能看到的唯一问题是,由于它是一个匿名结构,因此您不能将其作为参数传递到任何地方(至少很容易),但这可以通过创建一个定义动态数组的 dynarray_def(TYPE, NAME) 宏来轻松解决带有NAME 的结构并让它保存TYPE 的数据,同时仍然可以与上面列出的所有其他函数/宏样式一起使用。
【问题讨论】:
-
你不能将
TYPE**传递给void**,这甚至不应该编译。 -
已经有系统
sizeof(void*) != sizeof(int*).
标签: c arrays macros undefined-behavior dynamic-arrays