我编写了这个简单的函数来学习 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/