我的堆栈实现有什么问题?

时间:2012-02-15 04:00:02

标签: c stack

我在C中创建了一个Stack的实现。以下是相关的定义/方法,我已经删除了所有的错误检查/重新分配,所以不要评论:

typedef struct {
    Element *data;
    int top;
    int size;
} Stack;

typedef void* Element;

void push(Stack *s, Element e) {
    s->data[(s->top)++] = e;
}

现在在另一种方法中,我有一个循环,我在其中调用push()。像

这样的东西
int character;
Stack *s = createStack();
while((character = getchar()) != EOF) {
    int tmp = character;
    push(s, &tmp);  
}

但是,这并不是我想要的。堆栈每次都接收相同的地址,因此当读取每个字符时,整个堆栈的“内容”改变。如何修改它以执行我想要的操作。例如,当读取abcde时,堆栈看起来像(自上而下)e,d,c,b,a

2 个答案:

答案 0 :(得分:3)

int tmp = character;
push(s, &tmp);

在那里,您将局部变量tmp的地址传递给函数push,该函数将指针存储在自身中。每次迭代循环时,变量都会被销毁,并且会产生另一个局部变量(很可能是在旧变量之上),所以你要存储指向被破坏变量的指针。

如果您希望堆栈是通用的并与void*一起使用,则必须确保存储的对象的生命周期长于堆栈的生命周期。一种方法是在堆上分配变量:

char* c = malloc(sizeof(char)); // or malloc(1) but sizeof is there in case you
                                // change the type later
*c = character;
push(s, c);

然后在堆栈不再使用后解除分配每个堆栈,这样就不会出现内存泄漏。

答案 1 :(得分:0)

作为上述答案的补遗:

您可以简单地将int值转换为指针:

push(s, (int *) tmp);