我允许用户输入我的数组的迭代次数。我试图了解当你超过10的最大大小并输入一个高于该数字的数字时会发生什么,例如255.然后用户可以输入每次迭代的数字。该程序允许一些额外的输入,但在12或13左右崩溃。为什么会发生这种情况?为什么程序不允许指定255次迭代?我相信它必须对c ++中引用内存的方式做些什么,但我不确定。
#include <iostream>
using namespace std;
int main()
{
int nums[20] = { 0 };
int a[10] = { 0 };
cout << a << endl;
cout << nums << endl;
cout << "How many numbers? (max of 10)" << endl;
cin >> nums[0];
for (int i = 0; i < nums[0]; i++)
{
cout << "Enter number " << i << endl;
cin >> a[i];
}
// Output the numbers entered
for (int i = 0; i < 10; i++)
cout << a[i] << endl;
return 0;
}
}
如果这个程序运行,我们输入255表示有多少个数字,每个数字输入9个,那么程序会这样做:
How many numbers? (max of 10)
255
Enter number 0
9
Enter number 1
9
Enter number 2
9
Enter number 3
9
Enter number 4
9
Enter number 5
9
Enter number 6
9
Enter number 7
9
Enter number 8
9
Enter number 9
9
Enter number 10
9
Enter number 11
9
Enter number 12
9
//(program crashes somewhere around here.)
答案 0 :(得分:1)
此:
int a[10] = { 0 };
cin >> a[i];
仅在i
介于0和9之间时才有效。除此之外的任何值都是“未定义的行为”,这意味着程序可以执行任何操作。包括不会因为第一次违规而崩溃,然后崩溃。包括立即崩溃。包括永不崩溃。或其他任何东西。这是未定义的。
答案 1 :(得分:0)
您在代码中所做的是移动到数组a []的有效范围之外。正如您所经历的那样,这会转移到未定义的行为。即使你的程序在输入第12个数字后崩溃,即使进入[10]也是不正确的。未定义行为的含义是机器之间的错误类型不同;另一台机器在撞击之前可能需要达到[16],或者可能只是简单地,正确地停止并在[10]处崩溃。这就是为什么它被称为未定义的行为;知道它迟早会崩溃,但没有看到固定的模式。
这种未定义的行为源于您的计算机内存。每次重新运行程序时,都会在本地内存中为阵列分配不同的内存块。这意味着周围的内存块可以填充或未填充。因此,如果您的代码有问题并且您将数组的索引扩展到其范围之外,则它可能适用于接下来的几个内存字节(如果它们为空且可访问)。但是,只要它们达到一个完整的字节,或者如果该存储器字节不可访问,那么它将导致程序崩溃。此外,由于该阵列在内存中的位置可以随着程序的重新运行而改变,&#34;多远&#34;它会在崩溃之前完全取决于相邻的内存字节。
这是很多理论,所以如果我偶然出错了,请告诉我。如需进一步阅读,请访问Wikipedia
答案 2 :(得分:0)
对此的简单回答是,您的程序正在尝试写入尚未分配的位。它将执行此操作,直到它尝试写入另一个进程正在使用的位。这就是崩溃的原因,因为这个位不可用。你似乎只是在12或13左右打“已经在使用中”。