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;
}