我有一个结构,定义如下:
struct vector
{
(TYPE) *items;
size_t nitems;
};
这里的"type"是任何类型,而我有一个类似的不受类型限制的结构。
struct _vector_generic
{
void *items;
size_t nitems;
};
第二种结构用于将任何类型的第一种结构传递给调整大小函数,例如像这样:
struct vector v;
vector_resize((_vector_generic*)&v, sizeof(*(v->items)), v->nitems + 1);
这里的vector_resize
尝试为向量中给定数量的项目重新分配内存。
int
vector_resize (struct _vector_generic *v, size_t item_size, size_t length)
{
void *new = realloc(v->items, item_size * length);
if (!new)
return -1;
v->items = new;
v->nitems = length;
return 0;
}
然而,C标准规定不同类型的指针不要求具有相同的大小。
6.2.5.27:
一个指向void的指针应该具有与指向字符类型的指针相同的表示和对齐要求。39)类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针应具有彼此相同的表示和对齐要求。所有指向联合类型的指针应具有彼此相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。现在我的问题是,我应该担心这段代码在某些架构上可能会出错吗?
我可以通过重新排列结构体使指针类型位于末尾来解决这个问题吗?例如:
struct vector
{
size_t nitems;
(TYPE) *items;
};
如果不行,我该怎么办?
参考我要实现的内容,请查看:
https://github.com/andy-graprof/grapes/blob/master/grapes/vector.h 例如用法,请查看:
https://github.com/andy-graprof/grapes/blob/master/tests/grapes.tests/vector.exp