c++ - 在函数中创建的 C++ 数组的行为

标签 c++ arrays function pointers

我编写了这个简单的函数来学习 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 而言,我的功能似乎不起作用。谁能帮助我了解这里发生了什么?

最佳答案

我看到以下问题:

问题一

int *pointer[m];

不是合法的 C++ 代码。

问题2

当你执行

return pointer;

您返回的内存指针在函数返回后无效。

简单的解决方法是更换线

int *pointer[m];

通过

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

关于c++ - 在函数中创建的 C++ 数组的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442339/

相关文章:

function - 用户在 Swift 中定义的 chooseStepFunction() 中的两个箭头的目的是什么?

php - php/mysql 查询的值不正确

c++ - ostream 的重载 << 运算符,用于虚函数

C:在一个数组中切换两个结构

c++ - OO编程问题: Global Object

javascript - 数组在 javascript 中实际上是如何工作的

java - 显示一些按钮取决于Integer中的数字

javascript - javascript 中的搜索功能出错

c++ - 在获取DLL_PROCESS_DETACH之前需要DLL已关闭的通知

c++ - 使用 makefile 默认只编译对象