更改引用

时间:2015-11-29 12:55:00

标签: c++ pointers pass-by-reference

我有这个奇怪的问题。我正在考虑通过引用传递指针的示例,所以如果我更改参数的指针地址,初始指针也应该更改地址。确实会发生这种情况。 但是,main方法中a的值将具有一些随机值,而不是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;

}

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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;
}
相关问题