C 作废*转让作废**

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*指针上应用指针算术。指向的

需要实现一个具有一些参数的api;具有输入类型(常量void*)、输出类型(void**);api希望将带有一定偏移量的输入分配给输出;比如说,

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标准。首先,这个功能看起来是完全多余的。我会停下来考虑程序设计是否有意义。