我无法理解为什么会引发此异常。我分配了一个数组以接收100个int值,并希望将200以下的所有奇数存储到该数组中(应该是100个整数值)。我试图了解为什么我的代码无法正常工作。
我已经调用了我的函数来分配100个int值的数组。之后,我创建了一个for循环来遍历整数并将其存储到数组中,但是我创建了一个if语句仅存储奇数。我不明白的是,如果我将计数器设置为200并使用if语句,则会引发异常,但是如果我不插入if语句,而只将计数器设置为100,则存储在1-100之间的所有数字与不会抛出异常。
我唯一能想到的是,当我的计数器为200时,我有了if语句来捕获所有奇数,以某种方式将所有小于200的数字都存储在数组中,从而引发异常。
int *allocIntArray(int);
int main() {
int *a;
a = allocIntArray(100);
for (int count = 1; count < 200; count++) {
if (a[count] % 2 == 1) {
a[count] = count;
cout << a[count] << endl;
}
}
delete[] a;
return 0;
}
int *allocIntArray(int size) {
int *newarray = new int[size]();
return newarray;
}
当我查看程序输出时,它仅显示奇数,但会引发异常。这告诉我我的if语句是否有效,但有些事情正在弄混。
我想念什么?
感谢您的时间和知识。
答案 0 :(得分:1)
如果您有一个由a
个元素创建的数组n
,则在尝试从绑定中访问数组元素时,这是未定义的行为。因此索引必须始终在0到n-1之间。
由于count
子句中的条件评估已经尝试越界,因此if
一旦为100,程序的行为就不会被定义。
此外,您的程序逻辑中还存在一个严重的错误:如果要添加满足某种条件的数字,则需要2个计数器:一个用于迭代数字,另一个用于最后使用的索引。数组:
for (int nextitem=0, count = 1; count < 200; count++) {
if (count % 2 == 1) { // not a[count], you need to test number itself
a[nextitem++] = count;
cout << count << endl;
if (nextitem == 100) { // attention: hard numbers should be avoided
cout << "Array full: " << nextitem << " items reached at " << count <<endl;
break; // exit the for loop
}
}
}
但是,此解决方案要求您跟踪数组中的最后一项以及数组的大小(在此处进行了硬编码)。
您可能正在学习。但是在C ++中,更好的解决方案是使用vector
而不是数组,然后使用push_back()
。向量管理内存,因此您可以专注于算法。完整的程序将如下所示:
vector<int> a;
for (int count = 1; count < 200; count++) {
if (count % 2 == 1) {
a.push_back(count);
cout << count << endl;
}
}
cout << "Added " << a.size() << " elements" <<endl;
cout << "10th element: "<< a[9] << endl;
答案 1 :(得分:0)
问题不是存储多少个数字,而是存储它们的位置;您正在a[101]
中存储101,这显然是错误的。
如果第i个奇数是C,则正确的索引是i-1,而不是C。
最易读的更改可能是引入一个新的计数器变量。
int main() {
int a[100] = {0};
int count = 0;
for (int number = 1; number < 200; number++) {
if (number % 2 == 1) {
a[count] = number;
count += 1;
}
}
}
我认为将其从搜索问题转变为世代问题更容易解决问题。
如果您碰巧记得对于某些C
,每个奇数2 * A + 1
都可以用A
的形式书写,那么您会发现所需的顺序是< / p>
2*0+1, 2*1+1, 2*2+1, ..., 2*99+1
如此
int main()
{
int numbers[100] = {0};
for (int i = 0; i < 100; i++)
{
numbers[i] = 2 * i + 1;
}
}
您还可以反过来,遍历奇数并将它们存储在正确的位置:
int main()
{
int numbers[100] = {0};
for (int i = 1; i < 200; i += 2) // This loops over the odd numbers.
{
numbers[i/2] = i; // Integer division makes this work.
}
}