我在A类中定义了一个函数getArray(),如下所示:
void getArray(int * arr){
arr = new int[10];
arr[0] = 1;
}
我想在getArray()中修改指针arr。我在main()中调用了函数getArray(),如下所示:
int main(){
A obj;
int * arr = new int[2];
obj.getArray(arr);
cout<<arr[0]<<endl;
delete[] arr;
}
但是当我执行main()时,arr [0]的输出为0,而不是1.为什么?
实际上,我想为指针arr分配新内存,并在函数getArray()中设置数组的内容。然后我想获取数组的内容并在main()中释放指针arr。但我不知道该怎么做。
答案 0 :(得分:3)
未修改数组,因为您在getArray
中重新分配了变量。这段代码可以使用:
void getArray(int * arr){
arr[0] = 1;
}
您应该决定分配数组内存的位置。如果答案在main
,那么您应该在此函数结束时解除分配:
int main(){
A obj;
int * arr = new int[2];
obj.getArray(arr);
cout<<arr[0]<<endl;
delete[] arr;
}
如果数组应该在getArray
中创建,那么你不需要在main中进行分配,你应该从getArray
返回新指针,并且不要忘记解除分配:
int * getArray(){
int * arr = new int[10];
arr[0] = 1;
return arr;
}
int main(){
A obj;
int * arr = obj.getArray();
cout<<arr[0]<<endl;
delete[] arr;
}
答案 1 :(得分:2)
因为您使用指针的副本调用getArray
。
您可以按值或按引用调用函数。使用指针看起来像是一个按引用调用,但它是一个按值调用,因为指针只存储一个引用。
你可以使用传递指针by-reference来实现你想要做的事情:void getArray(int *& arr)
。
BTW:我希望这段代码不在生产环境中,因为它有2个内存泄漏。
<强>更新强>
使用std::vector
的示例:
示例1:
#include<iostream>
#include<vector>
struct A
{
void getData(std::vector<int>& v){
v = std::vector<int>(10, 0); //vector with 10 zeros
v[0] = 1;
}
};
void printData(const std::vector<int>& v)
{
std::cout << "v.size() = " << v.size() << std::endl;
for(int value : v)
{
std::cout << value << std::endl;
}
}
int main(){
A obj;
std::vector<int> v;
obj.getData(v);
printData(v);
return 0;
}
示例2:
#include<iostream>
#include<vector>
struct A
{
std::vector<int> getData(){
std::vector<int> v(10, 0); //vector with 10 zeros
v[0] = 1;
return v;
}
};
void printData(const std::vector<int>& v)
{
std::cout << "v.size() = " << v.size() << std::endl;
for(int value : v)
{
std::cout << value << std::endl;
}
}
int main(){
A obj;
std::vector<int> v = obj.getData();
printData(v);
return 0;
}