关于C++野指针的问题
关于C++野指针的问题
木兰宿莽 发表于2年前
关于C++野指针的问题
  • 发表于 2年前
  • 阅读 75
  • 收藏 0
  • 点赞 1
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

共有 人打赏支持
粉丝 34
博文 11
码字总数 9318
×
木兰宿莽
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: