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

Changing the value of a pointer passed by reference

我有一个奇怪的问题。我正在考虑下面的例子,我通过引用传递一个指针,所以如果我改变参数的指针地址,初始指针也应该改变地址。确实发生了这种情况。 但是,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;

}

qchangePointer内部的局部变量,所以当changePointer退出时q的地址包含垃圾。

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

尝试在 int q = 3; 之前添加 static 并使变量成为静态变量,这样变量就不会在函数返回时消失。

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

q 是作用域变量,它在 changePointer returns 时被销毁。 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;
}