`
LeslieWei
  • 浏览: 13521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C++中的一个小问题

阅读更多
先看下面一段代码:
  1/*******************************************
  2 * Author: Leslie Wei
  3 * Created Time: 2012年04月22日 星期日 21时35分58秒
  4 * File Name: nullObj.cpp
  5 * Description:
  6 * @Copyright reserved
  7 ********************************************/
  8
  9 #include <stdio.h>
10 class nullObj
11 {
12 public:
13     void Print()
14     {
15         int a = 10;
16         printf("a's value is %d\n", a);
17     }
18 };
19
20 int main(int argc, char *argv[])
21 {
22     nullObj *nobj = NULL;
23     nobj->Print();
24     return 0;
25 }

觉得这段代码有问题吧?22行的nullObj为空,下面怎么能访问了空指针啊?这不是致命的空指针错误么?
别急,先去test下,你一定很惊讶,访问空指针程序居然能正确运行!
为什么呢?对应到汇编代码中去看吧?编译器是怎么把C++类编译成汇编代码的呢?我们都知道,程序的函数定义最后是装载到内存的静态内存区的。也就是说不管是C程序还是C++程序,经编译后的函数是没什么区别的,那么编译器怎么实现C++对对象的支持呢?其实编译器只是做了个很看似很简单的操作,就是在编译C++函数的时候将C++的this指针传给了该函数,我们在创建一个对象的时候,会自动把创建的对象赋值给this指针,这里的nullObj *nobj = NULL;说明了this指针为空,但是Print()函数的定义是固化到代码区的,而Print函数中并没有访问this指针,所以即使这里的nobj 为空,函数一样能正确执行!
偶然发现了这个小问题,特此记录下来。
分享到:
评论

相关推荐

    C++小球碰撞C++ 小球碰撞

    C++ 小球碰撞 C++ 小球碰撞 C++ 小球碰撞

    C/C++:小球下落问题求解.rar(含完整注释)

    二叉树中每个结点处都有一个开关,初始时全部关 闭,每当有小球落到一个结点时,该结点上的开关的状态就会改变。当一个小球落到某个结点时, 如果该结点上的开关的状态是打开的,则往左走,否则,往右走,直到走到...

    最小权顶点覆盖问题的C++代码(完整)

    如果U包含于V,且对任意(u,v)∈E有u∈U或v∈U,就称U为图G的一个顶点条覆盖.G的最小权顶点覆盖是指G中所含顶点权之和最小的顶点覆盖. 编程任务 对于结定的无向图G,设计一个优先队列式分支限界法,计算G的最小权顶点...

    c++小球反弹运动

    在窗口中显示一个小球,该球以45度角反弹直线运动,碰撞后依然45度运行

    C++ 最短哈米尔顿回路问题

    C++ 最短哈米尔顿回路问题 种子产生随机数,运用了递归调用算法

    exceptional c++:47个c++工程难题、编程问题和解决方案(英文版)

    《exceptional c++:47个c++工程难题、编程问题和解决方案(中文版)》讲述如何用标准c++进行企业级的软件开发,通过“问题/解答”的方式,启发读者思考,帮助了解隐藏在问题背后的设计思想,以及各种编程指导原则适用...

    C、C++学习中应该注意的问题

    C、C++学习中应注意的一些小细节,及一些问题

    猎人过河问题c++源码

    猎人要带一条狼、一只羊和一棵大白菜过河。船太小,一次只能带一样。但猎人不在场的情况下,狼要吃羊,羊要吃白菜。请设计一个C++程序为猎人指出一个安全的渡河放案。 资源中有c++源程序和文档说明

    c++ 百钱买鸡问题 百鸡问题

    中国古代算书《张丘建算经》中有一道著名的百鸡问题: 公鸡每只值5 文钱,母鸡每只值3 文钱,而3 只小鸡值1 文钱。 用100 文钱买100 只鸡,问:这100 只鸡中,公鸡、母鸡和小鸡各有多少只?

    汽车加油问题C++代码

    算法设计与分析课后程序实现题C++代码. int greedy(int n,int k,int *d) //贪心策略:最远加油站优先 { int num = 0; for(int i = 0;i ;i++) //无法到达目的地 { if(d[i] &gt; n) { cout; return NULL; ...

    收集和整理的c++小游戏合集(115个).rar

    收集和整理的c++小游戏合集(115个): ABS五子棋(win7).cpp Beat BIT.cpp flappy_bird1(比2更精致,但有闪屏问题).cpp gmon.out move闯关.cpp qwq.cpp UNO.cpp yourcraft.cpp 三国杀AI(偶尔有BUG).cpp 三子棋...

    C++解数独问题

    一个用C++写的小程序,用回溯法解数独问题

    C++实现最小二乘法一元回归和多项式拟合

    其中以一元函数(线性)和多元函数(多项式)居多,下面这个类专门用于进行多项式拟合,可以根据用户输入的阶次进行多项式拟合,算法来自于网上,和GSL的拟合算法对比过,没有问题。此类在拟合完后还能计算拟合之后...

    c++小程序实验

    自己编的一些c++小程序,适合c++刚入门童鞋练手用。包括MC问题,简单哈希,象棋,学生信息管理,柱状图等程序。

    C++求解小球落地问题

    用C++编程求解: 一球从100m高度自由落下,每次落地后反弹回原高度的一半,再落下。求它在第10次落地时,共经过多少m?第10次反弹多高?

    C++模拟随机游动问题

    编写的一个C++ 模拟随机游动问题的控制台小程序,可以运行

    c++中有关母牛问题的程序代码

    问题描述: 假设单性繁殖成立,一头母牛从出生第四年起每年生一头母牛,生出的小母牛在四岁时也将具有生殖能力。以此类推,第n年时有多少头母牛?

    C++常见问题解答

    引言篇 1.学习C++是否必须先了解C?...4.对于小的程序C优于C++,对吗? 5.C是C++的子集吗? 6.C++与C有什么区别? 7.为什么用C++产生的"Hello World"的程序代码要比用C产生 8.什么是面向对象的程序设计(OOP)?

    射击类小游戏c++源代码

    在VC++6.0的环境下,用C++语言利用了EZwin编写的原创射击类小游戏,代码简单,适合初学者了解如何在屏幕上显示图片,加入音乐等问题。

    c++:母牛生小母牛问题(递归)

    问题描述: 设有一头小母牛,从出生第四年起每年生一头小母牛, 按此规律,第N年时有几头母牛?

Global site tag (gtag.js) - Google Analytics