返回结构数组或结构指针数组?

时间:2013-08-01 11:15:14

标签: c arrays pointers struct

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

如果您想返回结构数组,建议:

  1. 返回一个结构数组(指向第一个元素的指针)
  2. 或返回一个struct指针数组?
  3. 我已经为下面两个选项绘制了一个图表:

    1:

    enter image description here

    2:

    enter image description here

    给出以下结构定义

    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);
    

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

答案 2 :(得分:1)

作为关于C的初学者书籍的一个例子,到目前为止答案中指出的选项1(无间接)显然会更好地满足该问题。 如果问题还有更多(例如哪个是在大型框架中传递结构的最佳方法)那么我肯定会选择选项2.为什么?结构是复杂的数据单元,往往成为独立的实体,它们被分配和传递并以不同的方式处理 - 如果数据处理变得更加复杂,那么通过直接访问处理它们的所有代码都需要重写。

答案 3 :(得分:0)

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

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