需要实现一个具有一些参数的api;它具有输入的类型(const void *),输出的类型(void **); api想要为输出分配一些偏移量的输入;例如,
void getOffset(const void* a, void** b) { int offset = getsomeoffset(); *b = a + offset; }
这会在编译器中引起一些抱怨 . 编写此代码的正确方法是什么?输入的类型可以是float,int,double .
这里的问题是偏移 . void 没有大小,因此C不允许在 void * 上使用指针算术 . 假设您要使用字节地址,您应该通过 char * 算术:
void
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 * 指针上应用指针算术 . 指向的目标没有任何类型,因此没有可用于计算偏移的大小 .
因此,您需要在应用偏移之前转换指针:
*b = ((char *)a) + offset;
使用此语句,偏移量被解释为字节数 .
鉴于 void *a , a + offset 违反6.5.6 Additive operators, paragraph 8 of the C standard:
void *a
a + offset
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有指针操作数的类型 . 如果指针操作数指向数组对象的元素,并且数组足够大......
void * 不指向实际对象 .
正如其他人所指出的那样,你必须将 void * 转换为另一种类型,很可能 char * 是合适的 .
3 回答
这里的问题是偏移 .
void
没有大小,因此C不允许在void *
上使用指针算术 . 假设您要使用字节地址,您应该通过char *
算术:您不能在
void *
指针上应用指针算术 . 指向的目标没有任何类型,因此没有可用于计算偏移的大小 .因此,您需要在应用偏移之前转换指针:
使用此语句,偏移量被解释为字节数 .
鉴于
void *a
,a + offset
违反6.5.6 Additive operators, paragraph 8 of the C standard:void *
不指向实际对象 .正如其他人所指出的那样,你必须将
void *
转换为另一种类型,很可能char *
是合适的 .