需要实现一个具有一些参数的api;它具有输入的类型(const void *),输出的类型(void **); api希望为输入分配一些偏移量;例如,
void getOffset(const void* a, void** b)
{
int offset = getsomeoffset();
*b = a + offset;
}
这会在编译器中引起一些抱怨。编写此代码的正确方法是什么?输入的类型可以是float,int,double。
答案 0 :(得分:4)
您不能在void *
指针上应用指针算术。指向的目标没有任何类型,因此没有可用于计算偏移量的大小。
因此,您需要在应用偏移量之前先投射指针:
*b = ((char *)a) + offset;
使用此语句,偏移量被解释为字节数。
答案 1 :(得分:0)
这里的问题是偏移量。 void
没有大小,因此C不允许在void *
上使用指针算术。假设您要使用字节地址,则应通过char *
算法:
void getOffset(const void* a, void** b)
{
int offset = getsomeoffset();
char *p = a; // automatic conversion from void * to char *
p += offset; // char pointer arithmetics
*b = p; // automatic conversion for char * to void *
// or directly: *b = ((char *) a) + offset;
}
答案 2 :(得分:0)
鉴于void *a
,a + offset
违反了6.5.6 Additive operators, paragraph 8 of the C standard:
当将整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大...
void *
没有类型,它不能指向实际对象。
正如其他人指出的那样,您必须将void *
强制转换为另一种类型,最有可能使用char *
是合适的。