C++ - 使用指针符号初始化二维数组
C++ - Initializing a 2D array with pointer notation
我正在使用 C++ 处理二维数组。我在连接数组和指针的概念时遇到问题。我知道它们在内存分配和访问元素方面是相关的。例如
int *arr;
int num = arr + 1*sizeof(int);
与
相同
int arr[];
int num = arr[1];
我试图找到二维数组和指针之间的相同联系
这是我的代码
void printGrid(int **arr) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cout << setw(3);
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main() {
int **grid;
srand(time(NULL));
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
printGrid(grid);
}
当我编译它时,它编译了。然后当我尝试 运行 它时,出现了段错误。有人可以指出我的代码中的错误吗?
非常感谢
int **grid;
srand(time(NULL));
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
应该为动态数组分配内存的部分在哪里?也可能是因为它的元素?要解决这个问题,您可以做到
// Allocating memory for array and elements
int **grid = new int*[10];
for (int i = 0; i < 10; i++) {
grid[i] = new int[10];
}
// Now fill the array as you had in your code
//
...
// Deletion part
for (int i = 0; i < 10; i++) {
delete[] grid[i];
}
delete[] grid;
此外,
I'm working on 2D array in C++. I'm having trouble connecting the
concepts of arrays and pointers. I know that they are related in terms
of memory allocation and accessing elements. For example
int *arr; int num = arr + 1*sizeof(int);
is the same as
int arr[]; int num = arr[1];
不,它们不一样。这将是相同的:
int x[] = {0, 2, 3};
int *arr = x;
int num = *(arr + 1); //Look up pointer arithmetic; same as num=arr[1];
grid
是一个未初始化的指针。尝试通过该指针存储任何内容将导致未定义的行为,例如分段失败。
您的代码需要如下所示:
grid = new (int*) [10];
for (int i = 0; i < 10; i++) {
grid[i] = new int[10];
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
(你应该delete
完成后分配的内存)
for (int i = 0; i < 10; i++) {
delete[] grid[i];
}
delete[] grid;
int ** ptrptr
和 int arr[X][Y]
的一大区别是 ptrptr
是指向 int
指针的指针,因此它可以容纳 [=13] 的可变长度=] 指针,每个指针可以表示不同大小的数组,如:
ptrptr (ptrptr points to the beginning of three different sized arrays)
▼
address_1: 0 1 2 3
address_2: 4 5
address_3: 6 7 8
对于arr
变量,数组占用的内存是连续的,因此可以形象地看成一个矩形,所以可以想象成每一行的元素个数必须相同。
我正在使用 C++ 处理二维数组。我在连接数组和指针的概念时遇到问题。我知道它们在内存分配和访问元素方面是相关的。例如
int *arr;
int num = arr + 1*sizeof(int);
与
相同int arr[];
int num = arr[1];
我试图找到二维数组和指针之间的相同联系 这是我的代码
void printGrid(int **arr) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cout << setw(3);
cout << arr[i][j] << " ";
}
cout << endl;
}
}
int main() {
int **grid;
srand(time(NULL));
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
printGrid(grid);
}
当我编译它时,它编译了。然后当我尝试 运行 它时,出现了段错误。有人可以指出我的代码中的错误吗?
非常感谢
int **grid;
srand(time(NULL));
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
应该为动态数组分配内存的部分在哪里?也可能是因为它的元素?要解决这个问题,您可以做到
// Allocating memory for array and elements
int **grid = new int*[10];
for (int i = 0; i < 10; i++) {
grid[i] = new int[10];
}
// Now fill the array as you had in your code
//
...
// Deletion part
for (int i = 0; i < 10; i++) {
delete[] grid[i];
}
delete[] grid;
此外,
I'm working on 2D array in C++. I'm having trouble connecting the concepts of arrays and pointers. I know that they are related in terms of memory allocation and accessing elements. For example
int *arr; int num = arr + 1*sizeof(int);
is the same as
int arr[]; int num = arr[1];
不,它们不一样。这将是相同的:
int x[] = {0, 2, 3};
int *arr = x;
int num = *(arr + 1); //Look up pointer arithmetic; same as num=arr[1];
grid
是一个未初始化的指针。尝试通过该指针存储任何内容将导致未定义的行为,例如分段失败。
您的代码需要如下所示:
grid = new (int*) [10];
for (int i = 0; i < 10; i++) {
grid[i] = new int[10];
for (int j = 0; j < 10; j++) {
grid[i][j] = rand() % 11;
}
}
(你应该delete
完成后分配的内存)
for (int i = 0; i < 10; i++) {
delete[] grid[i];
}
delete[] grid;
int ** ptrptr
和 int arr[X][Y]
的一大区别是 ptrptr
是指向 int
指针的指针,因此它可以容纳 [=13] 的可变长度=] 指针,每个指针可以表示不同大小的数组,如:
ptrptr (ptrptr points to the beginning of three different sized arrays)
▼
address_1: 0 1 2 3
address_2: 4 5
address_3: 6 7 8
对于arr
变量,数组占用的内存是连续的,因此可以形象地看成一个矩形,所以可以想象成每一行的元素个数必须相同。