1. 程式人生 > >非法訪問空指針問題

非法訪問空指針問題

images () span 之前 listnode ext png mes ptr

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

技術分享圖片

非法訪問空指針問題