預備知識
一個由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函數的二進制代碼在程序代碼區
}