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
相关产品推荐
相关产品推荐

