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

输入超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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:01:01