【发布时间】:2014-02-21 18:42:00
【问题描述】:
我对 C 的这一部分有点不清楚,因为它有点不像我用过的其他语言,但这可能只是一个愚蠢的问题。我正在尝试实现一个堆栈。我有节点结构,它有我想要传递的信息:
struct position{
int square[2];
int counter;
struct position *prev;
};
所以在main中,我声明并初始化栈底节点,将*prev设置为NULL,然后声明其余部分。我的问题是,当我尝试将它传递给函数pop 时会发生什么?我可以创建一个指向该对象的position 对象并返回它,但是当函数关闭时它会被推离堆栈吗?或者我应该返回 position 并将其设置为等于 main 中的新 position 对象?如果我决定在一个函数中创建几个这样的节点怎么办?功能关闭后它们会保留吗?
编辑:mah 让我想起了我的后续问题,如果它们不存在于函数之外,我应该使用 malloc 为它们在内存中创建空间吗?
【问题讨论】:
-
首先,您没有设置
*prev(读取为prev地址处的值),但您确实将prev设置为NULL,即struct position*类型。这是语法细节,但将*运算符和foo*类型混合使用是一个非常常见的初学者错误。 -
@JFA 回复:您的后续行动...大括号 (
{}) 不仅定义代码块,正如您在结构定义中看到的那样。您的元素(square、counter、prev)不需要进行 malloc,只需要对struct position进行 malloc。它将包含所有元素。 -
@mah 我可能打错了一些东西,使问题产生了误导。我编辑了编辑。
-
@JFA 你要去的地方真的是“可以让它工作”和“这是一个好主意”之间的一条细线。在适当的情况下(这意味着它取决于您编写的确切代码),您可以使其在使用和不使用 malloc 的情况下工作,但是如果您采用 no-malloc 方法,您将很容易破坏某些东西。这种捷径最初可能会奏效,但后来细微的代码更改可能会产生令人惊讶的不良影响。使用指向 malloc 对象的指针可以最大限度地减少这种风险。
-
这不是一个真正的范围问题,而更多的是你想如何使用你的堆栈的问题。要使其动态化,您需要使用
malloc()s。