初始化动态分配的数组时出错
Error in initializing a dynamically allocated array
这是我的代码
#include <iostream>
using namespace std;
void Initalize(int* p, int n) {
p = new int[n];
for (int i = 0; i < n; ++i) {
p[i] = 5;
}
}
int main() {
int n = 3;
int* p = new int[n];
for (int j = 0; j < 2; ++j)
for (int i = 0; i < n; ++i) {
Initalize(p, n);
p[i] += 5;
}
cout << p[0] << " " << p[1] << " " << p[2] << endl;
return 0;
}
当我运行此代码时,我得到的前两个值是垃圾,最后一个值始终是 10。我该如何解决这个问题?
行Initalize(p, n);
除了泄漏一些内存外没有任何效果。
行p[i] += 5;
具有未定义的行为,因为您正在从未初始化的值读取。
如果你从Initialize
函数中删除了行p = new int[n];
,你的代码就会工作,甚至可能做你所期望的——当然,这取决于你的期望(你为什么要在循环中调用Initialize
?)。
我得到的前两个值是垃圾,最后一个值总是 10
实际上,10 也是垃圾:您传递给Initialize
的n
值无关紧要,因为每次您通过该函数时,该函数都会分配并泄漏一个新数组。
要修复此程序,请更改Initialize
以返回新数组,并从main
中删除初始化以new int[n]
。
int *Initalize(int n) {
int *p = new int[n];
for (int i = 0; i < n; ++i) {
p[i] = 5;
}
return p;
}
...
int *p = Initalize(n);
cout << p[0] << " " << p[1] << " " << p[2] << endl;
p[i] += 5;
cout << p[0] << " " << p[1] << " " << p[2] << endl;
delete[] p;
void Initalize(int* p, int n) {
p = new int[n];
^
|
|
这家伙是罪魁祸首。您无需在此处重新初始化。 删除它,事情就会从这里流出。
您正在初始化数组两次。除非你想要的是二维数组,否则你应该删除它。如果您尝试初始化二维数组,则main
函数中的p
应指向数组,而不是单个整数。
正如其他人指出的那样,您还通过初始化它然后重新分配给它来泄漏内存。
相关文章:
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 将链表转换为指针数组时出错
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 基于数组的列表 - 动态数组创建时出错
- 从斐波那契序列 c++ 中的数组中查找正确的元素时出错
- 分段 使用 MPI_Gather 收集字符数组时出错
- 读取字符串字符时出错 - 对于数组中的字符串值
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 在 c++ 中返回一维数组时出错
- 将 2D 数组传递给 C++ 中的函数时出错
- 在 c++ 上创建动态数组时出错
- 尝试返回指向 Visual Studio 中的动态数组的指针时出错C++
- 将 find_if() 与数组一起使用的代码段中出错
- 在比较特定输入中的程序的数组中出错
- 分段 填充数组时出错
- 数组作为函数参数查找数组长度时出错
- 读取结构数组时出错
- 将数组指针传递到函数时出错
- C++将指针数组传递给函数指针数组时出错
- 在数组中插入数据时出错 - 数组下标'int[int]'的类型无效