1. C代码的内存分布
一个程序本质上都是由 BSS 段、data段、text段三个组成的。C代码在运行装入内存时会增加栈和堆。
C代码的内存分布:
区 | 说明 |
---|---|
栈 | 由编译器在需要时分配,在不需要时自动清除,通常是局部变量、函数参数等 |
堆 | 由程序员自己申请(malloc)和释放(delete)的内存,如果没有释放,程序结束后,可能由操作系统释放 |
数据段 | 初始化的全局变量和静态变量,静态内存分配 |
BSS段 | 未初始化的全局变量,静态内存分配 |
代码段 | 存放的是程序代码,也可能存放一些只读的常量,如字符串常量等 |
/*全局变量,项目中的所有文件都可以使用这个变量,但外部文件使用前要加extern声明*/
int a = 1;
/*静态全局变量,具有文件作用域,即该变量只能在当前文件的任意位置使用*/
static int b;
void func(){
/*局部变量,是在函数体内定义的变量(包括main,各函数同名的局部变量并无影响),
只在函数执行期间存在,在函数调用结束之后变量会被撤销,其所占的空间也会被释放。*/
int c=1;
/*静态局部变量,只被初始化一次,直到程序结束之前都会一直存在。但是只能被定义自
己的函数一直可见*/
static int d=2;
}
此外,对于全局变量和static修饰的静态变量,如果不赋初值,编译时自动为该变量赋值为0。
2. C++内存分布
基本上和C是差不多的,但有些变化
区 | 说明 |
---|---|
栈 | 由编译器在需要时分配,在不需要时自动清除,通常是局部变量、函数参数等 |
堆 | 由程序员自己申请(malloc)和释放(free)的内存,如果没有释放,程序结束后,可能由操作系统释放 |
全局/静态存储区 | 初始化的和未初始化的全局变量和静态变量都在这一块,C是分开的,C++将其放在同一块 |
自由存储区 | 程序员使用操作符new(delete)申请(释放)的内存 |
常量存储区 | 存放的是只读的常量 |