函数中创建c++数组的行为

Behavior of C++ array created in function

本文关键字:数组 c++ 创建 函数      更新时间:2023-10-16

我写了这个简单的函数来学习c++中的数组(我使用CERN的ROOT作为c++编译器):

int** vec() {
  int n = 2;
  int m = 3;
  int *pointer[m];                                                                                                                              
  for (int i=0; i<m; i++) {
    pointer[i] = new int[n];
  }
  for (int i=0; i<m; i++) {
    for (int j=0; j<n; j++) {
      pointer[i][j] = -1;
    }
  }
  return pointer;
}

编译代码后,我保存为test.C,我创建了两个指向两个数组的指针,在我看来是相同的方式,但结果不同。第一个是完全按照我期望的两种方法工作:

root [0] .L test.C+
root [1] 
root [1] int** mat1;
root [2] int** mat2;
root [3] mat1 = vec();
root [4] mat2 = vec();
root [5] mat1[0][0]
(int)(-1)
root [6] mat2[0][0]
(int)(-1)

好吧,没什么好奇怪的。但是,如果在到达mat2之前对mat1执行所有操作,则会得到以下非常不同的结果:

root [0] .L test.C+
root [1] 
root [1] int** mat1;
root [2] mat1 = vec();
root [3] mat1[0][0]
(int)(-460363344)
root [4] 
root [4] int** mat2;
root [5] mat2 = vec();
root [6] mat2[0][0]
(int)(-1)

在这种情况下,就mat1而言,我的函数似乎没有工作。谁能告诉我这是怎么回事?

我看到了以下问题:

问题1

int *pointer[m];

不是合法的c++代码。

问题2

当你执行

return pointer;

返回一个指向内存的指针,该指针在函数返回后无效。

简单的修复方法是替换 行
int *pointer[m];

int ** pointer =  new int*[m];