您的位置:首页 > 其它

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

2015-08-16 00:11 260 查看
在一段使用高级语言编写出一个源代码文件后,源代码要经过编译预处理(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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: