二维数组初始化

时间:2012-09-14 11:14:41

标签: c++ pointers

CASE1:

int nrows=5;
int ncols=10;
int **rowptr;
rowptr=new int*;
for(int rows=0;rows<nrows;rows++) {
  for(int cols=0;cols<ncols;cols++) {
    *rowptr=new int;
  }
}

CASE2:

int nrows=5;
int ncols=10;
int **rowptr;
for(int rows=0;rows<nrows;rows++) {
  rowptr=new int*;
  for(int cols=0;cols<ncols;cols++) {
    *rowptr=new int;
  }
}

我可以使用两种方式插入和打印值。初始化有什么区别?

3 个答案:

答案 0 :(得分:2)

  

有什么区别?

#1只需分配足够的内存来保存整数指针,而不是整数指针数组 #2仅通过覆盖上一次迭代的内存分配导致内存泄漏。

  

我可以使用两种方式插入和打印值

内存泄漏和未定义的行为可能不会在您的程序中产生立即观察到的错误结果,但它们肯定是 Murphy's Law 的好例子。

正确的方法是:

int nrows = 5;
int ncols = 10;

//Allocate enough memory for an array of integer pointers
int **rowptr = new int*[nrows]; 

//loop through the array and create the second dimension
for (int i = 0;i < nrows;i++)
    rowptr[i] = new int[ncols];

答案 1 :(得分:1)

两种情况都有内存泄漏。

初始化这种“2d”数组的正确方法是

int** arr = new int*[nrows];
for (int i = 0; i < nrows; i++)
   arr[i] = new int[ncols];

但请注意,它不是C / C ++定义的二维数组。它可能不会,也可能不会在记忆中连续。此外,访问成员的汇编代码也不同。

在您的情况下,通过索引进行访问等同于*(*(arr+i)+j)

对于2d数组,当*(arr + N_COLS*i + j)是编译时常量时,它是N_COLS

如果你想要一个真正的二维数组,你应该这样做:

int (*arr)[N_COLS] = (int(*)[N_COLS])(new int[N_ROWS * N_COLS])

答案 2 :(得分:0)

您最好使用1d数组来管理2d数组

int **x = new int*[nrows];
x[0] = new int[nrows*ncols];
for (int i = 1; i < nrows; i++)
    x[i] = x[i-1] + ncols;

for (int i = 0; i < nrows; i++)
    for (int j = 0; j < ncols; j++)
        x[i][j] = 0;

delete [] x[0];
delete [] x;