2015-06-21 57 views
2

有几种方法可以返回C中的一堆结构(A)。哪个更好的方式返回C中的一堆结构?

第一种方法是将指针返回到指向struct(A)的指针,并确保指向指针的指针的最后一个元素是设置为NULL来告诉有多少结构(A)在那里。第二个是返回指向struct(B,与上面不同)的指针,并且该结构(B)中有两个元素是n_items和一个指向struct(A)的数组的指针。

哪个更好的方式返回C中的一堆结构?

或者哪一种比另一种更普遍,更快,更安全?

+0

所以,基本上你问的是链表或数组是否更好的数据结构?好吧,两者都有自己的位置,但广义而言,连续阵列通常更快。 – 5gon12eder

+0

@ 5gon12eder实际上并不是一个链表。它更类似于[这张图片](http://i.stack.imgur.com/BJ23N.gif)。 –

+0

我明白了。这种间接数组(指向对象的指针数组)增加了一个额外的间接层,额外的开销和额外的复杂性。如果你不需要它,你可能不应该使用它。 – 5gon12eder

回答

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 **,它有指向单独分配结构的指针(或者,每个结构都有一些方法来指示它是结束的)。第二个要求你定义一个只用于返回一对值的临时结构,这更常用上面的“输出”参数表示。

+0

你的意思是'size_t bufsize'? –

+2

没有。这是一个“输入/输出”参数 - 这允许您发送缓冲区的大小,并在返回时获取修改后的缓冲区的大小。该函数的返回值可用于指示错误。例如,请参阅POSIX的'recvfrom'函数,以获取此类API的示例。 – nneonneo