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