有几种方法可以在C中返回一堆struct(A)。
第一种方法是返回指向struct(A)的指针,并确保指向指针的指针的最后一个元素设置为NULL
,以告知有多少结构(A)。< / p>
并且,第二个是返回指向struct(B,不同于上面!)的指针,并且该结构(B)中有两个元素是n_items和指向struct(A)数组的指针。 / p>
哪种更好的方法可以在C中返回一堆结构?
哪个更常见,更快,更安全?
答案 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 **
,它有指向单独分配结构的指针(或者,每个结构都有某种方式表明它是结束)。第二个要求您定义一个短暂的结构,仅用于返回一对值,这通常使用上面的“输出”参数表示。