关于C++野指针的问题

原创
2016/02/04 17:22
阅读数 392

在做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;这样会好很多。

展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部