gpt4 book ai didi

c - 在 C 中返回指针或引用

转载 作者:太空宇宙 更新时间:2023-11-04 08:57:02 25 4
gpt4 key购买 nike

有以下内容,

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

Node n = newNode();

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com