数组初始化函数

Array initialization functions

本文关键字:函数 初始化 数组      更新时间:2023-10-16

我在使用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;
}

请帮助我了解这个问题。

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

当你将array传递给函数时,会生成该指针的副本。当你把new int[size];赋值给array时,你实际上把它赋值给了参数,也就是我刚才说的拷贝。要真正修改main中定义的array,请使用引用。将函数的定义更改为

void initialize(int*& array, int size)

或返回指针,如1

int* initialize(int size)

然后再试一次


我推荐第二种方法,因为它的表达性更高:像

initialize(array, 3);

没有明确array是否被修改。OTOH,

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);

传递指针的地址,以避免出现错误信息