【发布时间】:2015-04-27 23:17:56
【问题描述】:
我有一个结构,定义如下:
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 尝试将realloc 内存用于向量中给定数量的项目。
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
【问题讨论】:
-
@Joey 的解释和引用来自这个答案:stackoverflow.com/a/1241314/885605
-
我相信你可能会想到 apples 和 oranges。对
pointer size的引用意味着在某些架构上指针的大小 可能不同(例如4-bit与8-bit等)。这与指针所指向的无关。我可能不完全理解你问题的症结所在,但这就是问题所在,你可能会侧身考虑。 -
@DavidC.Rankin 我确实在考虑实际指针的大小,而不是它指向的大小。我的问题是,如果 (TYPE*) 的大小不等于 (void*) 的大小,那么我的代码将会中断。
-
那么我很抱歉,并且必须承认难以设想无法将 (TYPE*) 的指针转换为 (void*) 以提供更有效的评论的情况。从指针大小的角度来看,我看到的唯一问题是一些愚蠢的寻址方案,其中较小的指针大小会阻止在不同硬件上寻址目标(例如,一些手动内存管理器等)。抱歉打扰了。
-
@DavidC.Rankin 是的,直接转换指针会起作用,但我将指针转换为包含指针的结构,其中结构不兼容。但是您的评论非常有效,也许我应该直接转换成员而不是使用通用中间结构。
标签: c pointers struct casting size