gpt4 book ai didi

c - 带有空指针的动态数组队列数据结构问题

转载 作者:行者123 更新时间:2023-12-05 01:24:22 27 4
gpt4 key购买 nike

也许没有办法按照我喜欢的方式解决这个问题,但我不知道一切,所以我最好问...

我已经实现了一个带有动态数组的简单队列,因此用户可以根据需要使用任意数量的项目进行初始化。我还尝试使用 void 指针来允许任何数据类型,但这就是问题所在。

这是我的代码:

typedef void * QueueValue;

typedef struct sQueueItem {
QueueValue value;
} QueueItem;

typedef struct sQueue {
QueueItem *items;

int first;
int last;
int size;
int count;
} Queue;

void queueInitialize(Queue **queue, size_t size) {
*queue = xmalloc(sizeof(Queue));

QueueItem *items = xmalloc(sizeof(QueueItem) * size);

(*queue)->items = items;
(*queue)->first = 0;
(*queue)->last = 0;
(*queue)->size = size;
(*queue)->count = 0;
}

Bool queuePush(Queue * const queue, QueueValue value, size_t val_sz) {
if(isNull(queue) || isFull(queue)) return FALSE;

queue->items[queue->last].value = xmalloc(val_sz);
memcpy(queue->items[queue->last].value, value, val_sz);

queue->last = (queue->last+1) % queue->size;
queue->count += 1;

return TRUE;
}

Bool queuePop(Queue * const queue, QueueValue *value) {
if(isEmpty(queue)) return FALSE;

*value = queue->items[queue->first].value;

free(queue->items[queue->first].value);

queue->first = (queue->first+1) % queue->size;
queue->count -= 1;

return TRUE;
}

问题出在queuePop函数上。当我调用它时,我失去了值(value),因为我立即释放了它。我似乎无法解决这个难题。我希望我的库是通用的和模块化的。用户不应该关心分配和释放内存,那是图书馆的工作。

用户如何仍然从 queuePop 中获取值并让库处理所有内存分配/释放?

最佳答案

您的 queuePop() 函数需要以与 queuePush() 相同的方式工作 - 获取位置的大小和 memcpy()

Bool queuePop(Queue * const queue, QueueValue value, size_t val_sz)
{
if (isEmpty(queue)) return FALSE;

memcpy(value, queue->items[queue->first].value, val_sz);

free(queue->items[queue->first].value);

queue->first = (queue->first+1) % queue->size;
queue->count -= 1;

return TRUE;
}

关于c - 带有空指针的动态数组队列数据结构问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2660802/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com