8
#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 行。这是为什么呢?

4

4 回答 4

9

是的,这些是悬空指针,您遇到了未定义的行为。

您不能取消引用指向您不拥有的内存的指针:

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;
}

没有指针:)

于 2012-07-27T17:09:00.030 回答
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;
}
于 2012-07-27T17:11:52.850 回答
2

您拥有的代码假设没有存储在 p 的东西。

这是你想做的吗?

int a=5;
int *p,*q;

p = &a;
q = p;  //line 6

cout<<(*p)<<p<<(*q)<<q;

在上面的代码中,在程序的最后,p和q指向同一个地址——整数a的存放地址

于 2012-07-27T17:12:36.123 回答
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

于 2012-07-27T17:48:20.027 回答