C语言:if条件中调用isPower函数出现异常问题求助
嘿,你遇到的问题应该是isPower函数的实现逻辑有漏洞,导致调用后掩码生成出错。咱们来一步步搞定它:
问题诊断
你提到不用自定义isPower时代码正常,调用后出异常,那大概率是这个判断函数没覆盖所有边界条件,或者返回值不符合if判断的预期。
正确的2的幂判断逻辑
在C里,判断正整数是2的幂的标准方法是利用位运算特性:
- 2的幂的二进制表示只有一个1(比如1是
1,2是10,4是100) - 当这个数减1后,所有低位都会变成1(比如4-1=3是
011) - 两者按位与(
&)的结果必然是0 - 额外注意:1是2的0次幂,符合条件;0和负数绝对不是2的幂,必须先排除
正确的
isPower实现 int isPower(int num) { // 先确保是正整数,再判断位运算条件 return (num > 0) && ((num & (num - 1)) == 0); }
这个函数会返回1(真)或0(假),完全适配if(isPower(nums[i]))的判断逻辑,不需要任何或条件。
完整可运行代码
下面是整合后的完整代码,包含掩码数组生成的逻辑,完全符合你的需求:
#include<stdio.h> #include<stdlib.h> // 核心判断函数:判断num是否是2的幂 int isPower(int num) { return (num > 0) && ((num & (num - 1)) == 0); } // 生成掩码数组:输入原始数组和长度,返回动态分配的掩码数组 int* generateMask(int* nums, int length) { int* mask = (int*)malloc(sizeof(int) * length); if (!mask) { printf("内存分配失败\n"); return NULL; } // 完全按照你想要的if写法生成掩码 for (int i = 0; i < length; i++) { if (isPower(nums[i])) { mask[i] = 1; } else { mask[i] = 0; } } return mask; } int main(void) { int array[] = {1,2,2,4,4,3,4,3,3,4,4,4,4,4}; int arrLength = sizeof(array) / sizeof(array[0]); int* resultMask = generateMask(array, arrLength); if (!resultMask) { return 1; } // 打印结果验证 printf("原始数组:"); for (int i = 0; i < arrLength; i++) { printf("%d ", array[i]); } printf("\n掩码数组:"); for (int i = 0; i < arrLength; i++) { printf("%d ", resultMask[i]); } printf("\n"); // 记得释放动态内存,避免泄漏 free(resultMask); return 0; }
关键注意点
- 边界处理:
isPower里的num>0必须加,否则会把0、负数误判为2的幂(比如0和-2按位与的结果也是0,但它们不是2的幂) - 内存管理:用
malloc动态分配掩码数组,避免栈溢出,用完一定要用free释放 - 职责拆分:把判断逻辑和掩码生成分开,代码更清晰,也更容易排查问题
运行这段代码后,你会得到正确的掩码数组:1 1 1 1 1 0 1 0 0 1 1 1 1 1,完全符合你的需求。
内容的提问来源于stack exchange,提问作者IDEN
相关产品推荐
相关产品推荐

