C++中的一个小问题_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > C++中的一个小问题

C++中的一个小问题

 2012/4/23 12:43:29  LeslieWei  程序员俱乐部  我要评论(0)
  • 摘要:先看下面一段代码:1/*******************************************2*Author:LeslieWei3*CreatedTime:2012年04月22日星期日21时35分58秒4*FileName:nullObj.cpp5*Description:6*@Copyrightreserved7********************************************/89#include<stdio.h>
  • 标签: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 为空,函数一样能正确执行!
偶然发现了这个小问题,特此记录下来。
发表评论
用户名: 匿名