2015-06-21 58 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