为队列设计resize函数

问题描述 投票:2回答:2

我目前正在尝试为队列数据结构设计公共API,并调整函数大小以更改其大小。我的第一个目的是通过以下方式实现:

typedef struct queue queue;

/**
 * Resizes a given queue.
 *
 * Changes the size of the queue passed as a parameter. 
 * The content of the resized queue prior to the lesser
 * of new and old sizes is left unchanged. 
 *
 * Returns:
 *  0 - on success
 * -1 - on error and the content of the original queue is left unchanged
 */
int queue_resize(queue * queue_ptr, size_t new_size);

问题是我读了realloc的合同,它是以下内容:

realloc函数返回指向新对象的指针(可能与指向旧对象的指针具有相同的值),如果无法分配新对象,则返回空指针。

重新分配函数返回新对象并回收旧对象是否常见?所以在这种情况下,我应该重新设计int queue_resize(queue *queue_ptr, size_t);,使queue * queue_resize(queue *queue_ptr, size_t);与相应的合同变更。

c api-design software-design memory-reallocation
2个回答
3
投票

realloc必须能够将分配的空间移动到不同的地址才能使其工作。在当前分配的内存已经被使用之后直接想象内存。没有重定位,您无法创建连续的序列。

通常,您的队列看起来像这样

typedef struct queue {
  some_type* data_member;
  size_t size;
  size_t capacity;
  // .. perhaps more
} queue;

因此,当你有一个queue_resize函数时,你可以传递一个queue*和新的大小。你传递给realloc的不是queue*,而是data_member。由于你已经有一个指向queue对象的指针,你可以更新data_member的指针,如果realloc选择更改它。

在这种情况下,不需要返回一个新的queue*对象,因为queue的内存占用量永远不会改变。你也不必通过queue**或类似的任何东西。


2
投票

以前的答案/评论不涉及如何处理数据。当Java运行时发现Array需要更大时,请考虑在Java中完成的操作。例如。您尝试将元素附加到已经完整的数组。

  • 分配一个具有所需大小的新数组;这包括设置元数据
  • 必须设置锁定,以便旧数组不会更改
  • 所有数据都从现有数据复制到新数组;包括更新元数据;请注意,两个阵列需要同时存在
  • 删除原始数组(此处不确定正确的单词。)
  • 锁被删除
  • 如果你只是指点指针,你将失去数据。
  • 您可以使用标准方法轻松复制数据,例如Add()和Remove()
© www.soinside.com 2019 - 2024. All rights reserved.