我目前正在尝试为队列数据结构设计公共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);
与相应的合同变更。
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**
或类似的任何东西。
以前的答案/评论不涉及如何处理数据。当Java运行时发现Array需要更大时,请考虑在Java中完成的操作。例如。您尝试将元素附加到已经完整的数组。