野指针产生的原因

  • 指针变量和它所指向的内存空间是两个不同的概念
  • 释放了指针所指的内存空间,但是指针变量本身没有重置成NULL
  • 判断释放 通过if(p1!=NULL)

避免方法

  • 定义指针的时候初始化成NULL
  • 释放指针指向的内存空间后,把指针重置成NULL。

代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. void main()
  6. {
  7. char *p1 = NULL; // p1栈中分配内存空间 NULL默认是0 p1的地址是0
  8. p1 = (char *)malloc(100); // p1指向了堆中开辟的空间 叫 0xaa11吧 p1的地址变成了0xaa11
  9. strcpy(p1, "123654"); // 把常量区的123654 拷贝到p1所指向的堆中空间
  10. if (NULL == p1) {
  11. return;
  12. }
  13. printf("p1:%s\n", p1);
  14. if (p1 != NULL) {
  15. free(p1); // 释放p1指向堆中的空间 但p1变量的地址还是0xaa11,乱指向了一个垃圾空间
  16. p1 = NULL; // 必须要把p1的地址
  17. }
  18. /*
  19. 如果前面已经释放了,再free(p1)这里会有问题的,也就产生了野指针,解决办法:p1=NULL
  20. */
  21. if (p1 != NULL) {
  22. free(p1);
  23. }
  24. system("pause");
  25. return;
  26. }

铁律1-野指针产生的原因 - 图1