有以下几点,

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

最佳答案

在这个简单的例子中,没有强烈的需要使用一个超过另一个。
当调用newNode()时,在调用函数以存储要从调用返回的节点大小(在调用堆栈上)时分配内存。这个内存可以分配给一个变量,您可以保留它(调用堆栈上的内存将存储在您的本地变量中):

Node n = newNode();

但是,当节点变得更复杂时,您将遇到问题。例如,如果您有嵌套的数据结构,这些数据结构将不会被复制,并可能在newNode()清理时被销毁。
此外,随着节点所需的内存越来越大(即字段越来越多),在堆栈上进行这些调用将需要越来越多的内存。这可能会限制递归之类的事情,或者仅仅限制一般的效率。
为了处理这些限制,您可以在newPNode()中在堆上分配内存;无论节点的大小,这都会返回一个指针。但是,您必须确保稍后显式清理此内存,否则将发生内存泄漏。

关于c - 在C中返回指针或引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16410704/

10-12 15:04