我需要在两个不同的函数中访问动态数组。在一个中进行的更改需要转移到另一个。
这些是功能:
void populate(int size, int *ptr)
{
ptr = new int[size];
for (int i = 0; i < size; i++)
{
ptr[i] = rand() % 51;
}
}
void display(int size, int *ptr)
{
for (int i=0; i < size; i++)
{
cout << ptr[i] << endl;
}
}
它在main中被称为
int* ptr = NULL;
答案 0 :(得分:5)
在populate
中,您试图将指向传递给函数的指针指向动态分配的数组。但是你通过 value 传递指针。这对调用方没有影响,导致内存泄漏。您需要通过引用传递指针:
void populate(int size, int*& ptr)
^
或将其退回
int* populate(int size)
{
int* ptr = new int[size];
....
return ptr;
}
但最简单,最安全的做法是使用std::vector<int>
代替这两种功能。例如
std::vector<int> populate(size_t size)
{
std::vector<int> v(size);
for (auto& i : v)
{
i = rand() % 51;
}
return v;
}
void display(const std::vector<int>& v)
{
for (auto i : v)
{
std::cout << ptr[i] << std::endl;
}
}
这样,很明显返回了什么,调用者不必阅读他们是否必须管理原始指针所指向的资源。
请注意,调用std::generate
可以取代populate
,std::copy
可以调用display
。
答案 1 :(得分:1)
您必须记住,在将参数传递给函数时,它们会按值传递,这意味着它们会被复制。因此,当您将指针传递给函数时,指针会被复制,当您修改指针时(例如ptr = new int[size]
),您只需修改本地副本。
在C ++中,您可以通过引用传递参数,这意味着您可以修改参数,它们的更改将反映在调用函数中:
void populate(int size, int*& ptr)
答案 2 :(得分:0)
一个简单的解决方案是让第一个函数返回指针并将其存储在另一个变量中。然后,您可以将其发送到第二个功能。
答案 3 :(得分:0)
通常当您需要将指针传递给执行指针初始化的函数时,您可以将p * ointer传递给指针 *或者函数返回指针。
最简单的方法是简单地从填充函数返回一个指针:
int* populate(int size, int *ptr)
{
ptr = new int[size];
for (int i = 0; i < size; i++)
{
ptr[i] = rand() % 51;
}
return ptr;
}
int*p = populate(N,p);
display(int size, int *ptr)
{
for (int i=0; i < size; i++)
{
cout << ptr[i] << endl;
}
}
简单地传递指针不起作用的原因是指针是按值传递的,这意味着指针的本地副本是在函数中本地创建的;退出函数时正在初始化和销毁本地副本