gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:57:56 26 4
gpt4 key购买 nike

我在 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 .

最佳答案

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);

然后在不再使用堆栈后释放每个堆栈,这样您就不会出现内存泄漏。

关于c - 我的堆栈实现有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9287679/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com