C 编译第三方库时指针无效错误的算术运算

C 编译第三方库时指针无效错误的算术运算,c,compiler-errors,void-pointers,C,Compiler Errors,Void Pointers,我试图编译一个第三方库,但由于某种原因,我得到了一个错误。该库的编译方式可能有所不同。我已经阅读了错误,但我似乎不知道问题出在哪里!:( 错误如下: sfo.cpp:150:47: error: arithmetic on a pointer to void entry_table = (struct sfo_table_entry*)(data + sizeof(*hdr));

我试图编译一个第三方库,但由于某种原因,我得到了一个错误。该库的编译方式可能有所不同。我已经阅读了错误,但我似乎不知道问题出在哪里!:(

错误如下:

 sfo.cpp:150:47: error: arithmetic on a pointer to void
         entry_table = (struct sfo_table_entry*)(data + sizeof(*hdr));
                                                 ~~~~ ^

我们无法对
void*
指针执行算术运算,因为它没有关于底层对象类型的信息。转换为适当的指针类型并对其执行算术运算。

来自C标准(6.2.5类型)

19 void类型包含一组空值;它是一个不完整的类型 无法完成的对象类型

要执行指针运算,需要指定指向对象的大小


某些编译器允许使用指针在指针算术设置中使指针对象的大小等于
sizeof(char)时无效
即到
1

错误在于,在类型为
void*
的指针上,或在指向任何其他不完整类型的指针上,都不允许进行算术运算。这与指针算术是根据指向类型的大小定义的事实一致,对于不完整类型,这是未知的

一些编译器实现了一个扩展,适用于这里,在“代码>空隙*/CODE”上处理指针算法,好像指向的类型有1个大小。通常,这正是代码作者想要的,就像你的代码中的情况一样。在这种情况下,你可以考虑通过改变受影响的行来修复代码中的这个缺陷。到

    entry_table = (struct sfo_table_entry*)((char *)data + sizeof(*hdr));

这回答了你的问题吗?你不能在
void*
上做指针运算,你需要将它转换成其他可识别的类型,对于你的情况,它应该是
char*
(struct sfo\u table\u entry*)((char*)data+sizeof(*hdr))
一些实现将给出大小为
1
,但它未定义。目标类型未知。我感谢所有的输入,各位。将其转换为
char*
确实有效。给定的信息对我的情况非常有用。但是仍然不完美/不可移植。将指针分配到
entry\u table
可能会运行到m内存对齐问题。这就是为什么人们通常会将
entry\u table
(例如,自动或使用
malloc
)和
memcpy
*((char*)data+sizeof(*hdr))
分配内存到该内存块的原因。对于OP来说可能足够好了(尽管性能可能会受到影响)。
    entry_table = (struct sfo_table_entry*)((char *)data + sizeof(*hdr));