1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Prehrávanie hudby] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK, takže návrh, Pred spustením tu. 5 00:00:07,940 --> 00:00:11,660 Ak ste sledovali video na na ukazovatele budete chcieť robiť tak ako prvý. 6 00:00:11,660 --> 00:00:15,860 Vzhľadom k tomu, toto video je ďalší spôsob práce s ukazovateľmi. 7 00:00:15,860 --> 00:00:17,574 >> Takže to bude hovoriť o niektorých pojmov 8 00:00:17,574 --> 00:00:19,490 že budeme rozprávať v na ukazovatele videá, a my sme 9 00:00:19,490 --> 00:00:21,948 bude lesk nad nimi teraz, za predpokladu, že sú už 10 00:00:21,948 --> 00:00:23,090 tak nejako pochopil. 11 00:00:23,090 --> 00:00:25,440 Tak to je len váš fér varovanie že ak ste videl toto video 12 00:00:25,440 --> 00:00:27,814 a vy ste nevideli ukazovatele video, by to mohlo nejako 13 00:00:27,814 --> 00:00:29,610 lietať nad hlavou, trochu. 14 00:00:29,610 --> 00:00:32,080 A tak by to mohlo byť lepšie sa pozerať na to v tomto poradí. 15 00:00:32,080 --> 00:00:34,710 >> Takže sme už videli jeden spôsob práce s ukazovateľmi, 16 00:00:34,710 --> 00:00:37,810 čo je deklarujeme variabilná, a potom sme 17 00:00:37,810 --> 00:00:42,160 deklarovať ďalšie premennú, ukazovateľ premenná, ktorá ukazuje na to. 18 00:00:42,160 --> 00:00:44,870 Preto sme vytvorili premenná s názvom, máme 19 00:00:44,870 --> 00:00:48,480 vytvoril druhú premennú s názvom, a upozorňujeme, že Druhá premenná 20 00:00:48,480 --> 00:00:50,220 na to ako prvý. 21 00:00:50,220 --> 00:00:52,370 Tento druh má Problémom však, pretože to 22 00:00:52,370 --> 00:00:54,650 vyžaduje, aby sme presne vedeli, koľko pamäti, že sme 23 00:00:54,650 --> 00:00:57,600 bude potrebovať vo chvíli, Náš program je zostavený. 24 00:00:57,600 --> 00:00:58,220 >> Prečo tomu tak je? 25 00:00:58,220 --> 00:01:03,338 Vzhľadom k tomu, musíme byť schopní pomenovať alebo identifikovať všetky možné premenných 26 00:01:03,338 --> 00:01:04,129 môžeme stretnúť. 27 00:01:04,129 --> 00:01:07,910 Mohli by sme mať pole, ktoré by mohlo byť schopný pojať veľké množstvo informácií, 28 00:01:07,910 --> 00:01:10,110 ale je to stále nie je presne dostatočne presná. 29 00:01:10,110 --> 00:01:12,640 Čo keď nevieme, čo keď budeme mať tušenie 30 00:01:12,640 --> 00:01:14,370 koľko budeme potrebovať v čase kompilácie? 31 00:01:14,370 --> 00:01:17,020 Alebo čo keď náš program bude bežať naozaj dlhú dobu, 32 00:01:17,020 --> 00:01:19,810 prijímať rôzne užívateľa dát, a môžeme naozaj 33 00:01:19,810 --> 00:01:23,170 odhadnúť, či sme bude potrebovať 1000 kusov? 34 00:01:23,170 --> 00:01:26,060 >> Nie je to tak, môžeme hovoria, na príkazovom riadku 35 00:01:26,060 --> 00:01:28,040 Zadajte, koľko položiek si myslíte, že budete potrebovať. 36 00:01:28,040 --> 00:01:31,100 No čo ak odhad je zle? 37 00:01:31,100 --> 00:01:34,300 Dynamické prideľovanie pamäte druh umožňuje nám cestu 38 00:01:34,300 --> 00:01:36,867 obísť tento konkrétny problém. 39 00:01:36,867 --> 00:01:38,700 A to, ako to robí je pomocou ukazovateľov. 40 00:01:38,700 --> 00:01:42,140 >> Môžeme použiť odkazy na získať prístup k dynamicky 41 00:01:42,140 --> 00:01:45,710 pridelenej pamäti, pamäti, ktorá je pridelený ako váš program beží. 42 00:01:45,710 --> 00:01:48,290 Nie je to pridelené v čase kompilácie. 43 00:01:48,290 --> 00:01:51,570 Keď dynamicky prideľovať Pamäť pochádza z bazéna 44 00:01:51,570 --> 00:01:53,795 pamäte známy ako haldy. 45 00:01:53,795 --> 00:01:56,420 Skôr je celá pamäť máme pracuje sa v priebehu 46 00:01:56,420 --> 00:01:59,920 bol pochádzajúce z bazéna pamäte známy ako zásobníka. 47 00:01:59,920 --> 00:02:02,470 Dobrým spôsobom, ako všeobecne majte na mind-- a tomto pravidle 48 00:02:02,470 --> 00:02:04,720 nemusí vždy platiť, ale do značnej miery takmer 49 00:02:04,720 --> 00:02:09,940 vždy myslí true-- je, že každý čas si dať názov premennej it 50 00:02:09,940 --> 00:02:12,090 pravdepodobne žije na zásobníku. 51 00:02:12,090 --> 00:02:14,650 A zakaždým, keď nie vykazovať premenlivú meno, 52 00:02:14,650 --> 00:02:19,160 ktoré môžete robiť s dynamickej pamäte alokácie, žije na halde. 53 00:02:19,160 --> 00:02:22,190 >> Teraz som trochu prezentovať to ako v prípade, že je tieto dva bazény pamäti. 54 00:02:22,190 --> 00:02:24,740 Ale možno videli toto diagram, ktorý je všeobecne 55 00:02:24,740 --> 00:02:27,290 znázornenie Aké pamäťové vyzerá, 56 00:02:27,290 --> 00:02:30,373 a nebudeme sa starať o všetkom Hmota v hornej a dolnej časti. 57 00:02:30,373 --> 00:02:33,580 To, čo zaujíma je táto časť v prostredný tu, haldy a zásobník. 58 00:02:33,580 --> 00:02:35,570 Ako môžete vidieť pri pohľade na tomto diagrame, 59 00:02:35,570 --> 00:02:38,390 Tieto skutočnosti nie sú dvoch oddelené bazény pamäte. 60 00:02:38,390 --> 00:02:42,757 Je to jedna spoločná pool pamäte kde začať, v tomto vizuálne 61 00:02:42,757 --> 00:02:44,590 začnete v dolnej časti a začať vyplnenie 62 00:02:44,590 --> 00:02:48,040 od dna s zásobníka, a vy začínajú na hornej a začatie doplňovanie 63 00:02:48,040 --> 00:02:50,072 zhora nadol s haldy. 64 00:02:50,072 --> 00:02:51,780 Ale je to naozaj je Rovnaký bazén, je to len 65 00:02:51,780 --> 00:02:56,050 rôznych miestach, rôzne umiestnenia v pamäti, ktoré sú pridelené. 66 00:02:56,050 --> 00:02:59,060 A môžete dôjdu pamäť buď s 67 00:02:59,060 --> 00:03:01,240 halda ísť celú cestu ku dnu, alebo sa 68 00:03:01,240 --> 00:03:05,440 zásobníka ísť celú cestu na vrchol, alebo má haldy a zásobníka 69 00:03:05,440 --> 00:03:06,740 stretnúť sa proti sebe. 70 00:03:06,740 --> 00:03:09,500 Všetky z nich môžu byť podmienky ktoré spôsobujú program 71 00:03:09,500 --> 00:03:11,030 spustiť nedostatok pamäte. 72 00:03:11,030 --> 00:03:11,952 Takže majte na pamäti, že. 73 00:03:11,952 --> 00:03:13,660 Keď hovoríme o halda a zásobník 74 00:03:13,660 --> 00:03:17,880 sme naozaj hovoríme o rovnakej všeobecnej kus pamäti, len 75 00:03:17,880 --> 00:03:21,930 rôzne časti tejto pamäte. 76 00:03:21,930 --> 00:03:24,910 >> Tak ako sa dostaneme dynamicky pridelené pamäte v prvom rade? 77 00:03:24,910 --> 00:03:27,740 Ako sa dostať náš program pamäť, ako to beží? 78 00:03:27,740 --> 00:03:32,660 No C poskytuje funkciu nazvanú malloc, pamäť alokátor, ktorý 79 00:03:32,660 --> 00:03:36,810 voláte na, a tie odovzdať koľko bajtov pamäte, ktoré chcete. 80 00:03:36,810 --> 00:03:39,940 Takže ak váš program beží a chcete integer runtime, 81 00:03:39,940 --> 00:03:46,040 môžete Mallock štyri byty pamäť, malloc zátvorky štyri. 82 00:03:46,040 --> 00:03:48,540 >> Mallock prejde hľadá cez haldy, 83 00:03:48,540 --> 00:03:50,750 pretože sme dynamicky prideľovanie pamäte, 84 00:03:50,750 --> 00:03:53,500 a navrátim sa k vám ukazovateľ na tejto pamäti. 85 00:03:53,500 --> 00:03:56,180 To nedáva vám, že memory-- nedáva to meno, 86 00:03:56,180 --> 00:03:57,950 to vám dáva ukazovateľ na neho. 87 00:03:57,950 --> 00:04:00,780 A tak to je dôvod, prečo som zase povedal, že je dôležité možná 88 00:04:00,780 --> 00:04:03,770 Sledoval ukazovatele videá než sa dostaneme príliš ďaleko do toho. 89 00:04:03,770 --> 00:04:05,940 Tak malloc to bude vám späť ukazovateľ. 90 00:04:05,940 --> 00:04:08,950 >> Ak Mallock nemôže dať vám niektorý pamäť, pretože ste dôjdu, 91 00:04:08,950 --> 00:04:10,645 to bude vám späť ukazovatele null. 92 00:04:10,645 --> 00:04:15,282 Pamätáš si, čo sa stane, keď vyskúšať a dereferencia null ukazovateľ? 93 00:04:15,282 --> 00:04:17,019 Trpíme poruchu seg, že jo? 94 00:04:17,019 --> 00:04:18,060 To je asi nie je dobré. 95 00:04:18,060 --> 00:04:21,579 >> Takže zakaždým, keď voláte vás malloc vždy, vždy 96 00:04:21,579 --> 00:04:25,270 je potrebné overiť, či je alebo nie je ukazovateľ, že vám dal späť, je null. 97 00:04:25,270 --> 00:04:28,800 Ak áno, budete musieť ukončiť svoj program pretože ak sa pokúsite a dereferencia 98 00:04:28,800 --> 00:04:31,360 ukazovatele null budete trpieť poruchy segmentácie 99 00:04:31,360 --> 00:04:34,380 a váš program je spadne tak ako tak. 100 00:04:34,380 --> 00:04:37,190 Tak ako sme staticky získať celé číslo? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Sme pravdepodobne urobil banda z časov, je to tak? 103 00:04:40,010 --> 00:04:43,480 To vytvára premennú s názvom x, ktorá žije v zásobníku. 104 00:04:43,480 --> 00:04:46,190 Ako môžeme dynamicky získať číslo? 105 00:04:46,190 --> 00:04:50,010 Int hviezda px rovná malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Alebo viac vhodne by sme povedať, int hviezda px 107 00:04:53,050 --> 00:04:57,680 rovná malloc veľkosť int, len hodiť niektoré menej 108 00:04:57,680 --> 00:04:59,740 Magická čísla okolo nášho programu. 109 00:04:59,740 --> 00:05:04,140 To sa chystá získať pre nás Štyri bajtov pamäte z haldy, 110 00:05:04,140 --> 00:05:06,720 a ukazovateľ dostaneme späť k nej, sa nazýva px. 111 00:05:06,720 --> 00:05:08,430 A potom už len ako my máme vykonané už skôr sme 112 00:05:08,430 --> 00:05:13,966 môže dereferencia PX prístup k tejto pamäte. 113 00:05:13,966 --> 00:05:15,590 Ako môžeme získať celé číslo od užívateľa? 114 00:05:15,590 --> 00:05:17,970 Dá sa povedať, int x rovná sa dostať int. 115 00:05:17,970 --> 00:05:19,930 To je celkom jednoduché. 116 00:05:19,930 --> 00:05:24,030 Čo ak chceme vytvoriť pole z x plaváky, ktoré žijú vo fronte? 117 00:05:24,030 --> 00:05:28,210 float stack_array--, že sa volá z našich array-- hranatých zátvoriek x. 118 00:05:28,210 --> 00:05:32,419 To bude vytvárať pre nás poľa z x plaváky, ktoré žijú v zásobníku. 119 00:05:32,419 --> 00:05:34,960 Môžeme vytvoriť celý rad plavákov ktorá žije na halde, taky. 120 00:05:34,960 --> 00:05:37,330 Syntax môže vyzerať trochu ťažkopádne, 121 00:05:37,330 --> 00:05:41,740 ale môžeme povedať, float hviezda heap_array rovná 122 00:05:41,740 --> 00:05:44,360 malloc x meria veľkosť plaváku. 123 00:05:44,360 --> 00:05:48,160 Potrebujem dostatok priestoru držať x s plávajúcou desatinnou čiarkou hodnoty. 124 00:05:48,160 --> 00:05:51,560 Takže povedať, že som potrebovať 100 plaváky, alebo plaváky 1000. 125 00:05:51,560 --> 00:05:54,810 Takže v tomto prípade by bolo 400 bytov pre 100 plaváky, 126 00:05:54,810 --> 00:05:59,080 alebo 4000 bajtov na 1000 plaváky, pretože každý float zaberá 127 00:05:59,080 --> 00:06:01,230 štyri byty priestoru. 128 00:06:01,230 --> 00:06:05,110 >> Potom, čo to môžem použiť hranatou zátvorku syntax na heap_array. 129 00:06:05,110 --> 00:06:08,970 Rovnako ako by som na stack_array, ja môžu individuálne pristupovať k jej prvky 130 00:06:08,970 --> 00:06:11,590 pomocou heap_array nula, heap_array jednu. 131 00:06:11,590 --> 00:06:15,800 Ale spomínam, prečo to môžeme urobiť Je tomu tak preto názov poľa v C 132 00:06:15,800 --> 00:06:19,990 je naozaj ukazovateľ na Prvý prvok tejto matice je. 133 00:06:19,990 --> 00:06:23,480 Takže k tomu, že sme deklarovaní rad plavákov na zásobníku tu 134 00:06:23,480 --> 00:06:24,810 je vlastne trochu zavádzajúce. 135 00:06:24,810 --> 00:06:27,600 Sme naozaj v Druhý riadok kódu tam 136 00:06:27,600 --> 00:06:32,360 tiež vytvára ukazovateľ na kus pamäti, že sme potom urobiť nejakú prácu s. 137 00:06:32,360 --> 00:06:35,620 >> Tu je veľký problém s dynamicky pridelenej pamäti však, 138 00:06:35,620 --> 00:06:38,360 a to je dôvod, prečo je to naozaj dôležité vytvoriť nejaké dobré návyky 139 00:06:38,360 --> 00:06:39,800 pri práci s ním. 140 00:06:39,800 --> 00:06:43,060 Na rozdiel od staticky deklaroval pamäť, pamäť 141 00:06:43,060 --> 00:06:46,790 nie je automaticky vrátená do Systém, kedy je vaša funkcia vykonáva. 142 00:06:46,790 --> 00:06:49,280 Takže ak máme hlavné, a Hlavný volá funkciu 143 00:06:49,280 --> 00:06:53,860 f, keď f povrchovej úpravy ako sa to robí a vráti riadenie programu 144 00:06:53,860 --> 00:06:58,810 späť na hlavnú, všetky pamäte že f použiť, je vrátená späť. 145 00:06:58,810 --> 00:07:01,250 To môže byť znovu použitý nejakým iným programom, 146 00:07:01,250 --> 00:07:04,250 alebo nejaké iné funkcie, ktorá sa zavolá neskôr v main. 147 00:07:04,250 --> 00:07:06,970 Je možné používať rovnako pamäť opäť nad. 148 00:07:06,970 --> 00:07:09,620 >> Ak vás dynamicky alokovať pamäť hoci 149 00:07:09,620 --> 00:07:14,380 budete musieť povedať, systém, ktorý ste s ním urobil. 150 00:07:14,380 --> 00:07:18,370 Bude to držať to pre vás, ktoré by mohli vedú k problému z vás beží 151 00:07:18,370 --> 00:07:19,290 pamäte. 152 00:07:19,290 --> 00:07:22,179 A v skutočnosti sme niekedy sa odvolávajú na toto ako pretekanie pamäte. 153 00:07:22,179 --> 00:07:24,970 A niekedy tieto pretekanie pamäte môže byť v skutočnosti naozaj zničujúce 154 00:07:24,970 --> 00:07:27,020 na výkon systému. 155 00:07:27,020 --> 00:07:31,120 >> Ak ste častým používateľ internetu môžete použiť niektoré webové prehliadače, 156 00:07:31,120 --> 00:07:35,630 a nebudem tu menovať mená, ale tam sú niektoré webové prehliadače vonku 157 00:07:35,630 --> 00:07:39,150 ktoré sú notoricky známe pre skutočne majú úniky pamäte, ktoré nie sú opravené. 158 00:07:39,150 --> 00:07:44,570 A ak necháte Váš prehliadač otvorené Po veľmi dlhú dobu, dni 159 00:07:44,570 --> 00:07:48,060 a dni, alebo týždne, niekedy všimnúť, že vo vašom systéme 160 00:07:48,060 --> 00:07:49,790 beží naozaj, ale naozaj pomaly. 161 00:07:49,790 --> 00:07:54,640 A dôvod pre to je skutočnosť, že prehliadač má pridelené pamäti, 162 00:07:54,640 --> 00:07:57,320 ale potom nepovedal systém že sa to robí s ním. 163 00:07:57,320 --> 00:08:01,000 A tak, že opustí menej pamäte k dispozícii pre všetky vaše iných programov 164 00:08:01,000 --> 00:08:04,480 musieť podeliť, pretože si leaking--, že webový prehliadač 165 00:08:04,480 --> 00:08:06,755 Program je netesní pamäte. 166 00:08:06,755 --> 00:08:08,880 Ako môžeme dať pamäť späť keď sme s ním urobil? 167 00:08:08,880 --> 00:08:10,838 No našťastie je to veľmi jednoduchý spôsob, ako to urobiť. 168 00:08:10,838 --> 00:08:11,710 Práve sme ho uvoľniť. 169 00:08:11,710 --> 00:08:15,020 K dispozícii je funkcia nazvaná zdarma, prijíma ukazovateľ na pamäti, 170 00:08:15,020 --> 00:08:16,010 a my sme dobré ísť. 171 00:08:16,010 --> 00:08:18,310 >> Takže povedzme, že sme v Uprostred nášho programu, 172 00:08:18,310 --> 00:08:21,970 Chceme malloc 50 znakov. 173 00:08:21,970 --> 00:08:25,710 Chceme malloc pole, ktoré môže schopné pojať 50 znakov. 174 00:08:25,710 --> 00:08:29,109 A keď sa dostaneme ukazovateľ späť že názov cez tento ukazovateľ je slovo. 175 00:08:29,109 --> 00:08:30,900 Robíme, čo máme robiť s slovu, 176 00:08:30,900 --> 00:08:33,440 a potom, keď sme urobili sme jednoducho ho uvoľniť. 177 00:08:33,440 --> 00:08:37,460 A teraz sme sa vrátili tie 50 bajtov pamäti späť do systému. 178 00:08:37,460 --> 00:08:40,147 Niektoré ďalšie funkcie môžu používať. 179 00:08:40,147 --> 00:08:43,480 Nemusíme sa starať o utrpení pretekanie pamäte, pretože sme oslobodení slovo. 180 00:08:43,480 --> 00:08:46,639 Dali sme pamäť späť, takže sme skončili prácu s ním. 181 00:08:46,639 --> 00:08:48,430 Takže tam sú tri zlatých pravidiel, ktorá by mala 182 00:08:48,430 --> 00:08:51,700 Treba mať na pamäti vždy, keď budete dynamicky prideľovanie pamäte 183 00:08:51,700 --> 00:08:52,990 s malloc. 184 00:08:52,990 --> 00:08:56,480 Každý blok pamäte, ktorá vy malloc musí byť uvoľnený 185 00:08:56,480 --> 00:08:58,430 Pred programu dokončenie spustenia. 186 00:08:58,430 --> 00:09:02,029 Teraz opäť do spotrebiča alebo v IDE tento druh stane pre vás tak ako tak 187 00:09:02,029 --> 00:09:04,820 kedy vás-- sa to stane tak ako tak ak je váš program ukončený, 188 00:09:04,820 --> 00:09:06,880 celá pamäť sa uvoľní. 189 00:09:06,880 --> 00:09:10,750 Ale je to všeobecne dobrá kódovanie praxe vždy, keď budete hotoví, 190 00:09:10,750 --> 00:09:13,810 oslobodiť, čo ste mallocd. 191 00:09:13,810 --> 00:09:16,690 >> To znamená, že len veci, ktoré nemáš mallocd by mal byť oslobodený. 192 00:09:16,690 --> 00:09:19,880 Ak staticky deklarovať integer, int x bodkočiarka, 193 00:09:19,880 --> 00:09:23,500 ktorá žije na zásobníku, budete nemajú potom chcieť oslobodiť x. 194 00:09:23,500 --> 00:09:25,970 Takže len veci, ktoré ste mallocd by mal byť oslobodený. 195 00:09:25,970 --> 00:09:28,960 >> A konečne, nie voľné niečo dvakrát. 196 00:09:28,960 --> 00:09:31,170 To môže viesť k ďalšie divná situácia. 197 00:09:31,170 --> 00:09:33,530 Takže všetko, čo som mallocd musí byť oslobodený. 198 00:09:33,530 --> 00:09:36,000 Iba veci, ktoré ste si malloc by malo byť uvoľnené. 199 00:09:36,000 --> 00:09:38,730 A nie bez niečo dvakrát. 200 00:09:38,730 --> 00:09:43,660 >> Takže poďme prejsť príklad tu z toho, čo niektorí dynamicky pridelenej 201 00:09:43,660 --> 00:09:46,122 Pamäť môže vyzerať ako zmiešané v s nejakým statické pamäte. 202 00:09:46,122 --> 00:09:47,080 Čo by sa mohlo stať tu? 203 00:09:47,080 --> 00:09:48,913 Uvidíme, či môžete sledovať spolu, a hádajte, čo je 204 00:09:48,913 --> 00:09:51,720 sa stane, ako sme ísť cez všetky tieto riadky kódu. 205 00:09:51,720 --> 00:09:53,980 >> Takže hovoríme int m. 206 00:09:53,980 --> 00:09:54,840 Čo sa tu deje? 207 00:09:54,840 --> 00:09:56,339 No to je celkom jednoduché. 208 00:09:56,339 --> 00:09:59,650 Aj vytvoriť celočíselnú premennú s názvom m. 209 00:09:59,650 --> 00:10:01,400 Aj farba je zelená, pretože to je farba 210 00:10:01,400 --> 00:10:03,730 ktorý používam, keď hovorím o celočíselné premenné. 211 00:10:03,730 --> 00:10:05,160 Je to krabice. 212 00:10:05,160 --> 00:10:08,400 Hovorí sa tomu m, a môžete ukladať celé čísla vnútri neho. 213 00:10:08,400 --> 00:10:12,400 >> Čo keď som potom povedal int hviezdičkou? 214 00:10:12,400 --> 00:10:13,530 No to je dosť podobné. 215 00:10:13,530 --> 00:10:15,780 Som vytvoriť krabice volal. 216 00:10:15,780 --> 00:10:19,100 Je schopná pojať int hviezdy, ukazovatele na celé čísla. 217 00:10:19,100 --> 00:10:21,570 Takže som to farbenie Green-ish rovnako. 218 00:10:21,570 --> 00:10:24,140 >> Viem, že to má niečo čo do činenia s celým číslom, 219 00:10:24,140 --> 00:10:25,852 ale to nie je samo o sebe celé číslo. 220 00:10:25,852 --> 00:10:27,310 Ale je to skoro rovnaké nápad. 221 00:10:27,310 --> 00:10:28,101 Vytvoril som krabicu. 222 00:10:28,101 --> 00:10:30,070 Obe tieto práva teraz žijú na zásobníku. 223 00:10:30,070 --> 00:10:32,520 Ja som im dal obe mená. 224 00:10:32,520 --> 00:10:36,750 >> int hviezda b rovná malloc veľkosť int. 225 00:10:36,750 --> 00:10:38,560 Toto by mohlo byť trochu zložitejšie. 226 00:10:38,560 --> 00:10:44,110 Vezmite druhý a premýšľať o tom, čo by sa očakávať, že sa stane v tejto schéme. 227 00:10:44,110 --> 00:10:50,210 int hviezda b rovná malloc veľkosť int. 228 00:10:50,210 --> 00:10:51,940 >> No to nie je len vytvoriť jednu kolónku. 229 00:10:51,940 --> 00:10:53,800 Toto vlastne vytvára dve krabice. 230 00:10:53,800 --> 00:10:58,670 A to väzby, ale tiež stanovuje bod vo vzťahu. 231 00:10:58,670 --> 00:11:02,240 Máme pridelené jeden blok pamäte na halde. 232 00:11:02,240 --> 00:11:05,940 Všimnite si, že v pravom hornom rohu box tam nemá meno. 233 00:11:05,940 --> 00:11:06,760 >> Mallocd sme to. 234 00:11:06,760 --> 00:11:08,050 To existuje na halde. 235 00:11:08,050 --> 00:11:10,090 Ale b má meno. 236 00:11:10,090 --> 00:11:11,950 Je to ukazovateľ premennú s názvom b. 237 00:11:11,950 --> 00:11:13,910 Ktorá žije na zásobníku. 238 00:11:13,910 --> 00:11:18,250 >> Takže je to kus pamäte , Ktorý odkazuje na iný. 239 00:11:18,250 --> 00:11:21,840 b obsahuje adresu z tohto bloku pamäte. 240 00:11:21,840 --> 00:11:23,757 Nemá meno inak. 241 00:11:23,757 --> 00:11:24,590 Ale to poukazuje na to. 242 00:11:24,590 --> 00:11:29,760 Takže keď povieme int star b sa rovná Veľkosť malloc int, že práve tam, 243 00:11:29,760 --> 00:11:33,490 že šípka, ktorá vyskočila na pravá strana tam, že celá tá vec, 244 00:11:33,490 --> 00:11:36,740 Budem mať to vyzerať Znovu, je to, čo sa stane. 245 00:11:36,740 --> 00:11:39,341 To všetko sa deje v že jediný riadok kódu. 246 00:11:39,341 --> 00:11:41,340 Teraz budeme mať trochu viac priamočiare znova. 247 00:11:41,340 --> 00:11:43,330 A je rovná ampersand m. 248 00:11:43,330 --> 00:11:46,280 Spomínate si, čo si rovná ampersand m je? 249 00:11:46,280 --> 00:11:48,920 No to je dostane adresu M. 250 00:11:48,920 --> 00:11:54,150 Alebo dať viac schematicky, A ukazuje na m. 251 00:11:54,150 --> 00:11:56,360 >> A je rovná b. 252 00:11:56,360 --> 00:11:57,560 OK, takže tu je ďalší. 253 00:11:57,560 --> 00:11:59,230 A je rovná b. 254 00:11:59,230 --> 00:12:02,260 Čo sa bude diať diagramu tentoraz? 255 00:12:02,260 --> 00:12:04,330 >> No pripomenúť, že Operátor priradenie práce 256 00:12:04,330 --> 00:12:08,960 priradením hodnoty na strane právo na hodnotu vľavo. 257 00:12:08,960 --> 00:12:14,820 Takže namiesto toho, ukazovacie do m, je teraz poukazuje na rovnakom mieste, ktoré b bodov. 258 00:12:14,820 --> 00:12:18,900 neukazuje na B, A miesta, kde sa b bodov. 259 00:12:18,900 --> 00:12:25,280 >> Ak sa ukázal na B, ktorá by boli sa rovná ampersand b. 260 00:12:25,280 --> 00:12:28,150 Ale namiesto toho sa rovná b len Znamená to, že a a b sú teraz 261 00:12:28,150 --> 00:12:31,770 smerujúce na rovnakú adresu, pretože vnútri b je len adresa. 262 00:12:31,770 --> 00:12:35,004 A teraz vo vnútri a je rovnaká adresa. 263 00:12:35,004 --> 00:12:37,170 m sa rovná 10, pravdepodobne Najjednoduchšia vec 264 00:12:37,170 --> 00:12:38,690 urobili sme v trochu. 265 00:12:38,690 --> 00:12:40,460 Dajte 10 v krabici. 266 00:12:40,460 --> 00:12:45,640 Hviezda b sa rovná m plus 2, prevezme späť od náš ukazovatele video Čo hviezda b znamená. 267 00:12:45,640 --> 00:12:50,230 Budeme dereferencia b a put nejakú hodnotu v tomto pamäťovom mieste. 268 00:12:50,230 --> 00:12:51,860 V tomto prípade 12. 269 00:12:51,860 --> 00:12:55,300 >> Takže keď sme sa dereferencia bodu spomínam len sme cestovať dole na šípku. 270 00:12:55,300 --> 00:12:58,205 Inak povedané, my choďte na túto adresu pamäti 271 00:12:58,205 --> 00:12:59,580 a my sme s ním manipulovať nejakým spôsobom. 272 00:12:59,580 --> 00:13:00,830 Dali sme nejakú hodnotu tam. 273 00:13:00,830 --> 00:13:03,960 V tomto prípade hviezdičkový B M rovné plus 2 je jednoducho 274 00:13:03,960 --> 00:13:08,230 ísť do premennej ukázal na B, prejsť do pamäte ukázal na B, 275 00:13:08,230 --> 00:13:11,750 a dal m plus 2 tam, 12. 276 00:13:11,750 --> 00:13:14,970 >> Teraz som oslobodiť b. 277 00:13:14,970 --> 00:13:16,490 Čo sa stane, keď som sa oslobodiť b? 278 00:13:16,490 --> 00:13:18,800 Spomeňte si, čo som povedal, voľné prostriedky. 279 00:13:18,800 --> 00:13:21,920 Čo som povedal, keď som sa oslobodiť b? 280 00:13:21,920 --> 00:13:23,410 >> Skončil som s ňou pracovať, nie? 281 00:13:23,410 --> 00:13:25,702 Ja v podstate vzdať pamäti. 282 00:13:25,702 --> 00:13:26,910 Dávam ju späť do systému. 283 00:13:26,910 --> 00:13:33,010 Nepotrebujem to už je to, čo som im povedal, OK? 284 00:13:33,010 --> 00:13:37,390 >> Teraz, keď poviem hviezdičkou sa rovná 11 môžete pravdepodobne 285 00:13:37,390 --> 00:13:40,460 Už, že niečo zlé povedať, sa stane, že? 286 00:13:40,460 --> 00:13:44,160 A skutočne, keď som sa snažil, že by som asi by utrpela chybu segmentácie. 287 00:13:44,160 --> 00:13:47,140 Vzhľadom k tomu, teraz, aj keď predtým, že kus pamäte 288 00:13:47,140 --> 00:13:50,220 bolo niečo, čo som mal prístupu k nim v tomto bode 289 00:13:50,220 --> 00:13:54,590 teraz som prístup k pamäti, že nie je legálne pre mňa prístup. 290 00:13:54,590 --> 00:13:57,330 >> A ako budeme pravdepodobne spomínate, keď sme sa prístup k pamäti 291 00:13:57,330 --> 00:14:00,000 že sme nemali na dotyk, to je najčastejšou príčinou 292 00:14:00,000 --> 00:14:01,860 z segmentácia porucha. A tak sa môj program 293 00:14:01,860 --> 00:14:05,170 zrúti, keď som sa snažil to urobiť. 294 00:14:05,170 --> 00:14:09,910 Takže opäť je to dobrý nápad, aby si dobre praxe a dobré návyky hlboko zakorenené 295 00:14:09,910 --> 00:14:12,920 Pri práci s malloc a zadarmo, takže nemusíte trpieť segmentáciu 296 00:14:12,920 --> 00:14:15,310 chyby, a že používate vaše dynamicky pridelenej 297 00:14:15,310 --> 00:14:17,370 pamäť zodpovedne. 298 00:14:17,370 --> 00:14:20,300 >> Som Doug Lloyd je to CS50. 299 00:14:20,300 --> 00:14:21,947