stack.h
typedef struct{
void * elems;
int elemSize;
int logicLen;
int allocLen;
}stack;
stack.c
#include <stdio.h>
#include "stack.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
void stackNew(stack * s,int elemSize){
s->logicLen = 0;
s->allocLen = 4;
s->elemSize = elemSize;
s->elems = malloc(s->allocLen * s->elemSize);
assert(s->elems != NULL);
}
void stackDispose(stack * s){
free(s->elems);
}
static void stackGrow(stack * s){
s->allocLen *= 2;
s->elems = realloc(s->elems,s->allocLen * s->elemSize);
}
void stackPush(stack * s,void *elemAddr){
if (s->logicLen == s->allocLen){
stackGrow(s);
assert(s->elems != NULL);
}
memcpy((char *)(s->elems) + s->logicLen * s->elemSize,elemAddr,s->elemSize);
s->logicLen ++;
}
void stackPop(stack * s,void * elemAddr){
assert(s->logicLen != 0);
s->logicLen --;
memcpy(elemAddr,(char *)s->elems + s->logicLen * s->elemSize,s->elemSize);
}
stack_example.c
#include <stdio.h>
#include "stack.c"
int main(void){
int i;
char * value;
stack s;
char * strings[5] = {"qwerty","asdfgh","zxcvbn","qazwsxedc","tgbyhnujm"};
stackNew(&s,sizeof(char *));
for(i=0;i<5;i++){
stackPush(&s,&(strings[i]));
}
for(i=0;i<5;i++){
stackPop(&s,&value);
printf("%s\n",value);
}
printf("%d",sizeof(long));
getchar();
return 0;
}