1. C语言中内存的分布:
C语言在内存中一共分为如下几个区域,分别是:
- 栈区(stack): 由编译器自动分配、释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
- 堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
- 全局区(静态区):存储全局变量和静态变量,初始化的全局变量和静态变量在一块区域(RW), 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(ZI)。 - 程序结束后有系统释放
- 文字常量区 :常量字符串就是放在这里的。 程序结束后由系统释放 (RO)
- 程序代码区—存放函数体的二进制代码。 (RO)
-
text( 程序代码区和文字常量区): 用来存放程序执行代码,同时也会包含一些常量(如一些字符串常量等)。静态分配
该段内存为静态分配,只读(某些架构可能允许修改)。
这块内存是共享的,当有多个相同进程(Process)存在时,共用同一个text段。 -
GVAR(global value),用来存放程序中已经初始化的非零全局变量和静态变量。静态分配
可分为读写(RW)区域和只读(RO)区域。
-> RO段保存const常量所以也被称为.constdata
-> RW段则是普通非常全局变量,静态变量就在其中 -
.bss: 存放程序中为未始化的和零值全局变量,和静态变量。静态分配内存。
-
堆(Heap)往高地址方向生长,栈(Stack)往低地址方向生长。
2. 全局变量和静态变量的区别:
2.1 静态全局变量
#include<iostream>
using namespace std;
static int i = 5;
int j = 3;//默认为extern
int main()
{
/*code*/
}
- 全局变量 j 和静态全局变量 i 都存放于程序的全局数据区域,
- 它们的生存周期都是程序的整个运行期,
- 但是 j 的作用域为全局作用域,可以通过extern在其他文件中使用,而 i 的作用域为文件作用域,只能在文件A中使用,
例如在文件B中:
extern int j; //OK
extern int i; // error: i在文件B中不可见
int a = j; // OK
int b = i; // error
2.2 局部静态变量
#include<iostream>
using namespace std;
void fun()
{
int i = 1; // 局部变量,具有动态生存期,每次进入函数时都初始化
static int j = 2; //静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化
}
int main()
{
static int j; //静态局部变量,具有全局寿命,局部可见
}
静态局部变量有以下特点:
- 该变量在全局数据区分配内存;
- 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
- 它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束;