C内存布局

(1)栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等。其操作方式类似数据结构中的栈。存放为运行时函数分配的局部变量、函数参数、返回数据、返回地址等。其操作类似于数据结构中的栈。
(2)堆区(heap):一般有程序员分配释放,若程序员不释放,程序结束时由系统释放。与数据结构的堆毫无关系,分配方式类似于链表。malloc,alloc,realloc
(3)全局/静态区:全局变量和静态变量的存储是在一块的。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域;存放全局变量、静态数据、常量。程序结束后由系统释放。全局区分为已初始化全局区(data)和未初始化全局区(bss)
(4)文字常量区:存放常量字符串,程序结束后由系统释放。
(5) 程序代码区:存放函数体(类成员函数和全局区)的二进制代码

C++内存布局

(1)栈区:局部变量,函数传参值,自动释放,效率高但内存少
(2)堆区:malloc函数从堆上申请内存,用free释放内存,若不释放,程序结束释放
(3)自由存储区:自由存储区是C++基于new操作符的一个抽象概念。new操作符在此申请内存,用delete释放内存,若不释放,程序结束释放
(4)全局/静态区:存储全局变量或静态变量。内存在编译时就分配好了(程序执行前),整个程序运行期间都存在,程序结束时释放。
(5)常量存储区:存储常量(const),不允许修改。

测试

  1. int a = 0;//全局初始化区
  2. char* p ;//全局未初始化区
  3. void main()
  4. {
  5. int b;//局部变量
  6. char s[] = abc”;//s在栈,“abc在字符常量区
  7. char *p2 ;//栈
  8. char *p3 = abcdef"//p3栈,“abcdef在字符常量区
  9. static int c = 0;//全局(静态)初始化区
  10. p1 = (char*)malloc(10);//在堆上开辟10个字节的内存,p1本身在栈中
  11. p2 = (char*)malloc(20);//在堆上开辟20个字节的内存,p2本身在栈中
  12. return 0;
  13. }