1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Glazbom] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> Doug LLOYD: U redu, tako je prijedlog Prije početka ovdje. 5 00:00:07,940 --> 00:00:11,660 Ako niste gledali video na naputke možda želite učiniti prvi. 6 00:00:11,660 --> 00:00:15,860 Budući da je ovaj video je još način rada s pokazivača. 7 00:00:15,860 --> 00:00:17,574 >> Dakle, to će govoriti o nekim konceptima 8 00:00:17,574 --> 00:00:19,490 koje pokrivaju u pokazivače video, a mi smo 9 00:00:19,490 --> 00:00:21,948 će prijeći preko njih sada, uz pretpostavku da su oni već 10 00:00:21,948 --> 00:00:23,090 vrsta razumio. 11 00:00:23,090 --> 00:00:25,440 Dakle, to je samo tvoja fer upozorenje da ako vidim ovaj video 12 00:00:25,440 --> 00:00:27,814 a niste vidjeli pokazivače videa, to bi moglo nekako 13 00:00:27,814 --> 00:00:29,610 letjeti iznad glave malo. 14 00:00:29,610 --> 00:00:32,080 I tako da bi moglo biti bolje da ga gledati u tom redoslijedu. 15 00:00:32,080 --> 00:00:34,710 >> Tako smo već vidjeli jedno način za rad s pokazivača, 16 00:00:34,710 --> 00:00:37,810 što je možemo proglasiti promjenjiva, a onda smo 17 00:00:37,810 --> 00:00:42,160 proglasiti drugu varijablu, pokazivač promjenjiva, koji ukazuje na to. 18 00:00:42,160 --> 00:00:44,870 Tako smo stvorili varijabla s imenom, mi smo 19 00:00:44,870 --> 00:00:48,480 stvorio drugu varijablu s imenom, a mi ukazuju da je druga varijabla 20 00:00:48,480 --> 00:00:50,220 na taj prvi. 21 00:00:50,220 --> 00:00:52,370 Ova vrsta ima Problem ipak, jer to 22 00:00:52,370 --> 00:00:54,650 zahtijeva od nas da znam točno koliko memorije smo 23 00:00:54,650 --> 00:00:57,600 Trebat će trenutak naš program je sastavljen. 24 00:00:57,600 --> 00:00:58,220 >> Zašto je to? 25 00:00:58,220 --> 00:01:03,338 Zato moramo biti u stanju navesti i prepoznati sve moguće varijabli 26 00:01:03,338 --> 00:01:04,129 možemo naići. 27 00:01:04,129 --> 00:01:07,910 Možda ćemo imati niz koji bi mogli biti u mogućnosti to držati puno informacija, 28 00:01:07,910 --> 00:01:10,110 ali to još uvijek ne upravo dovoljno precizni. 29 00:01:10,110 --> 00:01:12,640 Što ako ne znamo, što ako nemamo pojma 30 00:01:12,640 --> 00:01:14,370 koliko ćemo trebati u vrijeme prevođenja? 31 00:01:14,370 --> 00:01:17,020 Ili što ako naš program će trčanje za jako dugo vremena, 32 00:01:17,020 --> 00:01:19,810 Prihvaćanjem različitih korisnika podataka, a ne možemo stvarno 33 00:01:19,810 --> 00:01:23,170 procijeniti da li smo Trebat će 1.000 jedinica? 34 00:01:23,170 --> 00:01:26,060 >> To nije kao što možemo kažu u naredbenom retku 35 00:01:26,060 --> 00:01:28,040 unesite Koliko stavki mislite da ćete trebati. 36 00:01:28,040 --> 00:01:31,100 Pa što ako je to mišljenje je u redu? 37 00:01:31,100 --> 00:01:34,300 Dinamička dodjela memorije vrsta dopušta nam put 38 00:01:34,300 --> 00:01:36,867 da biste dobili okolo ovaj problem. 39 00:01:36,867 --> 00:01:38,700 A način na koji to radi je pomoću pokazivača. 40 00:01:38,700 --> 00:01:42,140 >> Možemo koristiti upućuje na dobiti pristup dinamički 41 00:01:42,140 --> 00:01:45,710 dodijeljeno memorije, memorije koja je raspoređen je vaš program radi. 42 00:01:45,710 --> 00:01:48,290 Nije dodijeljen u vrijeme prevođenja. 43 00:01:48,290 --> 00:01:51,570 Kada dinamički alocirati Memorija dolazi iz bazena 44 00:01:51,570 --> 00:01:53,795 memorije poznat kao gomila. 45 00:01:53,795 --> 00:01:56,420 Prije svega memorija imamo radi s tijekom 46 00:01:56,420 --> 00:01:59,920 je dolazi iz bazena memorije poznat kao stog. 47 00:01:59,920 --> 00:02:02,470 Dobar način da se općenito držati u mind-- i tog pravila 48 00:02:02,470 --> 00:02:04,720 uvijek ne vrijedi, ali prilično mnogo gotovo 49 00:02:04,720 --> 00:02:09,940 Uvijek drži true-- je da je bilo Vrijeme vam dati ime varijable ga 50 00:02:09,940 --> 00:02:12,090 Vjerojatno živi na stog. 51 00:02:12,090 --> 00:02:14,650 I svaki put kad ne dati varijablu ime, 52 00:02:14,650 --> 00:02:19,160 što možete učiniti s dinamičke memorije raspodjele, ona živi na hrpi. 53 00:02:19,160 --> 00:02:22,190 >> Sada sam vrsta predstavljanja ovo kao ako postoji ta dva bazena memorije. 54 00:02:22,190 --> 00:02:24,740 Ali možda ste vidjeli dijagram, koji je općenito 55 00:02:24,740 --> 00:02:27,290 prikaz što memoriju izgleda, 56 00:02:27,290 --> 00:02:30,373 i nećemo brinuti o svim stvari na vrhu i na dnu. 57 00:02:30,373 --> 00:02:33,580 Ono što mi je stalo je taj dio u srednji ovdje, gomila i stog. 58 00:02:33,580 --> 00:02:35,570 Kao što možete vidjeti po gleda na dijagramu, 59 00:02:35,570 --> 00:02:38,390 oni zapravo nisu dva odvojena bazena memorije. 60 00:02:38,390 --> 00:02:42,757 To je jedna zajednička bazen memorije gdje početi, u ovom vizualnom 61 00:02:42,757 --> 00:02:44,590 vi početi na dnu i početi punjenje 62 00:02:44,590 --> 00:02:48,040 od dna s hrpe, i vama početi na vrhu i započeti punjenje 63 00:02:48,040 --> 00:02:50,072 od vrha prema dolje s hrpe. 64 00:02:50,072 --> 00:02:51,780 Ali, to je stvarno Isto bazen, to je samo 65 00:02:51,780 --> 00:02:56,050 različita mjesta, različita mjesta u memoriji koje se dodjeljuju. 66 00:02:56,050 --> 00:02:59,060 A možete ponestane memorije koju ima ili 67 00:02:59,060 --> 00:03:01,240 hrpu ide sve na putu na dnu, ili imaju 68 00:03:01,240 --> 00:03:05,440 snop ide sve na putu do vrha, ili ima hrpu i hrpu 69 00:03:05,440 --> 00:03:06,740 susret jedni protiv drugih. 70 00:03:06,740 --> 00:03:09,500 Svi oni mogu biti uvjeti koje uzrokuju vaš program 71 00:03:09,500 --> 00:03:11,030 izvoditi iz memorije. 72 00:03:11,030 --> 00:03:11,952 Pa imajte to na umu. 73 00:03:11,952 --> 00:03:13,660 Kada govorimo o hrpu i stog 74 00:03:13,660 --> 00:03:17,880 zapravo govorimo o Isti opći komad memorije, samo 75 00:03:17,880 --> 00:03:21,930 različiti dijelovi tog sjećanja. 76 00:03:21,930 --> 00:03:24,910 >> Pa kako ćemo dobiti dinamički dodjeljuje memoriju na prvom mjestu? 77 00:03:24,910 --> 00:03:27,740 Kako naš program dobiti memorije kao što je trčanje? 78 00:03:27,740 --> 00:03:32,660 Pa C nudi funkciju pod nazivom malloc, memorije razdjelnika, koji 79 00:03:32,660 --> 00:03:36,810 napraviti poziv, a vi proći u koliko bajtova memorije koje želite. 80 00:03:36,810 --> 00:03:39,940 Dakle, ako je vaš program radi i želite cijeli broj izvođenja, 81 00:03:39,940 --> 00:03:46,040 možda mallock četiri bajtova memorije, malloc zagrada četiri. 82 00:03:46,040 --> 00:03:48,540 >> mallock će proći kroz gleda kroz gomilu, 83 00:03:48,540 --> 00:03:50,750 jer smo dinamički dodjeljivanje memorije, 84 00:03:50,750 --> 00:03:53,500 i ona će se vratiti k vama pokazivač na tu memoriju. 85 00:03:53,500 --> 00:03:56,180 To vam ne daje tu memory-- ne dati mu ime, 86 00:03:56,180 --> 00:03:57,950 to vam daje pokazivač na njega. 87 00:03:57,950 --> 00:04:00,780 I tako to je razlog zašto sam opet rekao da je važno da se možda 88 00:04:00,780 --> 00:04:03,770 su gledali naputke videa prije nego što smo dobili previše daleko u to. 89 00:04:03,770 --> 00:04:05,940 Dakle malloc će daju ti natrag pokazivač. 90 00:04:05,940 --> 00:04:08,950 >> Ako mallock ne mogu vam dati bilo memorije jer ste ponestane, 91 00:04:08,950 --> 00:04:10,645 to će vam vratiti null pokazivača. 92 00:04:10,645 --> 00:04:15,282 Sjećate li se što se događa ako mi pokušati dereference null pointer? 93 00:04:15,282 --> 00:04:17,019 Mi pate grešku SEG, zar ne? 94 00:04:17,019 --> 00:04:18,060 To je vjerojatno nije dobro. 95 00:04:18,060 --> 00:04:21,579 >> Tako svaki put kad upućivanje poziva vas malloc uvijek, uvijek 96 00:04:21,579 --> 00:04:25,270 potrebno je provjeriti da li ili ne pokazivač dao si ponovno je null. 97 00:04:25,270 --> 00:04:28,800 Ako je, morate završiti svoj program jer ako pokušate i dereference 98 00:04:28,800 --> 00:04:31,360 nul pokazivač idete trpjeti grešku segmentiranja 99 00:04:31,360 --> 00:04:34,380 i vaš program će ionako srušiti. 100 00:04:34,380 --> 00:04:37,190 Pa kako i mi statički dobije cijeli broj? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Vjerojatno sam to učinio hrpa vremena, zar ne? 103 00:04:40,010 --> 00:04:43,480 To stvara varijablu nazvanu x da živi na stog. 104 00:04:43,480 --> 00:04:46,190 Kako dinamički dobije cijeli broj? 105 00:04:46,190 --> 00:04:50,010 Int zvijezda px jednak malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Ili prikladnije bismo reći int zvijezda PX 107 00:04:53,050 --> 00:04:57,680 jednako malloc veličinu int, samo baciti neke manje 108 00:04:57,680 --> 00:04:59,740 Magic Numbers oko našeg programa. 109 00:04:59,740 --> 00:05:04,140 To će nam izmoli četiri bajta memorije iz gomile, 110 00:05:04,140 --> 00:05:06,720 a pokazivač smo dobili vratiti na to se zove px. 111 00:05:06,720 --> 00:05:08,430 A onda kao imamo učinjeno ranije smo 112 00:05:08,430 --> 00:05:13,966 Možete dereference px na pristupiti tu memoriju. 113 00:05:13,966 --> 00:05:15,590 Kako ćemo dobiti broj od korisnika? 114 00:05:15,590 --> 00:05:17,970 Možemo reći int x jednak dobili int. 115 00:05:17,970 --> 00:05:19,930 To je prilično jednostavan. 116 00:05:19,930 --> 00:05:24,030 Što ako želimo stvoriti niz X plovaka koji žive na stog? 117 00:05:24,030 --> 00:05:28,210 plutaju stack_array-- da je ime naših array-- uglatim zagradama x. 118 00:05:28,210 --> 00:05:32,419 To će stvoriti za nas niz X plovaka koji žive na stog. 119 00:05:32,419 --> 00:05:34,960 Možemo stvoriti niz plovaka koji živi na hrpu, previše. 120 00:05:34,960 --> 00:05:37,330 Sintaksa mogao izgledati malo nezgrapan, 121 00:05:37,330 --> 00:05:41,740 ali možemo reći plutaju zvijezda heap_array jednak 122 00:05:41,740 --> 00:05:44,360 malloc x puta veći od plovka. 123 00:05:44,360 --> 00:05:48,160 Trebam dovoljno prostora za držanje x pomičnim zarezom vrijednosti. 124 00:05:48,160 --> 00:05:51,560 Tako kažu trebam 100 pluta, ili 1.000 pluta. 125 00:05:51,560 --> 00:05:54,810 Tako je u tom slučaju to bi bilo 400 bajtova za 100 kola, 126 00:05:54,810 --> 00:05:59,080 ili 4.000 bajtova za 1.000 kola, jer svaki plovak zauzima 127 00:05:59,080 --> 00:06:01,230 četiri bajta prostora. 128 00:06:01,230 --> 00:06:05,110 >> Nakon toga se mogu koristiti uglata zagrada sintaksu na heap_array. 129 00:06:05,110 --> 00:06:08,970 Baš kao što bih na stack_array, ja možete pristupiti na elemente pojedinačno 130 00:06:08,970 --> 00:06:11,590 pomoću heap_array nula, heap_array jedan. 131 00:06:11,590 --> 00:06:15,800 Ali sjećam razlog možemo učiniti je zato što je naziv niza u C 132 00:06:15,800 --> 00:06:19,990 stvarno pointer na da je niz je prvi element. 133 00:06:19,990 --> 00:06:23,480 Dakle činjenica da smo proglašena niz plovaka na stogu ovdje 134 00:06:23,480 --> 00:06:24,810 je zapravo malo zabludu. 135 00:06:24,810 --> 00:06:27,600 Mi zapravo u Druga linija koda postoji 136 00:06:27,600 --> 00:06:32,360 Također stvaranje pokazivač na komad memorije da smo napraviti nešto raditi. 137 00:06:32,360 --> 00:06:35,620 >> Evo veliki problem s dinamički dodijeljene memorije ipak, 138 00:06:35,620 --> 00:06:38,360 i to je razlog zašto je zapravo važno razviti neke dobre navike 139 00:06:38,360 --> 00:06:39,800 kada radite s njim. 140 00:06:39,800 --> 00:06:43,060 Za razliku statički proglasio memorija, pamćenje 141 00:06:43,060 --> 00:06:46,790 nije automatski vratio na Sustav kada vaš funkcija je učinio. 142 00:06:46,790 --> 00:06:49,280 Dakle, ako smo glavni i Glavni poziva funkciju 143 00:06:49,280 --> 00:06:53,860 f, f, kada završi ono što radi i vraća kontrolu programa 144 00:06:53,860 --> 00:06:58,810 Povratak na stranicu, sve memorije da f koristi se vraća. 145 00:06:58,810 --> 00:07:01,250 To se može ponovno koristiti nekom drugom programu, 146 00:07:01,250 --> 00:07:04,250 ili neke druge funkcije koje dobiva se zove kasnije u glavnom. 147 00:07:04,250 --> 00:07:06,970 To se može koristiti istu memoriju iznova. 148 00:07:06,970 --> 00:07:09,620 >> Ako vas dinamički alocirati memoriju iako 149 00:07:09,620 --> 00:07:14,380 morate izričito reći sustav koji ste učinili s njim. 150 00:07:14,380 --> 00:07:18,370 To će zadržati to za vas, koji bi mogao dovesti do problema od vas ponestaje 151 00:07:18,370 --> 00:07:19,290 memorije. 152 00:07:19,290 --> 00:07:22,179 A u stvari smo se ponekad odnosi na to kao na memorijsku curenja. 153 00:07:22,179 --> 00:07:24,970 A ponekad i ove memory leaks zapravo može biti jako poražavajući 154 00:07:24,970 --> 00:07:27,020 za izvedbu sustava. 155 00:07:27,020 --> 00:07:31,120 >> Ako ste čest korisnik interneta možete koristiti određene web preglednike, 156 00:07:31,120 --> 00:07:35,630 i neću navoditi imena ovdje, ali postoje neke web preglednicima vani 157 00:07:35,630 --> 00:07:39,150 koje su zloglasne za zapravo ima memory leaks da ne bi fiksni. 158 00:07:39,150 --> 00:07:44,570 A ako ostavite vaš preglednik otvoren za vrlo dugo vremensko razdoblje, dani 159 00:07:44,570 --> 00:07:48,060 i dana, ili tjedana, ponekad možda primijetiti da vaš sustav 160 00:07:48,060 --> 00:07:49,790 je pokrenut jako, jako polako. 161 00:07:49,790 --> 00:07:54,640 A razlog za to je da preglednik je izdvojila memorije, 162 00:07:54,640 --> 00:07:57,320 ali onda nije rekla sustav kako se to radi s njom. 163 00:07:57,320 --> 00:08:01,000 I tako da ostavlja manje memorije dostupan za sve svoje druge programe 164 00:08:01,000 --> 00:08:04,480 morati dijeliti, jer si leaking-- taj web preglednik 165 00:08:04,480 --> 00:08:06,755 Program curi memorije. 166 00:08:06,755 --> 00:08:08,880 Kako ćemo dati memoriju natrag kad završimo s njom? 167 00:08:08,880 --> 00:08:10,838 Pa srećom to je vrlo jednostavan način to učiniti. 168 00:08:10,838 --> 00:08:11,710 Upravo smo ga osloboditi. 169 00:08:11,710 --> 00:08:15,020 Postoji funkcija zove besplatno, prihvaća pokazivač u memoriju, 170 00:08:15,020 --> 00:08:16,010 a mi si dobar to ići. 171 00:08:16,010 --> 00:08:18,310 >> Dakle, recimo da smo u Sredina našeg programa, 172 00:08:18,310 --> 00:08:21,970 želimo malloc 50 znakova. 173 00:08:21,970 --> 00:08:25,710 Želimo malloc niz koji mogu sposoban za držanje 50 znakova. 174 00:08:25,710 --> 00:08:29,109 A kad smo dobili pokazivač natrag da, ime tog pokazivača je riječ. 175 00:08:29,109 --> 00:08:30,900 Mi radimo sve što smo učiniti s riječju, 176 00:08:30,900 --> 00:08:33,440 a onda kad smo učinili smo samo ga osloboditi. 177 00:08:33,440 --> 00:08:37,460 A sada smo se vratili onih 50 bajta memorije natrag u sustav. 178 00:08:37,460 --> 00:08:40,147 Neki drugi funkcija ih mogu koristiti. 179 00:08:40,147 --> 00:08:43,480 Ne morate brinuti o patnje otjecanje memorije, jer smo oslobodili riječ. 180 00:08:43,480 --> 00:08:46,639 Mi smo dali sjećanje vrati, tako da završite rad s njim. 181 00:08:46,639 --> 00:08:48,430 Dakle, postoje tri zlatna pravila koja bi trebala 182 00:08:48,430 --> 00:08:51,700 imati na umu kada ste dinamički dodjele memorije 183 00:08:51,700 --> 00:08:52,990 s malloc. 184 00:08:52,990 --> 00:08:56,480 Svaki blok memorije što malloc mora biti oslobođena 185 00:08:56,480 --> 00:08:58,430 prije programa završi s radom. 186 00:08:58,430 --> 00:09:02,029 Sada opet, u aparatu ili u IDE ova vrsta se događa za vas bilo 187 00:09:02,029 --> 00:09:04,820 kada you-- će ionako dogoditi Kada je vaš program prekinut, 188 00:09:04,820 --> 00:09:06,880 sve memorije će biti objavljen. 189 00:09:06,880 --> 00:09:10,750 No, to je općenito dobro kodiranje praksa da se uvijek, kada završite, 190 00:09:10,750 --> 00:09:13,810 osloboditi ono što ste mallocd. 191 00:09:13,810 --> 00:09:16,690 >> To je rekao, samo stvari koje ste mallocd trebao biti oslobođen. 192 00:09:16,690 --> 00:09:19,880 Ako statički proglasiti broj, int x polu-debelog crijeva, 193 00:09:19,880 --> 00:09:23,500 koji živi na stog, što ne onda žele osloboditi x. 194 00:09:23,500 --> 00:09:25,970 Dakle, samo stvari koje ste mallocd trebao biti oslobođen. 195 00:09:25,970 --> 00:09:28,960 >> I na kraju, ne nešto besplatno dva puta. 196 00:09:28,960 --> 00:09:31,170 To može dovesti do još jedna čudna situacija. 197 00:09:31,170 --> 00:09:33,530 Dakle, sve što ste mallocd mora biti oslobođen. 198 00:09:33,530 --> 00:09:36,000 Samo stvari koje ste malloc trebao biti oslobođen. 199 00:09:36,000 --> 00:09:38,730 A ne nešto besplatno dva puta. 200 00:09:38,730 --> 00:09:43,660 >> Tako ćemo proći kroz primjer ovdje onoga što neki dinamički dodijeljene 201 00:09:43,660 --> 00:09:46,122 memorije može izgledati mješovito s nekim statičkim memorije. 202 00:09:46,122 --> 00:09:47,080 Što bi se moglo dogoditi ovdje? 203 00:09:47,080 --> 00:09:48,913 Pogledajte ako možete pratiti zajedno i pogodite što je 204 00:09:48,913 --> 00:09:51,720 će se dogoditi kao što smo ići kroz sve ove linije koda. 205 00:09:51,720 --> 00:09:53,980 >> Tako bismo mogli reći int m. 206 00:09:53,980 --> 00:09:54,840 Što se događa ovdje? 207 00:09:54,840 --> 00:09:56,339 Pa to je prilično jednostavan. 208 00:09:56,339 --> 00:09:59,650 Ja stvoriti cjelobrojna varijabla zove m. 209 00:09:59,650 --> 00:10:01,400 I boja je zelena, jer to je boja 210 00:10:01,400 --> 00:10:03,730 da koristim kad govorim o cjelobrojne varijable. 211 00:10:03,730 --> 00:10:05,160 To je kutija. 212 00:10:05,160 --> 00:10:08,400 To se zove m, a možete trgovina integers unutar nje. 213 00:10:08,400 --> 00:10:12,400 >> Što ako sam tada rekao int zvjezdicom? 214 00:10:12,400 --> 00:10:13,530 Pa to je prilično slično. 215 00:10:13,530 --> 00:10:15,780 Izrađujem kutija zove. 216 00:10:15,780 --> 00:10:19,100 To je sposoban za držanje int zvijezde, upućuje na cijele brojeve. 217 00:10:19,100 --> 00:10:21,570 Tako sam ga bojanje zeleno-ish kao dobro. 218 00:10:21,570 --> 00:10:24,140 >> Znam da ima nešto učiniti s cijeli broj, 219 00:10:24,140 --> 00:10:25,852 ali to nije sama cijeli broj. 220 00:10:25,852 --> 00:10:27,310 No, to je manje-više ista ideja. 221 00:10:27,310 --> 00:10:28,101 Napravio sam kutiju. 222 00:10:28,101 --> 00:10:30,070 Obje od tih prava sada žive na stog. 223 00:10:30,070 --> 00:10:32,520 Ja sam im dao oba imena. 224 00:10:32,520 --> 00:10:36,750 >> int zvijezda b jednak malloc veličinu int. 225 00:10:36,750 --> 00:10:38,560 To bi mogao biti malo lukav. 226 00:10:38,560 --> 00:10:44,110 Uzmite drugi i razmišljati o tome što očekujem da bi se dogoditi na ovoj slici. 227 00:10:44,110 --> 00:10:50,210 int zvijezda b jednak malloc veličinu int. 228 00:10:50,210 --> 00:10:51,940 >> Pa to ne samo stvoriti jedan okvir. 229 00:10:51,940 --> 00:10:53,800 To zapravo stvara dvije kutije. 230 00:10:53,800 --> 00:10:58,670 I to veze, ona također uspostavlja točka u vezi. 231 00:10:58,670 --> 00:11:02,240 Mi smo dodijeljen jedan blok memorije na hrpi. 232 00:11:02,240 --> 00:11:05,940 Obavijest da je gornji desni box tamo nema ime. 233 00:11:05,940 --> 00:11:06,760 >> To mallocd smo. 234 00:11:06,760 --> 00:11:08,050 Ona postoji na hrpu. 235 00:11:08,050 --> 00:11:10,090 Ali b ima ime. 236 00:11:10,090 --> 00:11:11,950 To je varijabla pokazivač zove b. 237 00:11:11,950 --> 00:11:13,910 Koji živi na stog. 238 00:11:13,910 --> 00:11:18,250 >> Dakle, to je komad memorije koji ukazuje na još jedan. 239 00:11:18,250 --> 00:11:21,840 b sadrži adresu tog bloka memorije. 240 00:11:21,840 --> 00:11:23,757 To nema ime drugačije. 241 00:11:23,757 --> 00:11:24,590 Ali, to ukazuje na to. 242 00:11:24,590 --> 00:11:29,760 Dakle, kada kažemo int zvijezda b jednak Veličina malloc od int, to pravo postoji, 243 00:11:29,760 --> 00:11:33,490 da strelica da popped up na desna strana postoji, da je cijela stvar, 244 00:11:33,490 --> 00:11:36,740 Morat ću se pojaviti opet, što se događa. 245 00:11:36,740 --> 00:11:39,341 Sve što se događa u da jedna linija koda. 246 00:11:39,341 --> 00:11:41,340 Sada ćemo malo više opet jednostavan. 247 00:11:41,340 --> 00:11:43,330 jednak ampersand m. 248 00:11:43,330 --> 00:11:46,280 Sjećate li se što se znak za struju jednaka je m? 249 00:11:46,280 --> 00:11:48,920 Pa to je dobiva m adresu. 250 00:11:48,920 --> 00:11:54,150 Ili staviti više shematski, a ukazuje na m. 251 00:11:54,150 --> 00:11:56,360 >> jednako b. 252 00:11:56,360 --> 00:11:57,560 U redu pa evo još jedan. 253 00:11:57,560 --> 00:11:59,230 Jednak b. 254 00:11:59,230 --> 00:12:02,260 Što će se dogoditi dijagram ovaj put? 255 00:12:02,260 --> 00:12:04,330 >> Pa podsjetiti da je Raspored djeluje operator 256 00:12:04,330 --> 00:12:08,960 dodjeljivanjem vrijednosti na Pravo na vrijednosti s lijeve strane. 257 00:12:08,960 --> 00:12:14,820 Dakle, umjesto ukazuje na m, A sada ukazuje na isto mjesto da B bodova. 258 00:12:14,820 --> 00:12:18,900 ne ukazuju na B, ukazuje gdje je B bodova. 259 00:12:18,900 --> 00:12:25,280 >> Ako je ukazao na b kako bi bio jednak ampersand b. 260 00:12:25,280 --> 00:12:28,150 No, umjesto toga jednako b jednostavno znači da je i B su sada 261 00:12:28,150 --> 00:12:31,770 ukazujući na istoj adresi, jer unutar b je samo adresa. 262 00:12:31,770 --> 00:12:35,004 A sada unutar a je ista adresa. 263 00:12:35,004 --> 00:12:37,170 m jednak 10, vjerojatno Najjednostavnija stvar 264 00:12:37,170 --> 00:12:38,690 što smo učinili u malo. 265 00:12:38,690 --> 00:12:40,460 Stavite 10 u kutiji. 266 00:12:40,460 --> 00:12:45,640 Star b jednak m plus 2, podsjećaju iz naš upućuje Video ono zvijezda b znači. 267 00:12:45,640 --> 00:12:50,230 Idemo dereference b i staviti neke vrijednosti u tom memorijskom mjestu. 268 00:12:50,230 --> 00:12:51,860 U ovom slučaju 12. 269 00:12:51,860 --> 00:12:55,300 >> Dakle, kada smo dereference točke sjećam se samo putuje prema dolje strelicu. 270 00:12:55,300 --> 00:12:58,205 Ili drugim riječima, mi ići na tu memorijsku adresu 271 00:12:58,205 --> 00:12:59,580 a mi ga manipulirati na neki način. 272 00:12:59,580 --> 00:13:00,830 Mi smo stavili neke vrijednosti u njemu. 273 00:13:00,830 --> 00:13:03,960 U ovom slučaju kategorizaciji b jednako m plus 2 je samo 274 00:13:03,960 --> 00:13:08,230 ići u varijablu ukazao na strane b, ići u memoriju ukazao na strane b, 275 00:13:08,230 --> 00:13:11,750 i stavi m plus 2 unutra, 12. 276 00:13:11,750 --> 00:13:14,970 >> Sada sam slobodan b. 277 00:13:14,970 --> 00:13:16,490 Što se događa kada sam slobodan b? 278 00:13:16,490 --> 00:13:18,800 Sjeti se što sam rekao slobodan znači. 279 00:13:18,800 --> 00:13:21,920 Što sam ja rekao kad sam slobodan b? 280 00:13:21,920 --> 00:13:23,410 >> Ja sam učinio raditi s njim, zar ne? 281 00:13:23,410 --> 00:13:25,702 Ja u biti odustati memorije. 282 00:13:25,702 --> 00:13:26,910 Ja ga vratiti u sustav. 283 00:13:26,910 --> 00:13:33,010 Ne treba mi to više je ono što sam im rekao, u redu? 284 00:13:33,010 --> 00:13:37,390 >> Sada, ako kažem zvjezdicom jednak 11 vjerojatno možete 285 00:13:37,390 --> 00:13:40,460 već reći da se nešto loše će se dogoditi ovdje, zar ne? 286 00:13:40,460 --> 00:13:44,160 I doista, ako sam pokušao da sam vjerojatno pretrpjeti grešku segmentiranja. 287 00:13:44,160 --> 00:13:47,140 Jer sada, iako prije da je komad memorije 288 00:13:47,140 --> 00:13:50,220 je nešto što sam imao pristup, u ovom trenutku 289 00:13:50,220 --> 00:13:54,590 sada sam pristupaju memoriju koja Nije pravno mi pristupiti. 290 00:13:54,590 --> 00:13:57,330 >> A kako ćemo vjerojatno Podsjetimo, kada smo pristupili memorije 291 00:13:57,330 --> 00:14:00,000 da mi ne smijemo dirati, to je najčešći uzrok 292 00:14:00,000 --> 00:14:01,860 od segmentacije kvara. I tako moj program 293 00:14:01,860 --> 00:14:05,170 bi srušiti ako sam pokušao to učiniti. 294 00:14:05,170 --> 00:14:09,910 Pa opet to je dobra ideja da se dobro praksi i dobre navike ukorijenjen 295 00:14:09,910 --> 00:14:12,920 kada se radi s malloc i besplatno, tako da ne pate segmentaciju 296 00:14:12,920 --> 00:14:15,310 mane, a koje koristite Vaš dinamički dodjeljuje 297 00:14:15,310 --> 00:14:17,370 memorije odgovorno. 298 00:14:17,370 --> 00:14:20,300 >> Ja sam Doug Lloyd je to CS50. 299 00:14:20,300 --> 00:14:21,947