[Predvaja glasba] Doug LLOYD: OK, tako kot predlog Pred začetkom tukaj. Če še niste gledal video na Kazalci boste morda želeli, da to stori prvi. Ker je ta video je še en način dela s kazalci. Tako se dogaja, da se pogovorite o nekaterih konceptih da pokrivamo v Kazalci video, in smo bo gloss nad njimi zdaj, ob predpostavki, da oni že nekako razumel. Torej, to je samo tvoja pošteno opozorilo da, če ste videli ta video in še niste videli kazalci video, bi bilo nekako letijo nad glavo malo. In zato bi bilo bolje, gledati v tem vrstnem redu. Torej smo že videli eno način za delo s kazalci, ki smo razglasi spremenljivka, potem pa razglasi drugo spremenljivko, kazalec spremenljivka, ki kaže na to. Zato smo ustvarili spremenljivka z imenom, ki smo jih ustvaril drugo spremenljivko z imenom, in moramo poudariti, da je druga spremenljivka na ta prvi. Ta vrsta ima Problem, kajti na njej od nas zahteva, da natančno vedo, koliko pomnilnika smo bo treba trenutek Naš program je sestavljen. Zakaj je tako? Ker moramo biti sposobni poimenovati ali identifikacijo vseh možnih spremenljivk bomo morda naleteli. Morda bomo imeli niz, ki bi lahko možnost, da imajo veliko informacij, vendar je še vedno ni ravno dovolj natančen. Kaj pa, če ne vemo, Kaj pa, če nimamo pojma koliko bomo morali v času prevajanja? Ali kaj, če je naš program bo teči za zelo dolgo časa, sprejemanje različnih uporabnika podatkov, in ne moremo zares oceniti, ali smo bodo potrebovali 1.000 enot? To ni, kot smo lahko pravijo v ukazni vrstici vnesite kako veliko predmetov mislite, da boste potrebovali. Pa kaj, če je to ugibanje narobe? Dinamično dodeljevanje pomnilnika nekako nam omogoča pot da se okrog tega posebnega problema. In tako, kot to počne je s pomočjo nasvetov. Mi lahko uporabite kazalci na dobili dostop do dinamično dodeljenih spomin, spomin, da je dodeljena kot svoj program teče. To ni dodeljen v času prevajanja. Ko se dinamično dodeli spomin prihaja iz bazena pomnilnika znan kot kup. Prej ves pomnilnik, ki smo jih sodeluje z v teku je prihajajo iz nabora pomnilnika znan kot dimnika. Dober način za splošno obdržati v mind-- in to pravilo vedno ne drži, vendar precej skoraj Vedno ima true-- je, da je vsaka Čas daš ime spremenljivke it verjetno živi na kupu. In vsakič, ko ne dati spremenljivka ime, ki jih lahko storite s dinamičnega pomnilnika dodelitev, da živi na kupu. Zdaj sem nekako predstavili to kot če je ta dva bazena spomina. Ampak ste to lahko videli diagram, ki je na splošno predstavitev kaj spomin izgleda, in ne bomo, da skrbi za vse stvari na vrhu in na dnu. Kaj mi mar, je ta del v srednji tu, kup in kup. Kot lahko vidite s gledaš ta diagram, ti dejansko niso dve ločeni bazeni pomnilnika. To je ena shared pool spomina kjer ste začeli, v ta vizualna začnete na dnu in začeti polnjenje od spodaj s kupa, in vas začeti na vrhu, in začeti polnjenje od zgoraj navzdol z kup. Ampak to je res Enako bazen, to je samo različni madeži, različne lokacije v spomin, ki se dodelijo. In ti lahko zmanjka spomin bodisi ob kup iti vse do dna, ali imajo Sveženj gredo vse do vrha, ali ima kup in kup srečali drug proti drugemu. Vsi ti lahko pogoji ki povzroča vaš program zmanjkalo pomnilnika. Tako da se vodijo v mislih. Ko govorimo o kup in kup smo res govorimo o Enako splošno kos pomnilnika, samo Različni deli tega spomina. Torej, kako bomo dobili dinamično dodeljen pomnilnik na prvem mestu? Kako naš program dobil spomin, saj je tekmovanje v teku? No C ponuja funkcijo imenovano malloc, spomin Razdelilniki, ki kličete k, in se boste peljali v koliko bajtov pomnilnika, ki jih želite. Torej, če je vaš program teče in si želijo celo število runtime, boste morda mallock štiri bajte spomin, malloc oklepaju štiri. mallock bo šel skozi videti skozi kup, ker smo dinamično dodeljevanje pomnilnika, in se bo vrnil k tebi kazalec na ta spomin. To vam ne daje to memory-- ne ji dati ime, vam daje kazalec na njej. In da je, zakaj sem spet rekel da je pomembno, da se morda so si ogledali video ptičarji preden smo dobili preveč daleč v to. Torej malloc se dogaja, da daš nazaj kazalec. Če mallock vam ne more dati koli spomin, ker ste zmanjka, da vam bom dal nazaj null kazalec. Se spomnite, kaj se zgodi, če bomo poskusite in dereference null pointer? Trpimo napako SEG, kajne? To verjetno ni dobro. Torej, vsakič, ko kličete da vas malloc vedno, vedno je treba preveriti, ali je kazalec, da ti je dal nazaj, je nična. Če je tako, morate končati svoj program ker če ste poskušali in dereference null kazalec boš trpeti napako segmentacije in je vaš program bo nekako sesuje. Torej, kako mi narediti statično dobimo celo število? int x. Verjetno smo že storili, da kup časov, kajne? To ustvari spremenljivko z imenom x, ki živi na kupu. Kako smo dinamično dobimo celo število? Int zvezda px enaka malloc 4. Ali več ustrezno mi bi rekli int zvezda px enaka malloc velikost int, samo da bi vrgel nekaj manj čarobne številke okoli našega programa. To se dogaja, da dobijo za nas štiri bajte pomnilnika iz kopice, in kazalec smo dobili nazaj k njej se imenuje px. In potem tako kot smo jih prej naredili smo lahko dereference px do dostop do tega pomnilnika. Kako smo dobili celo od uporabnika? Lahko rečemo, int x enak dobili int. To je precej preprosta. Kaj pa, če želimo ustvariti niz od x plovci, ki živijo na kupu? float stack_array--, da je ime naših array-- oglatih oklepajih x. To bo ustvarilo za nas diod od x plovci, ki živijo na kupu. Mi lahko ustvarite paleto plovci ki živi na kupu, preveč. Skladnja morda videti malo bolj okoren, vendar pa lahko rečemo, plovec zvezda heap_array enaka malloc x-krat na velikost plovca. Rabim dovolj prostora, da imajo x plavajočo vejico. Tako pravijo rabim 100 boje, ali 1.000 plava. Torej v tem primeru bi bilo 400 bajte za 100 plovci, ali 4000 bajtov za 1.000 plovci, ker vsak float zavzema štiri bajte prostora. Po tem sem lahko uporabite oglati oklepaj sintaksa na heap_array. Tako kot bi jaz na stack_array sem lahko dostopate do svoje elemente posamično uporabo heap_array nič, heap_array ena. Ampak spomnim razlog, kar lahko naredimo, da je zato, ker ime array v C je res kazalec Prvi element, ki Array je. Torej dejstvo, da smo razglasitev array plovci na stack tukaj je pravzaprav nekoliko zavajajoč. Smo res v Druga vrstica kode tam Prav tako ustvarja kazalec na kos spomin, da naredite nekaj dela s. Tukaj je velik problem z dinamično dodeljenega pomnilnika, čeprav, in to je razlog, zakaj je res pomembno razvijati nekaj dobrih navad Ko delate z njo. Za razliko od statično razglasila spomin, tvoj spomin ni samodejno vrne k Sistem, ko je funkcija storiti. Torej, če imamo glavni in Glavna zahteva funkcijo f, ko f oblogami, kar počne in vrne nadzor nad programom nazaj v glavnem ves pomnilnik da f je naveden nazaj. To je mogoče ponovno uporabiti kak drug program ali kakšno drugo funkcijo, da gets pozval kasneje v glavnem. Prav tako lahko uporabite isti spomin znova. Če vam je dinamično dodeliti pomnilnika, čeprav morate izrecno povedati Sistem, ki ste končali z njo. To bo držite to za vas, ki bi lahko privede do problema od vas zmanjkuje spomina. In v resnici smo včasih nanašajo to kot spomin razpoka. In včasih ti spominski pušča lahko dejansko res uničujoče za delovanje sistema. Če ste pogost uporabnik interneta lahko uporabite nekatere spletne brskalnike, in ne bom ime imen tukaj, ampak obstajajo nekateri spletni brskalniki tam da so zloglasne za dejansko imajo Pomnilniške puščanje, ki ne ne dobijo osnovna. In če pustite vaš brskalnik odprt za zelo dolgo časa, dnevi in dni ali tednov, včasih morda opazili, da je vaš sistem je tek res, res počasi. In razlog za to je, da brskalnik je dodeljen pomnilnik, potem pa ni povedal sistema da je to storjeno z njo. In tako, da pušča manj pomnilnika na voljo za vse vaše druge programe morali deliti, ker ste leaking-- da je spletni brskalnik Program pušča spomin. Kako damo spomin nazaj Ko končamo z njim? No, na srečo je to zelo enostaven način, da to storite. Pravkar smo ga osvobodi. Tam je funkcija imenuje brezplačno, sprejema kazalec na spomin, in smo na dobri poti. Torej, recimo, da smo v Sredi našega programa, želimo malloc 50 znakov. Želimo malloc array, da lahko sposoben držati 50 znakov. In ko smo dobili kazalec nazaj da, ime te Pointer je beseda. Naredimo vse, kar smo boš naredil z besedo, in potem, ko smo naredili smo ga pravkar osvoboditi. In zdaj smo se vrnili tistih 50 bajtov pomnilnika nazaj v sistem. Nekatere druge funkcije ki jih lahko uporabite. Mi ne bo treba skrbeti trpljenje pomnilnika, ker smo osvobodili besedo. Mi smo dal spomin nazaj, tako da smo končali delo z njim. Tako obstajajo tri zlatih pravil, da bi morala je treba hraniti v mislih, ko ste dinamično dodeljevanje pomnilnika z knjižnične funkcije malloc. Vsak blok pomnilnika, ki je ste malloc treba osvoboditi pred svojim programom konča teče. Zdaj spet v aparatu oziroma v IDE to nekako zgodi za vas vseeno ko you-- se bo to zgodilo v vsakem primeru če je vaš program zaključen, ves spomin se bodo sprostila. Ampak to je na splošno dobro kodiranje praksa, da se vedno, ko ste končali, sprostiti kaj ste mallocd. To je dejal, samo stvari, ki ste mallocd treba rešiti. Če ste statično razglasi celo, int x podpičjem, ki živi na kupu, si ne, potem ne želite sprostiti x. Torej, samo stvari, ki ste jih mallocd treba rešiti. In nenazadnje, ne brezplačno nekaj dvakrat. To lahko privede do ena čudna situacija. Torej vse, kar ste mallocd je treba rešiti. Edine stvari, ki ste jih malloc je treba rešiti. In ne prostega nekaj dvakrat. Torej, kaj je šel skozi primer tukaj kaj nekateri dinamično dodeljen Pomnilnik lahko izgledal mešano z neko statični pomnilnik. Kaj bi se lahko zgodilo tukaj? Poglej, če lahko sledite skupaj in ugibati, kaj je se bo zgodilo, ko gremo po vseh teh vrstic kode. Torej rečemo int m. Kaj se dogaja tukaj? No to je precej preprosta. Sem ustvariti celoštevilsko spremenljivko z imenom m. Jaz obarvajo je zelena, ker je to barva , ki ga uporabljam, ko govorim približno celoštevilskih spremenljivk. To je polje. Imenuje m, in lahko store cela znotraj nje. Kaj pa, če sem takrat rekel, int zvezda? No, to je precej podobno. Sem ustvarja polje imenuje. To je sposoben držati int zvezde, kazalci na cela števila. Tako da sem ji barvanje zeleno-ish, kot dobro. Vem, da ima nekaj storiti s celo število, ampak to je samo po sebi ni celo število. Ampak to je precej isto idejo. Sem ustvaril polje. Oba pravice zdaj živi na kupu. Sem jim dal obe imeni. int zvezda b enaka malloc velikost notr. Ta je lahko precej zapleteno. Bodite drugi in razmišljati o tem, kaj Pričakovali bi, da se zgodi na tem diagramu. int zvezda b enaka malloc velikost notr. No, pa to ne samo ustvariti eno polje. To dejansko ustvarja dve škatli. In to vezi, pa tudi vzpostavlja točka v odnosu. Mi smo dodeljen en blok spomina na kup. Opazimo, da je zgoraj desno polje tam nima ime. Ga mallocd smo. Obstaja na kupu. Ampak b ima ime. To je kazalec spremenljivka imenovan b. Ki živi na kupu. Torej, to je del pomnilnika da kaže na drugo. b vsebuje naslov navedenega bloka pomnilnika. To sicer nima imena. Vendar pa kaže na to. Torej, ko smo rekli, int zvezda b enaka Velikost malloc int, da je tam, da je puščica, ki izstrelil na desna stran je, da je cela stvar, Jaz bom se zdi še enkrat, je tisto, kar se zgodi. Vse, kar se dogaja v da ena vrstica kode. Zdaj bomo dobili malo več enostavna znova. enak ampersand m. Se spomnite, kaj je enaka ampersand m je? No, da je dobil naslov M. Ali se bolj shematsko, a kaže na m. enaka b. OK, tako da tukaj je še eden. Enaka b. Kaj se bo zgodilo diagram tokrat? Dobro spomniti, da je operaterja odstop dela z dodelitvijo vrednosti na Pravica do vrednosti na levi strani. Torej, namesto kaže na M, A zdaj opozarja na istem mestu da je B točk. ne kaže, da so B, A opozarja kjer b točk. Če koničastim na b, da bi so bili enako ampersand b. Ampak namesto tega enaka b pravkar pomeni, da in b sta sedaj kaže na istem naslovu, saj Notranjost b je samo naslov. In sedaj notranjost je a enak naslov. m je enak 10, verjetno Najbolj preprosta stvar smo naredili v malo. Dal 10 v škatli. Star b enak m plus 2, odpokličejo od naša kazalci video kakšna zvezda b pomeni. Bomo razrešimo b in dal nekateri vrednost tega pomnilnika. V tem primeru 12. Torej, ko smo dereference točko spomnim smo pravkar potuje navzdol puščico. Ali povedano drugače, smo pojdite na to spominsko naslov in smo ga manipulira na nek način. Mi je dal neko vrednost noter. V tem primeru zvezdicami b enaka m plus 2 je pravkar pojdite na spremenljivko opozoril, da ga b, iti v spomin opozoril, da ga b, in dal m plus 2 tam, 12. Zdaj sem se osvobodil b. Kaj se zgodi, ko sem se osvobodil b? Se spomniš, kaj sem rekel prostih sredstev. Kaj sem rekel, ko sem se osvobodil b? Bom končal delo z njim, kajne? V bistvu sem dal gor spomin. Sem ga nazaj v sistem. Jaz ne potrebujem več, je kaj sem jim povedal, OK? Zdaj pa, če rečem, zvezda enaka 11 lahko verjetno že povedal, da je nekaj slabega se bo zgodilo tukaj, kajne? In res, če sem se potrudil, da sem verjetno bi utrpel napako segmentacije. Ker zdaj, čeprav prej, da je kos pomnilnika je bilo nekaj, kar sem imel dostop do, na tej točki zdaj sem dostop do pomnilnika, ki ni pravna za mene, da dostop. In kot bomo verjetno spomnim, ko smo dostop do pomnilnika da si ne bi smel dotakniti, da je najpogostejši vzrok za segmentacijo kriv. In tako je moj program, bi crash, če sem se potrudil, da to storijo. Torej še enkrat, da je to dobra ideja, da bi dobili dober prakse in dobre navade zakoreninjene pri delu z knjižnične funkcije malloc in free, tako da ne boste trpeli segmentacije napake, in da jih uporabljate vaš dinamično dodeljen spomin odgovorno. Sem Doug Lloyd to je CS50.