Lecture 5 Memorky Layout and Allocation
使用靜態內存分配方式的不一定都是靜態變量, 也可能是全局變量
但靜態變量一定是靜態內存分配
int a;
int b = 1;
static int c; //靜態全局變量:只在文件內使用
static int d = 1;
char *str = "str";
static char *str1 = "str1";
void func() {
int e;
int f = 1;
static int g; //靜態局部變量:只在函數內使用, 函數執行完後並不釋放, 可供下次調用函數時使用
static int h = 1;
char *str2 = "str2";
static char *str3 = "str3";
int *p = (int *)malloc(sizeof(int));
}
Linux的內存佈局
(1)全局區和靜態區
初始化:
初始化的全局變量b : 0x80495ec
初始化的靜態全局變量d : 0x80495f0
全局字符串str : 0x80495f4
全局靜態字符串str1 : 0x80495f8
局部靜態字符串str3 : 0x80495fc
初始化的靜態局部變量h : 0x8049600
未初始化: 系統自動賦予0
未初始化的靜態全局變量c : 0x8049610
未初始化的靜態局部變量g : 0x804960c
未初始化的全局變量a : 0x8049614
(2)棧區
局部變量:
未初始化的局部變量e : 0xbfd36fdc (使用未初始化的局部變量可能出錯,因爲它的值是隨機的)
初始化的局部變量f : 0xbfd36fe0
局部字符串str2 : 0xbfd36fe4
(3)字符串常量區
字符串常量:
全局字符串str的內容 : 0x80484c0
全局靜態字符串str1的內容 : 0x80484c4
局部靜態字符串str3的內容 : 0x80484c9
局部字符串str2的內容 : 0x80484ce
(4)堆區
動態分配的內存地址p: 0x8e91008
(5)程序代碼區
Windows的內存佈局
(1)全局區和靜態區
初始化:
初始化的全局變量b : 0x00417000
初始化的靜態全局變量d : 0x00417004
全局字符串str : 0x00417008
全局靜態字符串str1 : 0x0041700c
局部靜態字符串str3 : 0x00417014
初始化的靜態局部變量h : 0x00417010
未初始化: 系統自動賦予0
未初始化的靜態全局變量c : 0x00417160
未初始化的靜態局部變量g : 0x00417164
未初始化的全局變量a : 0x0041718c
(2)棧區
局部變量:
未初始化的局部變量e : 0x0012fe8c (使用未初始化的局部變量可能出錯,因爲它的值是隨機的)
初始化的局部變量f : 0x0012fe80
局部字符串str2 : 0x0012fe74
(3)字符串常量區
字符串常量:
全局字符串str的內容 : 0x0041574c
全局靜態字符串str1的內容 : 0x00415744
局部靜態字符串str3的內容 : 0x0041573c
局部字符串str2的內容 : 0x004157b8
(4)堆區
動態分配的內存地址p: 0x00385ee8
(5)程序代碼區