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

标签 c struct

我对 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/

相关文章:

c - 为什么 GNU 补丁无法解决这个差异?

java - 如何通过网络发送更少的比特数

c - 适用于 Windows 的样例 Splint 选项文件

c++ - MPI派生的数据类型问题是由结构填充和无阻塞通信缓冲区的问题引起的

c++ - std::map 如何/在哪里初始化其成员?

c++ - 这段代码不是线程安全的,不是吗?

c - 涉及结构体和数组的段错误,但不分开

c++ - 隐式调用的结构析构函数 - 我的语法有误吗?

c++ - 将 C++ 代码转换为 C、结构数组

c - 熟悉指针吗?