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

时间:2015-03-13 18:15:18

标签: c++ syntax

这是我的代码

#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.我该如何解决这个问题?

4 个答案:

答案 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应指向数组,而不是单个整数。

正如其他人指出的那样,你也会通过初始化并重新分配内存来泄漏记忆。