我目前正在尝试为队列数据结构设计公共API,并调整大小函数以更改其大小。我的初衷是通过以下方式做到这一点:
react, redux
问题是我读了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);
进行相应的合同更改。
答案 0 :(得分: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**
或类似的任何内容。
答案 1 :(得分:2)
先前的答案/评论未解决如何处理数据。考虑当Java运行时发现Array需要更大时,用Java做什么。例如。您尝试将元素追加到已经完整的数组中。