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

动态数组抛出异常原因排查:存储200以内奇数时出错

问题根源:数组下标越界 + 逻辑判断写反

嘿,你遇到的异常本质是两个关键错误叠加的结果,咱们一步步拆解开看:

1. 最致命的问题:数组下标超范围了!

你分配的数组只有100个int元素,C++里数组下标从0开始,所以这个数组的有效下标只能是0到99。但你的循环里count从1一直跑到199,直接用a[count]访问数组——只要count >=100,你就已经在访问数组分配内存之外的空间了,这属于未定义行为,触发异常是必然的结果。

2. 逻辑判断完全搞反了

你的代码里写的判断条件是:

if (a[count] % 2 == 1) {
    a[count] = count;
    cout << a[count] << endl;
}

这里你居然在判断数组里还未赋值的元素是不是奇数?但你用new int[size]()初始化的数组,所有元素默认都是0,0是偶数,这个条件其实永远不会成立?不过你说输出显示了奇数,估计你实际写代码时把条件搞反了——应该是判断count本身是不是奇数才对:if (count % 2 == 1)。

3. 正确的姿势:用独立索引追踪数组存储位置

你需要一个单独的变量来记录数组当前存到第几个位置了,不能直接用循环的count当下标。比如设个int idx = 0;,每找到一个奇数,就把它存到a[idx],然后idx++,等idx到100的时候,说明已经存满100个奇数了,直接退出循环就行。

修正后的完整代码

#include <iostream>
using namespace std;

int *allocIntArray(int);
int main() {
    int *a;
    a = allocIntArray(100);
    int idx = 0; // 专门用来追踪数组当前的存储位置
    for (int count = 1; count < 200; count++) {
        if (count % 2 == 1) { // 现在才是正确判断当前数是不是奇数
            a[idx] = count;
            cout << a[idx] << endl;
            idx++;
            if (idx >= 100) { // 存够100个奇数就停止循环,不用再遍历了
                break;
            }
        }
    }
    delete[] a;
    return 0;
}
int *allocIntArray(int size) {
    int *newarray = new int[size]();
    return newarray;
}

这样修改后,数组只会被访问0到99的有效下标,而且准确存储了200以内的100个奇数,再也不会触发异常啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:07:24