21 野指针

Posted 王小东大将军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21 野指针相关的知识,希望对你有一定的参考价值。

分析下列程序,输出结果:不确定,未定义行为。

#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
void test(void) {
	char *str=(char *)malloc(100);
	strcpy(str,"hello");
	free(str);
	if(str!=NULL) {
		strcpy(str,"world");
	}
	printf(str);
}

int main()
{
	test();
	return 0;
}

      指针释放存储空间后没有置为NULL,变成野指针。

分析:野指针,不能通过简单的NULL进行判断,delete或free只是释放了指针所指向的内存区域,并没有干掉指针本身,所以指针指向的是“垃圾”指针,所以free或者delete之后要把指针置为NULL。

    free(str)只是释放了str指针所指向的内存区域,并未修改指针本身的地址值,所以str!=NULL,但是str是一个野指针(野指针 指向一个已删除的对象或未申请访问受限内存区域的指针),访问内存区域是受限的。不过,本人在mac和linux平台上运行上述代码,虽然有警告,但是最终都输出了world。

 

  

    释放以后按照理论是不能访问的,如果这个时候访问并且往里面输入数据的话系统不能保证数据安全,会有可能会出现world 但不代表一直会出现world。

 

以上是关于21 野指针的主要内容,如果未能解决你的问题,请参考以下文章

20160208.CCPP体系详解(0018天)

关于野指针空指针

20160208.CCPP体系具体解释(0018天)

野指针问题

C++ 空指针和野指针

C语言野指针就是未初始化的指针么