1 / 33

CẤP PHÁT BỘ NHỚ VÀ CON TRỎ TRONG C

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

lel
Download Presentation

CẤP PHÁT BỘ NHỚ VÀ CON TRỎ TRONG C

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CẤP PHÁT BỘ NHỚ VÀ CON TRỎ TRONG C

  2. BIẾN (VARIABLE)

  3. 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ụ:

  4. 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:

  5. 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ỏ

  6. CẤP PHÁT VÙNG NHỚ(MEMORY ALLOCATION)

  7. 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

  8. STACK • Là 1 kiểucấutrúcdữliệu (data structure) • Hoạtđộngtheonguyênlý last in first out (vàosauratrước)

  9. 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

  10. STACK OVERFLOW int funtion1() { return funtion1(); } double x[1000000] funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1 funtion1

  11. MAIN(FIXED) STACK HEAP

  12. CON TRỎ (POINTER)

  13. Con trỏlàgì ? Con trỏlàloạibiếnđặcbiệt Con trỏlưuđịachỉcủacácbiếnkhác

  14. 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

  15. int number = 99; • int *pnumber; • pnumber = &number

  16. 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.

  17. 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.

  18. CÁC HÀM CẤP PHÁT ĐỘNG

  19. malloc realloc HÀM CẤP PHÁT ĐỘNG stdlib.h calloc free

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. TẠI SAO SỬ DỤNG CẤP PHÁT VÙNG NHỚ ĐỘNG ????????

  26. 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ớ//

  27. 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.

  28. NGUỒN THAM KHẢO • en.wikipedia.org • Google.com.vn

  29. THANKS FOR LISTENING ANY QUESTION ???

More Related