(1 )栈( stack ):由 编译器自动分配释放 ,存放 函数的参数值、局部变量的值、返回地址 等,其操作方式类似于数据结果中的栈。
栈又称堆栈, 是用户存放程序临时创建的局部变量 ,也就是说我们函数括弧“ { } ”中定义的变量(但不包括static 声明的变量, static 意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存 / 恢复调用现场 。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
(2) 堆(heap ):一般由 程序员动态分配 (调用malloc 函数)和释放(调用 free 函数),若程序员不释放,程序结束时可能由操作系统回收。
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。
(3 )数据段( data ):存放的是 全局变量、静态变量、常数 。根据存放的数据,数据段又可以分为普通数据段(包括可读可写/ 只读数据段,存放静态初始化的全局变量或常量)、 BSS 数据段(存放未初始化的全局变量 )。 在采用段式内存管理的架构中,BSS 段( bss segment )通常是指用来存放程序中未初始化的全局变量的一块内存区域。 BSS 是英文 Block Started by Symbol 的简称。 BSS 段属于静态内存分配。 程序结束后由系统释放
(4)文字常量区 : —常量字符串就是放在这里的 , 程序结束后由系统释放
(5 )代码段( code ):用于存放程序代码。代码段( code segment/text segment )通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读 , 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
内存分布示意图
//main.cpp int a = 0; // 全局初始化区 char *p1; // 全局未初始化区 main() { int b; //栈中 char s[] = "abc"; //栈中 char *p2; //栈中 char *p3 = "123456"; //123456\0在常量区, p3 在栈上 static int c =0; //全局(静态)初始化区 //以下分配得到的 10 和 20 字节的区域就在堆区 p1 = (char *)malloc(10); p2 = new char[20];//(char *)malloc(20); strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与 p3 所指向的 "123456" 优化成一个地方。 }
转载:http://blog.sina.com.cn/s/blog_63d4849c01014qg3.html