段与堆栈
段
定义:一个二进制文件的内容快。例如a.out
组成:文本段、数据段、BSS段
文本段:存放程序的运行指令
数据段:已经初始化全局变量或者静态变量
BSS段:未初始化的全局变量和静态变量
例如以下程序:
/*BSS段*/
char pear[40];
static double peach;
/*BSS段*/
/*数据段*/
int mango = 13;
static long melon =200;
/*数据段*/
mian()
{
/*不进入文件之中,在运行时创建*/
int i =3, j, *ip;
/*不进入文件之中,在运行时创建*/
/*文本段*/
ip = malloc(sizeof(i));
pear[5] = i;
peach = 2.0 *mango;
/*文本段*/
}
通过实验得到的结论:
数据段保存到目标文件中
BSS段不保存到文件之中
文本段会被编译器优化
段正在执行的程序之中是一块内存区域。
堆栈
以上阐述一些全局变量以及静态变量在在文件中的位置,局部变量由于不进入目标文件,在运行的时候存在于堆栈。在Linux中段是不断生长的,所以可以将其认为是无限大的。
堆栈的主要作用主要有三点:
1.为局部变量提供存储空间
2.记录函数调用的过程记录
由于每个函数名称就是一个地址,当调用一个函数的时候,程序在堆栈中可以创建以下的结构,函数调用完毕后会返回到指向之前结构的指针。
过程活动记录的数据结构 |
---|
局部变量 |
参数 |
指向之前结构的指针 |
返回地址 |
3.暂时存储区
某些复杂的计算。