数组初始化函数
Array initialization functions
我在使用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);
传递指针的地址,以避免出现错误信息
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 如何从静态类函数初始化静态类对象
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 使用 c++ 中的函数初始化数组
- 使用 lambda 函数初始化静态数据成员