有以下内容,
struct node{
int value;
struct node *next;
};
typedef struct node Node;
typedef struct node *pNode;
Node newNode(){
Node n;
n.value = 5;
return n;
}
pNode newpNode(){
pNode pn = (pNode) malloc(sizeof(Node));
pn->value = 6;
return pn;
}
我在某处读过,如果要通过调用函数完成内存释放,我应该使用newpNode(),否则使用newNode(),但这并没有帮助我理解得足够多。
你能给我一些具体的例子,告诉我何时应该使用newNode()和newpNode()?
编辑:在newpNode()
中忘记了pn答案 0 :(得分:2)
在这个简单的例子中,没有必要使用一个而不是另一个。
调用newNode()时,调用函数时会分配内存,以存储要从调用返回的节点的大小(在调用堆栈上)。这个内存可以分配给一个变量,你可以保留它(调用堆栈中的内存将被存储到你的本地变量中):
Node n = newNode();
但是,随着Node变得越来越复杂,您将遇到问题。例如,如果您有嵌套的数据结构,那么它们将不会被复制,并且可能会在newNode()清理时被销毁。
此外,随着Node所需的内存变大(即更多字段),堆栈上将需要越来越多的内存来进行这些调用。这可能会限制诸如递归之类的事情,或仅限于一般效率。
要处理这些限制,请在newPNode()中在堆上分配内存;无论Node的大小如何,它总是返回一个指针。但是,您必须确保稍后明确清理此内存,否则将导致内存泄漏。