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