您的位置:知蚁博客 » C/C++程序设计 » 深入详解C/C++中的全局变量和静态局部变量(上)

深入详解C/C++中的全局变量和静态局部变量(上)

作者: 发布时间:2011-06-03 分类:C/C++程序设计 标签: 3,371人浏览

  这篇文章,知蚁将带大家一起去研究下关于全局变量的一些东东。不过在开始之前,我们有些准备工作需要做,首先就是打开/FA编译器选项,其次是了解什么是BSS SEGMENT和DATA SEGMENT。

编译器选项/FA

  C/C++语言都属于高级语言,机器是无法直接使用的,必需通过编译变成汇编语言后机器才能识别,那我们的C/C++代码对应的汇编代码都是什么样子的呢,通过打开/FA编译选项后,我们就能得到编译后会生成.asm文件。

  在VC6.0中通过【工程】-【设置】或者Alt+F7可以打开工程设置对话框,选择【C/C++】选项卡,在最下面Project Options中现有的内容后面加上/FA即可。加上/FA编译选项后,每次编译文件后就会在debuf目录下生成.asm文件了。

BSS SEGMENT和DATA SEGMENT

  BSS的全称是Block Started by Symbol,在采用段式内存管理的架构中,BSS段通常是一块用于存放程序中未初始化的全局变量的区域。

  Data Segment就是数据段了,不用解释了。

全局变量和BSS SEGMENT的关系

  好了,现在你知道如何生成汇编代码了,也知道BSS SEGMENT和DATA SEGMENT的作用了,我们正式开始。

  首先新建一个控制台应用程序,并添加一个a.cpp文件,添加如下代码(其实就是声明了四个全局变量):

double d;
float f;
int a;
char c;

OK,编译,然后到Debug文件夹中找到a.asm文件,用记事本打开即可。如果不出意外的话你将看到下面的内容:

PUBLIC ?d@@3NA      ; d
PUBLIC ?a@@3HA      ; a
PUBLIC ?f@@3MA      ; f
PUBLIC ?c@@3DA      ; c
_BSS SEGMENT
?d@@3NA DQ 01H DUP (?)    ; d
?a@@3HA DD 01H DUP (?)    ; a
?f@@3MA DD 01H DUP (?)    ; f
?c@@3DA DB 01H DUP (?)    ; c
_BSS ENDS

  我们定义的那么漂亮的名字竟然被编译器改成这么个丑八怪的名字,估计以后机器人的审美观一定也不怎么样。前面说的BSS SEGMENT也出现了,现在该知道BSS SEGMENT有什么用了吧。我们声明的全局变量便是放在这个地方的。(顺便说下,上面四个变量的位置千万别搞混了,如果搞混了出现意外我可不负责,(*^__^*) 嘻嘻……,这个问题以后再专门说说)。

  在C/C++中全局变量的那些事儿中我们说过,不同文件中不可以有同名的全局变量,当时没有解释原因,现在我们就可以解释了。

  在上面工作的基础上,再新建一个b.cpp文件,其中通过int a;再定义一个全局变量a,然后编译,查看b.asm文件,你会在BSS SEGMENT中找到下面的内容:

PUBLIC ?a@@3HA      ; a
_BSS SEGMENT
?a@@3HA DD 01H DUP (?)    ; a
_BSS ENDS

  对比下就会发现两个文件中的全局变量都被改名为?a@@3HA,并且都放在BSS SEGMENT中,这样当链接的时候就会出问题了,因为两个文件中都PUBLIC  ?a@@3HA了。

Linking…
b.obj : error LNK2005: “int a” (?a@@3HA) already defined in a.obj

全局变量和DATA SEGMENT的关系

  上面我们只是声明了四个全局变量,但是并没有进行初始化,如果初始化后会是什么情况呢?

double d = 1.0;
float f = 1.0;
int a = 1;
char c = 1;

  在a.cpp中代码修改为如上代码,编译,查看a.asm我们发现BSS SEGMENT没有了,取而代之的是DATA SEGMENT

PUBLIC ?d@@3NA      ; d
PUBLIC ?f@@3MA      ; f
PUBLIC ?a@@3HA      ; a
PUBLIC ?c@@3DA      ; c
_DATA SEGMENT
?d@@3NA DQ 03ff0000000000000r  ; 1 ; d
?f@@3MA DD 03f800000r   ; 1 ; f
?a@@3HA DD 01H     ; a
?c@@3DA DB 01H     ; c
_DATA ENDS

  从上面的对比中,我们可以得出结论BSS SEGMENT用于保存未初始化的全局变量,而初始化的全局变量是保存在DATA SEGMENT中的。

(困死了,先写这么多,剩下的明天继续写=_=)
原创文章请注明转载于知蚁博客,本文地址:http://www.letuknowit.com/archives/88

相关文章

12访客评论 ,博主回复1

  1. 博主是高手吧 好厉害!

    辟邪物品06-03 23:34 回复
  2. 博主在大学里很认真的哦

  3. 不错,跟着学习了

    七七06-04 10:48 回复
  4. 编程高手一个月在互联网上赚个5位数应该是件很容易的事情。不知道博主有没有进入网赚圈?

    屠龙06-04 11:24 回复
  5. 做外挂最多了

    深圳seo06-04 13:48 回复
  6. 高手啊~可惜我不懂~

    桌游批发06-04 15:30 回复
  7. 果然好方法!

  8. 支持你了哦!!

    长沙SEO06-04 17:39 回复
  9. 哈哈 说得很有味哦!!

  10. 我C++菜鸟。

  11. 为啥C++完全看不懂的…

    Cheney06-06 16:55 回复
    • 搞网站的懂css+html就差不多了,C++可以不懂的,呵呵

      知蚁06-06 20:47 回复
  12. :mrgreen: haiyao shenhe :1eek:

    12121205-16 17:18 回复

我来说说

(必须)

(必须,保密)

你确定你已经看过文章了?
取消

无觅相关文章插件,快速提升流量