C++ 更改通过引用传递的指针的值

C++ 更改通过引用传递的指针的值,c++,pointers,pass-by-reference,C++,Pointers,Pass By Reference,我有个奇怪的问题。我在考虑下面的例子,我通过引用传递一个指针,所以如果我更改参数的指针地址,初始指针也应该更改地址。这确实发生了。 但是,main方法中a的值将有一些随机值,而不是3作为changePointer中的q变量,我们使用该变量的地址来更改指针a 是有什么愚蠢的事情,还是整个事情都是不明确的行为 #include <iostream> void changePointer(int* &p) { int q = 3; std::cout << "

我有个奇怪的问题。我在考虑下面的例子,我通过引用传递一个指针,所以如果我更改参数的指针地址,初始指针也应该更改地址。这确实发生了。 但是,main方法中a的值将有一些随机值,而不是3作为
changePointer
中的q变量,我们使用该变量的地址来更改指针a

是有什么愚蠢的事情,还是整个事情都是不明确的行为

#include <iostream>

void changePointer(int* &p) {
  int q = 3;
  std::cout << "Address of q: " << &q << std::endl;
  p = &q;
  std::cout << "Value of p: " << *p << std::endl;
}

int main() {
  int* a = new int(4);
  changePointer(a);
  std::cout << "Adress of a: " << a << std::endl;
  std::cout << "Value of a: " << *a << std::endl;

}
#包括
无效更改指针(int*&p){
int q=3;

std::cout
q
changePointer
中的一个局部变量,因此当
changePointer
退出时,q的地址包含垃圾。

q
changePointer
中的一个局部变量,因此当
changePointer
退出
q
的地址时包含垃圾。

s未定义的行为,因为您访问的局部变量已消失

尝试在
int q=3;
之前添加
static
,并将变量设置为static,以便变量在从函数返回时不会消失


另外,请不要将一些缓冲区分配给
a
并将其丢弃,从而导致内存泄漏!

这是未定义的行为,因为您访问的局部变量已消失

尝试在
int q=3;
之前添加
static
,并将变量设置为static,以便变量在从函数返回时不会消失


另外,请不要通过向
a
分配一些缓冲区并将其丢弃而导致内存泄漏!

q
是作用域变量,当
changePointer
返回时,它会被破坏。
a
然后指向已释放的内存,因此它是无效指针,取消引用它(
*a
)是未定义的行为

更正代码:

void changePointer(int* &p) {
  int* q = new int(3); // this way q lives until you delete it
  std::cout << "Address of q: " << q << std::endl;
  delete p; // we don't want unfreeable memory
  p = q;
  std::cout << "Value of p: " << *p << std::endl;
}

int main() {
  int* a = new int(4);
  changePointer(a);
  std::cout << "Adress of a: " << a << std::endl;
  std::cout << "Value of a: " << *a << std::endl;
  delete a;
}
void changePointer(int*&p){
int*q=newint(3);//这样q会一直存在,直到删除它为止

std::cout
q
是作用域变量,当
changePointer
返回时,它将被销毁。
a
然后指向释放的内存,因此它是无效的指针,取消引用它(
*a
)是未定义的行为

更正代码:

void changePointer(int* &p) {
  int* q = new int(3); // this way q lives until you delete it
  std::cout << "Address of q: " << q << std::endl;
  delete p; // we don't want unfreeable memory
  p = q;
  std::cout << "Value of p: " << *p << std::endl;
}

int main() {
  int* a = new int(4);
  changePointer(a);
  std::cout << "Adress of a: " << a << std::endl;
  std::cout << "Value of a: " << *a << std::endl;
  delete a;
}
void changePointer(int*&p){
int*q=newint(3);//这样q会一直存在,直到删除它为止

std::cout
q
是作用域变量,当
changePointer
返回=>
a
然后指向释放的内存=>
a
是无效的指针=>
*a
是未定义的行为。Write
delete p;p=new int(3)
delete
p`in
main
。啊,这是有道理的。ThanksIt也是的重复,
q
是作用域变量,当
changePointer
返回=>
a
然后指向释放的内存=>
a
是无效指针=>
*a
是未定义的行为时,它会被销毁。Write
delete p;p=new int(3)
delete
p`in
main
。啊,对了,这很有意义。谢谢,这也是,