【问题标题】:Returning a pointer or a reference in C在 C 中返回指针或引用
【发布时间】:2013-04-30 21:56:38
【问题描述】:

有以下,

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

【问题讨论】:

  • 您不需要在 C 程序中强制转换 malloc 的返回类型。

标签: c pointers reference return


【解决方案1】:

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

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

Node n = newNode();

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

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

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

【讨论】:

  • 例如,如果您有嵌套的数据结构,这些数据结构将不会被复制,并且可能会在 newNode() 清理时被销毁。 这很清楚。所以这就是为什么你总是使用指向下一个节点的指针,而不是一个实际的节点,对吧?因为创建新节点并将其分配到最后一个位置的函数也可能会破坏它?编辑:参考->实际节点
  • 这里的每个人都对你为什么一直使用“参考”这个词感到困惑。 C 没有引用。 C具有实际的数据结构和指针。你在链表中使用指针的原因是你不知道它会有多长,所以你不能为它预先分配空间(如果你这样做了,那实际上只是一个数组)。
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2012-10-24
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多