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));