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: 849
        
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