所以我应该实现一个可以在C语言中包含任何类型的对象的集合。如何根据该对象的类型动态分配内存。或者,即,我如何找出类型未知的对象的大小,只给出指向它的空指针?
void set_add(set *s, const void *item) {
...
s->items[s->size] = malloc(sizeof(*item) * ??);
...
}
你不能
,除非你将大小传递给你的set_add
函数。
不过,您所知道的是指向对象的指针的大小。因此,与其存储指向对象的副本,不如获取对象的所有权(因此,当不再需要时,您负责free
它)并将指向对象的指针存储在集合中。
struct set {
void **items;
size_t free_space;
size_t capacity;
};
void set_add(set * s, void * obj) {
// dedupe logic
assert(! (s->free_space > s->capacity));
if (s->free_space == s->capacity) {
void ** new_items = realloc(s->items, s->capacity * 2);
// error handling please!
s->items = new_items;
s->capacity *= 2;
}
s->items[s->free_space++] = obj;
}
请注意,我牺牲了const
,因为我也使items
非常量。否则,free
在向它传递一个const
限定指针(目标)时会抱怨。另一种可能性是在free
之前移除const
的石膏。取决于你想要实现的目标。