数组初始化函数

Array initialization functions

我在玩 C++ 时偶然发现了这个问题。我试图在堆上初始化一个数组指针,它在 initialize() 内部工作,输出 69,但在 main() 中,它因错误 [=14] 而崩溃=].

#include <iostream>

void initialize(int* array, int size) {
    array = new int[size];

    // Testing
    array[2] = 69;
    std::cout << array[2] << std::endl; // Works fine
}

int main() {

    int size = 3;
    int* array;

    // Initializing
    initialize(array, size);

    // Testing
    std::cout << array[2] << std::endl; // Crash, EXC_BAD_ACCESS

    // Cleanup
    delete[] array;
    array = nullptr;


    return EXIT_SUCCESS;
}

请帮我理解这个问题。

是的,我知道我应该使用 std::vector 但我想了解为什么这不起作用:)

当您将 array 传递给函数时,会生成该指针的副本。当您将 new int[size]; 分配给 array 时,您实际上将其分配给了参数,也就是我所说的副本。要真正修改 main 中定义的 array,请使用引用。将函数的定义改为

void initialize(int*& array, int size)

或return指针如1

int* initialize(int size)

再试一次。


我推荐第二种方法,因为它的表现力更高:类似于

initialize(array, 3);

不清楚array是否被修改。哦,

int* array = initialize(3);

会。


1 如@Jack 在此答案的评论中所述

程序失败的原因是因为你想在初始化函数之外分配内存,并在该内存上进行操作。

只需从您的函数中删除 new 语句,使其看起来像这样...

void initialize(int* array, int size) {
        for (int i = 0; i < size; i++) {
        cout << array[i] << " ";
    }
}

...然后,在 main 中和函数调用之前进行分配...

int size = 3;
int* array = new int [size];

initialize(array, size);

传递指针的地址,避免报错