Issue with dynamic array Queue data structure with void pointer
Posted
by Nazgulled
on Stack Overflow
See other posts from Stack Overflow
or by Nazgulled
Published on 2010-04-18T01:55:42Z
Indexed on
2010/04/18
2:03 UTC
Read the original article
Hit count: 752
Hi,
Maybe there's no way to solve this the way I'd like it but I don't know everything so I better ask...
I've implemented a simple Queue with a dynamic array so the user can initialize with whatever number of items it wants. I'm also trying to use a void
pointer as to allow any data type, but that's the problem.
Here's my code:
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;
}
The problem lies on the queuePop
function. When I call it, I lose the value because I free it right away. I can't seem to solve this dilemma. I want my library to be generic and modular. The user should not care about allocating and freeing memory, that's the library's job.
How can the user still get the value from queuePop
and let the library handle all memory allocs/frees?
© Stack Overflow or respective owner