1、在C语言的运行过程中,需要内存来存储数据。C语言使用的内存总体可以分为两类:一类是静态区,一类是动态区。
2、静态数据存储区包含:只读数据区、已初始化的读写数据区、未初始化的读写数据区
动态数据存储区包含:堆内存区域、栈内存区域
3、C语言编写的程序经过编译-连接之后,将形成一个统一的文件,它由几个部分组成:
代码段(code或text)、只读数据段(RO data)、宏定义、已初始化读写数据段(RW data)、未初始化读写数据段(BSS)、堆(heap)、栈 (stack)
代码段: 由各个函数产生,函数的每一条语句最终都生成机器码,例如普通的数学运算、条件语句、循环语句
只读数据段: 由程序使用的数据产生,该部分数据的特点是不需要修改,因此被放入只读部分;
例如:只读全局变量 const char a[10] = "hello!!!"; 只读局部变量 const char str[8] = "world"; 程序中使用的常量 printf("ni hao c
"); "ni hao c
"就被放入只读数据区
4、已初始化数据段,又称为读写数据段,它里面的变量可读可写,
例如: 已初始化的全局变量 int a = 10; 以初始化的局部静态变量,在函数体内定义 static int num = 10;
5、未初始化数据段,该段的数据没有初始化,它只在目标文件中被标识,并不会称为一个真正的段。只有在程序运行的初始化阶段才会产生,因此不会影响目标文件大小
6、堆 只在程序运行的过程中出现,一般由程序员分配和释放
7、栈 只在程序运行的过程中出现,在函数内部使用的变量、函数的参数以及返回值将使用栈空间
栈的特点是先进后出
栈的增长方式有2种:一种是向上增长的,即从低地址向高地址增长;一种是向下增长的,即从高地址向低地址增长。目前绝大多是系统是递减的
根据栈的指针位置又可以讲栈分为满栈和空栈。
按照满栈的处理情况:入栈的时候,入栈内容放在栈指针移动后的内存地址;出栈的时候,将弹出当前栈指针地址的内容
按照空栈的处理情况:入栈的时候,入栈内容放在当前栈指针的内存地址中;出栈的时候,将弹出栈指针移动后地址的内容
http://blog.chinaunix.net/uid-29958512-id-4584209.html