我有一个类似的功能:
#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);
在第一种情况下,我遇到了一个段错误。
答案 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所述。这样,内存将在返回时自动释放(并且变量将在堆栈上创建),缺点是在定义给定变量的函数返回后,您的指针将无效,如果您在函数外部取消引用它,你会得到一个段错误。