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

时间:2016-03-06 07:29:05

标签: c pointers memory-management malloc

所以我应该实现一个可以在C中包含任何类型对象的集合。如何根据该对象的类型动态分配内存。或者说,如果仅指向指向它的void指针,我如何找出类型未知的对象的大小?

void set_add(set *s, const void *item) {
  ...
  s->items[s->size] = malloc(sizeof(*item) * ??);
  ...
}

1 个答案:

答案 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。取决于你想要达到的目标。