1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Muzika] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG Lloyd: OK kështu që një sugjerim para fillimit këtu. 5 00:00:07,940 --> 00:00:11,660 Nëse ju nuk e keni shikuar videon në pointers ju mund të dëshironi për të bërë këtë për herë të parë. 6 00:00:11,660 --> 00:00:15,860 Sepse kjo video është një tjetër mënyrë për të punuar me pointers. 7 00:00:15,860 --> 00:00:17,574 >> Kështu ajo do të flasim në lidhje me disa koncepte 8 00:00:17,574 --> 00:00:19,490 që ne të mbuluar në pointers video të, dhe ne jemi 9 00:00:19,490 --> 00:00:21,948 do të komentoj mbi to tani, duke supozuar se ata janë tashmë të 10 00:00:21,948 --> 00:00:23,090 lloj i kuptuar. 11 00:00:23,090 --> 00:00:25,440 Pra, kjo është vetëm paralajmërimi juaj i drejtë se në qoftë se ju jeni duke parë këtë video 12 00:00:25,440 --> 00:00:27,814 dhe ju nuk e kanë parë pointers Video, ajo mund lloj 13 00:00:27,814 --> 00:00:29,610 fluturojnë mbi kokën tuaj pak. 14 00:00:29,610 --> 00:00:32,080 Dhe kështu që ajo mund të jetë më mirë për të parë atë në atë mënyrë. 15 00:00:32,080 --> 00:00:34,710 >> Pra, ne kemi parë tashmë një mënyrë për të punuar me pointers, 16 00:00:34,710 --> 00:00:37,810 i cili është shpallim një variabel dhe pastaj ne 17 00:00:37,810 --> 00:00:42,160 të deklarojë një ndryshore, një akrep variabël, që tregon për të. 18 00:00:42,160 --> 00:00:44,870 Pra, ne kemi krijuar një ndryshueshme me një emër, ne kemi 19 00:00:44,870 --> 00:00:48,480 krijoi një ndryshore të dytë me një emër, dhe ne pika se ndryshueshme dytë 20 00:00:48,480 --> 00:00:50,220 në atë të parë. 21 00:00:50,220 --> 00:00:52,370 Ky lloj ka një Problemi pse, sepse ajo 22 00:00:52,370 --> 00:00:54,650 na kërkon që të dini saktësisht sa e kujtesës sa ne jemi 23 00:00:54,650 --> 00:00:57,600 do të duhet momentin programi ynë është hartuar. 24 00:00:57,600 --> 00:00:58,220 >> Pse eshte ajo? 25 00:00:58,220 --> 00:01:03,338 Sepse ne duhet të jetë në gjendje për të përmendur apo të identifikojnë të gjitha variablave të mundshme 26 00:01:03,338 --> 00:01:04,129 ne mund të hasni. 27 00:01:04,129 --> 00:01:07,910 Ne mund të kemi një rrjet që mund të jetë në gjendje të mbajë një shumë të informacionit, 28 00:01:07,910 --> 00:01:10,110 por kjo nuk është ende e saktësisht saktë të mjaftueshme. 29 00:01:10,110 --> 00:01:12,640 Po në qoftë se ne nuk e dimë, çfarë nëse ne nuk kemi ide 30 00:01:12,640 --> 00:01:14,370 sa ne do të duhet në kohën e kompilimit? 31 00:01:14,370 --> 00:01:17,020 Ose çfarë nëse programi ynë do të të kandidojë për një kohë vërtet të gjatë, 32 00:01:17,020 --> 00:01:19,810 pranuar përdorues ndryshme të dhënave, dhe ne nuk mund të vërtetë 33 00:01:19,810 --> 00:01:23,170 vlerësojnë nëse ne jemi do të ketë nevojë për 1000 njësi? 34 00:01:23,170 --> 00:01:26,060 >> Ajo nuk është si ne mund të thonë se në rreshtin e komandave 35 00:01:26,060 --> 00:01:28,040 të hyjë sa shumë sende ju mendoni se ju do të duhet. 36 00:01:28,040 --> 00:01:31,100 E pra çfarë nëse kjo mend është e gabuar? 37 00:01:31,100 --> 00:01:34,300 Kujtese dinamik lloj na lejon rrugën 38 00:01:34,300 --> 00:01:36,867 për të marrë rreth këtij problemi të veçantë. 39 00:01:36,867 --> 00:01:38,700 Dhe mënyrën se si ajo e bën atë është duke përdorur pointers. 40 00:01:38,700 --> 00:01:42,140 >> Ne mund të përdorim pointers për merrni qasje në mënyrë dinamike 41 00:01:42,140 --> 00:01:45,710 kujtesës ndarë, kujtesës që është ndarë si programin tuaj po kandidon. 42 00:01:45,710 --> 00:01:48,290 Kjo nuk është alokuar në kohën e kompilimit. 43 00:01:48,290 --> 00:01:51,570 Kur ju dinamike ndajë kujtim ajo vjen nga një pishinë 44 00:01:51,570 --> 00:01:53,795 e kujtesës e njohur si grumbull. 45 00:01:53,795 --> 00:01:56,420 Më parë të gjithë Memory ne kemi punuar me gjatë 46 00:01:56,420 --> 00:01:59,920 ka ardhur nga një grup e kujtesës e njohur si rafte. 47 00:01:59,920 --> 00:02:02,470 Një mënyrë e mirë për të në përgjithësi të mbajtur në rregull mind-- dhe këtë 48 00:02:02,470 --> 00:02:04,720 nuk ka gjithmonë të mbajë e vërtetë, por shumë e shumë pothuajse 49 00:02:04,720 --> 00:02:09,940 gjithmonë mban true-- është se çdo herë ju jepni një emër ndryshueshme atë 50 00:02:09,940 --> 00:02:12,090 ndoshta jeton në rafte. 51 00:02:12,090 --> 00:02:14,650 Dhe çdo herë që ju nuk e bëni të japë një ndryshore një emër, 52 00:02:14,650 --> 00:02:19,160 që ju mund të bëni me kujtesën dinamike ndarja, ajo jeton në grumbull. 53 00:02:19,160 --> 00:02:22,190 >> Tani unë jam natyrë e paraqitur këtë si në qoftë se ka këto dy pishina të kujtesës. 54 00:02:22,190 --> 00:02:24,740 Por ju mund të keni parë këtë diagram, e cila është përgjithësisht 55 00:02:24,740 --> 00:02:27,290 një përfaqësim i çfarë kujtesës duket si, 56 00:02:27,290 --> 00:02:30,373 dhe ne nuk do të kujdesen për të gjithë stuff në krye dhe në fund. 57 00:02:30,373 --> 00:02:33,580 Ajo që na intereson është kjo pjesë në e mesme këtu, tog dhe rafte. 58 00:02:33,580 --> 00:02:35,570 Siç mund ta shikoni nga duke kërkuar në këtë diagram, 59 00:02:35,570 --> 00:02:38,390 këto në fakt nuk janë dy pishina të veçanta të kujtesës. 60 00:02:38,390 --> 00:02:42,757 Kjo është një pishinë të përbashkët të kujtesës ku ju filloni, në këtë vizuale 61 00:02:42,757 --> 00:02:44,590 ju filloni në fund dhe të fillojnë mbushur deri 62 00:02:44,590 --> 00:02:48,040 nga thellësia me rafte, dhe ju të fillojë në krye dhe të fillojnë mbushur 63 00:02:48,040 --> 00:02:50,072 nga lart poshtë me tog. 64 00:02:50,072 --> 00:02:51,780 Por kjo me të vërtetë është njëjtë pishinë, kjo është vetëm 65 00:02:51,780 --> 00:02:56,050 spote të ndryshme, vende të ndryshme në kujtesën që janë duke u ndarë. 66 00:02:56,050 --> 00:02:59,060 Dhe ju mund të drejtuar nga kujtim nga ose të paturit 67 00:02:59,060 --> 00:03:01,240 tog shkuar gjatë gjithë rrugës në fund, ose kanë 68 00:03:01,240 --> 00:03:05,440 rafte shkojnë të gjithë rrugën në krye, ose që kanë tog dhe rafte 69 00:03:05,440 --> 00:03:06,740 takohen kundër njëri-tjetrit. 70 00:03:06,740 --> 00:03:09,500 Të gjithë ata mund të jenë kushtet që shkaktojnë programin tuaj 71 00:03:09,500 --> 00:03:11,030 për të dalë jashtë kujtesës. 72 00:03:11,030 --> 00:03:11,952 Pra, mbani në mend. 73 00:03:11,952 --> 00:03:13,660 Kur ne flasim për tog dhe rafte 74 00:03:13,660 --> 00:03:17,880 ne jemi me të vërtetë duke folur për njëjtën copë e përgjithshme e kujtesës, vetëm 75 00:03:17,880 --> 00:03:21,930 Pjesë të ndryshme të kësaj kujtesës. 76 00:03:21,930 --> 00:03:24,910 >> Pra, si nuk kemi marrë dinamike ndarë kujtesës në vendin e parë? 77 00:03:24,910 --> 00:03:27,740 Si funksionon programi ynë të marrë kujtesës si ajo e running? 78 00:03:27,740 --> 00:03:32,660 E pra C ofron një funksion të quajtur malloc, përcaktuesi kujtesës, e cila 79 00:03:32,660 --> 00:03:36,810 ju bëni një telefonatë për të, dhe ju të kalojë në Sa bytes e kujtesës që ju dëshironi. 80 00:03:36,810 --> 00:03:39,940 Pra, në qoftë se programi juaj është duke dhe ju doni një Runtime integer, 81 00:03:39,940 --> 00:03:46,040 ju mund të mallock katër bytes i kujtesës, malloc kllapa katër. 82 00:03:46,040 --> 00:03:48,540 >> mallock do të shkojnë nëpër duke kërkuar nëpërmjet një mase, 83 00:03:48,540 --> 00:03:50,750 sepse ne jemi në mënyrë dinamike caktimin e kujtesës, 84 00:03:50,750 --> 00:03:53,500 dhe ajo do të kthehet tek ju një tregues për këtë kujtesë. 85 00:03:53,500 --> 00:03:56,180 Ajo nuk ju jap se memory-- kjo nuk do t'i jepte një emër, 86 00:03:56,180 --> 00:03:57,950 kjo ju jep një tregues për të. 87 00:03:57,950 --> 00:04:00,780 Dhe kështu kjo është arsyeja pse përsëri thashë kjo është e rëndësishme për të ndoshta 88 00:04:00,780 --> 00:04:03,770 kanë shikuar video Pointers para se të merrni shumë larg në këtë. 89 00:04:03,770 --> 00:04:05,940 Pra malloc do të ju jap përsëri një akrep. 90 00:04:05,940 --> 00:04:08,950 >> Nëse mallock nuk mund të ju jap ndonjë kujtesës për shkak se ju keni dalë jashtë, 91 00:04:08,950 --> 00:04:10,645 ajo do të ju jap përsëri një tregues null. 92 00:04:10,645 --> 00:04:15,282 A ju kujtohet çfarë ndodh nëse ne provoni dhe dereference një tregues null? 93 00:04:15,282 --> 00:04:17,019 Ne vuajnë një faj seg, e drejtë? 94 00:04:17,019 --> 00:04:18,060 Kjo ndoshta nuk është e mirë. 95 00:04:18,060 --> 00:04:21,579 >> Pra, çdo herë që bëni një telefonatë për malloc ju gjithmonë, gjithmonë 96 00:04:21,579 --> 00:04:25,270 duhet të kontrolloni nëse janë apo jo treguesin ajo ju dha përsëri është i pavlefshëm. 97 00:04:25,270 --> 00:04:28,800 Nëse kjo është, ju keni nevojë për t'i dhënë fund programin tuaj sepse në qoftë se ju provoni dhe dereference 98 00:04:28,800 --> 00:04:31,360 tregues null ju do të jeni të vuajnë një defekt segmentimit 99 00:04:31,360 --> 00:04:34,380 dhe programi juaj është i duke shkuar për të rrëzuar gjithsesi. 100 00:04:34,380 --> 00:04:37,190 Deri sa nuk kemi statike të marrë një numër të plotë? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Ne kemi bërë ndoshta që një bandë e herë, e drejtë? 103 00:04:40,010 --> 00:04:43,480 Kjo krijon një ndryshore të quajtur x që jeton në rafte. 104 00:04:43,480 --> 00:04:46,190 Si nuk kemi dinamike të marrë një numër të plotë? 105 00:04:46,190 --> 00:04:50,010 Int yll px barabartë malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Ose më shumë në mënyrë të përshtatshme ne do të them yll int PX 107 00:04:53,050 --> 00:04:57,680 është e barabartë me madhësinë malloc e int, vetëm për të hedhur disa më pak 108 00:04:57,680 --> 00:04:59,740 numrat magjike rreth programit tonë. 109 00:04:59,740 --> 00:05:04,140 Kjo do të marrë për ne katër bytes të memories nga plehrat, 110 00:05:04,140 --> 00:05:06,720 dhe tregues marrim kthehen në atë që quhet px. 111 00:05:06,720 --> 00:05:08,430 Dhe pastaj ashtu si ne kemi bërë më parë ne 112 00:05:08,430 --> 00:05:13,966 mund dereference PX të hyni në këtë kujtesë. 113 00:05:13,966 --> 00:05:15,590 Si mund të merrni një numër të plotë nga përdoruesit? 114 00:05:15,590 --> 00:05:17,970 Ne mund të themi int x është e barabartë me të int. 115 00:05:17,970 --> 00:05:19,930 Kjo është shumë i thjeshtë. 116 00:05:19,930 --> 00:05:24,030 Çfarë nëse duam të krijojmë një rrjet nga x gjithandej që jetojnë në rafte? 117 00:05:24,030 --> 00:05:28,210 noton stack_array-- ky është emri i array-- tona kllapa katrore x. 118 00:05:28,210 --> 00:05:32,419 Kjo do të krijojë për ne një array nga x gjithandej që jetojnë në rafte. 119 00:05:32,419 --> 00:05:34,960 Ne mund të krijojë një grup të gjithandej që jeton në grumbull, too. 120 00:05:34,960 --> 00:05:37,330 Sintaksa mund të duket një pak më shumë i rëndë, 121 00:05:37,330 --> 00:05:41,740 por ne mund të themi noton yll heap_array barabartë 122 00:05:41,740 --> 00:05:44,360 herë malloc x Madhësia e noton. 123 00:05:44,360 --> 00:05:48,160 Unë kam nevojë për hapësirë ​​të mjaftueshme për të mbajtur x lundrues vlerat pikë. 124 00:05:48,160 --> 00:05:51,560 Pra, thonë se unë duhet 100 gjithandej, ose 1000 gjithandej. 125 00:05:51,560 --> 00:05:54,810 Pra, në këtë rast do të 400 bytes për 100 gjithandej, 126 00:05:54,810 --> 00:05:59,080 apo 4000 bytes për 1000 gjithandej, sepse secili noton merr 127 00:05:59,080 --> 00:06:01,230 katër bytes të hapësirës. 128 00:06:01,230 --> 00:06:05,110 >> Pas bërë këtë unë mund të përdorni të katror Sintaksa kllapa në heap_array. 129 00:06:05,110 --> 00:06:08,970 Ashtu si unë do të në stack_array, unë mund të hyni në elementet e saj në mënyrë individuale 130 00:06:08,970 --> 00:06:11,590 përdorur heap_array zero, një heap_array. 131 00:06:11,590 --> 00:06:15,800 Por kujtojnë arsyen ne mund të bëjë atë është për shkak se emri i një grup në C 132 00:06:15,800 --> 00:06:19,990 është me të vërtetë një tregues për Elementi i parë që Array së. 133 00:06:19,990 --> 00:06:23,480 Pra, fakti se ne jemi një deklarues grup i gjithandej në rafte këtu 134 00:06:23,480 --> 00:06:24,810 është në fakt një pak mashtruese. 135 00:06:24,810 --> 00:06:27,600 Ne me të vërtetë jemi në Linja e dytë e kodit atje 136 00:06:27,600 --> 00:06:32,360 gjithashtu duke krijuar një tregues për një copë të kujtesës që ne pastaj të bëjë disa punë me të. 137 00:06:32,360 --> 00:06:35,620 >> Këtu është problemi i madh me dinamike ndarë kujtesës edhe pse, 138 00:06:35,620 --> 00:06:38,360 dhe kjo është arsyeja pse është e vërtetë e rëndësishme që të zhvillojnë disa zakone të mira 139 00:06:38,360 --> 00:06:39,800 kur ju jeni duke punuar me të. 140 00:06:39,800 --> 00:06:43,060 Ndryshe deklaruar statike kujtesës, kujtesa juaj 141 00:06:43,060 --> 00:06:46,790 nuk është kthyer automatikisht në sistemi kur funksioni juaj është bërë. 142 00:06:46,790 --> 00:06:49,280 Pra, nëse ne kemi kryesor, dhe kryesore quan një funksion 143 00:06:49,280 --> 00:06:53,860 f, kur f përfundon çfarëdo qoftë ajo është duke bërë dhe kthen kontrollin e programit 144 00:06:53,860 --> 00:06:58,810 Mbrapsht në kryesore, të gjithë e kujtesës se f përdorur është dhënë përsëri. 145 00:06:58,810 --> 00:07:01,250 Ajo mund të përdoret përsëri nga ndonjë program tjetër, 146 00:07:01,250 --> 00:07:04,250 apo ndonjë funksion tjetër që merr quajtur më vonë në kryesore. 147 00:07:04,250 --> 00:07:06,970 Ajo mund të përdorni të njëjtin kujtesën mbi përsëri. 148 00:07:06,970 --> 00:07:09,620 >> Nëse ju dinamike të siguroj kujtesë pse 149 00:07:09,620 --> 00:07:14,380 ju keni për të në mënyrë eksplicite them të sistem që ju jeni bërë me të. 150 00:07:14,380 --> 00:07:18,370 Ajo do të mbajnë atë për ju, e cila mund të të çojë në një problem të ju mbaron 151 00:07:18,370 --> 00:07:19,290 e kujtesës. 152 00:07:19,290 --> 00:07:22,179 Dhe në fakt ne nganjëherë i referohemi në këtë si një rrjedhje kujtesës. 153 00:07:22,179 --> 00:07:24,970 Dhe ndonjëherë këto rrjedhjet e kujtesës në fakt mund të jetë me të vërtetë shkatërruese 154 00:07:24,970 --> 00:07:27,020 për ecurinë e sistemit. 155 00:07:27,020 --> 00:07:31,120 >> Nëse ju jeni një përdorues i shpeshtë në internet ju mund të përdorni shfletues web të caktuara, 156 00:07:31,120 --> 00:07:35,630 dhe unë nuk do emrin emra këtu, por ka disa shfletues web atje 157 00:07:35,630 --> 00:07:39,150 që janë të njohur për të pasur në të vërtetë rrjedhjet e kujtesës që nuk do të marrë fikse. 158 00:07:39,150 --> 00:07:44,570 Dhe në qoftë se ju largoheni shfletuesi juaj i hapur për një periudhë shumë të gjatë kohore, ditë 159 00:07:44,570 --> 00:07:48,060 dhe ditë, apo javë, ju ndonjëherë mund të vëreni se sistemi juaj 160 00:07:48,060 --> 00:07:49,790 është duke të vërtetë, me të vërtetë ngadalë. 161 00:07:49,790 --> 00:07:54,640 Dhe arsyeja për këtë është se shfletuesi ka ndarë kujtesën, 162 00:07:54,640 --> 00:07:57,320 por pastaj nuk i tha të sistemit se kjo është bërë me të. 163 00:07:57,320 --> 00:08:01,000 Dhe kështu që lë pak memorie në dispozicion për të gjitha programet tuaja të tjera 164 00:08:01,000 --> 00:08:04,480 që të ketë për të ndarë, për shkak se ju jeni leaking-- se web browser 165 00:08:04,480 --> 00:08:06,755 Programi rrjedh kujtesës. 166 00:08:06,755 --> 00:08:08,880 Si mund të japin kujtesës prapa kur ne jemi duke bërë me të? 167 00:08:08,880 --> 00:08:10,838 E pra për fat të mirë kjo është një mënyrë shumë e lehtë për të bërë atë. 168 00:08:10,838 --> 00:08:11,710 Ne vetëm të lirë atë. 169 00:08:11,710 --> 00:08:15,020 Ka një funksion të quajtur të lirë, ajo pranon një tregues për kujtesë, 170 00:08:15,020 --> 00:08:16,010 dhe ne jemi të mirë për të shkuar. 171 00:08:16,010 --> 00:08:18,310 >> Pra, le të thonë se ne jemi në mesi i programit tonë, 172 00:08:18,310 --> 00:08:21,970 ne duam të malloc 50 karaktere. 173 00:08:21,970 --> 00:08:25,710 Ne duam të malloc një grup që mund të aftë për të mbajtur 50 karaktere. 174 00:08:25,710 --> 00:08:29,109 Kur ne të merrni një tregues kthehet në se, emër që akrep është fjala. 175 00:08:29,109 --> 00:08:30,900 Ne bëjmë çdo gjë që ne jemi do të bëni me fjalë, 176 00:08:30,900 --> 00:08:33,440 dhe pastaj kur ne jemi bërë ne vetëm të lirë atë. 177 00:08:33,440 --> 00:08:37,460 Dhe tani ne kemi kthyer ato 50 bytes i kujtesës përsëri në sistem. 178 00:08:37,460 --> 00:08:40,147 Disa funksion tjetër mund t'i përdorë ato. 179 00:08:40,147 --> 00:08:43,480 Ne nuk duhet të shqetësohen për një vuajtje rrjedhje kujtim, sepse ne kemi liruar fjalën. 180 00:08:43,480 --> 00:08:46,639 Ne kemi dhënë kujtesës prapa, kështu që ne jemi bërë duke punuar me të. 181 00:08:46,639 --> 00:08:48,430 Pra, ka tre rregullat e arta që duhet 182 00:08:48,430 --> 00:08:51,700 të mbahet në mend kur ju jeni dinamike ndarjen e kujtesës 183 00:08:51,700 --> 00:08:52,990 me malloc. 184 00:08:52,990 --> 00:08:56,480 Çdo bllok i kujtesës që ju malloc duhet të lirohen 185 00:08:56,480 --> 00:08:58,430 para programin tuaj përfundon running. 186 00:08:58,430 --> 00:09:02,029 Tani përsëri, në pajisje ose në IDE ky lloj i ndodh për ju gjithsesi 187 00:09:02,029 --> 00:09:04,820 kur ju, duke filluar kjo do të ndodhë gjithsesi kur programi juaj është ndërprerë, 188 00:09:04,820 --> 00:09:06,880 gjithë Memory do të lirohet. 189 00:09:06,880 --> 00:09:10,750 Por kjo është në përgjithësi e mirë coding praktikë që gjithmonë, kur ju jeni bërë, 190 00:09:10,750 --> 00:09:13,810 të lirë atë që keni mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Ajo tha se, vetëm gjëra që ju keni mallocd duhet të lirohen. 192 00:09:16,690 --> 00:09:19,880 Nëse ju statike të deklarojë një numër i plotë, int x gjysmë-zorrës së trashë, 193 00:09:19,880 --> 00:09:23,500 që jeton në rafte, ju mos pastaj duan të x lirë. 194 00:09:23,500 --> 00:09:25,970 Pra, vetëm gjëra që ju keni mallocd duhet të lirohet. 195 00:09:25,970 --> 00:09:28,960 >> Dhe së fundi, nuk bëni diçka të lirë dy herë. 196 00:09:28,960 --> 00:09:31,170 Që mund të çojë në një situatë tjetër i çuditshëm. 197 00:09:31,170 --> 00:09:33,530 Pra, çdo gjë që ju keni mallocd duhet të lirohen. 198 00:09:33,530 --> 00:09:36,000 Vetmet gjëra që ju keni malloc duhet të lirohet. 199 00:09:36,000 --> 00:09:38,730 Dhe mos bëni diçka të lirë dy herë. 200 00:09:38,730 --> 00:09:43,660 >> Pra, le të kalojnë nëpër një shembull këtu e asaj që disa ndarë dinamike 201 00:09:43,660 --> 00:09:46,122 kujtesës mund të duket si i përzier në me disa kujtesës statike. 202 00:09:46,122 --> 00:09:47,080 Çfarë mund të ndodhë këtu? 203 00:09:47,080 --> 00:09:48,913 Shih nëse ju mund të ndiqni së bashku dhe me mend se çfarë është 204 00:09:48,913 --> 00:09:51,720 do të ndodhë si të shkojmë nëpër të gjitha këto rreshta të kodit. 205 00:09:51,720 --> 00:09:53,980 >> Pra, ne themi m int. 206 00:09:53,980 --> 00:09:54,840 Çfarë ndodh këtu? 207 00:09:54,840 --> 00:09:56,339 E pra kjo është shumë i thjeshtë. 208 00:09:56,339 --> 00:09:59,650 Kam krijuar një variabël integer quajtur m. 209 00:09:59,650 --> 00:10:01,400 Unë ngjyra atë të gjelbër, sepse kjo është ngjyra 210 00:10:01,400 --> 00:10:03,730 që unë e përdor kur unë jam duke folur rreth variablave numër i plotë. 211 00:10:03,730 --> 00:10:05,160 Kjo është një kuti. 212 00:10:05,160 --> 00:10:08,400 Ajo që quhet m, dhe ju mund të integers dyqan brendësi të saj. 213 00:10:08,400 --> 00:10:12,400 >> Çka nëse unë pastaj thonë yll int një? 214 00:10:12,400 --> 00:10:13,530 E pra kjo është shumë e ngjashme. 215 00:10:13,530 --> 00:10:15,780 Unë jam duke krijuar një kuti të quajtur. 216 00:10:15,780 --> 00:10:19,100 Është i aftë për të int mbajnë yjet, pointers integers. 217 00:10:19,100 --> 00:10:21,570 Kështu që unë jam ngjyrosur atë të gjelbër-ish si. 218 00:10:21,570 --> 00:10:24,140 >> Unë e di se ka diçka të bëjë me një numër të plotë, 219 00:10:24,140 --> 00:10:25,852 por ai vetë nuk është një numër të plotë. 220 00:10:25,852 --> 00:10:27,310 Por kjo është shumë e shumë të njëjtën ide. 221 00:10:27,310 --> 00:10:28,101 Unë kam krijuar një kuti. 222 00:10:28,101 --> 00:10:30,070 Të dyja këto të drejta tani jetojnë në rafte. 223 00:10:30,070 --> 00:10:32,520 Unë e kam dhënë atyre dy emra. 224 00:10:32,520 --> 00:10:36,750 >> Ylli int b barabartë me madhësinë malloc të int. 225 00:10:36,750 --> 00:10:38,560 Kjo mund të jetë pak e ndërlikuar. 226 00:10:38,560 --> 00:10:44,110 Ndalo një sekondë dhe mendoni se çka ju do të presin që të ndodhë në këtë diagram. 227 00:10:44,110 --> 00:10:50,210 Ylli int b barabartë me madhësinë malloc të int. 228 00:10:50,210 --> 00:10:51,940 >> E pra kjo nuk ka vetëm të krijojë një kuti. 229 00:10:51,940 --> 00:10:53,800 Ky fakt krijon dy kuti. 230 00:10:53,800 --> 00:10:58,670 Dhe ajo e lidhjeve, ai gjithashtu krijon një pikë në një marrëdhënie. 231 00:10:58,670 --> 00:11:02,240 Ne kemi ndarë një bllok e kujtesës në grumbull. 232 00:11:02,240 --> 00:11:05,940 Vini re se top box drejtë atje nuk ka një emër. 233 00:11:05,940 --> 00:11:06,760 >> Ne mallocd atë. 234 00:11:06,760 --> 00:11:08,050 Ajo ekziston në grumbull. 235 00:11:08,050 --> 00:11:10,090 Por b ka një emër. 236 00:11:10,090 --> 00:11:11,950 Kjo është një variabël pointer quajtur b. 237 00:11:11,950 --> 00:11:13,910 Që jeton në rafte. 238 00:11:13,910 --> 00:11:18,250 >> Pra, kjo është një pjesë e kujtesës që tregon për një tjetër. 239 00:11:18,250 --> 00:11:21,840 b përmban adresën e atij bllok të memories. 240 00:11:21,840 --> 00:11:23,757 Ajo nuk ka një emër ndryshe. 241 00:11:23,757 --> 00:11:24,590 Por ajo tregon për të. 242 00:11:24,590 --> 00:11:29,760 Pra, kur themi yll int b barabartë Madhësia malloc e int, se ka të drejtë, 243 00:11:29,760 --> 00:11:33,490 se shigjetë që popped deri në anën e djathtë atje, se gjithë gjë, 244 00:11:33,490 --> 00:11:36,740 Unë do të duhet të duket përsëri, është ajo që ndodh. 245 00:11:36,740 --> 00:11:39,341 E gjithë kjo ndodh në se linjë të vetme të kodit. 246 00:11:39,341 --> 00:11:41,340 Tani ne do të merrni pak më shumë drejtpërdrejtë përsëri. 247 00:11:41,340 --> 00:11:43,330 një është e barabartë m ampersand. 248 00:11:43,330 --> 00:11:46,280 A ju kujtohet se çfarë një është e barabartë m simbol është? 249 00:11:46,280 --> 00:11:48,920 E pra kjo është një merr adresën e M. 250 00:11:48,920 --> 00:11:54,150 Ose të vënë më shumë diagram, një pikë në m. 251 00:11:54,150 --> 00:11:56,360 >> një është e barabartë me b. 252 00:11:56,360 --> 00:11:57,560 OK kështu që këtu është një tjetër. 253 00:11:57,560 --> 00:11:59,230 Një është e barabartë me b. 254 00:11:59,230 --> 00:12:02,260 Çfarë do të ndodhë në diagramin këtë kohë? 255 00:12:02,260 --> 00:12:04,330 >> E pra kujtojnë se Punimet operatori detyrë 256 00:12:04,330 --> 00:12:08,960 duke caktuar vlerën në të drejtë me vlerën në të majtë. 257 00:12:08,960 --> 00:12:14,820 Pra, në vend të një duke treguar për të m, një tani vë në të njëjtin vend që pikat b. 258 00:12:14,820 --> 00:12:18,900 një nuk ka pikë të b, një Pikët Pikët ku b. 259 00:12:18,900 --> 00:12:25,280 >> Nëse një vuri të b që do të kanë qenë një është e barabartë me ampersand b. 260 00:12:25,280 --> 00:12:28,150 Por në vend të një është e barabartë me b vetëm do të thotë se dhe b janë tani 261 00:12:28,150 --> 00:12:31,770 duke treguar të njëjtën adresë, sepse brenda B është vetëm një adresë. 262 00:12:31,770 --> 00:12:35,004 Dhe tani brenda një është e njëjtë adresa. 263 00:12:35,004 --> 00:12:37,170 m është e barabartë me 10, ndoshta më gjë drejtpërdrejtë 264 00:12:37,170 --> 00:12:38,690 ne kemi bërë në pak. 265 00:12:38,690 --> 00:12:40,460 Vendos 10 në kuti. 266 00:12:40,460 --> 00:12:45,640 Star b barabartë m plus 2, kujtohet nga jonë pointers Video çfarë yll b thotë. 267 00:12:45,640 --> 00:12:50,230 Ne jemi duke shkuar për dereference b dhe vënë disa vlera në atë vend e kujtesës. 268 00:12:50,230 --> 00:12:51,860 Në këtë rast 12. 269 00:12:51,860 --> 00:12:55,300 >> Pra, kur ne dereference një pikë kujtojnë ne vetëm të udhëtuar poshtë arrow. 270 00:12:55,300 --> 00:12:58,205 Ose thënë ndryshe, ne të shkojë në atë adresë e kujtesës 271 00:12:58,205 --> 00:12:59,580 dhe ne e manipuluar atë në një farë mënyre. 272 00:12:59,580 --> 00:13:00,830 Ne kemi vënë disa vlera në atje. 273 00:13:00,830 --> 00:13:03,960 Në këtë rast yll b është e barabartë m plus 2 është vetëm 274 00:13:03,960 --> 00:13:08,230 shkoni në variablin vuri në dukje nga b, shkoni në kujtesën vuri në dukje nga b, 275 00:13:08,230 --> 00:13:11,750 dhe të vënë m plus 2 në atje, 12. 276 00:13:11,750 --> 00:13:14,970 >> Tani unë të lirë b. 277 00:13:14,970 --> 00:13:16,490 Çfarë ndodh kur unë të lirë b? 278 00:13:16,490 --> 00:13:18,800 Mos harroni atë që kam thënë do të thotë pa pagesë. 279 00:13:18,800 --> 00:13:21,920 Çfarë jam unë duke thënë se kur unë të lirë b? 280 00:13:21,920 --> 00:13:23,410 >> Unë jam bërë duke punuar me të, e drejtë? 281 00:13:23,410 --> 00:13:25,702 Unë në thelb heqin dorë kujtesën. 282 00:13:25,702 --> 00:13:26,910 Unë jap atë përsëri në sistem. 283 00:13:26,910 --> 00:13:33,010 Unë nuk kanë nevojë për këtë më është atë që unë jam duke u thënë atyre, OK? 284 00:13:33,010 --> 00:13:37,390 >> Tani në qoftë se unë them një yll është e barabartë me 11 ju mund ndoshta 285 00:13:37,390 --> 00:13:40,460 tashmë them se diçka e keqe do të ndodhë këtu, apo jo? 286 00:13:40,460 --> 00:13:44,160 Dhe me të vërtetë në qoftë se unë u përpoq që unë ndoshta do të vuajnë një defekt segmentimit. 287 00:13:44,160 --> 00:13:47,140 Sepse tani, edhe pse më parë se copë e kujtesës 288 00:13:47,140 --> 00:13:50,220 ishte diçka që unë kam qasje në, në këtë pikë 289 00:13:50,220 --> 00:13:54,590 tani unë jam duke hyrë në kujtesën se nuk është e ligjshme për mua për të hyrë. 290 00:13:54,590 --> 00:13:57,330 >> Dhe si ne ndoshta do të kujtoj, kur ne Access Memory 291 00:13:57,330 --> 00:14:00,000 se ne nuk jemi duke menduar për të prekur, kjo është shkaku më i zakonshëm 292 00:14:00,000 --> 00:14:01,860 e segmentimit faji. Dhe kështu programi im 293 00:14:01,860 --> 00:14:05,170 do të rrëzimit në qoftë se unë u përpoq për të bërë këtë. 294 00:14:05,170 --> 00:14:09,910 Pra, përsëri kjo është një ide e mirë për të marrë të mirë praktikë dhe të mirë zakonet e rrënjosura 295 00:14:09,910 --> 00:14:12,920 kur punojnë me malloc dhe të lirë, kështu që ju të mos vuani segmentimit 296 00:14:12,920 --> 00:14:15,310 gabimet, dhe që ju të përdorni juaj ndarë dinamike 297 00:14:15,310 --> 00:14:17,370 kujtesës me përgjegjësi. 298 00:14:17,370 --> 00:14:20,300 >> Unë jam Doug Lloyd kjo është CS50. 299 00:14:20,300 --> 00:14:21,947