C ++ - 使用指针表示法初始化2D数组

时间:2016-03-20 20:58:37

标签: c++ arrays pointers srand

我正在使用C ++编写2D数组。我在连接数组和指针的概念时遇到了麻烦。我知道它们在内存分配和访问元素方面是相关的。例如

int *arr;
int num = arr + 1*sizeof(int);

相同
int arr[];
int num = arr[1];

我正在尝试在2D数组和指针之间找到相同的连接 这是我的代码

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

当我编译它时,它编译。当我尝试运行它时,我得到一个段错误。有人可以指出我的代码中的错误吗?

非常感谢

3 个答案:

答案 0 :(得分:3)

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;

此外,

  

我正在使用C ++编写2D数组。我无法连接   数组和指针的概念。我知道他们是相关的   内存分配和访问元素。例如

     

int * arr; int num = arr + 1 * sizeof(int);

     

相同      

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

答案 1 :(得分: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;

答案 2 :(得分:1)

int ** ptrptrint arr[X][Y]之间的一个重要区别是ptrptr是指向int指针的指针,因此它可以保存int的可变长度指针,每个指针可以表示不同大小的数组,如:

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变量,数组占用了连续的内存,因此可以将其显示为矩形,因此请将其视为每行必须具有相同数量的元素。