00401020 push ebp
00401021 mov ebp,esp
00401023 sub esp,44h
00401026 push ebx
00401027 push esi
00401028 push edi
00401029 lea edi,[ebp-44h]
0040102c mov ecx,11h
00401031 mov eax,0cccccccch
00401036 rep stos dword ptr [edi] // 初始化
10: int x=10;
00401038 mov dword ptr [ebp-4],0ah //區域性變數ebp-4賦值0xa(10)
11: static int y=x;
0040103f xor eax,eax
00401041 mov al,[`variant'::`2'::$s1 (00427c58)] // 全域性變數初始化標誌放入al(8位乙個位元組)
00401046 and eax,1 // 取全域性變數初始化標誌的最後乙個位元組
00401049 test eax,eax // 比較
0040104b jne variant+45h (00401065) // 已經初始化,則跳過初始化過程
0040104d mov cl,byte ptr [`variant'::`2'::$s1 (00427c58)]
00401053 or cl,1
00401056 mov byte ptr [`variant'::`2'::$s1 (00427c58)],cl // 沒有初始化,則將初始化標誌置位
0040105c mov edx,dword ptr [ebp-4]
0040105f mov dword ptr [__cfltcvt_tab+0ab4h (00427c54)],edx // 初始化標誌置位後,將區域性變數的值賦值給全域性變數
12: static int z=g_x;
00401065 xor eax,eax
00401067 mov al,[`variant'::`2'::$s1 (00427c58)] // 全域性變數初始化標誌放入al(8位,乙個位元組)
0040106c and eax,2 // 取全域性變數初始化標誌的第二個位元組,即第二個全域性變數的初始化標誌
0040106f test eax,eax // 判斷
00401071 jne variant+6eh (0040108e) // 已經被初始化,則直接跳出
00401073 mov cl,byte ptr [`variant'::`2'::$s1 (00427c58)]
00401079 or cl,2
0040107c mov byte ptr [`variant'::`2'::$s1 (00427c58)],cl // 否則將初始化標誌置位
00401082 mov edx,dword ptr [g_x (00424a30)] // 全域性變數放edx
00401088 mov dword ptr [__cfltcvt_tab+0ab0h (00427c50)],edx // 全域性變數放到全域性靜態變數中
13: }
0040108e pop edi
0040108f pop esi
00401090 pop ebx
00401091 mov esp,ebp
00401093 pop ebp
00401094 ret
C 全域性變數與區域性變數
lession1.h extern bool a extern int b extern float c extern double d extern unsigned int e extern long f extern unsigned long g extern char h extern l...
全域性變數與區域性變數 C
區域性變數 作用域 函式內 包括形參 或 塊內 定義 函式內,包括形參,塊內 生命週期 從定義的那行開始分配記憶體,直至其所屬 塊內的最後一行結束或者return結束 儲存位置 儲存在棧中,當作用域結束後會自動釋放的區域性變數 注意 不同的作用域可以定義相同的區域性變數,否則不可.未初始化則預設值是...
區域性變數與全域性變數
根據c語言的說法,區域性變數 定義在方法內部的變數叫區域性變數 全域性變數 定義在方法外部的變數叫全域性變數。區域性變數和全域性變數的主要區別在於二者的生存週期不同。全域性變數的生存週期 靜態分配記憶體,程式執行期間常駐記憶體,直到程式執行結束。區域性變數的生存週期 動態分配記憶體,位於執行緒堆疊中...