所以我应该实现一个可以在C中包含任何类型对象的集合。如何根据该对象的类型动态分配内存。或者说,如果仅指向指向它的void指针,我如何找出类型未知的对象的大小?
void set_add(set *s, const void *item) {
...
s->items[s->size] = malloc(sizeof(*item) * ??);
...
}
答案 0 :(得分:0)
除非您将尺寸传递给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
非const。否则free
会在传递const
限定指针(目标)时抱怨。另一种可能性是在const
之前移除free
。取决于你想要达到的目标。