目标文件中变量的位置以及默认值
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.
相关文章推荐
- ERROR 1010 (HY000): Error dropping database (can't rmdir '.\kehuanedu_db', errno: 41)
- Android中startService的使用及Service生命周期
- 以核心图表解析游戏核心机制设计原理
- poi Build path 配置,顺序问题
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
- Java之面向对象详细总结
- 8.16 lru缓存java版
- 海量数据处理 - 10亿个数中找出最大的10000个数(top K问题)
- HDU 1014 Uniform Generator
- 我的YUV播放器MFC小笔记:右键菜单事件和非标题实现鼠标拖动
- Objective-C Runtime (二)
- 【8-15】Markdown语法学习
- iOS基础班之c语言学习复习查漏
- POJ 1182 食物链(并查集)
- 计算机网络--session和cookie的区别
- 简单计算器 java实现hdu1237
- Leetcode: Maximal Square
- ViewFliper两个View无限显示
- 浅析代理模式(转)
- iOS 设计模式-委托模式