无效*分配给无效**

时间:2018-12-10 11:10:48

标签: c void

需要实现一个具有一些参数的api;它具有输入的类型(const void *),输出的类型(void **); api希望为输入分配一些偏移量;例如,

void getOffset(const void* a, void** b)
{
    int offset = getsomeoffset();
    *b = a + offset; 
} 

这会在编译器中引起一些抱怨。编写此代码的正确方法是什么?输入的类型可以是float,int,double。

3 个答案:

答案 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 *aa + offset违反了6.5.6 Additive operators, paragraph 8 of the C standard

  

当将整数类型的表达式添加到指针或从指针中减去时,结果将具有指针操作数的类型。如果指针操作数指向数组对象的元素,并且数组足够大...

void *没有类型,它不能指向实际对象。

正如其他人指出的那样,您必须将void *强制转换为另一种类型,最有可能使用char *是合适的。