哪个是在C中返回一堆结构的更好方法?

时间:2015-06-21 03:07:20

标签: c pointers struct

有几种方法可以在C中返回一堆struct(A)。

第一种方法是返回指向struct(A)的指针,并确保指向指针的指针的最后一个元素设置为NULL,以告知有多少结构(A)。< / p>

并且,第二个是返回指向struct(B,不同于上面!)的指针,并且该结构(B)中有两个元素是n_items和指向struct(A)数组的指针。 / p>

哪种更好的方法可以在C中返回一堆结构?

哪个更常见,更快,更安全?

1 个答案:

答案 0 :(得分:3)

有许多方法可以返回一堆结构:

  • 使用一对输出参数:

    int get_structs(struct A **outp, size_t *outsize);
    

    其中函数将分配输出缓冲区并使用输出参数返回它(类似于B的想法,但不需要单独的结构)。这是一种非常常见的方法。

  • 使用链接列表:

    struct node {
       struct A *value;
       struct node *next;
    };
    struct node *get_struct_list();
    

    如果需要动态调整列表大小,这很方便。

  • 使用预先分配的缓冲区:

    int get_structs(struct A *outbuf, size_t *bufsize);
    

    其中调用者提供分配的缓冲区和缓冲区的大小,函数填充它并返回实际写入的结构数。这对于避免被调用者中的分配很有用(这有时非常重要,例如允许调用者分配单个缓冲区并继续重用它以避免昂贵的分配)。

您最终使用的内容取决于您的用例。如果不了解您的应用程序,就无法确定最佳策略是什么。所有这些技术都可以在实践中使用。

根据我的经验,你提到的两种技术在实践中都不太常见。第一个要求你返回一个struct A **,它有指向单独分配结构的指针(或者,每个结构都有某种方式表明它是结束)。第二个要求您定义一个短暂的结构,仅用于返回一对值,这通常使用上面的“输出”参数表示。