非法访问空指针问题

Posted 木叶∞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非法访问空指针问题相关的知识,希望对你有一定的参考价值。

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

 

原创、转载请注明出处

以上是关于非法访问空指针问题的主要内容,如果未能解决你的问题,请参考以下文章

访问非法内存为什么不会出错?

访问非法内存为什么不会出错?

片段中的 EditText 上的空指针异常 [重复]

在tablayout片段之间进行通信[重复]

Segment fault 常见原因

片段中的空指针异常