且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

C语言 C语言野指针

更新时间:2022-04-29 15:12:00

关于野指针也就是进行了内存free后,其指针变量指向的内存空间已经free掉了,但是指针变量其值并没有释放,可能造成
二次释放的导致程序崩溃。
考虑如下的程序



点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}



  5. int getstr( char **p/*out*/,int *len/*out*/)
  6. {
  7.         *p = (char *)malloc(4094);
  8.         strcpy(*p,"testesest");
  9.         *len = strlen(*p);

  10.         return 0;
  11. }




  12. int main()
  13. {
  14.         char *p = NULL;
  15.         int len = 0;

  16.         getstr(&p,&len);

  17.         printf("%s %d\n",p,len);

  18.         if(p!=NULL)
  19.         {
  20.                 free(p); //释放指针p指向的内存空间,但是指针变量本身的值还存在
  21.                 printf("%p\n",p);//打印出来
  22.         }

  23.         if(p!=NULL) //条件还是成立因为p变量本身没有改变
  24.         {
  25.                 free(p);//内存不存在了,再次释放程序崩溃
  26.         }
  27. }
我们有必要画出他的内存四区图如下:

C语言 C语言野指针

实际上free(p)的时候,只是free了指针p指向的堆栈的内存空间,而指针p的
变量0X25C1010这个值还在,如下:
C语言 C语言野指针

记住指针p也是需要在栈上开辟空间的,实际上
我们只需要在free(p)后将p=NULL,将指针的值赋予0,那么下次释放的时候加
上p!=NULL即可,我们可以定义一个宏:
#define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}
来完成所有的操作如下:

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>

  4. #define xfree(p) {if(p!=NULL);{free(p);p=NULL;}}



  5. int getstr( char **p/*out*/,int *len/*out*/)
  6. {
  7.         *p = (char *)malloc(4094);
  8.         strcpy(*p,"testesest");
  9.         *len = strlen(*p);

  10.         return 0;
  11. }




  12. int main()
  13. {
  14.         char *p = NULL;
  15.         int len = 0;

  16.         getstr(&p,&len);

  17.         printf("%s %d\n",p,len);
  18.         xfree(p); //使用宏
  19.         xfree(p);

  20. }