数组初始化函数

Mad*_*art 2 c++ arrays pointers function new-operator

我正在玩C++,我偶然发现了这个问题.我正在尝试初始化堆上的数组指针,并且它initialize()在输出的内部工作69,但是在main()它中,它与错误一起崩溃EXC_BAD_ACCESS.

#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;
}
Run Code Online (Sandbox Code Playgroud)

请帮我理解这个问题.

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

cad*_*luk 16

传递array给函数时,会生成该指针的副本.当你指定new int[size];array,你实际上将它分配给参数,这是我正在谈论的副本.要真正修改array定义的main,请使用引用.将函数的定义更改为

void initialize(int*& array, int size)
Run Code Online (Sandbox Code Playgroud)

或返回指针,如1

int* initialize(int size)
Run Code Online (Sandbox Code Playgroud)

然后再试一次.


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

initialize(array, 3);
Run Code Online (Sandbox Code Playgroud)

不清楚是否array被修改.OTOH,

int* array = initialize(3);
Run Code Online (Sandbox Code Playgroud)

确实.


@Jack在对此答案的评论中指出1

  • 或者,如果没有任何特定目的通过引用设置现有指针,则直接将签名更改为"int*initialize(int size)`. (3认同)