一、程序的内存分配
由C/C++编译器编译的程序占用的内存分为以下几个部分:
1. 栈(stack)——由编译器自动分配释放,存放函数参数、局部变量等。其操作方式类似数据结构中的栈
2. 堆(heap)——一般由程序员分配和释放,如果程序员没有释放,在程序结束时可能由操作系统回收。其与数据结构中的堆是两回事,操作方式类似于链表
3. 全局静态区——全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量存放在相邻的另一块区域。程序结束后由系统释放
4. 文字常量区——常量字符串就存放在这个区域,程序结束后由系统释放
5. 代码区——存放函数体的二进制代码
示例:
int a = 0; // 全局初始化区
char *p1; // 全局未初始化区
main()
{
int b; // 栈
char s[] = "abc"; // 栈
char *p2; // 栈
char *p3 = "12345"; // “12345\0”在常量区,p3在栈
static int c = 0; // 全局静态区
p1 = (char *)malloc(10); // 分配的10字节区域在堆
p2 = (char *)malloc(20); // 分配的20字节区域在堆
strcpy(p1, "12345"); // “12345\0”在常量区,编译器可能将它与p3所指向的“12345\0”优化成一个地方
}