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)程式碼區