在 c 中动态分配未知类型的内存



所以我应该实现一个可以在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的石膏。取决于你想要实现的目标。

相关内容

  • 没有找到相关文章

最新更新