You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存储布尔值(最常用,推荐)

你不需要用二级指针传布尔结果,调整如下:

  1. 修改函数签名,将参数改为一级布尔指针:
char *hash_table_lookup(hash_table_t *ht, int key, bool *result)
  1. 函数内部赋值逻辑保持不变,else分支补充返回NULL:
if (next && next->value)
{
  *result = true;
  return (next->value);
}
else  
{
  *result = false;
  return NULL;
}
  1. 修改测试代码适配:
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:确实需要返回布尔指针

如果你业务要求必须返回动态分配的布尔指针,调整如下:

  1. 函数内部先给指针分配内存再赋值:
if (next && next->value)
{
  *result = malloc(sizeof(bool));
  **result = true;
  return (next->value);
}
else  
{
  *result = malloc(sizeof(bool));
  **result = false;
  return NULL;
}
  1. 测试代码用完记得释放内存,避免泄漏:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:06:03