我有一些以 void *buffer
开头的结构体,接下来的成员可以是不同的类型:
struct A {
void *buffer;
type_x *x;
type_y *y;
};
struct B {
void *buffer;
type_w *w;
type_y *y;
type_z *z;
};
struct A
的缓冲区将存储n个type_x
类型的元素,后跟n个type_y
类型的元素。另外两个成员type_x *x
和type_y *y
将分别指向这些数组。struct B
同理。
我目前正在做的事情类似于:
void allocate(struct B **b, unsigned int n) {
(*b)->buffer = calloc(n * (sizeof(type_w) + sizeof(type_y) + sizeof(type_z));
(*b)->w = (type_w *) (*b)->buffer;
(*b)->y = (type_y *) ((*b)->w + n);
(*b)->z = (type_z *) ((*b)->y + n);
}
有没有办法创建一个函数来实现这个功能?该函数应接收指向这些结构体之一的指针(void *s
)和一个整数作为参数,如下所示:
void allocate(void *s, unsigned int n) {
// MAGIC
}
我考虑过的其他选项:
创建
void allocate(void *buffer, int n, ...)
,并将其指针给予结构体的指针。但问题在于,我必须给它void *指针,因此我还必须给出每种类型的大小。创建
void *create_struct(StructType type)
(其中StructType是一个枚举),但我仍然需要编写每个结构体的情况,并且我希望能够定义新的结构体而不必编写额外的代码。
我试图这样做是因为我将有许多结构体,因为allocate函数对于每个结构体基本上都执行相同的操作,所以我认为可能有一种“更清洁”的方法来完成它。
另外,我知道我可以直接删除缓冲区并直接为所有成员分配内存,但我想以这种方式进行,以便数据存储连续。
#define alloc(ptr) __alloc((ptr), sizeof((ptr)))
? - user1551592n = 3
,type_w = char
和type_y = double
) - Bryan Chentypeof
GCC扩展这样的编译器扩展,它可以实现一些神奇的事情,比如Linux内核的container_of
宏。否则,你需要处理单独的初始化函数,并且仍然需要将大小传递给函数以及n
和初始化函数本身。 - user539810