[经验分享] 关于野指针

来源:本站
导读:目前正在解读《[经验分享] 关于野指针》的相关信息,《[经验分享] 关于野指针》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《[经验分享] 关于野指针》的详细说明。
简介:本文是关于野指针的意义及应用

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

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

(2)示例程序如下:

#include<stdio.h>

int main()

{

int*p;

printf("%dn",*p);

*p=10;

printf("%dn",*p);

return0;

}

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

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

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

示例程序如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int main()

{

intn=5,*p,i;

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

{

printf("mallocerrorn");

return0;

}

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

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

{

p=i+1;

printf("%d",p);

}

printf("n")

printf("p=%p*p=%dn",p,*p);

free(p);

printf("afterfree:p=%p *p=%dn",p,*p);

*p=100;

printf("p=%p*p=%dn",p,*p);

return0;

}

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

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

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

提醒:《[经验分享] 关于野指针》最后刷新时间 2024-03-14 00:58:00,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《[经验分享] 关于野指针》该内容的真实性请自行鉴别。