【问题标题】:Dynamically allocate memory in c with unknown type在c中动态分配未知类型的内存
【发布时间】:2016-06-19 20:31:01
【问题描述】:

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

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

【问题讨论】:

  • 如果没有传入大小,你就无法找出以可移植方式指向的对象的大小。
  • 也许你的任务并没有说明要维护一个装满你的副本项的集合。只要const void * 指向的任何东西的生命周期都比您的设置长/长,并且身份是基于地址的,您就知道大小;它是const void* 的大小。如果作业确实需要复制,您需要知道大小。没有什么可以逃避的。
  • 您的set *s 作为参数传递是否保证在函数调用之前包含正确的s->size

标签: c pointers memory-management malloc


【解决方案1】:

您不能,除非您将大小传递给您的 set_add 函数。

但是,您所做 知道的是指向对象的指针的大小。因此,您可能应该拥有该对象的所有权,而不是存储指向对象的副本(因此,您在不再需要时负责freeing)并将指向对象的指针存储在您的集合中.

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

【讨论】:

  • 我不确定 “你不能” 注释是否正确。查看问题set *s 作为参数传递,s->size 成员似乎包含所需的大小。值得向 OP 提出问题来确认。就目前而言,您是正确的 size 是必需的,但是否已经提供它只是模棱两可。
  • 确实,尽管我假设 size 成员保存集合的当前大小,而不是元素的(然后对于所有元素都是常量)大小。 @DavidC.Rankin
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
相关资源
最近更新 更多