我写了以下一段代码
#include <iostream>
using namespace std;
void temp (int * x)
{
x=new int [2];
x[0]=1;
x[1]=2;
}
int main()
{
int *ptr;
temp(ptr);
cout<<ptr[0]<<endl;
cout<<ptr[1]<<endl;
return 0;
}
运行它会产生seg错误,内存分配是在函数本地temp
函数内发生的吗?从temp
返回时内存是否已取消分配?我知道,为了解决这个问题,我需要将指针传递给指针ptr
,但是,为什么这个东西不能正常工作呢?
答案 0 :(得分:2)
C ++回答:
您将int*
参数按值传递到temp
。这意味着您正在将ptr
复制到函数中,而指针x
是一个完全独立的对象。然后,您将new int[2]
的结果分配给此副本,但ptr
中的main
不受影响。为了能够修改作为参数传递的指针,您需要通过引用来获取它:
void temp (int*& x)
{
// ...
}
这意味着x
现在引用作为参数传递的指针。这里的替代解决方案是返回int*
代替:
int* temp()
{
int* x = new int [2];
x[0]=1;
x[1]=2;
return x;
}
int main()
{
int *ptr = temp();
// ...
}
但是,temp
的来电者可能不清楚int
对象的所有权。他们需要delete[]
它,但是在界面中没有明确说明。相反,您可以返回std::unique_ptr
。
答案 1 :(得分:2)
要在C中修改函数中的某些内容,需要传递一个指向它的指针。在这种情况下,您想要更改指针,因此您需要指向指针的指针:
void temp (int** x)
然后在函数中使用*x
,您现在拥有x
(您需要(*x)[n]
,因为*x[n]
意味着其他内容)
然后使用:
致电temp
temp(&ptr);
这应该在C中解决,并且可以在C ++中使用。
在C ++中,您还可以传递对指针的引用:
void temp(int*&x)
这将允许您已经使用的语法保持不变。
答案 2 :(得分:2)
考虑一下这段代码
void temp(int x)
{
x = 2;
}
int main()
{
int y = 3;
temp(y);
cout << y << '\n';
}
输出结果为2
或3
?当然是三个。现在这和你的例子有什么区别?什么都没有。除非你使用引用,否则C ++中的所有内容都是按值传递的。 x
是y
的副本,因此对x
永远不会的更改会影响y
。无论涉及哪种类型,它都适用于整数及其指针的真实性,这是正确的。
答案 3 :(得分:1)
int *ptr;
您在此处创建了一个自动变量,并将其传递给
temp(ptr);
这是副本传递,因此x
将获得ptr
的值,x
范围在temp
函数内。它是该范围内的自动变量。当您从temp
返回时,其值将丢失。
现在,x
分配和指向的内存绝不会反映到main中的ptr
。 (他们没有连接)
您需要temp(int*& ptr)
,即通过引用传递。或temp(int** ptr)
即通过地址
注意:temp
答案 4 :(得分:0)
您需要传递**,因为您在函数内部分配了x。