预备知识
一个由C/C++编译的程序占用的内存分为以下几个部分:
-
栈区(stack):由编译器自动分配与释放,存放函数运行时的局部变量、函数参数、返回数据、返回地址等。
-
堆区(heap):由程序员自动分配与释放,用malloc函数申请内存,用free函数释放内存。
-
全局区(静态区static):全局变量和静态变量的存储是放在一块的,内存分配在程序编译之前完成,且在程序的整个运行期间都存在。全局区分为已初始化全局区(data)和未初始化全局区(bss)。
-
文字常量区:存放常量字符串。
-
程序代码区:存放函数体的二进制代码。
内存图解
示例代码
#include <stdio.h>
#include <stdlib.h>
int i = 0;//全局已初始化区
int j; //全局未初始化区
static int x =0;//全局已初始化区
static int y; //全局未初始化区
void main() {
int a; //栈区
int *pa;//栈区
int *p1 = (int *) malloc(20);//堆区
int *p2 = (int *) malloc(40);//堆区
char *s1;//栈区
char s2[] = "Hello World";//栈区
char *s3 = "Hello World";//*s3:栈区 Hello World\0:文字常量区
static int x =0;//全局已初始化区
static int y; //全局未初始化区
printf("main:0x%p\n",main);//main函数的二进制代码在程序代码区
}