结构数组的典型模式?

时间:2012-10-11 19:58:25

标签: c

我有一些somestruct_t数组我正在添加,但事先并不知道它需要多少元素。所以我malloc 5个空格开始,但我需要将它封装在另一个保存数组边界的结构中,到目前为止使用的是什么,所以我不会溢出。如果它看起来会溢出,我会重新分配。

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

这是否是惯用的方式?

2 个答案:

答案 0 :(得分: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中写的更可靠。

答案 1 :(得分:2)

您可以通过linked list(在C中,例如在内核模式Windows驱动程序中)看到这一点,这里是example如何实现自己的。

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

C ++还为您提供了stl容器(如std::vector)但bames53 already suggested that one