动态数组抛出异常原因排查:存储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
相关产品推荐
相关产品推荐

