C 作废*转让作废**
需要实现一个具有一些参数的api;具有输入类型(常量void*)、输出类型(void**);api希望将带有一定偏移量的输入分配给输出;比如说,C 作废*转让作废**,c,void,C,Void,需要实现一个具有一些参数的api;具有输入类型(常量void*)、输出类型(void**);api希望将带有一定偏移量的输入分配给输出;比如说, void getOffset(const void* a, void** b) { int offset = getsomeoffset(); *b = a + offset; } 这将在编译器中引起一些抱怨。写这段代码的正确方法是什么?输入的类型可以是float、int、double。您不能在void*指针上应用指针算术。指向的
void getOffset(const void* a, void** b)
{
int offset = getsomeoffset();
*b = a + offset;
}
这将在编译器中引起一些抱怨。写这段代码的正确方法是什么?输入的类型可以是float、int、double。您不能在
void*
指针上应用指针算术。指向的目标没有任何类型,因此没有可用于计算偏移的大小
因此,在应用偏移量之前,需要强制转换指针:
*b = ((char *)a) + offset;
此语句将偏移量解释为字节数。这里的问题是偏移量。
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;
}
给定
void*a
,a+偏移量
违反:
将整数类型的表达式添加到指针或从指针中减去时,结果具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大
void*
没有类型,也不能指向实际对象
正如其他人所指出的,您必须将
void*
强制转换为另一种类型,最有可能的是char*
。如果编译器投诉,请始终在问题中包含警告或错误。空指针上的错误提示违反了C标准。首先,这个功能看起来是完全多余的。我会停下来考虑程序设计是否有意义。