1. 首页
  2. IT资讯

C语言 C语言野指针

关于野指针也就是进行了内存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 %dn”,p,len);
  18.         if(p!=NULL)
  19.         {
  20.                 free(p); //释放指针p指向的内存空间,但是指针变量本身的值还存在
  21.                 printf(“%pn”,p);//打印出来
  22.         }
  23.         if(p!=NULL) //条件还是成立因为p变量本身没有改变
  24.         {
  25.                 free(p);//内存不存在了,再次释放程序崩溃
  26.         }
  27. }

我们有必要画出他的内存四区图如下:

C语言 C语言野指针

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

记住指针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 %dn”,p,len);
  18.         xfree(p); //使用宏
  19.         xfree(p);
  20. }

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7728585/viewspace-2131193/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/183469.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code