当前位置:  编程技术>c/c++/嵌入式

基于C语言中野指针的深入解析

    来源: 互联网  发布时间:2014-10-17

    本文导语:  “野指针”的成因主要有两种:(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让...

“野指针”的成因主要有两种:
(1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。例如
代码如下:

char *p = NULL;
     char *str = (char *) malloc(100);

(2)指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。
别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。

用调试器跟踪示例7-5,发现指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。

如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
代码如下:

char *p = (char *) malloc(100);
     strcpy(p, “hello”);
     free(p);         // p 所指的内存被释放,但是p所指的地址仍然不变
     …
     if(p != NULL)      // 没有起到防错作用
     {
        strcpy(p, “world”);      // 出错
}

示例7-5 p成为野指针
(3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
代码如下:

 class A
{     
public:
     void Func(void){ cout Func()时,对象a已经消失,而p是指向a的,所以p就成了“野指针”。但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。
实例程序:
代码如下:

#include
#include
int main(int argc, char *argv[])
{
  char *p = NULL;
  p = (char*)malloc(sizeof(char)*100);
  printf("指针p的地址是:%pn", p);
  strcpy(p, "Hello");
  printf("%sn", p);
  free(p);

  printf("指针p的地址是:%pn", p);

  system("PAUSE"); 
  return 0;
}

运行截图如下:



可以看出,虽然使用 free(p) ,释放了p指向的地址空间,但是这个指针还是存在的,只是指向的是“垃圾”内存。
此时p的状态就被称为是“野指针”

    
 
 

您可能感兴趣的文章:

  • C语言中有指针,因此C语言可以创建链表,那么Java语言没有指针,那Java是否可以创建链表呢?
  • C语言指针问题?
  • C语言中常量指针与指针常量区别浅析
  • C语言:指针问题求救~
  • C语言的指针类型详细解析
  • 一个c语言指针问题
  • C语言指针学习经验总结浅谈
  • 关于c语言指针的两处小tip分享
  • C语言数组指针的小例子
  • C语言入门之指针用法教程
  • C语言创建链表错误之通过指针参数申请动态内存实例分析
  • C语言安全之数组长度与指针实例解析
  • 新手提问c语言指针
  • c语言指针之二级指针示例
  • 解析C语言中空指针、空指针常量、NULL & 0的详解
  • 关于C语言指针赋值的问题详解
  • 深入理解C语言 static、extern与指针函数
  • 深入分析C语言中结构体指针的定义与引用详解
  • C语言指针的长度和类型深入分析
  • C语言中函数与指针的应用总结
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • C语言二维条形码解析库 libqrencode
  • C语言的XML解析器 iksemel
  • 用C语言如何组装和解析XML报文???
  • C 语言的 JSON 解析器 BeneJSON
  • 表达式语言解析器 Commons EL
  • C语言的异步DNS解析库 c-ares
  • C语言DNS解析器 dns.c
  • C语言的HTML解析库 libhtml
  • 请问脚本语言 解析器的工作原理?
  • 在做FTP服务端,请问哪位有解析LIST命令的C语言代码?
  • 纯C语言实现的HTML5解析库 Gumbo
  • C语言解析XML报文的问题
  • 深入解析C语言中常数的数据类型
  • 解析c语言中"函数调用中缺少哨兵"的情况分析
  • C语言static修饰函数详细解析
  • c语言中static和extern的用法详细解析
  • 解析c语言switch中break语句的具体作用
  • 解析C语言中位字段内存分配的问题
  • C语言typedef与复杂函数声明问题的深入解析
  • Linux系统中C语言编程创建函数fork()执行解析
  • 2013年7月和2013年8月编程语言排行榜
  • 如何在GTK2.0下实现国际化(语言选择根据自己设置的语言,不用系统的语言)
  • 2017 年热门编程语言排行榜出炉,你的语言上榜没?
  • 求助,在linux下,c语言和汇编语言的接口是什么?
  • 苹果OS X和IOS下最新编程语言swift介绍
  • C语言中间语言 CIL
  • c语言判断某一年是否为闰年的各种实现程序代码
  • 最近学JSP,苦于HTML语言和JAVA语言太差,请教推荐几本书,thanks.
  • PHP编程语言介绍及安装测试方法
  • 动态编程语言 LIME编程语言
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3