0

具有以下内容,

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

4

1 回答 1

2

在这个简单的示例中,没有强烈需要使用其中一个。

当您调用 newNode() 时,会在调用该函数时分配内存以存储要从调用返回的节点的大小(在调用堆栈上)。这个内存可以分配给一个变量,你可以保留它(调用堆栈上的内存将被 memcpy 存储到你的本地变量中):

Node n = newNode();

但是,随着节点变得越来越复杂,您会遇到问题。例如,如果您有嵌套的数据结构,这些数据结构不会被复制,并且可能会在 newNode() 清理时被销毁。

此外,随着 Node 所需的内存变大(即更多字段),堆栈上的内存将越来越多来进行这些调用。这可以限制诸如递归之类的事情,或者只是一般的效率。

为了解决这些限制,您在 newPNode() 中分配堆上的内存;无论 Node 的大小如何,这总是返回一个指针。但是,您必须确保稍后明确清理此内存,否则您将发生内存泄漏。

于 2013-05-07T03:55:36.587 回答