1、栈区
保存局部变量。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁。其特点是效率高,但空间大小有限。
2、堆区
由malloc系列函数或new操作符分配的内存。其生命周期有free或delete决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
3、数据区
①bss区:(Block Started by Symbol segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域,一般在初始化时bss 段部分将会清零。bss段属于静态内存分配,即程序一开始就将其清零了。 比如,在C语言之类的程序编译完成之后,已初始化的全局变量保存在.data 段中,未初始化的全局变量保存在.bss 段中。 在《Programming ground up》里对.bss的解释为:There is another section called the .bss. This section is like the data section, except that it doesn’t take up space in the executable.
②data区:保存初始化不为0的全局变量或者static修饰的变量
③rodata区:用于保存常量
4、代码区
存放函数体的二进制代码
int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈
char s[] = "abc"; //s在栈上,abc在常量区
char *p2; //栈
char *p3 = "123456"; //123456\0在常量区,p3在栈上
static int c = 0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(10); //分配的10和20字节的区域就在堆区
strcpy(p1,"123456"); //123456\0存放在常量区,编译器可能会与p3所指的“123456”优化成一
//个地方
}