我正在玩C ++,我偶然发现了这个问题。我正在尝试初始化堆上的数组指针,它在initialize()
内部工作,在其中输出69
,但在main()
中,它与错误{{1}崩溃}}
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;
}
,但我想了解为什么这不起作用:)
答案 0 :(得分:16)
将array
传递给函数时,会生成该指针的副本。当您将new int[size];
分配给array
时,您实际将其分配给参数,这是我正在讨论的副本。要真正修改array
中定义的main
,请使用引用。将函数的定义更改为
void initialize(int*& array, int size)
或返回指针,如 1
int* initialize(int size)
再试一次。
我推荐第二种方法,因为它具有更高的表现力:类似
initialize(array, 3);
无法明确array
是否被修改。 OTOH,
int* array = initialize(3);
确实
@Jack在对此答复的评论中指出1
答案 1 :(得分:0)
程序失败的原因是因为您希望在初始化函数之外分配内存以及在该内存上运行的函数。
只需从您的函数中删除 new 语句,使其看起来像这样......
output
...然后,在main函数调用之前进行分配...
&&
答案 2 :(得分:0)
传递指针的地址以避免错误消息