我正在尝试编译第三方库,但是由于某种原因,我遇到了错误。该库的编译方式可能有所不同。我已阅读了该错误,但似乎无法弄清问题所在! :(
struct sfo_entry {
char* key;
size_t size;
size_t area;
void* value;
enum sfo_value_format format;
struct sfo_entry* next;
struct sfo_entry* prev;
};
struct sfo {
struct sfo_entry* entries;
};
bool sfo_load_from_memory(struct sfo* sfo, const void* data, size_t data_size) {
struct sfo_header* hdr;
struct sfo_table_entry* entry_table;
struct sfo_table_entry* entry;
entry_table = (struct sfo_table_entry*)(data + sizeof(*hdr));
// ...
return true;
}
错误如下:
sfo.cpp:150:47: error: arithmetic on a pointer to void
entry_table = (struct sfo_table_entry*)(data + sizeof(*hdr));
~~~~ ^
最佳答案
错误是不允许对void *
类型的指针或任何其他不完整类型的指针进行算术运算。这与以下事实一致:指针算术是根据指向类型的大小定义的,而对于不完整类型则不知道。
一些编译器实现了一个扩展,将在此处应用该扩展,将void *
上的指针算术视为指向的类型的大小为1。通常,这正是代码作者想要的,就像您的代码中那样。在这种情况下,您可以考虑通过将受影响的行更改为
entry_table = (struct sfo_table_entry*)((char *)data + sizeof(*hdr));
关于c - 编译第三方库时指向无效错误的指针的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62092492/