1

我写了以下一段代码

#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;
}

temp运行它会产生 seg 错误,那么在函数本地函数内部发生的内存分配是否是函数?从返回时内存被释放temp?我知道,要解决这个问题,我需要将指针传递给指针ptr,但是,为什么这东西到底行不通?

4

5 回答 5

2

想想这段代码

void temp(int x)
{
    x = 2;
}

int main()
{
    int y = 3;
    temp(y);
    cout << y << '\n';
}

输出将是2什么3?当然是三个。现在这个和你的例子有什么区别?什么都没有。除非您使用引用,否则 C++ 中的所有内容都是按值传递的。x副本y所以改动x 永远不会影响y。无论涉及的类型如何,整数都是如此,指针也是如此。

于 2013-05-09T13:46:48.517 回答
2

C++ 答案:

您正在按值传递int*参数temp。这意味着您正在复制ptr到函数中,并且指针x是一个完全独立的对象。然后将结果分配new int[2]给此副本,但ptrinmain不受影响。为了能够修改作为参数传递的指针,您需要通过引用来获取它:

void temp (int*& x)
{ 
  // ...
}

这意味着xnow 指的是作为参数传递的指针。这里的替代解决方案是返回一个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.

于 2013-05-09T13:42:47.997 回答
2

要在 C 中更改函数中的某些内容,您需要传递一个指向它的指针。在这种情况下,你想改变一个指针,所以你需要一个指向指针的指针:

void temp (int** x)

然后在*x你现在拥有的函数中使用x(你将需要(*x)[n]*x[n]意味着别的东西)

然后调用temp

temp(&ptr);

这应该在 C 中解决它,并将在 C++ 中工作。

在 C++ 中,您还可以传递对指针的引用:

 void temp(int*&x)

这将允许您已经使用的语法保持不变。

于 2013-05-09T13:44:20.003 回答
1
int *ptr;

您在这里创建了一个自动变量并将其传递给

temp(ptr);

这是通过副本传递的,因此x将获得的值ptrx范围在temp函数内。它是那个范围内的一个自动变量。当你从temp它返回时,它的值就丢失了。现在,分配和指向的内存x 绝不会反映ptr在 main 中。(他们没有连接

你需要做temp(int*& ptr)即通过引用传递。或者temp(int** ptr)即通过地址传递

注意:您的内存泄漏temp

于 2013-05-09T13:45:14.250 回答
0

您需要传递 ** 因为您在函数内部分配 x 。

于 2013-05-09T13:42:59.800 回答