函数中创建c++数组的行为
Behavior of C++ array created in function
我写了这个简单的函数来学习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];
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '