目录10.野指针定义案例随机的(没有初始化)没有明确限制的(越界访问)指针指向的空间释放11.野指针规避方法初始化防止越界指针变量不再使用时及时置NULL指针使用之前检查有效性避免返回局部变量的地址其实特殊情况下,空指针及空指针附近的内存区域是可以被访问的13.assert() (assert v.断言)解释作用优点启用assert的开关往期推荐承接上篇 38.【C语言】指针重难点C)10.野指针定义指针指向的位置是不可知随机的、没有明确限制的案例随机的(没有初始化)int* p; *p 10;//非法访问没有明确限制的(越界访问)#include stdio.h int main() { int arr[10] {0}; int* p arr[0]; for(int i0; i11; i) { *(p) i;//当i10时p就是野指针 } return 0; }注意*(p) i;先使用后 -- *p i; p;指针指向的空间释放#include stdio.h int* test() { int n 100; return n; } int main() { int* p test(); printf(%d\n, *p); return 0; }分析test函数定义的n的生命周期介于test函数的 { 与 } 之间一旦出test函数n交换给操作系统没有使用权限即空间释放例如scanf(%d,a);会被报错,原因是野指针11.野指针规避方法初始化明确知道指针指向哪里就直接赋值地址如果不知道指针应该指向哪里给指针赋值NULL(空指针)int num 10; int*p1 num; int*p2 NULL;#define NULL ((void *)0) //把0转换为(void *)附: 空指针发明人Tony Hoare的演讲Null References: The Billion Dollar Mistake - InfoQ内存查看p2的地址注意空指针不能访问(*p210;不允许),即不允许向地址为0处写入数据注:在C11之后,使用nullptr来代替了NULL防止越界int main() { int arr[10] {1,2,3,4,5,6,7,8,9,10}; int* p arr[0]; int i 0; for(i0; i10; i) { *(p) i; } //p已越界把p置为NULL p NULL; return 0; }指针变量不再使用时及时置NULL指针使用之前检查有效性规则只要是NULL指针就不去访问同时使用指针之前可以判断指针是否为NULLif (p2 ! NULL) { dosomething; }避免返回局部变量的地址见本篇指针指向的空间释放其实特殊情况下,空指针及空指针附近的内存区域是可以被访问的详见格友公众号文章谁说空指针不能访问的13.assert() (assert v.断言)解释assert(表达式);如果表达式为真返回值非零继续执行如果表达式为假返回值为零则报错作用在运行时确保程序符合指定条件如果不符合就报错终止运行使用前引用头文件#include assert.h优点报错是会在窗口显示没有通过的表达式以及包含这个表达式的文件名和行号#include assert.h int main() { int* p NULL; assert(p ! NULL); return 0; }运行结果:启用assert的开关禁用assert在#include assert.h前加#define NDEBUG可以提高程序的运行效率尽管assert(表达式)为假但不会报错继续执行启用assert直接注释掉#define NDEBUG注NDEBUG为No Debug往期推荐19.【C语言】指针重难点A37.【C语言】指针重难点B38.【C语言】指针重难点C)