将指针传递给接收引用的函数?

时间:2014-03-14 14:47:32

标签: c++ pointers reference segmentation-fault

我有一个类似的功能:

#include <iostream>
#include <string>
void increaseRef(int& x) {
    x += 3;
    std::cout << x << std::endl;
}

现在我有一个应该传递给这个函数的指针,我可以顺从它:

int main(int argc, char const* argv[])
{
    int* x;
    *x = 3;
    increaseRef(*x);
    return 0;
}

或不:

int main(int argc, char const* argv[])
{
    int* x;
    *x = 3;
    increaseRef(x);
    return 0;
}

在第二种情况下,我收到了一个错误:

main.cpp:15:15: error: invalid initialization of reference of type ‘int&’ from expression of type ‘int*’
  increaseRef(x);

在第一种情况下,我遇到了一个段错误。

2 个答案:

答案 0 :(得分:4)

首先,你不能这样做:

int* x;
*x = 3;

因为x没有指向有效的int。取消引用它们未定义的行为

你可以这样做:

int y = 3;
int* x = &y;

然后你可以将*x传递给函数。

increaseRef(*x);

答案 1 :(得分:3)

编辑完成后,我看到了你的观点。

在第二种情况下,您引用引用本身。 换句话说,您为函数提供了&(int*)而不是&(int)

否则:

您没有为指针分配任何内存。

在取消引用指针之前,需要调用malloc()或new()。

尝试

int *x=new int;
*x=3;
increaseRef(*x);
delete x; //and don't forget to delete your pointers, or you will leak memory.
return 0;

您也可以通过定义局部变量将分配传递给c ++,如@juanchopanza所述。这样,内存将在返回时自动释放(并且变量将在堆栈上创建),缺点是在定义给定变量的函数返回后,您的指针将无效,如果您在函数外部取消引用它,你会得到一个段错误。