1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Predvaja glasba] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> Doug LLOYD: OK, tako kot predlog Pred začetkom tukaj. 5 00:00:07,940 --> 00:00:11,660 Če še niste gledal video na Kazalci boste morda želeli, da to stori prvi. 6 00:00:11,660 --> 00:00:15,860 Ker je ta video je še en način dela s kazalci. 7 00:00:15,860 --> 00:00:17,574 >> Tako se dogaja, da se pogovorite o nekaterih konceptih 8 00:00:17,574 --> 00:00:19,490 da pokrivamo v Kazalci video, in smo 9 00:00:19,490 --> 00:00:21,948 bo gloss nad njimi zdaj, ob predpostavki, da oni že 10 00:00:21,948 --> 00:00:23,090 nekako razumel. 11 00:00:23,090 --> 00:00:25,440 Torej, to je samo tvoja pošteno opozorilo da, če ste videli ta video 12 00:00:25,440 --> 00:00:27,814 in še niste videli kazalci video, bi bilo nekako 13 00:00:27,814 --> 00:00:29,610 letijo nad glavo malo. 14 00:00:29,610 --> 00:00:32,080 In zato bi bilo bolje, gledati v tem vrstnem redu. 15 00:00:32,080 --> 00:00:34,710 >> Torej smo že videli eno način za delo s kazalci, 16 00:00:34,710 --> 00:00:37,810 ki smo razglasi spremenljivka, potem pa 17 00:00:37,810 --> 00:00:42,160 razglasi drugo spremenljivko, kazalec spremenljivka, ki kaže na to. 18 00:00:42,160 --> 00:00:44,870 Zato smo ustvarili spremenljivka z imenom, ki smo jih 19 00:00:44,870 --> 00:00:48,480 ustvaril drugo spremenljivko z imenom, in moramo poudariti, da je druga spremenljivka 20 00:00:48,480 --> 00:00:50,220 na ta prvi. 21 00:00:50,220 --> 00:00:52,370 Ta vrsta ima Problem, kajti na njej 22 00:00:52,370 --> 00:00:54,650 od nas zahteva, da natančno vedo, koliko pomnilnika smo 23 00:00:54,650 --> 00:00:57,600 bo treba trenutek Naš program je sestavljen. 24 00:00:57,600 --> 00:00:58,220 >> Zakaj je tako? 25 00:00:58,220 --> 00:01:03,338 Ker moramo biti sposobni poimenovati ali identifikacijo vseh možnih spremenljivk 26 00:01:03,338 --> 00:01:04,129 bomo morda naleteli. 27 00:01:04,129 --> 00:01:07,910 Morda bomo imeli niz, ki bi lahko možnost, da imajo veliko informacij, 28 00:01:07,910 --> 00:01:10,110 vendar je še vedno ni ravno dovolj natančen. 29 00:01:10,110 --> 00:01:12,640 Kaj pa, če ne vemo, Kaj pa, če nimamo pojma 30 00:01:12,640 --> 00:01:14,370 koliko bomo morali v času prevajanja? 31 00:01:14,370 --> 00:01:17,020 Ali kaj, če je naš program bo teči za zelo dolgo časa, 32 00:01:17,020 --> 00:01:19,810 sprejemanje različnih uporabnika podatkov, in ne moremo zares 33 00:01:19,810 --> 00:01:23,170 oceniti, ali smo bodo potrebovali 1.000 enot? 34 00:01:23,170 --> 00:01:26,060 >> To ni, kot smo lahko pravijo v ukazni vrstici 35 00:01:26,060 --> 00:01:28,040 vnesite kako veliko predmetov mislite, da boste potrebovali. 36 00:01:28,040 --> 00:01:31,100 Pa kaj, če je to ugibanje narobe? 37 00:01:31,100 --> 00:01:34,300 Dinamično dodeljevanje pomnilnika nekako nam omogoča pot 38 00:01:34,300 --> 00:01:36,867 da se okrog tega posebnega problema. 39 00:01:36,867 --> 00:01:38,700 In tako, kot to počne je s pomočjo nasvetov. 40 00:01:38,700 --> 00:01:42,140 >> Mi lahko uporabite kazalci na dobili dostop do dinamično 41 00:01:42,140 --> 00:01:45,710 dodeljenih spomin, spomin, da je dodeljena kot svoj program teče. 42 00:01:45,710 --> 00:01:48,290 To ni dodeljen v času prevajanja. 43 00:01:48,290 --> 00:01:51,570 Ko se dinamično dodeli spomin prihaja iz bazena 44 00:01:51,570 --> 00:01:53,795 pomnilnika znan kot kup. 45 00:01:53,795 --> 00:01:56,420 Prej ves pomnilnik, ki smo jih sodeluje z v teku 46 00:01:56,420 --> 00:01:59,920 je prihajajo iz nabora pomnilnika znan kot dimnika. 47 00:01:59,920 --> 00:02:02,470 Dober način za splošno obdržati v mind-- in to pravilo 48 00:02:02,470 --> 00:02:04,720 vedno ne drži, vendar precej skoraj 49 00:02:04,720 --> 00:02:09,940 Vedno ima true-- je, da je vsaka Čas daš ime spremenljivke it 50 00:02:09,940 --> 00:02:12,090 verjetno živi na kupu. 51 00:02:12,090 --> 00:02:14,650 In vsakič, ko ne dati spremenljivka ime, 52 00:02:14,650 --> 00:02:19,160 ki jih lahko storite s dinamičnega pomnilnika dodelitev, da živi na kupu. 53 00:02:19,160 --> 00:02:22,190 >> Zdaj sem nekako predstavili to kot če je ta dva bazena spomina. 54 00:02:22,190 --> 00:02:24,740 Ampak ste to lahko videli diagram, ki je na splošno 55 00:02:24,740 --> 00:02:27,290 predstavitev kaj spomin izgleda, 56 00:02:27,290 --> 00:02:30,373 in ne bomo, da skrbi za vse stvari na vrhu in na dnu. 57 00:02:30,373 --> 00:02:33,580 Kaj mi mar, je ta del v srednji tu, kup in kup. 58 00:02:33,580 --> 00:02:35,570 Kot lahko vidite s gledaš ta diagram, 59 00:02:35,570 --> 00:02:38,390 ti dejansko niso dve ločeni bazeni pomnilnika. 60 00:02:38,390 --> 00:02:42,757 To je ena shared pool spomina kjer ste začeli, v ta vizualna 61 00:02:42,757 --> 00:02:44,590 začnete na dnu in začeti polnjenje 62 00:02:44,590 --> 00:02:48,040 od spodaj s kupa, in vas začeti na vrhu, in začeti polnjenje 63 00:02:48,040 --> 00:02:50,072 od zgoraj navzdol z kup. 64 00:02:50,072 --> 00:02:51,780 Ampak to je res Enako bazen, to je samo 65 00:02:51,780 --> 00:02:56,050 različni madeži, različne lokacije v spomin, ki se dodelijo. 66 00:02:56,050 --> 00:02:59,060 In ti lahko zmanjka spomin bodisi ob 67 00:02:59,060 --> 00:03:01,240 kup iti vse do dna, ali imajo 68 00:03:01,240 --> 00:03:05,440 Sveženj gredo vse do vrha, ali ima kup in kup 69 00:03:05,440 --> 00:03:06,740 srečali drug proti drugemu. 70 00:03:06,740 --> 00:03:09,500 Vsi ti lahko pogoji ki povzroča vaš program 71 00:03:09,500 --> 00:03:11,030 zmanjkalo pomnilnika. 72 00:03:11,030 --> 00:03:11,952 Tako da se vodijo v mislih. 73 00:03:11,952 --> 00:03:13,660 Ko govorimo o kup in kup 74 00:03:13,660 --> 00:03:17,880 smo res govorimo o Enako splošno kos pomnilnika, samo 75 00:03:17,880 --> 00:03:21,930 Različni deli tega spomina. 76 00:03:21,930 --> 00:03:24,910 >> Torej, kako bomo dobili dinamično dodeljen pomnilnik na prvem mestu? 77 00:03:24,910 --> 00:03:27,740 Kako naš program dobil spomin, saj je tekmovanje v teku? 78 00:03:27,740 --> 00:03:32,660 No C ponuja funkcijo imenovano malloc, spomin Razdelilniki, ki 79 00:03:32,660 --> 00:03:36,810 kličete k, in se boste peljali v koliko bajtov pomnilnika, ki jih želite. 80 00:03:36,810 --> 00:03:39,940 Torej, če je vaš program teče in si želijo celo število runtime, 81 00:03:39,940 --> 00:03:46,040 boste morda mallock štiri bajte spomin, malloc oklepaju štiri. 82 00:03:46,040 --> 00:03:48,540 >> mallock bo šel skozi videti skozi kup, 83 00:03:48,540 --> 00:03:50,750 ker smo dinamično dodeljevanje pomnilnika, 84 00:03:50,750 --> 00:03:53,500 in se bo vrnil k tebi kazalec na ta spomin. 85 00:03:53,500 --> 00:03:56,180 To vam ne daje to memory-- ne ji dati ime, 86 00:03:56,180 --> 00:03:57,950 vam daje kazalec na njej. 87 00:03:57,950 --> 00:04:00,780 In da je, zakaj sem spet rekel da je pomembno, da se morda 88 00:04:00,780 --> 00:04:03,770 so si ogledali video ptičarji preden smo dobili preveč daleč v to. 89 00:04:03,770 --> 00:04:05,940 Torej malloc se dogaja, da daš nazaj kazalec. 90 00:04:05,940 --> 00:04:08,950 >> Če mallock vam ne more dati koli spomin, ker ste zmanjka, 91 00:04:08,950 --> 00:04:10,645 da vam bom dal nazaj null kazalec. 92 00:04:10,645 --> 00:04:15,282 Se spomnite, kaj se zgodi, če bomo poskusite in dereference null pointer? 93 00:04:15,282 --> 00:04:17,019 Trpimo napako SEG, kajne? 94 00:04:17,019 --> 00:04:18,060 To verjetno ni dobro. 95 00:04:18,060 --> 00:04:21,579 >> Torej, vsakič, ko kličete da vas malloc vedno, vedno 96 00:04:21,579 --> 00:04:25,270 je treba preveriti, ali je kazalec, da ti je dal nazaj, je nična. 97 00:04:25,270 --> 00:04:28,800 Če je tako, morate končati svoj program ker če ste poskušali in dereference 98 00:04:28,800 --> 00:04:31,360 null kazalec boš trpeti napako segmentacije 99 00:04:31,360 --> 00:04:34,380 in je vaš program bo nekako sesuje. 100 00:04:34,380 --> 00:04:37,190 Torej, kako mi narediti statično dobimo celo število? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Verjetno smo že storili, da kup časov, kajne? 103 00:04:40,010 --> 00:04:43,480 To ustvari spremenljivko z imenom x, ki živi na kupu. 104 00:04:43,480 --> 00:04:46,190 Kako smo dinamično dobimo celo število? 105 00:04:46,190 --> 00:04:50,010 Int zvezda px enaka malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Ali več ustrezno mi bi rekli int zvezda px 107 00:04:53,050 --> 00:04:57,680 enaka malloc velikost int, samo da bi vrgel nekaj manj 108 00:04:57,680 --> 00:04:59,740 čarobne številke okoli našega programa. 109 00:04:59,740 --> 00:05:04,140 To se dogaja, da dobijo za nas štiri bajte pomnilnika iz kopice, 110 00:05:04,140 --> 00:05:06,720 in kazalec smo dobili nazaj k njej se imenuje px. 111 00:05:06,720 --> 00:05:08,430 In potem tako kot smo jih prej naredili smo 112 00:05:08,430 --> 00:05:13,966 lahko dereference px do dostop do tega pomnilnika. 113 00:05:13,966 --> 00:05:15,590 Kako smo dobili celo od uporabnika? 114 00:05:15,590 --> 00:05:17,970 Lahko rečemo, int x enak dobili int. 115 00:05:17,970 --> 00:05:19,930 To je precej preprosta. 116 00:05:19,930 --> 00:05:24,030 Kaj pa, če želimo ustvariti niz od x plovci, ki živijo na kupu? 117 00:05:24,030 --> 00:05:28,210 float stack_array--, da je ime naših array-- oglatih oklepajih x. 118 00:05:28,210 --> 00:05:32,419 To bo ustvarilo za nas diod od x plovci, ki živijo na kupu. 119 00:05:32,419 --> 00:05:34,960 Mi lahko ustvarite paleto plovci ki živi na kupu, preveč. 120 00:05:34,960 --> 00:05:37,330 Skladnja morda videti malo bolj okoren, 121 00:05:37,330 --> 00:05:41,740 vendar pa lahko rečemo, plovec zvezda heap_array enaka 122 00:05:41,740 --> 00:05:44,360 malloc x-krat na velikost plovca. 123 00:05:44,360 --> 00:05:48,160 Rabim dovolj prostora, da imajo x plavajočo vejico. 124 00:05:48,160 --> 00:05:51,560 Tako pravijo rabim 100 boje, ali 1.000 plava. 125 00:05:51,560 --> 00:05:54,810 Torej v tem primeru bi bilo 400 bajte za 100 plovci, 126 00:05:54,810 --> 00:05:59,080 ali 4000 bajtov za 1.000 plovci, ker vsak float zavzema 127 00:05:59,080 --> 00:06:01,230 štiri bajte prostora. 128 00:06:01,230 --> 00:06:05,110 >> Po tem sem lahko uporabite oglati oklepaj sintaksa na heap_array. 129 00:06:05,110 --> 00:06:08,970 Tako kot bi jaz na stack_array sem lahko dostopate do svoje elemente posamično 130 00:06:08,970 --> 00:06:11,590 uporabo heap_array nič, heap_array ena. 131 00:06:11,590 --> 00:06:15,800 Ampak spomnim razlog, kar lahko naredimo, da je zato, ker ime array v C 132 00:06:15,800 --> 00:06:19,990 je res kazalec Prvi element, ki Array je. 133 00:06:19,990 --> 00:06:23,480 Torej dejstvo, da smo razglasitev array plovci na stack tukaj 134 00:06:23,480 --> 00:06:24,810 je pravzaprav nekoliko zavajajoč. 135 00:06:24,810 --> 00:06:27,600 Smo res v Druga vrstica kode tam 136 00:06:27,600 --> 00:06:32,360 Prav tako ustvarja kazalec na kos spomin, da naredite nekaj dela s. 137 00:06:32,360 --> 00:06:35,620 >> Tukaj je velik problem z dinamično dodeljenega pomnilnika, čeprav, 138 00:06:35,620 --> 00:06:38,360 in to je razlog, zakaj je res pomembno razvijati nekaj dobrih navad 139 00:06:38,360 --> 00:06:39,800 Ko delate z njo. 140 00:06:39,800 --> 00:06:43,060 Za razliko od statično razglasila spomin, tvoj spomin 141 00:06:43,060 --> 00:06:46,790 ni samodejno vrne k Sistem, ko je funkcija storiti. 142 00:06:46,790 --> 00:06:49,280 Torej, če imamo glavni in Glavna zahteva funkcijo 143 00:06:49,280 --> 00:06:53,860 f, ko f oblogami, kar počne in vrne nadzor nad programom 144 00:06:53,860 --> 00:06:58,810 nazaj v glavnem ves pomnilnik da f je naveden nazaj. 145 00:06:58,810 --> 00:07:01,250 To je mogoče ponovno uporabiti kak drug program 146 00:07:01,250 --> 00:07:04,250 ali kakšno drugo funkcijo, da gets pozval kasneje v glavnem. 147 00:07:04,250 --> 00:07:06,970 Prav tako lahko uporabite isti spomin znova. 148 00:07:06,970 --> 00:07:09,620 >> Če vam je dinamično dodeliti pomnilnika, čeprav 149 00:07:09,620 --> 00:07:14,380 morate izrecno povedati Sistem, ki ste končali z njo. 150 00:07:14,380 --> 00:07:18,370 To bo držite to za vas, ki bi lahko privede do problema od vas zmanjkuje 151 00:07:18,370 --> 00:07:19,290 spomina. 152 00:07:19,290 --> 00:07:22,179 In v resnici smo včasih nanašajo to kot spomin razpoka. 153 00:07:22,179 --> 00:07:24,970 In včasih ti spominski pušča lahko dejansko res uničujoče 154 00:07:24,970 --> 00:07:27,020 za delovanje sistema. 155 00:07:27,020 --> 00:07:31,120 >> Če ste pogost uporabnik interneta lahko uporabite nekatere spletne brskalnike, 156 00:07:31,120 --> 00:07:35,630 in ne bom ime imen tukaj, ampak obstajajo nekateri spletni brskalniki tam 157 00:07:35,630 --> 00:07:39,150 da so zloglasne za dejansko imajo Pomnilniške puščanje, ki ne ne dobijo osnovna. 158 00:07:39,150 --> 00:07:44,570 In če pustite vaš brskalnik odprt za zelo dolgo časa, dnevi 159 00:07:44,570 --> 00:07:48,060 in dni ali tednov, včasih morda opazili, da je vaš sistem 160 00:07:48,060 --> 00:07:49,790 je tek res, res počasi. 161 00:07:49,790 --> 00:07:54,640 In razlog za to je, da brskalnik je dodeljen pomnilnik, 162 00:07:54,640 --> 00:07:57,320 potem pa ni povedal sistema da je to storjeno z njo. 163 00:07:57,320 --> 00:08:01,000 In tako, da pušča manj pomnilnika na voljo za vse vaše druge programe 164 00:08:01,000 --> 00:08:04,480 morali deliti, ker ste leaking-- da je spletni brskalnik 165 00:08:04,480 --> 00:08:06,755 Program pušča spomin. 166 00:08:06,755 --> 00:08:08,880 Kako damo spomin nazaj Ko končamo z njim? 167 00:08:08,880 --> 00:08:10,838 No, na srečo je to zelo enostaven način, da to storite. 168 00:08:10,838 --> 00:08:11,710 Pravkar smo ga osvobodi. 169 00:08:11,710 --> 00:08:15,020 Tam je funkcija imenuje brezplačno, sprejema kazalec na spomin, 170 00:08:15,020 --> 00:08:16,010 in smo na dobri poti. 171 00:08:16,010 --> 00:08:18,310 >> Torej, recimo, da smo v Sredi našega programa, 172 00:08:18,310 --> 00:08:21,970 želimo malloc 50 znakov. 173 00:08:21,970 --> 00:08:25,710 Želimo malloc array, da lahko sposoben držati 50 znakov. 174 00:08:25,710 --> 00:08:29,109 In ko smo dobili kazalec nazaj da, ime te Pointer je beseda. 175 00:08:29,109 --> 00:08:30,900 Naredimo vse, kar smo boš naredil z besedo, 176 00:08:30,900 --> 00:08:33,440 in potem, ko smo naredili smo ga pravkar osvoboditi. 177 00:08:33,440 --> 00:08:37,460 In zdaj smo se vrnili tistih 50 bajtov pomnilnika nazaj v sistem. 178 00:08:37,460 --> 00:08:40,147 Nekatere druge funkcije ki jih lahko uporabite. 179 00:08:40,147 --> 00:08:43,480 Mi ne bo treba skrbeti trpljenje pomnilnika, ker smo osvobodili besedo. 180 00:08:43,480 --> 00:08:46,639 Mi smo dal spomin nazaj, tako da smo končali delo z njim. 181 00:08:46,639 --> 00:08:48,430 Tako obstajajo tri zlatih pravil, da bi morala 182 00:08:48,430 --> 00:08:51,700 je treba hraniti v mislih, ko ste dinamično dodeljevanje pomnilnika 183 00:08:51,700 --> 00:08:52,990 z knjižnične funkcije malloc. 184 00:08:52,990 --> 00:08:56,480 Vsak blok pomnilnika, ki je ste malloc treba osvoboditi 185 00:08:56,480 --> 00:08:58,430 pred svojim programom konča teče. 186 00:08:58,430 --> 00:09:02,029 Zdaj spet v aparatu oziroma v IDE to nekako zgodi za vas vseeno 187 00:09:02,029 --> 00:09:04,820 ko you-- se bo to zgodilo v vsakem primeru če je vaš program zaključen, 188 00:09:04,820 --> 00:09:06,880 ves spomin se bodo sprostila. 189 00:09:06,880 --> 00:09:10,750 Ampak to je na splošno dobro kodiranje praksa, da se vedno, ko ste končali, 190 00:09:10,750 --> 00:09:13,810 sprostiti kaj ste mallocd. 191 00:09:13,810 --> 00:09:16,690 >> To je dejal, samo stvari, ki ste mallocd treba rešiti. 192 00:09:16,690 --> 00:09:19,880 Če ste statično razglasi celo, int x podpičjem, 193 00:09:19,880 --> 00:09:23,500 ki živi na kupu, si ne, potem ne želite sprostiti x. 194 00:09:23,500 --> 00:09:25,970 Torej, samo stvari, ki ste jih mallocd treba rešiti. 195 00:09:25,970 --> 00:09:28,960 >> In nenazadnje, ne brezplačno nekaj dvakrat. 196 00:09:28,960 --> 00:09:31,170 To lahko privede do ena čudna situacija. 197 00:09:31,170 --> 00:09:33,530 Torej vse, kar ste mallocd je treba rešiti. 198 00:09:33,530 --> 00:09:36,000 Edine stvari, ki ste jih malloc je treba rešiti. 199 00:09:36,000 --> 00:09:38,730 In ne prostega nekaj dvakrat. 200 00:09:38,730 --> 00:09:43,660 >> Torej, kaj je šel skozi primer tukaj kaj nekateri dinamično dodeljen 201 00:09:43,660 --> 00:09:46,122 Pomnilnik lahko izgledal mešano z neko statični pomnilnik. 202 00:09:46,122 --> 00:09:47,080 Kaj bi se lahko zgodilo tukaj? 203 00:09:47,080 --> 00:09:48,913 Poglej, če lahko sledite skupaj in ugibati, kaj je 204 00:09:48,913 --> 00:09:51,720 se bo zgodilo, ko gremo po vseh teh vrstic kode. 205 00:09:51,720 --> 00:09:53,980 >> Torej rečemo int m. 206 00:09:53,980 --> 00:09:54,840 Kaj se dogaja tukaj? 207 00:09:54,840 --> 00:09:56,339 No to je precej preprosta. 208 00:09:56,339 --> 00:09:59,650 Sem ustvariti celoštevilsko spremenljivko z imenom m. 209 00:09:59,650 --> 00:10:01,400 Jaz obarvajo je zelena, ker je to barva 210 00:10:01,400 --> 00:10:03,730 , ki ga uporabljam, ko govorim približno celoštevilskih spremenljivk. 211 00:10:03,730 --> 00:10:05,160 To je polje. 212 00:10:05,160 --> 00:10:08,400 Imenuje m, in lahko store cela znotraj nje. 213 00:10:08,400 --> 00:10:12,400 >> Kaj pa, če sem takrat rekel, int zvezda? 214 00:10:12,400 --> 00:10:13,530 No, to je precej podobno. 215 00:10:13,530 --> 00:10:15,780 Sem ustvarja polje imenuje. 216 00:10:15,780 --> 00:10:19,100 To je sposoben držati int zvezde, kazalci na cela števila. 217 00:10:19,100 --> 00:10:21,570 Tako da sem ji barvanje zeleno-ish, kot dobro. 218 00:10:21,570 --> 00:10:24,140 >> Vem, da ima nekaj storiti s celo število, 219 00:10:24,140 --> 00:10:25,852 ampak to je samo po sebi ni celo število. 220 00:10:25,852 --> 00:10:27,310 Ampak to je precej isto idejo. 221 00:10:27,310 --> 00:10:28,101 Sem ustvaril polje. 222 00:10:28,101 --> 00:10:30,070 Oba pravice zdaj živi na kupu. 223 00:10:30,070 --> 00:10:32,520 Sem jim dal obe imeni. 224 00:10:32,520 --> 00:10:36,750 >> int zvezda b enaka malloc velikost notr. 225 00:10:36,750 --> 00:10:38,560 Ta je lahko precej zapleteno. 226 00:10:38,560 --> 00:10:44,110 Bodite drugi in razmišljati o tem, kaj Pričakovali bi, da se zgodi na tem diagramu. 227 00:10:44,110 --> 00:10:50,210 int zvezda b enaka malloc velikost notr. 228 00:10:50,210 --> 00:10:51,940 >> No, pa to ne samo ustvariti eno polje. 229 00:10:51,940 --> 00:10:53,800 To dejansko ustvarja dve škatli. 230 00:10:53,800 --> 00:10:58,670 In to vezi, pa tudi vzpostavlja točka v odnosu. 231 00:10:58,670 --> 00:11:02,240 Mi smo dodeljen en blok spomina na kup. 232 00:11:02,240 --> 00:11:05,940 Opazimo, da je zgoraj desno polje tam nima ime. 233 00:11:05,940 --> 00:11:06,760 >> Ga mallocd smo. 234 00:11:06,760 --> 00:11:08,050 Obstaja na kupu. 235 00:11:08,050 --> 00:11:10,090 Ampak b ima ime. 236 00:11:10,090 --> 00:11:11,950 To je kazalec spremenljivka imenovan b. 237 00:11:11,950 --> 00:11:13,910 Ki živi na kupu. 238 00:11:13,910 --> 00:11:18,250 >> Torej, to je del pomnilnika da kaže na drugo. 239 00:11:18,250 --> 00:11:21,840 b vsebuje naslov navedenega bloka pomnilnika. 240 00:11:21,840 --> 00:11:23,757 To sicer nima imena. 241 00:11:23,757 --> 00:11:24,590 Vendar pa kaže na to. 242 00:11:24,590 --> 00:11:29,760 Torej, ko smo rekli, int zvezda b enaka Velikost malloc int, da je tam, 243 00:11:29,760 --> 00:11:33,490 da je puščica, ki izstrelil na desna stran je, da je cela stvar, 244 00:11:33,490 --> 00:11:36,740 Jaz bom se zdi še enkrat, je tisto, kar se zgodi. 245 00:11:36,740 --> 00:11:39,341 Vse, kar se dogaja v da ena vrstica kode. 246 00:11:39,341 --> 00:11:41,340 Zdaj bomo dobili malo več enostavna znova. 247 00:11:41,340 --> 00:11:43,330 enak ampersand m. 248 00:11:43,330 --> 00:11:46,280 Se spomnite, kaj je enaka ampersand m je? 249 00:11:46,280 --> 00:11:48,920 No, da je dobil naslov M. 250 00:11:48,920 --> 00:11:54,150 Ali se bolj shematsko, a kaže na m. 251 00:11:54,150 --> 00:11:56,360 >> enaka b. 252 00:11:56,360 --> 00:11:57,560 OK, tako da tukaj je še eden. 253 00:11:57,560 --> 00:11:59,230 Enaka b. 254 00:11:59,230 --> 00:12:02,260 Kaj se bo zgodilo diagram tokrat? 255 00:12:02,260 --> 00:12:04,330 >> Dobro spomniti, da je operaterja odstop dela 256 00:12:04,330 --> 00:12:08,960 z dodelitvijo vrednosti na Pravica do vrednosti na levi strani. 257 00:12:08,960 --> 00:12:14,820 Torej, namesto kaže na M, A zdaj opozarja na istem mestu da je B točk. 258 00:12:14,820 --> 00:12:18,900 ne kaže, da so B, A opozarja kjer b točk. 259 00:12:18,900 --> 00:12:25,280 >> Če koničastim na b, da bi so bili enako ampersand b. 260 00:12:25,280 --> 00:12:28,150 Ampak namesto tega enaka b pravkar pomeni, da in b sta sedaj 261 00:12:28,150 --> 00:12:31,770 kaže na istem naslovu, saj Notranjost b je samo naslov. 262 00:12:31,770 --> 00:12:35,004 In sedaj notranjost je a enak naslov. 263 00:12:35,004 --> 00:12:37,170 m je enak 10, verjetno Najbolj preprosta stvar 264 00:12:37,170 --> 00:12:38,690 smo naredili v malo. 265 00:12:38,690 --> 00:12:40,460 Dal 10 v škatli. 266 00:12:40,460 --> 00:12:45,640 Star b enak m plus 2, odpokličejo od naša kazalci video kakšna zvezda b pomeni. 267 00:12:45,640 --> 00:12:50,230 Bomo razrešimo b in dal nekateri vrednost tega pomnilnika. 268 00:12:50,230 --> 00:12:51,860 V tem primeru 12. 269 00:12:51,860 --> 00:12:55,300 >> Torej, ko smo dereference točko spomnim smo pravkar potuje navzdol puščico. 270 00:12:55,300 --> 00:12:58,205 Ali povedano drugače, smo pojdite na to spominsko naslov 271 00:12:58,205 --> 00:12:59,580 in smo ga manipulira na nek način. 272 00:12:59,580 --> 00:13:00,830 Mi je dal neko vrednost noter. 273 00:13:00,830 --> 00:13:03,960 V tem primeru zvezdicami b enaka m plus 2 je pravkar 274 00:13:03,960 --> 00:13:08,230 pojdite na spremenljivko opozoril, da ga b, iti v spomin opozoril, da ga b, 275 00:13:08,230 --> 00:13:11,750 in dal m plus 2 tam, 12. 276 00:13:11,750 --> 00:13:14,970 >> Zdaj sem se osvobodil b. 277 00:13:14,970 --> 00:13:16,490 Kaj se zgodi, ko sem se osvobodil b? 278 00:13:16,490 --> 00:13:18,800 Se spomniš, kaj sem rekel prostih sredstev. 279 00:13:18,800 --> 00:13:21,920 Kaj sem rekel, ko sem se osvobodil b? 280 00:13:21,920 --> 00:13:23,410 >> Bom končal delo z njim, kajne? 281 00:13:23,410 --> 00:13:25,702 V bistvu sem dal gor spomin. 282 00:13:25,702 --> 00:13:26,910 Sem ga nazaj v sistem. 283 00:13:26,910 --> 00:13:33,010 Jaz ne potrebujem več, je kaj sem jim povedal, OK? 284 00:13:33,010 --> 00:13:37,390 >> Zdaj pa, če rečem, zvezda enaka 11 lahko verjetno 285 00:13:37,390 --> 00:13:40,460 že povedal, da je nekaj slabega se bo zgodilo tukaj, kajne? 286 00:13:40,460 --> 00:13:44,160 In res, če sem se potrudil, da sem verjetno bi utrpel napako segmentacije. 287 00:13:44,160 --> 00:13:47,140 Ker zdaj, čeprav prej, da je kos pomnilnika 288 00:13:47,140 --> 00:13:50,220 je bilo nekaj, kar sem imel dostop do, na tej točki 289 00:13:50,220 --> 00:13:54,590 zdaj sem dostop do pomnilnika, ki ni pravna za mene, da dostop. 290 00:13:54,590 --> 00:13:57,330 >> In kot bomo verjetno spomnim, ko smo dostop do pomnilnika 291 00:13:57,330 --> 00:14:00,000 da si ne bi smel dotakniti, da je najpogostejši vzrok 292 00:14:00,000 --> 00:14:01,860 za segmentacijo kriv. In tako je moj program, 293 00:14:01,860 --> 00:14:05,170 bi crash, če sem se potrudil, da to storijo. 294 00:14:05,170 --> 00:14:09,910 Torej še enkrat, da je to dobra ideja, da bi dobili dober prakse in dobre navade zakoreninjene 295 00:14:09,910 --> 00:14:12,920 pri delu z knjižnične funkcije malloc in free, tako da ne boste trpeli segmentacije 296 00:14:12,920 --> 00:14:15,310 napake, in da jih uporabljate vaš dinamično dodeljen 297 00:14:15,310 --> 00:14:17,370 spomin odgovorno. 298 00:14:17,370 --> 00:14:20,300 >> Sem Doug Lloyd to je CS50. 299 00:14:20,300 --> 00:14:21,947