c - 编译第三方库时指向无效错误的指针的算法

标签 c compiler-errors void-pointers

我正在尝试编译第三方库,但是由于某种原因,我遇到了错误。该库的编译方式可能有所不同。我已阅读了该错误,但似乎无法弄清问题所在! :(

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/

相关文章:

C语言 : void *x = &x compiles and runs without declaring x beforehand

C++ 使用 (void*) 转换为 int 进行比较?

c - ADT、void 指针和 int - C 中几乎没有相关警告的问题

c++ - 使用 uint16_t 和按位操作时期望的数字是多少

function - 表达式不能用作函数-IF STATEMENT

scala - 访问抽象类 (Scala) 中构造函数创建的字段

c++ - 如果有 std::thread,Visual Studio 2017 linux 无法编译

c - 如何在 python 中使用 struct 模块解压缩字节?

c - Sscanf 扫描包含列的行

c - 如何使#define 使用 64 位