C++ 使用指针的2D数组的非访问冲突

C++ 使用指针的2D数组的非访问冲突,c++,pointers,multidimensional-array,C++,Pointers,Multidimensional Array,我正在尝试使用指针创建二维动态数组: int** Grid; Grid = new int*[5]; for (int i=0;i<5;i++) { Grid[i] = new int[5]; } std::cout << Grid[4][300] << std::endl; // output: -17891602 std::cout << Grid[5][0] << std::endl; // access violati

我正在尝试使用指针创建二维动态数组:

int** Grid;
Grid = new int*[5];
for (int i=0;i<5;i++)   { Grid[i] = new int[5]; }
std::cout << Grid[4][300] << std::endl;   // output: -17891602
std::cout << Grid[5][0] << std::endl;     // access violation
int**Grid;
网格=新整数*[5];

for(int i=0;i您从未初始化网格[5],在for循环中,您检查了
i<5

如果i小于5,则它将永远不会在for循环中用作5。请记住数组将0计为一个位置。这意味着
int arr[5]
只能用0-4进行索引,任何或多或少的内容都会导致访问冲突


[300]
之所以没有抛出访问冲突,是因为索引是指针,而不是定义的数组



也不要忘记在数组中初始化值(最可能是0)。你可能不希望出现意外的数字,如“代码> -1994021”/Cord->显示在你的数据中。
很好地做到这一点。C++和C++中的< /P> < P>没有编译错误和运行时错误,如果你试图访问比声明的
更大的索引。 例如

int a[10];

std::cout问题是数组也计数为0。因此数组中的第一个内存空间将是[0][0],前提是使用(int i=0;i

考虑以下代码:

#include <iostream>

using namespace std;

int main () {
    int Size = 5;
    int **Grid;
    Grid = new int* [Size];
    for (int i = 0; i < Size; ++i)
        Grid[i] = new int [Size];

    for (int i = 0; i < Size; ++i)
        for (int j = 0; j < Size; ++j)
            cin >> Grid[i][j];

    cout << Grid[4][4];
    return 0;
}
还要记住,在动态分配任何类型的数组时,还必须提供delete[]

因此,我放置的代码正确地如下所示:

#include <iostream>

using namespace std;

int main () {
    int Size = 5;
    int **Grid;
    Grid = new int* [Size];
    for (int i = 0; i < Size; ++i)
        Grid[i] = new int [Size];

    for (int i = 0; i < Size; ++i)
        for (int j = 0; j < Size; ++j)
            cin >> Grid[i][j];

    cout << Grid[4][4];

    for (int i = 0; i < Size; ++i)
        delete [] Grid[i];
    delete [] Grid;
    return 0;
}
#包括
使用名称空间std;
int main(){
int Size=5;
国际**网格;
网格=新整数*[大小];
对于(int i=0;i>网格[i][j];
库特


我希望这能为您澄清一些事情。祝您好运!

是的,我期待网格[5][0]出现异常。我真正不明白的是为什么网格[4][300]不出现异常。我的后续问题是如何定义数组?我不能使用静态数组,因为我需要由用户端确定数组的大小。如果是由用户端确定的,则只需保留长度。如果尝试使用
Grid[4][300]
且300超出长度,则请自行出错。“原因是[300]不是因为你索引的是一个指针,而不是一个已定义的数组,所以不会抛出访问冲突。“@twenty49这是我的荣幸。
#include <iostream>

using namespace std;

int main () {
    int Size = 5;
    int **Grid;
    Grid = new int* [Size];
    for (int i = 0; i < Size; ++i)
        Grid[i] = new int [Size];

    for (int i = 0; i < Size; ++i)
        for (int j = 0; j < Size; ++j)
            cin >> Grid[i][j];

    cout << Grid[4][4];

    for (int i = 0; i < Size; ++i)
        delete [] Grid[i];
    delete [] Grid;
    return 0;
}