在做C++开发时,总避免不了与指针打交道,代码一多,野指针就成了一个问题!就此,我专门研究了一下野指针,总结其规律,仅供大家参考一下。
我们知道,代码所获得的内存地址是系统所提供的虚拟内存地址,其与真正的物理内存地址之间存在着映射关系,也就是所谓的内存管理机制。对每一个程序而言,都会的自己的独立的内存空间(4G)。
考察下面两段代码:
/*
test1:file1.cc
野指针存在于main函数内,编译能通过但会出现段错误
*/
include<iostream>
using std::cout;
using std::endl;
int main()
{
int* p1;
cout<<*p1<<endl;
return 0;
}
/*
test2:file2.cc
野指针存在于一般函数内,编译能通过并且会输出
该野指针所指向的值
*/
include<iostream>
using std::cout;
using std::endl;
void test()
{
int* p2;
cout<<*p2<<endl;
}
int main()
{
test();
}
为什么野指针在mian函数中不能输出其指向的值而在一般函数中却可以呢?很奇怪吧!!这其实一点都不奇怪!再来考察一下,这两个野指针的地址值。发现p1=NULL;而p2=0xffde38(可能会是其他的),所以想要获得指向NULL的值心定是会出现错误的。
那有人会问,为什么p2所指向的值为什么可以输出呢?为解答这个问题,我们再来看个例子。
/*
test3:file3.cc
野指针存在于一般函数中,但是给它随意赋个地址值0xddff45;
能通过编译但也会出现错误
*/
#include<iostream>
using std::cout;
using std::endl;
void test()
{
int* p3=(int*)0xddff45;
cout<<*p<<endl;
}
int main()
{
test();
return 0;
}
按照前面所说的,不给野指针赋值会得到一个野地址,随意赋个值也同样是个野地址值,那为什么一个能输出其所指向的值而另一个却不能呢?
这是因为,一个是系统给分配的,虽然也是个随意的地址,但是仍然是处在自己的独立内存内间里的,也就是说到最后映射时,不会映射到其他程序
所占用的地址空间去。而人工随意分配的话,一般都不会在自己的独立内存空间里面的,映射之后会跑到其他程序所占用的存在中去。
由此可以,野指针其实不像平常我们想的那样可怕,只要它还处在自己的空间里就是良性的。当然,这并不是说鼓励大家写代码时都是野指针,一般来讲,当
定义一个指针时,最好将其初始化为NULL;这样会好很多。