将指针传递给C ++中的函数

时间:2013-05-09 13:40:49

标签: c++ pointers

我写了以下一段代码

#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,但是,为什么这个东西不能正常工作呢?

5 个答案:

答案 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';
}

输出结果为23?当然是三个。现在这和你的例子有什么区别?什么都没有。除非你使用引用,否则C ++中的所有内容都是按值传递的。 xy副本,因此对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。