一个由C/C++编译的程序占用的内存分为以下几个区域:
1、栈区(stack)
由系统自动分配和释放,用于存放函数的参数值,局部变量值等。其在内存中是一块连续的存储区域,由低地址向高地址延伸。
2、堆区(heap)
由程序员分配和释放,若程序员不释放,则程序结束时可能由操作系统回收。其存储空间在内存中是不连续,分配方式类似于链表。
3、静态区(static)
又称全局区,程序结束后由系统释放,用于存放全局变量和静态变量。初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量则存储在相邻的另一块区域。
4、文字常量区
程序结束后由系统释放,用于存储常量,字符串常量就是放在这里的。
5、程序代码区
存放函数体的二进制代码。
#include <stdlib.h> #include <string.h> int a = 0; // 全局初始化区. char *p1; // 全局未初始化区. int main(void) { int b; // 栈区. char s[] = "abc"; // 栈区. char *p2; // 栈区. char *p3 = "123456"; // 123456\0 在常量区, p3 在栈上. static int c = 0; // 静态(全局)初始化区. // 分配得来的 10 和 20 字节的区域就在堆区。 p1 = (char *)malloc(10); p2 = (char *)malloc(20); // 123456\0 放在常量区. // 编译器可能会将它与p3所指向的 "123456" 优化成一个地方. strcpy(p1, "123456"); return 0; }