【问题标题】:Simple stack, pop简单堆栈,弹出
【发布时间】:2014-04-10 22:54:09
【问题描述】:

我一直在寻找 C 中的简单堆栈实现,并找到了类似的东西:

void pop(struct stack **top)
{
   struct stack *temp;
   temp = malloc(sizeof(struct stack));
   if(*top != NULL)
   {
       printf("%d popped.\n",(*top)->data);
       temp = (*top);
       (*top) = (*top)->prev;
       free(temp);
   }
   else
       printf("Stack is empty.\n");
}

可能这是新手问题,但我不确定我通过 free(temp) 释放了什么。 似乎首先我将当前顶部分配给临时,然后将顶部更改为顶部->下一个(弹出上一个顶部),然后删除临时。那么使用 temp 有什么意义呢?

还是写错了?

【问题讨论】:

  • 我的 C 生锈了,但这段代码似乎在泄露内存。你在哪里找到的?
  • mallocfree 在这里是不必要的(并且泄漏的)。 temp 应该是一个局部变量。
  • @ooga 很确定free() 应该保留,它应该删除您刚刚弹出的堆栈的头部。 temp 是完全冗余和泄漏的。
  • @amit,对,我现在明白了。

标签: c stack


【解决方案1】:

之所以使用temp是因为你需要移除栈顶(你刚刚弹出),但你还想修改栈顶为后面的元素。

为此,您需要将旧顶部存储在某处,更改顶部,然后移除最后一个顶部。

malloc() 是多余的并且会泄漏内存,你什么都不做,你绑定它到temp,但是在使用这个变量之前,你重新绑定一个不同的地址。 p>

根据经验,应该提示您有问题 - 为什么在删除时需要动态分配?虽然并不总是错误的,但它确实暗示了调查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2014-02-14
    • 2018-04-12
    • 2023-03-14
    • 2019-08-08
    • 2012-10-14
    相关资源
    最近更新 更多