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

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;
}
关键注意点
  1. 边界处理:isPower里的num>0必须加,否则会把0、负数误判为2的幂(比如0和-2按位与的结果也是0,但它们不是2的幂)
  2. 内存管理:用malloc动态分配掩码数组,避免栈溢出,用完一定要用free释放
  3. 职责拆分:把判断逻辑和掩码生成分开,代码更清晰,也更容易排查问题

运行这段代码后,你会得到正确的掩码数组:1 1 1 1 1 0 1 0 0 1 1 1 1 1,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:21:05