C编译报“从int赋值给_Bool*无转换生成指针”警告如何解决?
问题原因说明
你遇到的编译警告是典型的类型不匹配问题:
- 你定义的
hash_table_lookup函数的第三个参数是bool **result,因此解引用一级后的*result类型是bool *(布尔类型指针) - 你代码中直接给
*result赋值true/false,这两个值本质是整数常量1/0,相当于把整数直接赋值给指针变量,编译器才会抛出「整数转指针没有强制类型转换」的警告。
你当前测试能通过完全是巧合:测试代码中CU_ASSERT_TRUE(result)是判断result指针本身是否为非空,你给*result赋值true相当于把指针指向地址0x1(非空),刚好符合断言判断条件,但代码逻辑本身存在严重的野指针风险,属于未定义行为,后续修改逻辑极大概率触发崩溃。
另外你的代码还有一处隐含问题:hash_table_lookup是返回char*的非void函数,else分支没有写返回值,也会触发未定义行为。
修复方案
根据你实际的业务需求,选择以下两种方案即可:
方案1:用result存储布尔值(最常用,推荐)
你不需要用二级指针传布尔结果,调整如下:
- 修改函数签名,将参数改为一级布尔指针:
char *hash_table_lookup(hash_table_t *ht, int key, bool *result)
- 函数内部赋值逻辑保持不变,else分支补充返回NULL:
if (next && next->value) { *result = true; return (next->value); } else { *result = false; return NULL; }
- 修改测试代码适配:
void test_lookup1() { hash_table_t *ht = hash_table_create(); char *valtest = "a"; int keytest = 12; hash_table_insert(ht, keytest, valtest); bool result; // 改为普通布尔变量,不是指针 hash_table_lookup(ht, keytest, &result); CU_ASSERT_TRUE(result); // 直接判断变量值 hash_table_destroy(ht); }
方案2:确实需要返回布尔指针
如果你业务要求必须返回动态分配的布尔指针,调整如下:
- 函数内部先给指针分配内存再赋值:
if (next && next->value) { *result = malloc(sizeof(bool)); **result = true; return (next->value); } else { *result = malloc(sizeof(bool)); **result = false; return NULL; }
- 测试代码用完记得释放内存,避免泄漏:
void test_lookup1() { hash_table_t *ht = hash_table_create(); char *valtest = "a"; int keytest = 12; hash_table_insert(ht, keytest, valtest); bool *result; hash_table_lookup(ht, keytest, &result); CU_ASSERT_TRUE(*result); // 解引用指针取布尔值 free(result); // 释放分配的内存 hash_table_destroy(ht); }
内容的提问来源于stack exchange,提问作者fireproofiii
相关产品推荐
相关产品推荐

