C语言错误排查:二元运算符!=操作数不匹配(struct与void*)
问题分析与解决
这个编译错误的核心原因是类型不匹配,我给你拆解清楚:
new->bucket是dataframe*类型,指向的是一个dataframe结构体数组,所以new->bucket[i]是一个实实在在的dataframe结构体实例(值类型),不是指针。- 而
NULL是指针常量,C语言不允许把结构体值和指针做比较,这就导致了编译器抛出的invalid operands to binary !=错误。
另外你的代码还有个逻辑漏洞:扩容哈希表时,不能直接把旧桶的元素按位置复制到新桶——因为桶数量变了,哈希值的计算结果也会改变,直接复制会破坏哈希表的冲突处理逻辑。正确的做法是遍历旧桶里的有效元素,重新计算哈希值插入新桶。
修正后的代码示例
#include <stdlib.h> enum dfStatus { EMPTY = 2, FULL, REMOVED }; typedef struct dataframe { void *key; void *data; enum dfStatus status; } dataframe; typedef struct assoc { dataframe *bucket; unsigned int buckCnt; unsigned int totalCnt; unsigned int multip; unsigned int keysize; } assoc; // 替换成你实际使用的哈希计算函数 unsigned int _assoc_hash(const void *key, unsigned int keysize, unsigned int buckCnt) { const unsigned char *k = key; unsigned int hash = 0; for (unsigned int i = 0; i < keysize; i++) { hash = hash * 31 + k[i]; } return hash % buckCnt; } assoc* _assoc_resize(assoc* a) { assoc *ass = a, *new; unsigned int oldSize = ass->buckCnt; unsigned int newSize = oldSize * 2; unsigned int multi = ass->multip * 2; // 分配新桶并初始化状态为EMPTY dataframe *newBucket = ncalloc(newSize, sizeof(dataframe)); for (unsigned int i = 0; i < newSize; i++) { newBucket[i].status = EMPTY; } // 初始化新的assoc结构体 new = ncalloc(1, sizeof(assoc)); new->multip = multi; new->bucket = newBucket; new->buckCnt = newSize; new->totalCnt = 0; new->keysize = ass->keysize; // 遍历旧桶,重新插入有效元素到新桶 for (unsigned int i = 0; i < oldSize; i++) { dataframe *oldDf = &ass->bucket[i]; // 用status字段判断元素是否有效,替代错误的NULL比较 if (oldDf->status != EMPTY) { unsigned int idx = _assoc_hash(oldDf->key, ass->keysize, newSize); // 线性探测处理哈希冲突,替换成你的冲突逻辑即可 while (newBucket[idx].status == FULL) { idx = (idx + 1) % newSize; } newBucket[idx] = *oldDf; new->totalCnt++; } } // 释放旧资源 free(ass->bucket); free(ass); return new; }
关键修正点
- 把错误的
if (new->bucket[i] != NULL)替换成判断旧元素的status != EMPTY,既解决了类型不匹配问题,也回归了正确的逻辑。 - 扩容时重新计算每个有效元素的哈希位置,保证哈希表结构的正确性。
- 补充了
keysize的复制,避免新桶无法正确计算哈希值。 - 把部分
int类型换成unsigned int,避免无符号数溢出的潜在问题。
内容的提问来源于stack exchange,提问作者Davospike
相关产品推荐
相关产品推荐

