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**
или что-либо в этом роде.