void *赋值给void **

loading...


-1

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

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

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

loading...

3回答

  • 0

    您不能在 void * 指针上应用指针算术 . 指向的目标没有任何类型,因此没有可用于计算偏移的大小 .

    因此,您需要在应用偏移之前转换指针:

    *b = ((char *)a) + offset;
    

    使用此语句,偏移量被解释为字节数 .


  • 0

    鉴于 void *aa + offset 违反6.5.6 Additive operators, paragraph 8 of the C standard

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

    void * 不指向实际对象 .

    正如其他人所指出的那样,你必须将 void * 转换为另一种类型,很可能 char * 是合适的 .


  • 4

    这里的问题是偏移 . 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; 
    }
    
评论

暂时没有评论!