文档章节

关于C++野指针的问题

木兰宿莽
 木兰宿莽
发布于 2016/02/04 17:22
字数 698
阅读 76
收藏 0

在做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
码字总数 8132
作品 0
崇明
程序员
Cocos2d-x开发中C++内存管理

由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识。 C++内存管理非常复杂,如果完全地系统地介绍...

智捷课堂
2014/11/02
0
0
C++中的NULL和nullptr的区别

C的NULL 在C语言中,我们使用NULL表示空指针,也就是我们可以写如下代码: 实际上在C语言中,NULL通常被定义为如下: 也就是说NULL实际上是一个void 的指针,然后吧void 指针赋值给int 和foo...

dukeke
01/08
0
0
CSDN回帖得分大全(近两年)

√ vs2005调用dll的时候Initialize()函数返回错误 [VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作! [VC/MFC 界面] √ CFileFind::FindFile 支持通配...

junwong
2012/03/09
0
0
C++11 中值得关注的几大变化

源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and Why You Should Care),赖勇浩做了一个中文翻译在这里。所以,我就不翻译了,我在这里仅对文中提到的这些变...

雅各宾
2014/01/17
0
0
篮子、水果和鸡蛋——关于C++的模板偏特化和萃取编程技法

最近在读《STL源码剖析》。读这本书的时候发现自己的C++的知识其实是非常匮乏的。 从大学的C++教材上学到一些C++基本的语法、内存管理、继承、多态等方面的基础知识。这些只是是一棵大树的根...

costaxu
2012/12/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
53分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
55分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部