gpt4 book ai didi

c - 使用函数调用来实现堆栈

转载 作者:行者123 更新时间:2023-11-30 15:38:05 25 4
gpt4 key购买 nike

我对 C 的这一部分有点不清楚,因为它有点不像我使用过的其他语言,但这可能只是一个愚蠢的问题。我正在尝试实现一个堆栈。我有节点结构,它有我想要传递的信息:

struct position{
int square[2];
int counter;
struct position *prev;
};

因此,在 main 中,我声明并初始化堆栈的底部节点,将 *prev 设置为 NULL,然后声明其余部分。我的问题是,当我尝试将其传递给函数 pop 时会发生什么?我可以创建一个指向此对象的 position 对象并返回该对象,但是当函数关闭时它会被从堆栈中推出吗?或者我应该返回 position 并将其设置为等于 main 中的新 position 对象?如果我决定在函数中创建多个这样的节点怎么办?功能关闭后它们还会保留吗?

编辑:mah 让我想起了我的后续问题,即如果它们不存在于函数之外,我是否应该使用 malloc 为它们在内存中创建空间?

最佳答案

对象的生命周期取决于它们的创建位置;例如,如果您在代码块中声明一个结构(其中 block 是 { 及其匹配的 } 内的所有内容),则一旦执行离开该 block ,该结构就不再有效。仅当该结构有效时,指向该结构的指针才有效。

对于您所描述的内容,您希望使用 malloc() 动态分配结构。或类似的功能。动态分配的数据将保持有效(假设您不覆盖它),直到您 free()内存,或者直到程序终止。指向这些内存区域的指针将在同一时间段内保持有效。

考虑:

static struct position *topOfStack = NULL;

void push(struct position *node)
{
node->prev = topOfStack;
topOfStack = node;
}

struct position *pop()
{
struct position *popped = topOfStack;
if (topOfStack) topOfStack = topOfStack->pref;
return popped;
}

要使用它,您可以:

f() {
struct position *node = malloc(sizeof(*node));
/* ... fill in node details ... */
push(node);
}

请注意,我动态分配了节点。如果我刚刚声明了 struct position node; ,我可以合法地调用 push(&node);但是一旦我的函数离开作用域,堆栈中就会有一个无效的项目(这可能会造成严重破坏)。

关于c - 使用函数调用来实现堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942628/

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