输入超48000时触发0xC0000005内存访问违规,求排查帮助
问题分析与解决
错误原因:整数溢出导致数组越界访问
你的代码触发0xC0000005错误(Windows下的内存访问违规),核心原因是整数溢出:
i和m都是int类型(通常为32位,最大值约2147483647),当n接近50000时,i*m的乘积会超出int的上限,溢出后变成负数。- 此时
i*m <= n的条件会始终成立(负数必然小于正数n),导致m无限增大,最终访问arr[i*m]时使用了负索引,超出数组合法范围(数组索引仅能从0到n),触发内存访问错误。
代码逻辑偏离需求
题目要求输出所有奇数,但你的代码实现的是类似埃氏筛的合数标记逻辑,完全偏离了需求。输出奇数的逻辑要简单得多:
修正后的代码
方案1:直接遍历输出奇数
#include <iostream> using namespace std; int main() { ios::sync_with_stdio(false); int n; cin >> n; // 输出1到n之间的所有奇数 for (int i = 1; i <= n; i += 2) { cout << i << '\n'; } return 0; }
方案2:筛法思路(标记偶数)
如果一定要用数组标记的方式,可标记所有偶数为1,再输出未被标记的数(注意排除非奇数的0):
#include <iostream> #include <vector> using namespace std; int main() { ios::sync_with_stdio(false); int n; cin >> n; vector<int> arr(n + 1, 0); // 标记所有偶数为1 for (int i = 2; i <= n; i += 2) { arr[i] = 1; } // 输出奇数(从1开始遍历) for (int i = 1; i <= n; ++i) { if (arr[i] == 0) { cout << i << '\n'; } } return 0; }
额外注意点
- 原代码中
printf的字符串存在语法问题,换行符应写为\n,即printf("%d\n", i);;更推荐配合ios::sync_with_stdio(false);使用cout,输出效率更高。 - 若日后需要处理大数乘法场景,建议用
long long类型存储乘积(比如(long long)i * m),避免整数溢出导致的逻辑错误。
内容的提问来源于stack exchange,提问作者khaled baccour
相关产品推荐
相关产品推荐

