详解C语言那些可怕的野指针

系统运维2025-11-05 08:25:54791

 一、详解什么是语言那野指针?

指针是C语言的灵魂,同时也是可怕很容易让人犯错的重难点,用错了指针将是指针一个灾难。

指针变量的详解本质是值,这个特殊的语言那值是一个内存地址值,而合法的可怕内存地址包括定义的变量的地址(栈)、malloc函数申请堆内存返回的指针地址(但未使用free释放,是详解在堆空间动态申请)

需要注意的是,野指针不是语言那NULL指针,通常NULL指针可以使用if语句来判断,可怕但是指针C语言中没有任何方法用来判断一个指针是否为野指针!

二、详解野指针是网站模板语言那怎么来的?

通常野指针是因为指针变量中保存的值不是一个合法的内存地址或者指向不可用内存的指针而造成的。

而且野指针往往会造成内存越界、可怕段错误等难以找到的问题,下面分几种情况来说说野指针的由来。

局部指针变量没有被初始化 

//在win10_64位+vs2017  //来源:技术让梦想更伟大  //作者:李肖遥  #include <stdio.h>  #include <string.h>   struct Student  {      char* name;      int number;  };  int main()  {      struct Student s;      strcpy(s.name, "Lixiaoyao"); // OOPS!      s.number = 99;      return 0;  } 

局部变量不像全局变量那样,不赋值会自动初始化为0,指针name指向的内存空间地址是随机的,不能向随机地址空间写数据。我们在定义局部指针变量时应该初始化为NULL,局部变量则初始化为0

使用已经释放过后的指针 

//在win10_64位+vs2017  //来源:技术让梦想更伟大  //作者:李肖遥  #include <stdio.h>  #include <malloc.h>  #include <string.h>  void func(char* p)  {      printf("%sn", p);      free(p);  }  int main()  {     char* s = (char*)malloc(5);      strcpy(s, "Lixiaoyao");//数组越界      func(s);      printf("%sn", s); // OOPS!使用已经释放的指针s      return 0;  } 

malloc申请的堆空间释放后,意味着把这片内存归还到空闲链表,其它程序可以使用这片空间,如果其它程序使用了这个空间,可能导致其它程序莫名其妙的被关闭,所以一定要在释放过后将指针变量的值赋值为NULL。

指针所指向的云南idc服务商变量在指针之前被销毁 

//在win10_64位+vs2017  //来源:技术让梦想更伟大  //作者:李肖遥  #include <stdio.h>   char* func()  {      char p[] = "Lixiaoyao";      return p;  }  int main()  {      char* s = func();      printf("%sn", s); // OOPS!      return 0;  } 

func函数被调用的时候,栈区存放了局部数组p,func返回之后,栈顶指针退出,占用的内存已经被释放掉,此时指针s指向一个被释放掉了栈空间,如果栈空间值被修改了,就不会打印出预期结果,s就变成了一个野指针,所以我们绝对不要在函数中返回局部变量和局部数组的地址。

进行了错误指针运算 

//在win10_64位+vs2017  //来源:技术让梦想更伟大  //作者:李肖遥  #include <stdio.h>  void main()  {   int a[10] = {1,2,3,4,5,6,7,8,9,10};   int *p;    for (int *p = &a[9];p >= a;){      *--p = 0;    }  } 

程序中在数组第1个元素a[0]被清除之后,指针p的值还继续减下去,而接下去的一次比较运算是用于结束循环的。但表达式p>= a(p >= &a[0])的值是未定义的。

为避免这种情况,一定要确保字符数组要以‘\0’结尾,为防止内存越界,自己编写的内存相关函数需要指定正确的长度信息。

进行了错误的强制类型转换 

//在win10_64位+vs2017  //来源:技术让梦想更伟大  //作者:李肖遥  #include <stdio.h>  #include <string.h>  int main()  {      int a = 1;      int p = &a;      printf("%dn",*((int*)p));      /*      在64位下输出错误      32位下输出a的值 1      */      return 0;  } 

上面的b2b信息网程序在64位下输出错误,32位下输出a的值1,在我们写嵌入式程序的时候,会将int类型的一个数据强制转换成一个指针类型用来表示寄存器的地址,这个时候就需要注意了。

怎么避免野指针?

知道了野指针产生的原因,避免方法就出来了,在指针的解引用之前,确保指针指向一个绝对可用的空间。

 定义指针时,同时初始化为NULL  在指针解引用之前,先去判断这个指针是不是Null  指针使用完之后,将其赋值为NULL  在指针使用之前,将其赋值绑定给一个可用地址空间 
本文地址:http://www.bzuk.cn/news/325e32099354.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

全站热门

Win10系统如何关闭自动更新(停用Win10系统的自动更新功能以保持更大控制权)

ab音箱的性能和特点(揭秘ab音箱的卓越音质和多功能设计)

选择一款适合你的显卡,提升电脑性能(探索显卡市场,为你的电脑定制专属升级方案)

联想G40笔记本拆机教程(详细图文指导,让您轻松拆解和组装您的联想G40笔记本)

微星H170ProVD的性能与特点(全面升级的硬件配置,带给你更顺畅的使用体验)

使用Ghost备份UEFI系统的详细教程(保护UEFI系统数据,轻松备份和恢复,无忧无虑)

联想IdeaPad320(体验高速运行与多功能性的IdeaPad320,让你事半功倍!)

使用U盘PE恢复系统的方法与步骤(教程)

友情链接

滇ICP备2023006006号-33