C++ 更改通过引用传递的指针的值
我有个奇怪的问题。我在考虑下面的例子,我通过引用传递一个指针,所以如果我更改参数的指针地址,初始指针也应该更改地址。这确实发生了。 但是,main方法中a的值将有一些随机值,而不是3作为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 << "
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::coutq
是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::coutq
是作用域变量,当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::coutq
是作用域变量,当changePointer
返回=>a
然后指向释放的内存=>a
是无效的指针=>*a
是未定义的行为。Writedelete p;p=new int(3)和delete
p`inmain
。啊,这是有道理的。ThanksIt也是的重复,q
是作用域变量,当changePointer
返回=>a
然后指向释放的内存=>a
是无效指针=>*a
是未定义的行为时,它会被销毁。Writedelete p;p=new int(3)
和delete
p`inmain
。啊,对了,这很有意义。谢谢,这也是,