我想通过引用将数组传递给函数。该函数将动态分配元素。
此代码向我显示错误消息:access violation
#include <iostream>
using namespace std;
void func(int* ptr)
{
ptr = new int[2];
ptr[0] = 1;
ptr[1] = 2;
}
void main()
{
int* arr = 0;
func(arr);
cout << arr[0] << endl; // error here
}
答案 0 :(得分:3)
C ++按值传递参数。如果你想通过引用传递int
指针,你需要告诉C ++类型是&#34;引用指向int
&#34;:int*&
的指针。
因此,你的函数原型应该是
void func(int*& ptr);
请注意,您仍然没有处理指针或对数组的引用,而是指向第一个元素的指针,该元素很接近但不相同。
如果您真的想通过引用传递大小为2
的数组,那么您的函数原型将如下所示:
void func(int(&my_array)[2]);
答案 1 :(得分:0)
首先,函数main应具有返回类型int
。
至于你的问题,你要么必须通过引用传递指针,要么将指针传递给指针。或者你可以简单地从函数返回指针。
这是一个展示三种方法的示范程序。考虑到您可以使用智能指针std::unique_ptr
。
#include <iostream>
int * func()
{
int *ptr = new int[2];
ptr[0] = 1;
ptr[1] = 2;
return ptr;
}
void func( int **ptr )
{
delete [] *ptr;
*ptr = new int[2];
( *ptr )[0] = 3;
( *ptr )[1] = 4;
}
void func( int * &ptr )
{
delete [] ptr;
ptr = new int[2];
ptr[0] = 5;
ptr[1] = 6;
}
int main()
{
int *arr = func();
std::cout << arr[0] << ", " << arr[1] << std::endl;
func( &arr );
std::cout << arr[0] << ", " << arr[1] << std::endl;
func( arr );
std::cout << arr[0] << ", " << arr[1] << std::endl;
delete [] arr;
}
还有一个使用std::unique_ptr
#include <iostream>
#include <memory>
std::unique_ptr<int[]> func()
{
std::unique_ptr<int[]> p( new int[2] );
p[0] = 1;
p[1] = 2;
return p;
}
void func( std::unique_ptr<int[]> &p )
{
p.reset( new int[2] );
p[0] = 3;
p[1] = 4;
}
int main()
{
std::unique_ptr<int[]> p = func();
std::cout << p[0] << ", " << p[1] << std::endl;
func( p );
std::cout << p[0] << ", " << p[1] << std::endl;
}
正如您在本案中所看到的,您无需担心调用运算符delete []