是什么导致数组出界?

时间:2014-01-27 07:11:41

标签: c++ arrays

在“输入第二个数字:”的第二次迭代之后,程序崩溃。我不明白为什么;它应该仍然存在。

int arr1[3];
int arr2[3];
for(int i = 1; i < 6; i++)
{
    if (i < 4)
    {
        cout << "enter number for first: ";
        cin >> arr1[i];
    }
    else
    {
        cout << "enter number for second: ";
        cin >> arr2[i-4];
    }
}

4 个答案:

答案 0 :(得分:2)

int arr1[3];
int arr2[3];
for(int i = 0; i < 6; i++)
{
    if (i < 3)
    {
        cout << "enter number for first: ";
        cin >> arr1[i];
    }
    else
    {
        cout << "enter number for second: ";
        cin >> arr2[i-3];
    }
}

尝试一下,因为数组从ZERO开始,arr [3] = 0,1,2

答案 1 :(得分:1)

对于i = 3,当此数组中的最高索引为2时,插入到arr1 [3]中(三个索引:0,1,2。

将代码中的每4个替换为3.最好对此值使用常量。

我相信你的代码还有另一件事:

for(int i = 1; i < 6; i++)

这个循环只运行5次迭代,从1到5.就像现在一样,你永远不会写入arr1的第一个索引。

从i = 0开始。

答案 2 :(得分:1)

让我们来看看你的程序如何适用于每个值

第一次迭代:

  • i = 1
  • 如果测试为真1&lt; 4
  • cin to arr1 [1]
  • 注意:跳过索引arr1 [0]

第二次迭代:

  • i = 2
  • 如果测试为真2&lt; 4
  • cin to arr1 [2]

第三次迭代:

  • i = 3
  • 如果测试为真3&lt; 4
  • cin to arr1 [3] - 这是你的索引超出范围。 C和C ++中的数组是从零开始的,因此数组的最大索引是数组的大小 - 1

我会在这里停止分析,因为这是你的错误部分,从现在起你应该没事。

哦,你也应该开始阅读一本关于C ++的书,因为你在旅程开始时的失败将会在以后变得更大。你缺乏语言基础知识

答案 3 :(得分:0)

数组是从0开始的索引,而不是从1开始,正如您的代码似乎所假设的那样。 arr1arr2中的有效位置因此为0,1和2.

修改您的循环以从for(int i=0; i<6; ++i)运行,更改循环条件以查找i<3,然后将arr2的索引更改为i-3。< / p>

您的循环将按如下方式运行:

i=0: enter number for first, stored in arr1[0]
i=1: enter number for first, stored in arr1[1]
i=2: enter number for first, stored in arr1[2]
i=3: enter number for second, stored in arr2[0]
i=4: enter number for second, stored in arr2[1]
i=5: enter number for second, stored in arr2[2]