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

