非法访问空指针问题

#include<iostream>
using namespace std;

struct listNode
{
    int data;
    listNode *next;
    listNode(int x):data(x),next(nullptr){}
};

int main()
{
    listNode *p1 = nullptr, *p2 = p1;
    p1 = new listNode(1);
    cout << p2->data << endl;
    return 0;
}

p1变了,但是指向p1的p2没有变,结果是非法的(p2是空指针,非法访问空指针)

 

#include<iostream>
using namespace std;

struct listNode
{
    int data;
    listNode *next;
    listNode(int x):data(x),next(nullptr){}
};

int main()
{
    listNode *p1 = nullptr, *p2 = p1;
    p2 = new listNode(1);
    cout << p1->data << endl;
    return 0;
}

这里也是非法访问空指针,当我们想要通过p2改变p1时,上述代码实际上使得p2指向了另一个对象。

 

结合以上错误,当我们想要通过p2改变p1时,容易发生以下错误:

#include<iostream>
using namespace std;

struct listNode
{
    int data;
    listNode *next;
    listNode(int x):data(x),next(nullptr){}
};

int main()
{
    listNode *p1 = nullptr, *p2 = p1;
    p1 = new listNode(1);
    p2->next = new listNode(2);
    p1 = p1->next;
    cout << p1->data << endl;
    return 0;
}

根据第一个案例可知,p1改变时,p2不变,所以p2访问了空指针。当我们想要通过p2改变p1时,注意p1的改变要在p2=p1语句之前。

 

通过p2改变p1:

#include<iostream>
using namespace std;

struct listNode
{
    int data;
    listNode *next;
    listNode(int x):data(x),next(nullptr){}
};

int main()
{
    listNode *p1 = new listNode(1), *p2 = p1;
    p2->next = new listNode(2);
    p1 = p1->next;
    cout << p1->data << endl;
    return 0;
}

 

原创、转载请注明出处

posted @ 2017-11-18 10:43  哲贤  阅读(628)  评论(0编辑  收藏  举报