凌阳教育的个人空间 https://blog.eetop.cn/204849 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

野指针

已有 398 次阅读| 2016-4-6 17:53

野指针指的是指向“垃圾”内存的指针,不是NULL指针。出现“野指针”主要有以下原因:

(1)指针变量没有被初始化。指针变量和其它的变量一样,若没有初始化,值是不确定的。也就是说,没有初始化的指针,指向的是垃圾内存,非常危险。

(2)示例程序如下:

#include<stdio.h>

 

int main()

{

       int *p;

      

       printf("%d\n",*p);

      

       *p=10;

       printf("%d\n",*p);

      

       return 0;

}    

(2)指针pfree之后,没有置为NULLfree函数是把指针所指向的内存释放掉,使内存成为了自由内存。但是,该函数并没有把指针本身的内容清除。指针仍指向已经释放的动态内存,这是很危险的。

程序员稍有疏忽,会误以为是个合法的指针。就有可能再通过指针去访问动态内存。实际上,这时的内存已经是垃圾内存了。

关于野指针会造成什么样的后果,这是很难估计的。若内存仍然是空闲的,可能程序暂时正常运行;若内存被再次分配,又通过野指针对内存进行了写操作,则原有的合法数据,会被覆盖,这时,野指针造成的影响将是无法估计的。

示例程序如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

       int n=5,*p,i;

      

       if ((p=(int *)malloc(n *sizeof(int)))==NULL)

       {

              printf("malloc error\n");

              return 0;

       }

       memset(p,0,n *sizeof(int));

       for(i=0;i<n;i++)

       {

              p[i]=i+1;

              printf("%d",p[i]);

       }

       printf("\n")

       printf("p=%p *p=%d\n",p,*p);

       free(p);

       printf("after free:p=%p *p=%d\n",p,*p);

       *p=100;

       printf("p=%p *p=%d\n",p,*p);

       return 0;

}    

该程序中,故意在执行了“freep)”之后,通过野指针p对动态内训进行了读写,程序正常执行,也在预料之中。前面已经分析过,内存释放后,若继续访问甚至修改,后果是不可预料的。

(3)指针操作超越了变量的作用范围。指针操作时,由于逻辑上的错误,导致指针访问了非法内存,这种情况让人防不胜防,只能依靠程序员好的编程风格,以及扎实的基本功。

(4)不要返回指向栈内存的指针。在主调函数中,往往会通过返回飞指针,继续访问指向的内存。因此,指针函数不能返回栈内存的起始地址,因为栈内存在函数结束时会释放。

常量的定义

凌阳教育,全国唯一一家原厂式嵌入式培训机构,专业从事嵌入式人才培训13年,最近新开课程信息安全工程师培训,想了解更多嵌入式资料下载或者是凌阳教育的动态,请访问凌阳教育官网www.sunplusedu.com


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 1

    粉丝
  • 0

    好友
  • 1

    获赞
  • 3

    评论
  • 3815

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-20 05:44 , Processed in 0.014541 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部