我有一些somestruct_t数组我正在添加,但事先并不知道它需要多少元素。所以我malloc 5个空格开始,但我需要将它封装在另一个保存数组边界的结构中,到目前为止使用的是什么,所以我不会溢出。如果它看起来会溢出,我会重新分配。
typedef struct {
somestruct_t[] *data;
uint32_t max_size;
uint32_t used;
} something_box_t;
这是否是惯用的方式?
答案 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。