我在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
。
答案 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);