非法訪問空指針問題
阿新 • • 發佈:2017-11-18
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; }
非法訪問空指針問題