我有这个奇怪的问题。我正在考虑通过引用传递指针的示例,所以如果我更改参数的指针地址,初始指针也应该更改地址。确实会发生这种情况。
但是,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;
}
答案 0 :(得分:3)
这是未定义的行为,因为您访问已经消失的局部变量。
尝试在static
之前添加int q = 3;
并将变量设为静态,以便变量从函数返回时不会消失。
另外,请不要通过为a
分配一些缓冲区并将其丢弃来导致内存泄漏!
答案 1 :(得分:1)
q
是changePointer
内的局部变量,因此当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;
}