[Muzikos grojimo] Doug LLOYD: Gerai, kad pasiūlymas prieš pradedant čia. Jei neturite stebėjo ant vaizdo Pointeriai galbūt norėsite padaryti pirmiausia. Kadangi šis vaizdo įrašas yra kita būdas dirbti su rodyklėmis. Todėl ketiname kalbėti apie kai sąvokų kad mes dangtelį Pointeriai vaizdo, ir mes ketina Koloryzować jų dabar darant prielaidą, kad jie jau esate rūšiuoti suprantama. Taigi tai tik jūsų sąžiningai perspėta kad jei matote šį video ir jūs dar nematėte rodyklės vaizdo, ji gali rūšiuoti skristi virš galvos šiek tiek. Ir todėl jis gali būti geriau žiūrėti ta pačia tvarka. Taigi, mes jau matėme vieną būdas dirbti su rodyklėmis, kuris yra mūsų deklaruoti kintamasis, ir tada mes paskelbti kitą kintamąjį rodyklę kintamasis, kad pažymi į jį. Taigi Sukūrėme kintamasis su pavadinimu, mes sukūrė antrą kintamąjį, su pavadinimu, ir mes atkreipti, kad antrasis kintamasis Tuo pirmiausia. Tai tarsi turi problema, nors, nes tai reikalauja, kad mes tiksliai nežinome kiek atminties mes ketinate reikia momentą Mūsų programa yra parengta. Kodėl taip yra? Kadangi mums reikia, kad būtų galima pavadinti arba identifikuoti visas galimas kintamųjų mes galime susidurti. Mes gali turėti matrica, gali būti galėtų turėti daug informacijos, bet tai dar nėra tiksliai pakankamai tiksli. Ką daryti, jei mes nežinome, Ką daryti, jei mes neįsivaizduoju kiek mums reikės kompiliavimo metu? Arba kas, jei mūsų programa bus paleisti tikrai ilgą laiką, priimti įvairių vartotojų duomenys, ir mes tikrai negali įvertinti, ar mes ketinate reikia 1000 vienetų? Tai nėra, kaip mes galime pasakyti, komandinėje eilutėje įvesti, kaip daug daiktų manote, kad jums reikia. Na ką, jei tas spėjimas yra negerai? Dinaminis atminties paskirstymas rūšiuoti leidžia mums kelią gauti aplink šią konkrečią problemą. Ir kaip ji tai daro yra naudojant rodykles. Mes galime naudoti nuorodas į gauti prieigą prie dinamiškai skirta atminties, atminties, kuri yra skiriama kaip jūsų programa veikia. Tai ne skyrė kompiliavimo metu. Kai dinamiškai paskirstyti atminties ji ateina iš baseinu atminties žinomas kaip krūvą. Anksčiau visi atminties mes dirbu su į paskaitas buvo iš baseinu atminties žinomas kaip kamino. Geras būdas paprastai turėkite mind-- ir šios taisyklės ne visada pasitvirtina, bet gana daug beveik visada turi true-- yra tai, kad bet kokia laikas jums suteikti kintama name it tikriausiai gyvena ant kamino. Ir kiekvieną kartą, jums nereikia suteikti kintamasis yra vardą, kuriuos galite padaryti su dinaminės atminties paskirstymą, jis gyvena ant krūvos. Dabar aš rūšies pristatydamas tai kaip jei yra šie du baseinai atmintį. Bet tu gali matyti tai diagrama, kuris paprastai yra atstovavimo kas atminties atrodo, ir mes neketiname rūpintis visi viršuje ir apačioje dalykų. Kas mums rūpi tai dalis į viduryje čia krūvos ir kamino. Kaip matote pagal žiūri šioje diagramoje, tai iš tikrųjų yra ne du atskiri baseinai atminties. Tai vienas bendras baseinas atminties kur pradėti, šiame vaizdo pradėdami apačioje ir pradėti užpildyti iš apačios su kamino, ir tu pradėti viršuje ir pradėti pildymo iš viršaus į apačią su krūvą. Bet tai tikrai yra pats baseinas, tai tik įvairių dėmių, skirtingos vietos atmintyje, kad yra skiriama. Ir jūs galite paleisti iš Atmintyje arba turintys krūvos pereiti visą kelią į apačią, arba turi kamino pereiti visą kelią į viršų, arba turinti krūvą ir krūvą atitinka vienas prieš kitą. Visi šie gali būti sąlygos kad sukelti jūsų programa paleisti iš atminties. Taigi keep that in mind. Kai mes kalbame apie krūvos ir kamino mes iš tikrųjų kalbame apie Lygiai toks pats bendras riekė atminties, tiesiog skirtingų porcijos tos atminties. Taigi, kaip mes gauti dinamiškai skirta atminties į pirmąją vietą? Kaip veikia mūsų programa gauti atminties, kaip jis veikia? Na C turi funkciją, vadinamą malloc, atminties paskirstytojo, kuris skambinate į ir pereisite į kiek baitų atminties, kad norite. Taigi, jei jūsų programa veikia ir norite kreipsitės runtime, jums gali mallock keturi baitai atmintis, malloc skliaustelius keturi. mallock bus eiti per ieško per krūvą, nes mes dinamiškai Skirstant atmintį, ir jis sugrįš pas jus rodyklė į tą atmintį. Jis neturi duoti jums, kad memory-- tai nesuteikia jai pavadinimą, ji suteikia jums žymiklį į jį. Ir taip, tai kodėl vėl pasakiau kad svarbu gal stebėjo rodyklės vaizdo Prieš mes gauname per toli į tai. Taigi malloc ketina duoti jums atgal žymiklį. Jei mallock negali suteikti jums bet atminties, nes jūs baigsis, tai duosiu jums atgal null žymeklį. Ar pamenate, kas atsitinka, jei mes pabandyti ir dereference null pointer? Mes patirti SEG kaltės, tiesa? Tai tikriausiai nėra gera. Taigi kiekvieną kartą, kai jūs skambinate į malloc jus visada, visada reikia patikrinti, ar žymiklį jis davė jums atgal yra niekinis. Jei taip, tai jums reikia baigti savo programą nes jei bandysite ir dereference null pointer jūs ketinate patirti segmentavimo kaltės ir jūsų programa yra vyksta į avariją vistiek. Taigi, kaip mes statiškai gauti sveikąjį skaičių? int x. Mes tikriausiai padaryta, kad kartų krūva, tiesa? Tai sukuria kintamąjį vadinamą x, gyvena ant kamino. Kaip mes dinamiškai gauti sveikąjį skaičių? Žiniasklaida žvaigždė px lygus malloc 4. Arba tikslingiau mes norime pasakyti int žvaigždė px lygus malloc dydį int, tiesiog mesti kai mažiau magija numeriai aplink mūsų programoje. Tai ketina gauti už mus keturių baitų atminties iš krūvos, ir rodyklė mes gauname atgal į tai vadinama px. Ir tada tiesiog kaip mes padaryta anksčiau mes gali dereference px, kad prisijungti prie šios atmintį. Kaip mes gauti iš vartotojo sveikasis skaičius? Galime sakyti, int x lygus gauti int. Tai gana paprasta. Ką daryti, jei norime sukurti masyvą X plūdės, kurie gyvena ant kamino? plūduriuoti stack_array-- tai pavadinimas mūsų array-- laužtiniuose skliaustuose x. Tai sukurs mums masyvo X plūdės, kurie gyvena ant kamino. Mes galime sukurti iš plūdės masyvo kuris gyvena ant krūvos, taip pat. Sintaksė gali atrodyti šiek tiek daugiau sudėtinga, bet mes galime pasakyti plūdę žvaigždučių heap_array lygus malloc x kartų didesnis už plūdės dydį. Man reikia pakankamai vietos laikyti x slankiojo kablelio vertybes. Taigi sako, man reikia 100 plūdės, arba 1,000 plūdės. Taigi, tuo atveju, kad būtų 400 baitų 100 plūdes, arba 4000 baitų 1000 plūdės, nes kiekvienas plūdė užima keturių baitų vietos. Atlikę tai galiu naudoti kvadratinių laikiklis sintaksė ant heap_array. Lygiai taip pat aš norėčiau ant stack_array, aš gali prieiti prie jo elementus atskirai naudojant heap_array nulis, heap_array vienas. Bet prisiminti priežastį mes galime padaryti, kad yra todėl, kad AN C masyvo vardas yra tikrai rodyklė tos masyvo pirmasis elementas. Taigi tai, kad mes, skelbiantys masyvas plūdės ant kamino čia iš tiesų yra šiek tiek klaidinantis. Mes tikrai yra į Antroji eilutė kodo ten taip pat sukurti rodyklę iki riekė atminties, kad mes tada ką nors su darbu. Štai didelė problema su dinamiškai skirta atminties, nors, ir tai, kodėl tai tikrai svarbu plėtoti gerų įpročių kai dirbate su juo. Skirtingai nuo statiškai paskelbė atminties, jūsų atminties nėra automatiškai grąžinami į sistema, kai jūsų funkcija atliekama. Taigi, jei mes turime pagrindinis ir Pagrindinis ragina funkciją f, kai f apdailos kokia ji daro ir grąžina kontroliuoti programos atgal į pagrindinis, visi atmintyje kad f naudojamas skiriamas atgal. Jis gali būti naudojamas vėl kitu programos, arba kai kitas funkcijas, iškviečiamas vėliau ir pagrindinė. Jis gali naudoti tą pačią atminties vėl. Jei jums dinamiškai paskirstyti atmintį nors jūs turite aiškiai pasakys sistema, kad jūs baigsite su juo. Tai bus eiti į jį už jus, kurie galėtų sukelti problemų iš jūsų bėga atminties. Ir iš tiesų kartais skaitykite tai kaip atminties nutekėjimas. Ir kartais šie atminties nutekėjimas iš tikrųjų gali būti tikrai sukrečiantys už sistemos veikimą. Jei esate dažnas interneto vartotojas galite naudoti tam tikras naršykles, ir aš ne vardų čia, bet yra keletas interneto naršyklių ten kurie yra žinomi dėl realiai Atminties nutekėjimas, kad negaunate fiksuotas. Ir jei jūs paliekate savo naršyklėje atviras Ilgą laiką, dienos ir dienų, savaičių, kartais pastebėsite, kad jūsų sistema yra veikia tikrai, tikrai lėtai. Ir dėl šios priežasties yra ta, kad naršyklė skyrė atmintį, bet tada nepasakiau sistema kad tai padaryti su juo. Ir taip, kad palieka mažiau atminties galima visus savo kitas programas turėti pasidalinti, nes esate leaking--, kad interneto naršyklė Programa yra nesandarus atmintį. Kaip mes suteikiame atmintį atgal kai mes padaryti su juo? Na, laimei, tai labai paprastas būdas tai padaryti. Mes tiesiog atlaisvinti jį. Yra funkcija vadinama nemokamai, ji priima žymiklį į atmintį, ir mes gerai eiti. Taigi tarkime, mes į viduryje mūsų programoje, norime malloc 50 simbolių. Mes norime malloc masyvą, kuris gali galima laikyti 50 simbolių. Ir kai mes gauti žymeklį atgal į kad, tai žymeklis vardas žodis. Mes darome viską, mes ketina daryti su žodžiu, ir tada, kai mes padaryti mes tiesiog atlaisvinti jį. Ir dabar mes grįžo tuos 50 baitųatminties atgal į sistemą. Kai kurios kitos funkcijos gali juos naudoti. Neturime nerimauti kančių Atminties nutekėjimas, nes mes turime išlaisvinti žodį. Mes suteikta atmintį atgal, todėl mes baigsite dirbti su juo. Taigi, yra trys auksinių taisyklių, kurios turėtų turėti omenyje, kai jūs dinamiškai paskirstyti atmintį su malloc. Kiekvienas atminties bloką Jūs malloc turi būti paleistas Prieš savo programą baigia veikia. Dabar vėl, į prietaisą arba IDE tai tarsi vyksta už jus vistiek kai you-- tai įvyks vistiek kai jūsų programa nutraukiama, visi atminties bus išleistas. Bet tai iš esmės gera kodavimas praktika visada, kai baigsite, nemokamai ką mallocd. Beje, tik tai, kas Jūs mallocd turėtų būti išlaisvinti. Jei statiškai paskelbti sveikasis skaičius, int x kabliataškis, kuris gyvena ant kamino, jums nereikia tada noriu atlaisvinti x. Taigi tik tai, kas jūs mallocd turėtų būti išlaisvinti. Ir galiausiai, ne nemokamai kažką du kartus. Tai gali sukelti kita keista situacija. Taigi viskas, kad jūs mallocd turi būti išlaisvinti. Vieninteliai dalykai, kad jūs malloc turėtų būti išlaisvinti. Ir nereikia nemokamą kažką du kartus. Taigi eikime kaip pavyzdys čia ką kai kurie dinamiškai paskirstoma atminties gali atrodyti mišri su tam tikru statiniu atmintį. Kas gali atsitikti čia? Žr jeigu jūs galite sekti kartu ir atspėti, kas nutiks, kaip mes einame per visus šiuos kodo eilutes. Taigi mes sakome int m. Kas nutinka čia? Na tai gana paprasta. Sukurti kintamąjį vadinamą m. Aš spalva ji žalia, nes tai spalva kad aš naudoju, kai aš kalbu apie sveikieji kintamieji. Tai dėžutė. Tai vadinama m, ir jūs galite Patalpink sveikieji skaičiai viduje ji. Ką daryti, jei aš ten sako int žvaigždute? Gerai, kad gana panašios. Kuriu dėžutė vadinamas. Tai galima laikyti int žvaigždės, rodyklės į sveikųjų skaičių. Taigi, aš dažymas ji žalia ish taip pat. Žinau, kad turi kažką daryti su sveikasis skaičius, bet tai ne pats sveikas. Bet tai beveik tas pats idėja. Aš sukūriau langelį. Abu šie teisės dabar gyvena ant kamino. Aš davė jiems abiem pavadinimus. INT žvaigždė b lygus malloc dydį tarpt. Tai vienas gali būti šiek tiek sudėtinga. Paimkite antrą ir galvoti apie tai, ką tikėtis, kad taip atsitiktų dėl šio schemoje. INT žvaigždė b lygus malloc dydį tarpt. Na tai ne tik sukurti vieną langelį. Tai iš tiesų sukuria du langelius. Ir jis yra susijęs, jis taip pat nustato santykius taškas. Mes skiriama vieną bloką atminties dėl krūvą. Atkreipkite dėmesį, kad viršutiniame dešiniajame lange ten neturi vardo. Mes tai mallocd. Ji egzistuoja krūvos. Bet b turi pavadinimą. Tai rodyklė kintamasis vadinamas b. Kuris gyvena ant kamino. Taigi tai yra atminties dalis kad nurodo į kitą. b yra adresas tos atminties blokas. Ji neturi vardą kitaip. Bet jis nurodo į jį. Taigi, kai mes sakome, int žvaigždė b lygus malloc dydis int, kad tiesiai ten, kad rodyklė kad popped up dėl dešinė pusė yra, kad visa tai, Aš turiu tai atrodo vėl, kas atsitinka. Visa tai vyksta kad vieną eilutę kodo. Dabar mes gauti šiek tiek daugiau paprasta dar kartą. lygus Ampersand m. Ar prisimenate ką lygus Ampersand m yra? Na tai yra gauna M adresą. Arba įdėti daugiau schema, A nurodo m. lygus b. Gerai, kad čia dar vienas. Lygus b. Kas nutiks diagramoje, šį kartą? Na priminti, kad priskyrimo operatorius darbai priskiriant vertei teisę kairėje vertę. Taigi vietoj žymeklio iki m, dabar nurodo į tą pačią vietą, kad B kiekis. nerodo B, atkreipia kur b punktus. Jeigu nurodė, kad būtų b buvę lygu Ampersand b. Bet vietoj to lygu b tiesiog tai reiškia, kad ir b yra dabar nukreipta į tą patį adresą, nes viduje B yra tik adresas. Ir dabar viduje a yra tas pats adresas. m yra lygus 10, turbūt Paprasčiausias dalykas mes padaryti šiek tiek. Įdėkite 10 langelyje. Zodiako b lygus m plius 2 atsiima iš mūsų patarimų Video žvaigždė b reiškia. Mes ketiname dereference b ir įdėti kai toje atminties vietą vertė. Šiuo atveju 12. Taigi, kai mes dereference iš taško priminti mes tiesiog keliauti žemyn rodyklę. Kitaip tariant, mes eiti į tą atminties adresą ir mes manipuliuoti tam tikru būdu. Mes įdėti šiek tiek vertę ten. Šiuo atveju žvaigždutėmis b lygus m plius 2 yra tik pereiti prie kintamojo atkreipė dėmesį į B, eiti į atminties atkreipė dėmesį į B, ir įdėti m plius 2 ten, 12. Dabar aš atlaisvinti b. Kas atsitinka, kai aš atlaisvinti b? Prisiminkite, ką pasakiau nemokamai priemonėmis. Ką aš noriu pasakyti, kai aš atlaisvinti b? Atlikau dirbti su juo, tiesa? Aš iš esmės kapituliuoti atmintį. Aš duodu ją atgal į sistemą. Man nereikia tai nebėra yra ką aš sakau jiems, gerai? Dabar, jei aš sakau žvaigždute lygus 11 jūs tikriausiai galite jau pasakyti, kad kažką blogo nutiks čia, tiesa? Ir iš tiesų, jei aš bandžiau, kad aš tikriausiai būtų patirti segmentavimo kaltės. Nes dabar, nors anksčiau, kad atminties riekė buvo kažkas, kad aš turėjau prieigą prie šiuo metu dabar aš susipažinimo atmintį, nėra juridinis man prieiti. Ir kaip mes tikriausiai prisiminti, kai mes Access Memory kad mes ne turėjo paliesti, tai dažniausia iš segmentavimo kaltės. Ir taip mano programa būtų katastrofos, jei aš bandžiau tai padaryti. Taigi dar kartą, kad tai gera idėja gauti geras praktikos ir geros įpročiai įsišaknijęs Dirbdami su malloc ir nemokamai, taip, kad jūs neturite kentėti segmentaciją gedimai, ir kad jūs naudojate Jūsų dinamiškai paskirstoma atminties atsakingai. Aš Doug Lloyd tai CS50.