码迷,mamicode.com
首页 > 其他好文 > 详细

非法访问空指针问题

时间:2017-11-18 12:42:01      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:span   ret   ios   blog   col   分享图片   技术   bsp   using   

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

技术分享图片

 

非法访问空指针问题

标签:span   ret   ios   blog   col   分享图片   技术   bsp   using   

原文地址:http://www.cnblogs.com/mu-ye/p/7856106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!