#include <iostream>
using namespace std;
int main(int argc, char **argv) {
int a=5;
int *p,*q;
*p = a;
*q = *p; //line 6
cout<<*p<<p<<*q<<q;
return 0;
}
此程序挂起。似乎问题在第6行。为什么会这样?
答案 0 :(得分:7)
是的,那些是悬空指针,你正在遇到未定义的行为。
您不能取消引用指向您不拥有的内存的指针:
int* p;
*p; //illegal
int* x = NULL;
*x; //illegal
int* y = new int;
*y; //OK!
正确的版本是:
int main(int argc, char **argv) {
int a=5;
int *p = new int;
int *q = new int;
*p = a;
*q = *p; //line 6
cout<<*p<<p<<*q<<q;
delete p;
delete q;
return 0;
}
或
int main(int argc, char **argv) {
int a=5;
int *p;
int *q;
p = &a;
q = p; //line 6
cout<<*p<<p<<*q<<q;
return 0;
}
更正确的版本:
int main(int argc, char **argv) {
int a=5;
int p,q;
p = a;
q = p; //line 6
cout<<p<<p<<q<<q;
return 0;
}
没有指针:)
答案 1 :(得分:5)
第5行也有问题。你已经声明了指针,但你没有让它们指向任何东西,这不会自动发生。并取消引用未初始化的指针,可能会导致程序崩溃。
这样的事情会更好。
int main(int argc, char **argv) {
int a=5;
int b, c;
int *p,*q;
p = &b; // make p point at b
q = &c; // make q point at c
*p = a;
*q = *p; //line 6
cout<<*p<<p<<*q<<q;
return 0;
}
答案 2 :(得分:2)
您所拥有的代码假定存在于p时的某些内容 没有。
这是你想要做的吗?
int a=5;
int *p,*q;
p = &a;
q = p; //line 6
cout<<(*p)<<p<<(*q)<<q;
在上面的代码中,在程序结束时,p和q指向相同的地址 - 存储整数a的地址
答案 3 :(得分:0)
可以使用另一个变量复制两个指针,如下所示
#include<iostream>
using namespace std;
int main()
{
int *p,*q;
int a = 5;
p = &a;
q = &(*p);
a = 10;
std::cout<<*p<<std::endl;
std::cout<<*q<<std::endl;
}
然而,在上面的例子中,两个指针指向的地址不一样。 这将使指针由变量a确定 在C ++中,另一个好方法是使用引用
int a = 5;
int& p = a;
int& q = p;
std::cout<<p<<std::endl;
std::cout<<q<<std::endl;
std::cout<<&p<<std::endl;
std::cout<<&q<<std::endl;
结果:
5
5
0xbf9e7498
0xbf9e7498