2015-10-20 196 views
1

我在玩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,但我想知道为什么这不起作用:)

+0

对于这个问题,它在删除[]功能崩溃也与错误文本“指针贝ng释放没有被分配“ –

+1

通过值传递你的'array'指针到你的函数 - 所以当你给它分配'new int [size]'时,main中的数组保持不变。 – melak47

+1

@MadsMarquart嗯,我很确定我们有这个问题的副本,我看到它每月询问约3-5次。虽然可能有太多重复,但我们没有真正的规范问答。 –

回答

15

当您通过array的功能,该指针的一份拷贝。当您将new int[size];指定为array时,您将其实际分配给参数,这是我正在讨论的副本。要真正修改main中定义的array,请使用参考。该函数的定义更改为

void initialize(int*& array, int size) 

或返回指针像

int* initialize(int size) 

,并再次尝试。


我推荐的第二种方法由于其较高的表现力:像

initialize(array, 3); 

如果array被修改与否不明确。 OTOH,

int* array = initialize(3); 

确实。


由@Jack在评论中所指出这个答案

+3

或者如果您没有任何特定目的通过引用设置现有指针,则直接将签名更改为“int * initialize(int size)”。 – Jack

+0

不错,帮助,谢谢:) –

+0

@Jack哦,是的,当然。编辑它在 – Downvoter

0

为什么程序失败的原因是因为你想要的内存初始化函数和函数外被分配在该内存上运行。

只需从你的函数,这样它看起来像这样删除声明...

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

......那么,做你分配在主,只是在函数调用前...

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

initialize(array, size); 
0

传递指针的地址,以避免该错误消息

+0

问题是为什么它不起作用。 – Djizeus