运行时检查失败#2:变量‘k’堆栈损坏,求排查完全数查找代码问题
解决栈溢出问题:1-1000完全数代码的错误排查
嘿,我看到你在编写寻找1到1000之间完全数的代码时遇到了栈溢出的问题,那个Run-Time Check Failure #2 - Stack around the variable 'k' was corrupted提示其实很明确——你定义的数组k被越界访问了,咱们来一步步拆解问题并解决它:
问题根源
你定义的数组int k[11];只能容纳11个元素(索引范围是0到10),但当处理一些因子数量较多的数时(比如60有10个真因子,840更是有31个真因子),变量n会不断递增,最终导致k[n] = i;这行代码访问了数组边界之外的内存,破坏了栈的结构,从而触发了栈溢出的错误提示。
解决方案
有两种简单的方式可以修复这个问题:
方案1:扩大数组容量
直接把数组k的大小调整到足够容纳1000以内数的最多真因子数量(1000以内的数最多有31个真因子),比如设置为50或100,这样就不会出现越界问题。修改后的代码如下:
#include<iostream> using namespace std; int main() { int k[50]; // 扩大数组容量,避免越界 int i, a, n, s; for (a = 2; a <= 1000; a++) { n = 0; s = a; for (i = 1; i < a; i++) { if (a % i == 0) { n++; s = s - i; k[n] = i; } } if (s == 0) { cout << a << " is a perfect number" << endl; cout << "its factors are:"; for (i = 1; i <= n; i++) { cout << k[i] << " "; } cout << endl; // 补全之前省略的换行,让输出更规范 } } return 0; }
方案2:移除数组,直接打印因子
其实完全不需要用数组存储因子,当确认某个数是完全数时,重新遍历一次1到a-1,把能整除a的数直接打印出来即可。这种方式既节省内存,又彻底避免了数组越界的风险:
#include<iostream> using namespace std; int main() { int i, a, s; for (a = 2; a <= 1000; a++) { s = a; for (i = 1; i < a; i++) { if (a % i == 0) { s -= i; } } if (s == 0) { cout << a << " is a perfect number" << endl; cout << "its factors are:"; for (i = 1; i < a; i++) { if (a % i == 0) { cout << i << " "; } } cout << endl; } } return 0; }
额外提示
1000以内的完全数其实只有3个:6、28、496,你可以用修改后的代码验证这一点,运行后就能看到正确的输出啦。
内容的提问来源于stack exchange,提问作者John Young
相关产品推荐
相关产品推荐

