初始化动态分配的数组时出错

Error in initializing a dynamically allocated array

本文关键字:出错 数组 动态分配 初始化      更新时间:2023-10-16

这是我的代码

#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 也是垃圾:您传递给Initializen值无关紧要,因为每次您通过该函数时,该函数都会分配并泄漏一个新数组。

要修复此程序,请更改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应指向数组,而不是单个整数。

正如其他人指出的那样,您还通过初始化它然后重新分配给它来泄漏内存。