我在C中实现泛型堆栈,我在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);
Run Code Online (Sandbox Code Playgroud)
Stack.c
#inlcude<Stack.h>
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; i<s.logLength; i++){
freefnc((char *)s.elems+i*s->elemSize);
}
}
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--;
}
Run Code Online (Sandbox Code Playgroud)
如何返回/获取在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;
}
Run Code Online (Sandbox Code Playgroud)
注意,调用者仍然需要提供内存和地址来弹出数据; 如果你想要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;
}
Run Code Online (Sandbox Code Playgroud)
当然,这将需要调用者在free()不再需要时使用它,并增加了需要处理内存不足情况的轻微复杂性.
| 归档时间: |
|
| 查看次数: |
2878 次 |
| 最近记录: |