Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组溢出c++;(在arr[0]处)?_C++_Arrays - Fatal编程技术网

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