数组初始化函数
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);
传递指针的地址,避免报错
我在玩 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);
传递指针的地址,避免报错