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

C++单参数递归回文数判断函数报写入位置访问违规错误

问题原因

你遇到的0xC0000005内存访问错误本质是栈溢出,由以下几处错误共同触发:

  • 函数没有对所有执行路径返回有效值:你声明了返回bool类型的函数,else分支仅调用递归函数但没有加return,属于C++未定义行为,程序执行逻辑完全不可控。
  • 去掉首尾数字的逻辑完全错误:你写的test-(firstDigit*length)-lastDigit计算逻辑不符合预期,比如输入12421,按该逻辑会得到12421 - 1*5 -1 = 12415,根本不是去掉首尾后的242,反而得到了更大的数,递归会无限执行下去,最终栈空间耗尽触发内存访问违规。
  • 数字长度计算逻辑错误:初始length=1,每次temp>0就加1,输入121的话最终length会得到4,和实际长度3不符,进一步加剧计算错误。
  • 基准条件设置错误:test==0才返回判断的逻辑不合理,单个数字(<10)本身就是回文,应该直接作为终止条件;且如果某次递归首尾数字已经不相等,直接返回false即可,不需要继续递归。

修正方案

要正确去掉首位数字,需要先计算出最高位对应的10的n次权重,再取余去掉首位、除以10去掉末位,得到中间值递归。修正后的代码符合仅传单个参数的要求,如下:

bool is_palindrome(int test) {
    // 负数不是回文数,0和单个正整数都是回文
    if (test < 0) return false;
    if (test < 10) return true;
    
    // 计算最高位的权重10^(length-1)
    int temp = test;
    int pow10 = 1;
    while (temp >= 10) {
        temp /= 10;
        pow10 *= 10;
    }
    
    int first = test / pow10;
    int last = test % 10;
    // 首尾不等直接返回false
    if (first != last) return false;
    // 去掉首尾后的数字:test%pow10去掉首位,再除以10去掉末位
    int sub_num = (test % pow10) / 10;
    // 返回递归结果
    return is_palindrome(sub_num);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:51:03