随着对指针的学习,慢慢我也接触到了野指针这个问题
什么是野指针呢?
因为指针指向的是该变量的地址,如果这个指向的地址是不可知的,随机性的,不正确的。那这个指针就是野指针。
野指针的成因:
1、指针未初始化
VS2013版本的编译器就报错了,有些编译器不会报错。但要注意指针没有初始化,那就是随机值。
2、指针越界访问
编译器通过了编译,但编译出现错误。由于数组只有10元素,而循环会循环12次。因此就会造成指针的越界访问。
那么为什么会出现越界访问呢?看一下代码:
注:system(pause)放在return 0后面无效,不会执行。
所有创建的变量都是在栈区申请空间的,这种过程称为压栈操作。
栈区的默认使用:先使用高地址处的空间,在使用低地址处的空间。
数组是随着下标的增长,地址由低到高变化的。
越界访问是非法的,当进入循环,从下标为10开始,就超出了数据的范围,继续访问将依次向高地址访问,因此就由可能访问到定义局部变量i=0这一处地址。必然就会进入死循环。
当然,除了进入死循环外,还由可能非法访问别处的地址数值。
3、指针指向的空间释放
这个一般出现在函数内。涉及到函数传参的问题,而局部变量,参数都是在栈区申请空间的,对于参数来说,它的生命周期是从进入函数到出函数。
参数的历程是从函数创建到函数结束,当实参传给形参的时候,形参其实是实参的一份临时拷贝。进入函数时创建变量,返回时函数空间已返回系统,返回的仅仅是地址。
如果再次访问这个已经释放了的空间的地址是非法的。