从类型“ZipperTree”分配给类型“struct ZipperNode”时的类型不兼容

incompatible types when assigning to type ‘struct ZipperNode’ from type ‘ZipperTree’

所以,我在编译时遇到这个 gcc 编译错误:

zipper.c: In function ‘fillZipperInfo’: zipper.c:384:22: error: incompatible types when assigning to type ‘struct ZipperNode’ from type ‘ZipperTree’ forest[current++] = n;

这是 "zipper.h" 文件中的不透明类型定义:

typedef struct ZipperNode *ZipperTree;

这里是 "zipper.c" 文件中的 ZipperNode 定义:

struct ZipperNode {
    int count;
    ZipperTree left;
    ZipperTree right;
    Symbol symbol;
};

以及调用错误的周围部分:

ZipperTree forest = malloc(sizeof(ZipperTree) * ft->total);
int current = 0;
int i;
for(i = 0; i < ft->size; i++) {
    if(ft->symbols[i] > 0) {
        ZipperTree n = malloc(sizeof(ZipperTree));
        n->count = ft->symbols[i];
        n->symbol = i;
        forest[current++] = n; //here!!
    }
}

这里是 ft 类型,FreqTable,以防万一,它也在 "zipper.h" 上预先定义:

struct FreqTable {
    int symLength;
    size_t size;
    Symbol* symbols;
    int total;
};

而且我认为这可能是我提出以下问题所需的全部内容:在 post 开始时可能导致错误的原因是什么?

感谢您的回答。

通过将 ZipperTree 类型替换为 ZipperNode * 可以更容易地看出问题所在

ZipperNode *forest = malloc(sizeof(ZipperNode *);
ZipperNode *n = malloc(sizeof(ZipperNode *));
forest[current++] = n; 

forest[current++] 是您的左值,在建立索引时,它将成为指向的值,ZipperNode,而不是 ZipperNode *,这就是您的右值。

用 clang 编译提供了更多信息,但最终它抱怨的是同一件事。

error: assigning to 'struct ZipperNode' from incompatible type 'ZipperTree'
  (aka 'struct ZipperNode *'); dereference with *
    forest[current++] = n; //here!!
                      ^ ~
                        *

您正在将指针分配给非指针类型。尝试取消引用 n