C++ 数组溢出c++;(在arr[0]处)?
好的,昨晚我教了我妹妹一些基本的代码,如何读取输入,将其放入数组并打印到屏幕上。代码如下:C++ 数组溢出c++;(在arr[0]处)?,c++,arrays,C++,Arrays,好的,昨晚我教了我妹妹一些基本的代码,如何读取输入,将其放入数组并打印到屏幕上。代码如下: int main() { int N; // size of array cin >> N; int arr[N]; for(int i = 1; i<= N; i++) { cin >> arr[i]; } for(int i = 0; i<N; i++) { cout <&
int main() {
int N; // size of array
cin >> N;
int arr[N];
for(int i = 1; i<= N; i++) {
cin >> arr[i];
}
for(int i = 0; i<N; i++) {
cout << arr[i] << endl;
}
return 0;
}
我不知道为什么会发生这种情况,我试图检查代码,但对我来说似乎很简单而且已经正确了。首先要注意的是dasblinkenlight在他的回答中已经提到,可变长度数组是一种语言扩展 那么您应该认为数组是基于零索引的。这意味着什么?让我们考虑一个大小为4的数组,表示为<代码> ARR < /代码>。然后它的元素可以访问为
arr[0]
,arr[1]
,arr[2]
和arr[3]
。那么,当您运行第一个循环时会发生什么
for(int i = 1; i<= N; i++) {
cin >> arr[i];
}
首先要注意的是dasblinkenlight在他的回答中已经提到,可变长度数组是一种语言扩展 那么您应该认为数组是基于零索引的。这意味着什么?让我们考虑一个大小为4的数组,表示为<代码> ARR < /代码>。然后它的元素可以访问为
arr[0]
,arr[1]
,arr[2]
和arr[3]
。那么,当您运行第一个循环时会发生什么
for(int i = 1; i<= N; i++) {
cin >> arr[i];
}
首先,C++不支持可变长度数组,如果数组声明为n个元素,则索引的有效范围为<代码> [0,n-1 ] < /代码> 您可以自己动态分配所需大小的数组,也可以使用标准容器
std::vector
例如,使用std::vector
可以编写
#include <iostream>
#include <vector>
int main()
{
unsigned int n = 0;
std::cout << "Enter number of elements: ";
std::cin >> n;
std::vector<int> v( n );
std::cout << "Enter " << n << " elements: ";
for ( int &x : v ) std::cin >> x;
std::cout << "\nThe array is ";
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
首先,C++不支持可变长度数组,如果数组声明为n个元素,则索引的有效范围为<代码> [0,n-1 ] < /代码> 您可以自己动态分配所需大小的数组,也可以使用标准容器
std::vector
例如,使用std::vector
可以编写
#include <iostream>
#include <vector>
int main()
{
unsigned int n = 0;
std::cout << "Enter number of elements: ";
std::cin >> n;
std::vector<int> v( n );
std::cout << "Enter " << n << " elements: ";
for ( int &x : v ) std::cin >> x;
std::cout << "\nThe array is ";
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
<>你的代码不是有效的C++,因为可变长度数组是语言扩展。
这部分超出了我们的思路,考虑在第一个循环的最后一步中发生了什么:你正在访问一个元素,它超出了数组的末尾,这是未定义的行为。
第二个循环是正确的,所以你需要做的只是纠正第一个循环的头与第二个循环的头匹配。
你的代码不是有效的C++,因为可变长度数组是语言扩展。这部分超出了我们的思路,考虑在第一个循环的最后一步中发生了什么:你正在访问一个元素,它超出了数组的末尾,这是未定义的行为。
但是,您的第二个循环是正确的,因此您所需要做的就是更正第一个循环的头以匹配第二个循环的头。N个元素的数组具有从0到N-1的索引(因此:N-1-0+1=N个元素,一些数学计算)
所以要解决这个问题:
for(int i=1;iN个元素的数组的索引从0到N-1(因此:N-1-0+1=N个元素,一些数学计算)
因此,请修复以下问题:iTi=1;iLaxDe指标起始于0,不是1。可变长度数组不是标准C++,不是便携式的。建议使用“<代码> STD::vector < /Cord>”。远离可变长度数组。使用<代码> STD::向量< /代码>。使用<代码> STD::vector < /代码>不仅使程序标准C++,您还有机会检查YO。您自己的错误使用at()谢谢,我现在意识到了错误,MeaLoad指数从0开始,而不是1。可变长度数组不是标准C++,不是可移植的。我建议使用<代码>:STD::向量< /代码>。远离可变长度数组。使用<代码> STD::向量< /代码>。使用<代码> STD::向量< /代码>不仅使程序变为程序。标准C++,你有机会使用<代码>()来检查自己的错误谢谢,我现在意识到了错误,我有多么愚蠢。C++中没有任何检查数组长度的方法,你可以做这样的事情。例如,如果你在C或java中尝试过,那么你就可以得到一个索引范围之外的异常。< /C>纯数组,当然,如果OP想要保护的话,请不要使用。在开发过程中,他们可以使用std::array
并使用.at(i)
进行索引,这将引发类似的异常。或者,更好的方法是,使用std::array
的“调试模式”版本,就像在各种编译器中一样,它检查操作符[]
,因此您不必使用s/\.at(\(\d*\)/[\1]在发布时,我们通常应该澄清上面提到的所有内容也适用于<代码> STD::vector < /C++ >,它可以被认为是动态大小的等价于<代码> STD::数组< /COD>,因此,正如弗拉德和PaulM所指出的,这里可能更相关。你可以做这样的事情。例如,如果你在C#或Java中尝试过这一点,你会得到一个索引超出范围的异常。
普通数组,当然。但是如果OP想在开发过程中防止这样的事情,他们可以使用std::array
和索引。at(i)
,它会引发类似的异常。或者,更好的方法是,在各种编译器中使用“调试模式”版本的std::array
,它检查运算符[]
,因此您不必在(\(\d*\)/[\1]/g
在发布时,正如我们通常应该澄清的那样,我上面所说的一切也适用于std::vector
,它可以被认为是std::array
的动态大小等价物,因此,正如Vlad和PaulM所指出的,在这里可能更相关。这假设OP不想cin
到arr[0]
,上下文建议为false。这假设OP不想cin
到arr[0]
,其中
Enter number of elements: 10
Enter 10 elements: 0 1 2 3 4 5 6 7 8 9
The array is 0 1 2 3 4 5 6 7 8 9