目标文件中变量的位置以及默认值

在一段使用高级语言编写出一个源代码文件后,源代码要经过编译预处理(preprocess gcc -E),编译(compilation gcc -S),汇编(assembly gcc -c),链接(link)四个阶段的处理后才能在计算机上运行。
预编译阶段处理预编译指令,常见指令#include,#define,#typedef等,编译阶段进行词法分析->语法分析->语义分析->优化处理->生成汇编指令。
汇编阶段就是将生成的汇编指令逐个翻译为机器指令生成目标文件。链接阶段将多个目标文件合并为一个完整的可执行文件。
 下面侧重描述你所编写的源代码中的变量存放位置以及初始化情况。首先分析变量的存储类型,变量的存储类型可分析为局部变量(auto(默认),register),全局变量(extern),局部变量:1局部变量,2局部静态变量。
  int  e; // 全局变量 
  int  f=3//全局变量
  int  foo()
      {
        int a;//局部变量
        auto int  b;//.....
        register int  c;//.....
        static  int   d;//局部静态变量
        printf("a=%a,b=%b,c=%c,d=%d,e=%d               
                f=%d\n",a,b,c,d,e,f);
      }

   #include<stdio.h>
   int main()
      {
       foo();
       return 0;       
      }

在编译执行后,你能准确的说出输出的结果吗?a=?,b=?,c=?,d=?,e=?,f=?如果能的话,您基本不用看下面的冗长的叙述了^_^,如果不能请接着看下面的文章,我为大家一一道来,首先在源代码被编译后,在生成的目标的文件中会有许多复杂的段,这些段包含代码段(code),数据段(data)这很容易想到,这也是我们叙述的重点,至于其他的段有兴趣的话不妨看看相关文章,这里不再赘述,代码段显而易见是源代码编译后的集合,包含你所编写的每一个函数(已经变为汇编指令),data用于存储所有的初始化的全局变量和局部静态变量,比如代码中的f变量就在此段中。那么没有初始化的全局变量个局部静态变量呢?这里引入一个新的段->dss段.这个段的就是用来存储没有初始化的全局变量个局部静态变量的,并且在dss段中变量默认值是0或者空(那d和e就等于0了呗),现在说一下为什么要引入dss段,而不是直接将变量存入data段,原因很简单就是为了节省内存(磁盘的),那局部变量a,b,c呢,他们到哪去了?他们不再目标文件中吗?答案就是这样,他们不再目标文件中,他们在进程的堆栈中,随着代码段加载至内存并运行时,即时定义(压入栈)->即时使用->即时清除(弹出栈),所以在使用他们没有如果你初始化了,他就是你所初始化的值,如果没有,那么没人知道他的值是什么,看内存情况。
所以a=?,b=?,c=?,d=0,e=0,f=3.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值