我正在用C语言编写动态数组。
typedef struct __c_array {
void**_elem;
int cur_size;
int capacity;
}c_array;
我的界面如下所示:
extern void push_back_c_array ( c_array*, void *);
现在,用户必须为要推送到数组中的元素分配内存。有没有办法使用void *来避免这种情况。
我想用它来做以下
int a = 5;
push_back_c_array ( <ARRAY_PTR>, a );
这可能。
答案 0 :(得分:2)
如果您提供将复制所提供值的push_back_c_array()版本,则可能。为此,您需要一个额外的参数,它指定值的大小:
push_back_c_array(c_array* arr, void* val, unsigned int size);
您在堆中为新值分配内存,然后执行memcpy。但之后你需要将它解除分配。因此,您需要记住,哪些值是由您分配的,哪些是由调用者分配的。相当讨厌...所以,如果你这样做 - 总是这样做,并在你的功能的文档中描述这个约定。
答案 1 :(得分:0)
您的示例数组包含类型为(void *)的项。它有指针。你似乎想要它拥有任意类型。在这种情况下和int。您是要存储插入数据的副本还是只是存储调用者给您的指针?
不久之前,我想要一个简单的数组,就像我正在编写的游戏中的行为一样,并想出了xrlist。过了一会儿,我想存储它们并随机访问它们,所以想出了xrhash。
xrlist和xrhash存储用户提供的指针,并期望所有元素具有相同的类型(xrhash具有哈希码和比较回调函数)
答案 2 :(得分:0)
你可能会更好地在开始时分配一小块内存(可能是为了保存联盟),并推回元素直到你填满它。然后重新分配,或者分配两倍大小的数组并复制一切。
答案 3 :(得分:0)
你的例子whit a = 5应该可以工作,只要你使用整数或任何其他类型与int相同的类型。泛型数组的用户希望推送结构,就像你的。但是,大元素不能/不应该通过值传递,但它的指针应该传递。
使用泛型并且不受sizeof(int)限制,从用户那里获得额外的努力。我认为最好的解决方案是你在函数中传递已分配的指针(void *)以及想要取出这个元素的人,应该free()这个结构。