【问题标题】:Why are all elements replaced in stack after new one added?为什么添加新元素后堆栈中的所有元素都被替换?
【发布时间】:2014-03-04 12:55:23
【问题描述】:

C 中的简单堆栈实现:

struct Stack {
  char* data;
  Stack* prev;
};

void push(char* data, Stack** stack) {
  Stack* node = (Stack*)malloc(sizeof(Stack));
  node->data = data;
  node->prev = *stack;
  *stack = node;
}

int main() {
  Stack* top = NULL;
  push("1", &top);
  push("2", &top);
  push("3", &top);
}

然后top->prev->prev->data 结果为3top->prev->datatop->data 相同。

谁能解释一下原因?

【问题讨论】:

  • @unwind:很可能 kassie 正在使用 c++ 编译器来编译这段代码。否则会出现许多其他错误。
  • 你传递给push的缓冲区(指针)可能相同。我认为有必要通过保护新区域来复制内容。

标签: c pointers data-structures stack


【解决方案1】:

所以,它似乎工作正常。

#include <stdlib.h>
#include <stdio.h>

struct Stack {
    char* data;
    struct Stack* prev;
};

void push(char *data, struct Stack** stack) {
    struct Stack* node = malloc(sizeof(struct Stack));
    node->data = data;
    node->prev = *stack;
    *stack = node;
}

int main() {
    struct Stack* top = NULL;
    push("1", &top);
    push("2", &top);
    push("3", &top);

    printf("top->data: %s\n", top->data);
    printf("top->prev->data: %s\n", top->prev->data);
    printf("top->prev->prev->data: %s\n", top->prev->prev->data);
}

输出是:

top->data: 3
top->prev->data: 2
top->prev->prev->data: 1

【讨论】:

  • 是的,一定要在新的struct-type 之前加上这个关键字。您可以通过 typedef struct MY_STRUCT { ... } MY_STRUCT; 来避免这种情况
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 2021-05-02
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多