【问题标题】:return an array of structs or an array of struct pointers?返回结构数组还是结构指针数组?
【发布时间】:2013-08-02 06:51:25
【问题描述】:

如果您需要从函数返回 struct,通常会返回指向 struct 的指针。

如果你想返回一个结构数组,是否建议:

  1. 返回结构数组(指向第一个元素的指针)
  2. 还是返回一个结构指针数组?

我已经为下面的两个选项画了一个图表:

1:

2:

给定以下结构定义

struct values {
    int a;
    int b;
};

这里是一些示例代码,用于从两个选项访问结构的字段:

选项#1:

 struct values *vals = get_values1();
 printf("%d, %d\n", values[0].a, values[1].b);

选项 #2:

 struct values **vals = get_values2();
 printf("%d, %d\n", values[0]->a, values[1]->b);

【问题讨论】:

  • @GrijeshChauhan 什么是最好的?我选择哪个重要吗?
  • 我看到不使用版本 1 的唯一问题是,在第二个版本中可能更容易识别结构的数量,因为 NULL 指针可以用作停止元素,而在第一个版本中,可能无法定义此停止值。
  • @alk,是的,你是对的 :)

标签: c arrays pointers struct


【解决方案1】:

作为 C 初学者书籍的示例,选项 1(无间接)显然会更好地满足问题,正如迄今为止的答案所指出的那样。 但是,如果还有更多问题(例如,这是在大型框架中传递结构的最佳方式),那么我当然会选择选项 2。为什么?结构是复杂的数据单元,往往成为独立的实体,它们以不同的方式分配、传递和处置——如果数据处理变得更加复杂,所有通过直接访问处理它们的代码都需要重写。

【讨论】:

    【解决方案2】:

    对我来说,随着间接次数的增加,代码的复杂性增长得更快。因此,我更喜欢您的选项 #1:struct values *foo()

    如果数据需求推向#2:struct values **foo(),建议创建一个新类型typedef struct values *ValuesSet 并返回一个指向该类型的指针:ValuesSet *foo()

    【讨论】:

      【解决方案3】:

      我看到不使用版本 1 的唯一问题是,在第二个版本中识别结构的数量(返回)可能更容易,因为 NULL 指针可以用作停止元素,而在第一个版本可能无法定义停止元素。

      【讨论】:

        【解决方案4】:

        除非您有充分的理由返回指向指针的指针(例如,如果您想稍后修改指针本身),我认为指向结构的指针就足够了。无需使用双指针来欺骗。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-25
          • 2014-12-30
          • 1970-01-01
          相关资源
          最近更新 更多