340 likes | 520 Views
CẤP PHÁT BỘ NHỚ VÀ CON TRỎ TRONG C. BIẾN (VARIABLE). BIẾN CỤC BỘ (local, automatic variable). Biến toàn cục ( global variable ). Được khai báo ngoài tất cả các hàm Tồn tại từ lúc bắt đầu đến lúc kết thúc chương trình . Kích thước không thay đổi trong quá trình sống
E N D
BIẾN CỤC BỘ (local, automatic variable) Biếntoàncục (global variable) • Đượckhaibáongoàitấtcảcáchàm • Tồntạitừlúcbắtđầuđếnlúckếtthúcchươngtrình. • Kíchthướckhôngthayđổitrongquátrìnhsống • Đượccấpphát ở vùngnhớcốđịnh • Vídụ: • Khaibáotronghàm • Tồntạitrongđoạnmãmànóđượckhaibáo • Kíchthướckhôngthayđổitrongquátrìnhsống • Đượccấpphát ở vùngnhớ stack • Vídụ:
Biếntĩnhcụcbộ Static local variable Biếntĩnhtoàncục Static global variable • Khaibáonhưbiếntoàncục • Cótừkhóastatic • Cóphạm vi trong file • Dùngtừkhóa extern đểliênkếtvới file khác • Khaibáotronghàm con • Cótừkhóa static • Chỉcóphạm vi tronghàm • Khởitạo 1 lầnchomọilầngọihàm. • Vídụ Lưu ý: biến static nếukhôngđượckhởitạogiátrịthìchươngtrìnhtựđộnggángiátrị 0 chonó. VD:
BIẾN ĐỘNG • Biếnkhôngđượckhaibáotường minh. • Cóthểđượccấppháthoặcgiảiphóngbộnhớkhingườisửdụngyêucầu. • Vùngnhớcủabiếnđượccấppháttrong Heap. • Kíchthướccóthểthayđổitrongquátrìnhsống. • Biếnđộngkhôngcótên, ta chỉcóthểtruyxuấtdữliệucủabiếnthông qua con trỏ
CẤP PHÁT VÙNG NHỚ CẤP PHÁT VÙNG NHỚ TỰ ĐỘNG CẤP PHÁT VÙNG NHỚ TĨNH CẤP PHÁT VÙNG NHỚ ĐỘNG stack main(fixed) Heap(free store) Biếncụcbộ, toàncục Biếntĩnh Biếnđộng
STACK • Là 1 kiểucấutrúcdữliệu (data structure) • Hoạtđộngtheonguyênlý last in first out (vàosauratrước)
int s void main () { intc; intd; int i; i = sum(a,b); } int sum(int a, int b) { int s = a + b; return s; } Return address inta intb sum inti intd intc main
STACK OVERFLOW int funtion1() { return funtion1(); } double x[1000000] funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1
MAIN(FIXED) STACK HEAP
Con trỏlàgì ? Con trỏlàloạibiếnđặcbiệt Con trỏlưuđịachỉcủacácbiếnkhác
Cáchkhaibáo con trỏ: • Nhìn 3 dònglệnhsauđây • intnumber = 99; • int*pnumber; • pnumber = &number • Quyướcchung: khikhaibáobiến con trỏthìtênbiếnthườngcóchữpphíatrướcđểdễphânbiệtvớicácbiếnkhác
int number = 99; • int *pnumber; • pnumber = &number
ADDRESS-OF OPERATOR (reference operator) • Kýhiệu: & • Dùngđểlấyđịachỉcủamộtbiến • Lưu ý: biếnkiểunàothìdùng con trỏkiểuấy.
Indirection operator (dereference operator) • Kíhiệu: * • Dùngđểtruycậpdữliệuchứatrongđịachỉmà con trỏđangtrỏtới • Lưu ý: khôngbaogiờtruycập con trỏcógiátrị NULL. Chươngtrìnhkhi compile và build khôngbáolỗinhưngkhichạysẽ crash.
malloc realloc HÀM CẤP PHÁT ĐỘNG stdlib.h calloc free
void* malloc(size); • Cấpphátbộnhớ • Trongđó size làsố byte bộnhớcầncấpphát. • Hàmtrảvềcon trỏchỉtớiđịachỉcủabộnhớvừacấpphát. Vídụ: int *p; p= (int*)malloc(4); Malloc
void* calloc(nitem,size); • Côngdụngnhưmallocnhưngcó 3 điểmkhácbiệt: • Có 2 thamsố • Khởitạocác bit trongbộnhớvề 0 • Vùngnhớgồmcác ô nhớliềnkềnhau Vídụ: int *p; p = (int*)calloc(10, 6); Calloc
void* realloc(void* block, size_t size); dùngđểthayđổikíchthướcbộnhớđãđượccấpphát: Trongđó block làđịacủabộnhớđãcấppháttrướcđó, size làtổngsố byte bộnhớbạnmuốncấpphátlại, giátrịtrảvềlàđịachỉcủabộnhớđượccấpphátlại. Vídụ:muốnthayđổikíchthướcbộnhớcủa con trỏ p1: int *p1=(int*)malloc(100); p1 = realloc(p1,200); Realloc
void free(void* block); Dùngđểgiảiphóngvùngbộnhớđượccấpphátbởi 1 trong 3 hàmtrên.Trongđó block làđịachỉcủavùngbộnhớcầngiảiphóng. Vídụ: int *p=(int*)malloc(10*sizeof(int)); free(p); Free
0 1 Con trỏ 1 bit 00 01 10 11 Con trỏ 2 bit 000 001 010 011 100 101 110 111 Con trỏ 3 bit 0…0 1…1 Con trỏ n bit
RÒ RỈ BỘ NHỚ (MEMORY LEAK) • Xảyrakhicấpphátbộnhớmàkhông “giảiphóng” vùngnhớhoặcmấtđịachỉvùngnhớ • Vùngnhớbịmất do ròrỉgọilàvùngnhớ “mồcôi” Vídụ: int*p=(int *)malloc(4); p=NULL; //mấtđịachỉvùngnhớ//
Ngănngừavàkhắcphụchậuquả • Ngănngừa: luônnhớdùnghàm free() để “giảiphóng” vùngnhớ. • Khắcphục (nếuquên “giảiphóng”): dùngcáccôngcụ memory debugger.
NGUỒN THAM KHẢO • en.wikipedia.org • Google.com.vn
THANKS FOR LISTENING ANY QUESTION ???