gpt4 book ai didi

c - 从函数返回对象的最佳方式是什么 (C)

转载 作者:行者123 更新时间:2023-12-04 19:56:28 25 4
gpt4 key购买 nike

这个问题有点主观,但似乎应该有一个标准。我正在制作一个树状数据结构,我想知道从函数传递新节点的最佳方式。我有几个想法,但我不知道哪个最安全/最有效。

这是我的代码的简化:

typedef struct Node {
struct Node *left;
struct Node *right;
int value;
} Node;

int f() {
//do stuff
}

Node *new_node() {
Node n = {NULL, NULL, f()};
return &n;
}

int main() {
Node a = {new_node(), new_node(), 0};
}

显然,这是行不通的,因为 new_node() 函数返回的指针指向堆栈分配的数据,这些数据将在 new_node() 结束。但解决这个问题的最佳方法是什么?

一种可能是在堆上分配n,像这样:

Node *new_node() {
Node *n = (Node *) malloc(sizeof(Node)); //unsure if the cast is necessary here, but that's not relevant
n->left = NULL;
n->right = NULL;
n->value = f();
return n;
}

但这感觉不太对劲,因为它要求调用函数直接处理内存清理,这可能会很快变得困惑。

我见过的另一种选择(尤其是当对象是数组或缓冲区,而不是对象时)是将指针传递给函数,然后只修改指针的内容。

void new_node(Node *n) {
n->left = NULL;
n->right = NULL;
n->value = f();
}

int main() {
Node n = {NULL, NULL, 0};
Node n1 = n;
new_node(&n);
new_node(&n1);
Node a = {&n, &n1, 0};
}

或者您可以直接传递数据,特别是因为 Node 在这种情况下非常小:

 Node new_node() {
Node n = {NULL, NULL, f()}
return n;
}

虽然我不确定,但这似乎会更慢。

关于这个主题已经有一些答案,但它们是用 C++ 编写的,并且处理引用和指针,恐怕我真的不明白它们之间的区别。

执行此操作的标准方法是什么?

(抱歉,如果这太长了)

最佳答案

您涵盖了所有四种可用方法,包括一种不起作用的方法。在它们之间进行选择取决于您的设计偏好:

  • 您正确地注意到第一种方法是错误的
  • 第二种方法适用于您创建的对象无法静态分配的情况,例如,因为直到运行时您才知道需要多少对象
  • 第三种方法适用于初始化静态分配的对象,因为它不需要复制,并且可以避免手动资源管理
  • 最后一种方法不太常见,因为希望避免复制。这几乎普遍相当于过早优化,因此这种方法也完全有效。

关于c - 从函数返回对象的最佳方式是什么 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922991/

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