2

我有一个要添加的 somestruct_t 数组,但事先不知道它需要多少元素。所以我首先分配了 5 个空间槽,但我需要将它封装在另一个结构中,以保存数组边界和到目前为止使用的内容,这样我就不会溢出。如果它看起来会溢出,我会重新分配。

typedef struct {
  somestruct_t[] *data;
  uint32_t max_size;
  uint32_t used;
} something_box_t;

这是惯用的方法吗?

4

2 回答 2

2

您可以看到这通常由链表完成(在 C 中,例如在内核模式 Windows 驱动程序中),这是一个如何实现您自己的示例。

C++ 为您提供模板以使列表更加灵活。

C++ 还为您提供 stl 容器(如std::vector),但bames53 已经建议使用.

于 2012-10-11T20:04:45.423 回答
2

有时在 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 编写的解决方案更可靠。

于 2012-10-11T20:00:16.927 回答