我对C的这一部分不清楚,因为它与我使用的其他语言有点不同,但这可能只是一个愚蠢的问题。我正在尝试实现一个堆栈。我有节点结构,它具有我要传递的信息:
struct position{
int square[2];
int counter;
struct position *prev;
};
所以在main中,我声明并初始化堆栈的底部节点,将其设置*prev
为NULL
,然后声明其余部分。我的问题是,当我尝试将其传递给函数时会发生什么pop
?我可以创建一个position
指向该对象并返回该对象的对象,但是当函数关闭时,该对象是否会从堆栈中移出?还是应该返回mainposition
并将其设置为等于新position
对象?如果我决定在一个函数中创建几个这样的节点怎么办?函数关闭后它们是否仍会保留?
编辑:可能让我想起了我的后续问题,即如果函数外部不存在它们,是否应该使用malloc为它们在内存中创建空间?
对象的生存期取决于创建对象的位置。例如,如果您在代码块中声明一个结构(其中一个块是内部的所有内容{
及其匹配项}
),则该执行一旦离开该块,该结构便不再有效。只要该结构有效,指向该结构的指针就有效。
对于您要描述的内容,您想使用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);
}
注意,我是动态分配节点的。如果我刚刚声明了a struct position node;
,我可以合法地调用,push(&node);
但是一旦我的函数离开范围,堆栈中就会有一个无效的项目(这可能会造成破坏)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句