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

C语言安全除法函数出现地址恒为真编译错误如何解决

问题原因
  • 指针判断逻辑错误:你写的&x是取函数形参指针x自身的栈内存地址,函数形参作为局部变量的地址永远不可能为NULL,所以编译器会提示该地址的求值结果永远为真,判断完全无效。你要检查的是传入的指针是否指向空地址,直接判断x == NULL即可,不需要加取地址符。
  • 逻辑表达式完全不符合需求:你需要的安全校验规则是「任意指针为空 或 除数为0时,返回false不执行除法」,你原来的表达式逻辑运算符||、!的使用完全颠倒,校验逻辑完全错误。
修复后的代码

你可以直接简化校验逻辑,把所有非法场景列出来直接判断即可:

bool safe_division(const int *x, const int *y, int *result){
    // 只要满足任意一个非法条件就直接返回失败
    if (x == NULL || y == NULL || result == NULL || *y == 0) {
        return false;
    }
    *result = *x / *y;
    return true;
}

完整可运行的测试代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stddef.h>

bool safe_division(const int *x, const int *y, int *result){
    if (x == NULL || y == NULL || result == NULL || *y == 0) {
        return false;
    }
    *result = *x / *y;
    return true;
}

int main(void){
    int x = 2;
    int y = 1;
    int result = 2;

    int *px = &x;
    int *py = &y;
    int *presult = &result;

    if(safe_division(px, py, presult)){
        printf("why hello there, division result is %d\n", result);
    }

    // 测试除数为0的异常场景
    y = 0;
    if(!safe_division(px, py, presult)){
        printf("division failed: divisor is zero\n");
    }

    // 测试空指针传入的异常场景
    if(!safe_division(px, NULL, presult)){
        printf("division failed: null pointer input\n");
    }

    return EXIT_SUCCESS;
}

内容的提问来源于stack exchange,提问作者Enezx

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:54:02