这是我的代码
#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.我该如何解决这个问题?
答案 0 :(得分:2)
除了泄漏一些内存之外,行Initalize(p, n);
无效。
行p[i] += 5;
具有未定义的行为,因为您正在读取未初始化的值。
如果您从p = new int[n];
函数中删除了行Initialize
,那么您的代码就可以运行,甚至可能会按照您的期望行事 - 当然,这取决于您的期望(为什么要调用{{1}在循环中?)。
答案 1 :(得分:1)
我得到的前两个值是垃圾,最后一个值总是10
实际上,10也是垃圾:你传递给n
的{{1}}的值是无关紧要的,因为每次你通过函数时,函数会分配并泄漏一个新的数组
要修复此程序,请更改Initialize
以返回新阵列,并从Initialize
中删除new int[n]
的初始化。
main
答案 2 :(得分:0)
void Initalize(int* p, int n) {
p = new int[n];
^
|
|
这家伙是罪魁祸首。你不需要在这里重新初始化。 删除它,事情将从这里流出。
答案 3 :(得分:0)
您正在初始化数组两次。除非你想要的是一个二维数组,否则你应该删除它。如果您尝试初始化二维数组,则p
函数中的main
应指向数组,而不是单个整数。
正如其他人指出的那样,你也会通过初始化并重新分配内存来泄漏记忆。