非法访问空指针问题
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; }
原创、转载请注明出处
以上是关于非法访问空指针问题的主要内容,如果未能解决你的问题,请参考以下文章