1.
char* x;这样的一定是野指针,指针声明时要直接初始化!或者置null也行!
2.
1 int main() 2 { 3 char *x=new char; 4 delete x; 5 cout<<*x; 6 getchar(); 7 return 0; 8 }
delete x;之后,x就是一个野指针。
1 int main() 2 { 3 char *x=new char[10]; 4 cout<<*x; 5 strcpy(x,"dqwdqw"); 6 delete []x; 7 cout<<x; 8 getchar(); 9 return 0; 10 }
这段代码是能运行的,但delete[]x;之后,x就成为了一个野指针,输出的结果是未定义的。这里我们应该加上:
x=nullptr;
或者malloc之后free掉的指针,也是上面的情况,一定要把指针置null。
3.
函数参数为二级指针&p,将p指向了函数中的临时变量。函数调用完毕后,p这个指针就变为了野指针。
1 int f(char** x){ 2 char p=97; //'a' 3 *x=&p; 4 } 5 int main() 6 { 7 char a=65; //'A' 8 char *x=&a; 9 f(&x); 10 cout<<*x; 11 getchar(); 12 return 0; 13 }
调用f(&x)结束后,指针x指向的值是未定义的。
牛批的来了,看下面代码,感觉会输出什么?
1 class T 2 { 3 public: 4 T (){ 5 cout<<"f"; 6 x=1; 7 delete this; 8 } 9 int x; 10 }; 11 12 13 int main() 14 { 15 T *p=new T(); 16 cout<<p->x; 17 getchar(); 18 return 0; 19 }
一定觉得这代码会调用失败吧,实际上会调用成功。。
delete this之后,p变为野指针了。但是p依然是个地址。
然后系统就会按照T类的对象空间模型去访问,并输出它认为其中x所在空间的值。
当然这个值就不一定是啥了,但确实不会报错。。。
来源:https://www.cnblogs.com/FdWzy/p/12364947.html