C中的通用堆栈

我在C中实现generics堆栈,我在stackPop方法中遇到问题。 我的结构如下:

“Stack.h”文件

typedef struct{ void *elems; int elemSize; int allocLength; int logLength; void (*freefnc)(void *); } Stack; void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)); void stackDispose(Stack *s); void stackPush(Stack *s, void *elemAddr); void stackPop(Stack *s, void *target); 

Stack.c

  #inlcude void stackNew(Stack *s, int elemSize, void (*freefnc)(void *)){ s.allocLength = 4; s.logLength = 0; s.elemSize = elemSize; s.elems = malloc(4*elemSize); s.freefnc = freefnc; } void stackDispose(Stack *s){ if(s.freefnc!=NULL){ for(int i=0; ielemSize); } } free(s.elems); } void Stringfree(void *elem){ free(*(char**)elem); } void stackPush(Stack *s, void *elemAddr){ if(s.alloclength == s.logLength){ stackGrow(s); } void *target = (char *)s.elems + s.logLength*s.elemSize; memcpy(target,elemAddr,s.elemSize); s.logLength++; } static void stackGrow(Stack *s){ s.allocLength*=2; s.elems = realloc(s.elems, s.alloclength*s.elemSize); assert(s.elems!=NULL); } void stackPop(Stack *s, void *elemAddr){ void *source = (char *)s.elems + (s.logLength-1)*s.elemSize; memcpy(elemAddr,source,s.elemSize); s.logLength--; } 

如何返回/获取在stackPop函数中弹出的值? 我不想改变实现,但是如果有一种很好的方法可以尽可能地保持实现的相同,那么我会很感激。 其他方法也是可以接受的。

我认为你能做的最好的事情就是返回一个指向弹出数据的指针(作为一个void*因为这是你在C中为’通用’函数做的最好的事情):

 void* stackPop(Stack *s, void *elemAddr){ void *source = (char *)s.elems + (s.logLength-1)*s.elemSize; memcpy(elemAddr,source,s.elemSize); s.logLength--; return elemAddr; } 

注意,调用者仍然需要提供内存和地址来弹出数据; 如果你想要ed你可以通过使用函数malloc()内存来避免这种情况:

 void* stackPop(Stack *s){ void *source = (char *)s.elems + (s.logLength-1)*s.elemSize; void *elemAddr = malloc(s.elemSize); // if (!elemAddr) handle_error(); memcpy(elemAddr,source,s.elemSize); s.logLength--; return elemAddr; } 

当然,这将需要调用者在不再需要时free()它,并添加需要处理内存不足情况的次要复杂性。