C语言 C语言野指针

简介: 关于野指针也就是进行了内存free后,其指针变量指向的内存空间已经free掉了,但是指针变量其值并没有释放,可能造成 二次释放的导致程序崩溃。 考虑如下的程序 点击(此处)折叠或打开 #include ...
关于野指针也就是进行了内存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. }
我们有必要画出他的内存四区图如下:



实际上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 %d\n",p,len);
  18.         xfree(p); //使用宏
  19.         xfree(p);

  20. }



相关文章
|
13小时前
|
安全 C语言
【C语言】如何规避野指针
【C语言】如何规避野指针
21 0
|
13小时前
|
C语言
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
C语言:数组和指针笔试题解析(包括一些容易混淆的指针题目)
|
13小时前
|
存储 程序员 编译器
爱上C语言:指针很难?来来来,看看这篇(基础篇)
爱上C语言:指针很难?来来来,看看这篇(基础篇)
|
13小时前
|
C语言
c语言指针总结
c语言指针总结
15 1
|
13小时前
|
C语言
C语言(指针详解)重点笔记:指针易错点,都是精华
C语言(指针详解)重点笔记:指针易错点,都是精华
3 0
|
13小时前
|
存储 C语言
C语言指针讲解(适用于初学者)
C语言指针讲解(适用于初学者)
6 0
|
13小时前
|
存储 程序员 C语言
【C 言专栏】C 语言指针的深度解析
【4月更文挑战第30天】C 语言中的指针是程序设计的关键,它如同一把钥匙,提供直接内存操作的途径。指针是存储其他变量地址的变量,通过声明如`int *ptr`来使用。它们在动态内存分配、函数参数传递及数组操作中发挥重要作用。然而,误用指针可能导致错误,如空指针引用和内存泄漏。理解指针的运算、与数组和函数的关系,以及在结构体中的应用,是成为熟练 C 语言程序员的必经之路。虽然挑战重重,但掌握指针将增强编程效率和灵活性。不断实践和学习,我们将驾驭指针,探索更广阔的编程世界。
|
13小时前
|
算法 搜索推荐 程序员
C语言中的函数指针和回调函数
C语言中的函数指针和回调函数
10 2
|
13小时前
|
存储 编译器 C语言
【C语言】初步解决指针疑惑
【C语言】初步解决指针疑惑
7 0
|
13小时前
|
存储 C语言
指针深入解析(C语言基础)带你走进指针,了解指针
指针深入解析(C语言基础)带你走进指针,了解指针