C:将信息从函数传递到调用例程的最佳实践

时间:2011-12-15 17:09:05

标签: c

哪个是在函数中创建的返回信息的首选方式?

A)

create_b_from_a(... a, struct b *my_b) { ... }

int main() {
  struct b my_b;
  ... define and create a ...
  create_b_from_a(a, &my_b);
  ... work on b ...
}

B)

struct st *create_b_from_a(... a)
{
  struct st *my_b = malloc(sizeof *my_b);
  ...
}

int main()
{
  struct b *my_b = create_b_from_a(a);
  ... work on b ...
  free(b);
}

我想我记得像'尽可能避免malloc',但另一方面B看起来更现代。也许我不了解其中一种方法的优点/缺点?

2 个答案:

答案 0 :(得分:4)

不要忘记结构是值,所以你不仅限于这两个。你也可以这样做:

struct b create_b_from_a(struct a an_a)
{
  struct b new_b;

  new_b.field = value; /* and so on ... */

  return new_b;
}

这也可以使代码更清晰,因为它更直接,而不是在(微)管理上花费那么多代码。

当然,如果编译器决定在目标体系结构上实际传递堆栈上的结构是非常低效的,那么存在针对此模式的优化。

答案 1 :(得分:0)

无论哪种方式都是可以接受的,事实上我已经在我自己的时间使用了这两种方式。我相信有些人会有各种理由得到更多证实,但IMO既有时间又有地方,部分取决于周围的代码等。如果b通常是本地的,那么第一种形式可能更有意义,因为你无论如何都不需要动态记忆。