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