欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中的一个小问题 博客分类: 技术笔记 C++编译器

程序员文章站 2024-03-06 19:46:20
...
先看下面一段代码:
  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++ 编译器