我有一个要添加的 somestruct_t 数组,但事先不知道它需要多少元素。所以我首先分配了 5 个空间槽,但我需要将它封装在另一个结构中,以保存数组边界和到目前为止使用的内容,这样我就不会溢出。如果它看起来会溢出,我会重新分配。
typedef struct {
somestruct_t[] *data;
uint32_t max_size;
uint32_t used;
} something_box_t;
这是惯用的方法吗?
我有一个要添加的 somestruct_t 数组,但事先不知道它需要多少元素。所以我首先分配了 5 个空间槽,但我需要将它封装在另一个结构中,以保存数组边界和到目前为止使用的内容,这样我就不会溢出。如果它看起来会溢出,我会重新分配。
typedef struct {
somestruct_t[] *data;
uint32_t max_size;
uint32_t used;
} something_box_t;
这是惯用的方法吗?
您可以看到这通常由链表完成(在 C 中,例如在内核模式 Windows 驱动程序中),这是一个如何实现您自己的示例。
C++ 为您提供模板以使列表更加灵活。
C++ 还为您提供 stl 容器(如std::vector
),但bames53 已经建议使用.
有时在 C 中完成的一件事是在结构的末尾使用零长度数组,并为可变数量的元素分配额外的空间。我不确定零长度数组在 C 中是否合法(它们不在 C++ 中),但它通常受到支持。
struct something_box_t {
uint32_t max_size;
uint32_t used;
somestruct_t data[];
};
something_box_t *box = malloc(sizeof(something_box_t) + N*sizeof(somestruct_t));
box.max_size = N;
box.used = 0;
box.data[0] = ...;
box.data[1] = ...;
当然,如果您可以切换到 C++,您就不必自己拼凑解决方案。你可以做std::vector<somestruct_t> box;
一个更容易使用的解决方案,即使不是更高性能,也更可靠,比你可能用 C 编写的解决方案更可靠。