在作C++开发时,总避免不了与指针打交道,代码一多,野指针就成了一个问题!就此,我专门研究了一下野指针,总结其规律,仅供你们参考一下。ios
咱们知道,代码所得到的内存地址是系统所提供的虚拟内存地址,其与真正的物理内存地址之间存在着映射关系,也就是所谓的内存管理机制。对每个程序而言,都会的本身的独立的内存空间(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所指向的值为何能够输出呢?为解答这个问题,咱们再来看个例子。code
/* 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; }
按照前面所说的,不给野指针赋值会获得一个野地址,随意赋个值也一样是个野地址值,那为何一个能输出其所指向的值而另外一个却不能呢?内存
这是由于,一个是系统给分配的,虽然也是个随意的地址,可是仍然是处在本身的独立内存内间里的,也就是说到最后映射时,不会映射到其余程序开发
所占用的地址空间去。而人工随意分配的话,通常都不会在本身的独立内存空间里面的,映射以后会跑到其余程序所占用的存在中去。内存管理
由此能够,野指针其实不像日常咱们想的那样可怕,只要它还处在本身的空间里就是良性的。固然,这并非说鼓励你们写代码时都是野指针,通常来说,当io
定义一个指针时,最好将其初始化为NULL;这样会好不少。编译