[Glazbom] Doug LLOYD: U redu, tako je prijedlog Prije početka ovdje. Ako niste gledali video na naputke možda želite učiniti prvi. Budući da je ovaj video je još način rada s pokazivača. Dakle, to će govoriti o nekim konceptima koje pokrivaju u pokazivače video, a mi smo će prijeći preko njih sada, uz pretpostavku da su oni već vrsta razumio. Dakle, to je samo tvoja fer upozorenje da ako vidim ovaj video a niste vidjeli pokazivače videa, to bi moglo nekako letjeti iznad glave malo. I tako da bi moglo biti bolje da ga gledati u tom redoslijedu. Tako smo već vidjeli jedno način za rad s pokazivača, što je možemo proglasiti promjenjiva, a onda smo proglasiti drugu varijablu, pokazivač promjenjiva, koji ukazuje na to. Tako smo stvorili varijabla s imenom, mi smo stvorio drugu varijablu s imenom, a mi ukazuju da je druga varijabla na taj prvi. Ova vrsta ima Problem ipak, jer to zahtijeva od nas da znam točno koliko memorije smo Trebat će trenutak naš program je sastavljen. Zašto je to? Zato moramo biti u stanju navesti i prepoznati sve moguće varijabli možemo naići. Možda ćemo imati niz koji bi mogli biti u mogućnosti to držati puno informacija, ali to još uvijek ne upravo dovoljno precizni. Što ako ne znamo, što ako nemamo pojma koliko ćemo trebati u vrijeme prevođenja? Ili što ako naš program će trčanje za jako dugo vremena, Prihvaćanjem različitih korisnika podataka, a ne možemo stvarno procijeniti da li smo Trebat će 1.000 jedinica? To nije kao što možemo kažu u naredbenom retku unesite Koliko stavki mislite da ćete trebati. Pa što ako je to mišljenje je u redu? Dinamička dodjela memorije vrsta dopušta nam put da biste dobili okolo ovaj problem. A način na koji to radi je pomoću pokazivača. Možemo koristiti upućuje na dobiti pristup dinamički dodijeljeno memorije, memorije koja je raspoređen je vaš program radi. Nije dodijeljen u vrijeme prevođenja. Kada dinamički alocirati Memorija dolazi iz bazena memorije poznat kao gomila. Prije svega memorija imamo radi s tijekom je dolazi iz bazena memorije poznat kao stog. Dobar način da se općenito držati u mind-- i tog pravila uvijek ne vrijedi, ali prilično mnogo gotovo Uvijek drži true-- je da je bilo Vrijeme vam dati ime varijable ga Vjerojatno živi na stog. I svaki put kad ne dati varijablu ime, što možete učiniti s dinamičke memorije raspodjele, ona živi na hrpi. Sada sam vrsta predstavljanja ovo kao ako postoji ta dva bazena memorije. Ali možda ste vidjeli dijagram, koji je općenito prikaz što memoriju izgleda, i nećemo brinuti o svim stvari na vrhu i na dnu. Ono što mi je stalo je taj dio u srednji ovdje, gomila i stog. Kao što možete vidjeti po gleda na dijagramu, oni zapravo nisu dva odvojena bazena memorije. To je jedna zajednička bazen memorije gdje početi, u ovom vizualnom vi početi na dnu i početi punjenje od dna s hrpe, i vama početi na vrhu i započeti punjenje od vrha prema dolje s hrpe. Ali, to je stvarno Isto bazen, to je samo različita mjesta, različita mjesta u memoriji koje se dodjeljuju. A možete ponestane memorije koju ima ili hrpu ide sve na putu na dnu, ili imaju snop ide sve na putu do vrha, ili ima hrpu i hrpu susret jedni protiv drugih. Svi oni mogu biti uvjeti koje uzrokuju vaš program izvoditi iz memorije. Pa imajte to na umu. Kada govorimo o hrpu i stog zapravo govorimo o Isti opći komad memorije, samo različiti dijelovi tog sjećanja. Pa kako ćemo dobiti dinamički dodjeljuje memoriju na prvom mjestu? Kako naš program dobiti memorije kao što je trčanje? Pa C nudi funkciju pod nazivom malloc, memorije razdjelnika, koji napraviti poziv, a vi proći u koliko bajtova memorije koje želite. Dakle, ako je vaš program radi i želite cijeli broj izvođenja, možda mallock četiri bajtova memorije, malloc zagrada četiri. mallock će proći kroz gleda kroz gomilu, jer smo dinamički dodjeljivanje memorije, i ona će se vratiti k vama pokazivač na tu memoriju. To vam ne daje tu memory-- ne dati mu ime, to vam daje pokazivač na njega. I tako to je razlog zašto sam opet rekao da je važno da se možda su gledali naputke videa prije nego što smo dobili previše daleko u to. Dakle malloc će daju ti natrag pokazivač. Ako mallock ne mogu vam dati bilo memorije jer ste ponestane, to će vam vratiti null pokazivača. Sjećate li se što se događa ako mi pokušati dereference null pointer? Mi pate grešku SEG, zar ne? To je vjerojatno nije dobro. Tako svaki put kad upućivanje poziva vas malloc uvijek, uvijek potrebno je provjeriti da li ili ne pokazivač dao si ponovno je null. Ako je, morate završiti svoj program jer ako pokušate i dereference nul pokazivač idete trpjeti grešku segmentiranja i vaš program će ionako srušiti. Pa kako i mi statički dobije cijeli broj? int x. Vjerojatno sam to učinio hrpa vremena, zar ne? To stvara varijablu nazvanu x da živi na stog. Kako dinamički dobije cijeli broj? Int zvijezda px jednak malloc 4. Ili prikladnije bismo reći int zvijezda PX jednako malloc veličinu int, samo baciti neke manje Magic Numbers oko našeg programa. To će nam izmoli četiri bajta memorije iz gomile, a pokazivač smo dobili vratiti na to se zove px. A onda kao imamo učinjeno ranije smo Možete dereference px na pristupiti tu memoriju. Kako ćemo dobiti broj od korisnika? Možemo reći int x jednak dobili int. To je prilično jednostavan. Što ako želimo stvoriti niz X plovaka koji žive na stog? plutaju stack_array-- da je ime naših array-- uglatim zagradama x. To će stvoriti za nas niz X plovaka koji žive na stog. Možemo stvoriti niz plovaka koji živi na hrpu, previše. Sintaksa mogao izgledati malo nezgrapan, ali možemo reći plutaju zvijezda heap_array jednak malloc x puta veći od plovka. Trebam dovoljno prostora za držanje x pomičnim zarezom vrijednosti. Tako kažu trebam 100 pluta, ili 1.000 pluta. Tako je u tom slučaju to bi bilo 400 bajtova za 100 kola, ili 4.000 bajtova za 1.000 kola, jer svaki plovak zauzima četiri bajta prostora. Nakon toga se mogu koristiti uglata zagrada sintaksu na heap_array. Baš kao što bih na stack_array, ja možete pristupiti na elemente pojedinačno pomoću heap_array nula, heap_array jedan. Ali sjećam razlog možemo učiniti je zato što je naziv niza u C stvarno pointer na da je niz je prvi element. Dakle činjenica da smo proglašena niz plovaka na stogu ovdje je zapravo malo zabludu. Mi zapravo u Druga linija koda postoji Također stvaranje pokazivač na komad memorije da smo napraviti nešto raditi. Evo veliki problem s dinamički dodijeljene memorije ipak, i to je razlog zašto je zapravo važno razviti neke dobre navike kada radite s njim. Za razliku statički proglasio memorija, pamćenje nije automatski vratio na Sustav kada vaš funkcija je učinio. Dakle, ako smo glavni i Glavni poziva funkciju f, f, kada završi ono što radi i vraća kontrolu programa Povratak na stranicu, sve memorije da f koristi se vraća. To se može ponovno koristiti nekom drugom programu, ili neke druge funkcije koje dobiva se zove kasnije u glavnom. To se može koristiti istu memoriju iznova. Ako vas dinamički alocirati memoriju iako morate izričito reći sustav koji ste učinili s njim. To će zadržati to za vas, koji bi mogao dovesti do problema od vas ponestaje memorije. A u stvari smo se ponekad odnosi na to kao na memorijsku curenja. A ponekad i ove memory leaks zapravo može biti jako poražavajući za izvedbu sustava. Ako ste čest korisnik interneta možete koristiti određene web preglednike, i neću navoditi imena ovdje, ali postoje neke web preglednicima vani koje su zloglasne za zapravo ima memory leaks da ne bi fiksni. A ako ostavite vaš preglednik otvoren za vrlo dugo vremensko razdoblje, dani i dana, ili tjedana, ponekad možda primijetiti da vaš sustav je pokrenut jako, jako polako. A razlog za to je da preglednik je izdvojila memorije, ali onda nije rekla sustav kako se to radi s njom. I tako da ostavlja manje memorije dostupan za sve svoje druge programe morati dijeliti, jer si leaking-- taj web preglednik Program curi memorije. Kako ćemo dati memoriju natrag kad završimo s njom? Pa srećom to je vrlo jednostavan način to učiniti. Upravo smo ga osloboditi. Postoji funkcija zove besplatno, prihvaća pokazivač u memoriju, a mi si dobar to ići. Dakle, recimo da smo u Sredina našeg programa, želimo malloc 50 znakova. Želimo malloc niz koji mogu sposoban za držanje 50 znakova. A kad smo dobili pokazivač natrag da, ime tog pokazivača je riječ. Mi radimo sve što smo učiniti s riječju, a onda kad smo učinili smo samo ga osloboditi. A sada smo se vratili onih 50 bajta memorije natrag u sustav. Neki drugi funkcija ih mogu koristiti. Ne morate brinuti o patnje otjecanje memorije, jer smo oslobodili riječ. Mi smo dali sjećanje vrati, tako da završite rad s njim. Dakle, postoje tri zlatna pravila koja bi trebala imati na umu kada ste dinamički dodjele memorije s malloc. Svaki blok memorije što malloc mora biti oslobođena prije programa završi s radom. Sada opet, u aparatu ili u IDE ova vrsta se događa za vas bilo kada you-- će ionako dogoditi Kada je vaš program prekinut, sve memorije će biti objavljen. No, to je općenito dobro kodiranje praksa da se uvijek, kada završite, osloboditi ono što ste mallocd. To je rekao, samo stvari koje ste mallocd trebao biti oslobođen. Ako statički proglasiti broj, int x polu-debelog crijeva, koji živi na stog, što ne onda žele osloboditi x. Dakle, samo stvari koje ste mallocd trebao biti oslobođen. I na kraju, ne nešto besplatno dva puta. To može dovesti do još jedna čudna situacija. Dakle, sve što ste mallocd mora biti oslobođen. Samo stvari koje ste malloc trebao biti oslobođen. A ne nešto besplatno dva puta. Tako ćemo proći kroz primjer ovdje onoga što neki dinamički dodijeljene memorije može izgledati mješovito s nekim statičkim memorije. Što bi se moglo dogoditi ovdje? Pogledajte ako možete pratiti zajedno i pogodite što je će se dogoditi kao što smo ići kroz sve ove linije koda. Tako bismo mogli reći int m. Što se događa ovdje? Pa to je prilično jednostavan. Ja stvoriti cjelobrojna varijabla zove m. I boja je zelena, jer to je boja da koristim kad govorim o cjelobrojne varijable. To je kutija. To se zove m, a možete trgovina integers unutar nje. Što ako sam tada rekao int zvjezdicom? Pa to je prilično slično. Izrađujem kutija zove. To je sposoban za držanje int zvijezde, upućuje na cijele brojeve. Tako sam ga bojanje zeleno-ish kao dobro. Znam da ima nešto učiniti s cijeli broj, ali to nije sama cijeli broj. No, to je manje-više ista ideja. Napravio sam kutiju. Obje od tih prava sada žive na stog. Ja sam im dao oba imena. int zvijezda b jednak malloc veličinu int. To bi mogao biti malo lukav. Uzmite drugi i razmišljati o tome što očekujem da bi se dogoditi na ovoj slici. int zvijezda b jednak malloc veličinu int. Pa to ne samo stvoriti jedan okvir. To zapravo stvara dvije kutije. I to veze, ona također uspostavlja točka u vezi. Mi smo dodijeljen jedan blok memorije na hrpi. Obavijest da je gornji desni box tamo nema ime. To mallocd smo. Ona postoji na hrpu. Ali b ima ime. To je varijabla pokazivač zove b. Koji živi na stog. Dakle, to je komad memorije koji ukazuje na još jedan. b sadrži adresu tog bloka memorije. To nema ime drugačije. Ali, to ukazuje na to. Dakle, kada kažemo int zvijezda b jednak Veličina malloc od int, to pravo postoji, da strelica da popped up na desna strana postoji, da je cijela stvar, Morat ću se pojaviti opet, što se događa. Sve što se događa u da jedna linija koda. Sada ćemo malo više opet jednostavan. jednak ampersand m. Sjećate li se što se znak za struju jednaka je m? Pa to je dobiva m adresu. Ili staviti više shematski, a ukazuje na m. jednako b. U redu pa evo još jedan. Jednak b. Što će se dogoditi dijagram ovaj put? Pa podsjetiti da je Raspored djeluje operator dodjeljivanjem vrijednosti na Pravo na vrijednosti s lijeve strane. Dakle, umjesto ukazuje na m, A sada ukazuje na isto mjesto da B bodova. ne ukazuju na B, ukazuje gdje je B bodova. Ako je ukazao na b kako bi bio jednak ampersand b. No, umjesto toga jednako b jednostavno znači da je i B su sada ukazujući na istoj adresi, jer unutar b je samo adresa. A sada unutar a je ista adresa. m jednak 10, vjerojatno Najjednostavnija stvar što smo učinili u malo. Stavite 10 u kutiji. Star b jednak m plus 2, podsjećaju iz naš upućuje Video ono zvijezda b znači. Idemo dereference b i staviti neke vrijednosti u tom memorijskom mjestu. U ovom slučaju 12. Dakle, kada smo dereference točke sjećam se samo putuje prema dolje strelicu. Ili drugim riječima, mi ići na tu memorijsku adresu a mi ga manipulirati na neki način. Mi smo stavili neke vrijednosti u njemu. U ovom slučaju kategorizaciji b jednako m plus 2 je samo ići u varijablu ukazao na strane b, ići u memoriju ukazao na strane b, i stavi m plus 2 unutra, 12. Sada sam slobodan b. Što se događa kada sam slobodan b? Sjeti se što sam rekao slobodan znači. Što sam ja rekao kad sam slobodan b? Ja sam učinio raditi s njim, zar ne? Ja u biti odustati memorije. Ja ga vratiti u sustav. Ne treba mi to više je ono što sam im rekao, u redu? Sada, ako kažem zvjezdicom jednak 11 vjerojatno možete već reći da se nešto loše će se dogoditi ovdje, zar ne? I doista, ako sam pokušao da sam vjerojatno pretrpjeti grešku segmentiranja. Jer sada, iako prije da je komad memorije je nešto što sam imao pristup, u ovom trenutku sada sam pristupaju memoriju koja Nije pravno mi pristupiti. A kako ćemo vjerojatno Podsjetimo, kada smo pristupili memorije da mi ne smijemo dirati, to je najčešći uzrok od segmentacije kvara. I tako moj program bi srušiti ako sam pokušao to učiniti. Pa opet to je dobra ideja da se dobro praksi i dobre navike ukorijenjen kada se radi s malloc i besplatno, tako da ne pate segmentaciju mane, a koje koristite Vaš dinamički dodjeljuje memorije odgovorno. Ja sam Doug Lloyd je to CS50.