[Musiikkia] DOUG Lloyd: ok niin ehdotus ennen täällä. Jos et ole katsellut video Nata saatat haluta tehdä niin ensin. Koska tämä video on toinen tapa työskennellä viitteitä. Joten se tulee puhua joitakin käsitteitä että me kattaa Nata video, ja olemme menossa kaunistella niitä nyt, olettaen, että ne ovat jo tavallaan ymmärtää. Niin, että vain teidän kohtuullisen varoituksen että jos näette tämän videon ja et ole nähnyt viitteitä video, se saattaa tavallaan lentää pään hieman. Ja niin se voisi olla parempi katsella sitä tässä järjestyksessä. Joten olemme jo nähneet yhden tapa työskennellä osoittimia, joka on julistamme muuttuja, ja sitten me toteaa toisen muuttujan, osoitin muuttuja, joka osoittaa sen. Joten loimme muuttujan nimi, olemme luotiin toinen muuttujan nimi, ja osoitamme, että toinen muuttuja tuohon ensin. Tällainen on Ongelmana kuitenkin, koska se vaatii meitä tietää tarkalleen kuinka paljon muistia olemme menossa on hetki meidän ohjelma on koottu. Miksi näin? Koska meidän on voitava nimetä tai tunnistaa kaikki mahdolliset muuttujat saatamme kohdata. Meillä saattaa olla array, joka voi olla pystyy pitämään paljon tietoa, mutta se silti ole juuri riittävän tarkka. Mitä jos emme tiedä, mitä jos meillä ei ole aavistustakaan kuinka paljon me tarvitsemme käännöksen yhteydessä? Tai mitä jos meidän ohjelma kestää todella kauan, hyväksytään eri käyttäjä tiedot, ja emme voi oikeastaan arvioimaan, onko olemme menossa on 1000 yksikköä? Se ei ole kuin voimme sanoa komentoriviltä määrittämään, kuinka monta kohdetta luulet sinun. No entä jos arvaus on väärin? Dynaaminen muistin jakamista tavallaan antaa meille tapa kiertää tätä ongelmaa. Ja miten se tekee sen on käyttää osoittimia. Voimme käyttää osoittimia pääset dynaamisesti jaettu muisti, muisti, joka on kohdennetaan ohjelma on käynnissä. Se ei ole myönnetty käännöksen yhteydessä. Kun dynaamisesti jakaa muistia se tulee allas muistia tunnetaan keon. Aiemmin kaikki muisti olemme työskennellyt aikana on lähtöisin allas muistia tunnetaan pinon. Hyvä tapa yleisesti pitää mind-- ja tämän säännön ei aina pidä paikkaansa, mutta melko paljon lähes sisältää aina true-- on, että kun antaa muuttujan nimi sen luultavasti elää pinoon. Ja milloin et antaa muuttujan nimi, jonka voit tehdä dynaamista muistia jakaminen, se elää kasaan. Nyt olen sellainen esittää tätä jos on nämä kaksi allasta muistia. Mutta et ehkä nähnyt tätä kaavio, joka on yleensä edustus mitä muisti näyttää, ja emme aio välittää kaikki kamaa yläosassa ja alaosassa. Mitä välitämme on tämä osa keskimmäinen täällä, pino ja pino. Kuten näette tarkastelemme tätä kaaviota, nämä oikeastaan ​​ole kahta erillistä allasta muistia. Se on yksi yhteinen uima-allas muistia mistä aloitat, tässä visuaalinen aloitat alareunassa ja aloittaa tankkaamalla pohjasta kanssa pinon, ja voit aloittaa huipulla ja aloittaa tankkaamalla ylhäältä alas kasaan. Mutta se todella on Sama allas, se on vain eri paikoissa, eri paikoissa muistissa, joita jaetaan. Ja voit loppuu muistia joko ottaa kasaan mennä aina pohjaan, tai on pino mennä huipulle, tai joilla kasaan ja pino tavata toisiaan vastaan. Kaikki nämä voivat olla edellytykset jotka aiheuttavat ohjelma loppuu muisti. Niin pitää tämä mielessä. Kun puhumme kasaan ja pino Olemme todella puhumme Sama yleinen kimpale muistia, vain eri osat että muisti. Joten miten saamme dynaamisesti jaettu muisti ensimmäinen paikka? Miten meidän ohjelma saada muistia kuin se on käynnissä? No C tarjoaa toiminto nimeltään malloc, muistinhallinnassa, joka voit soittaa, ja ohitat kuinka monta tavua muistia, jonka haluat. Joten jos ohjelma on käynnissä ja haluat kokonaisluku runtime, saatat mallock neljä tavua muisti, malloc sulkeissa neljä. mallock menee läpi katsellut kasan, koska olemme dynaamisesti jaettaessa muisti, ja se palaa teille osoittimen että muisti. Se ei anna teille, että memory-- se ei anna sille nimen, se antaa sinulle osoittimen siihen. Ja niin siksi jälleen sanoin että on tärkeää ehkä ovat seuranneet viitteitä video ennen kuin pääsemme liian pitkälle tähän. Joten malloc tulee antaa sinulle takaisin osoittimen. Jos mallock voi antaa teille mitään muisti koska olet loppuu, se tulee antaa sinulle takaisin nollaosoittimen. Muistatko, mitä tapahtuu, jos me yrittää dereference nollaosoittimen? Me kärsimme seg vika, eikö? Se on luultavasti ole hyvä. Joten aina kun teet puhelun että malloc aina, aina täytyy tarkistaa, onko osoitin se antoi sinulle takaisin on null. Jos se on, sinun täytyy lopettaa ohjelman koska jos yrität ja dereference nollaosoittimen aiot kärsiä segmentointi vika ja ohjelma on menossa kaatua muutenkin. Miten siis staattisesti saada kokonaisluku? int x. Olemme varmaan tehneet sitä joukko kertaa, eikö? Tämä luo muuttuja nimeltä X, joka elää pinoon. Miten dynaamisesti saadaan kokonaisluku? Int tähden px vastaa malloc 4. Tai asianmukaisemmin me halua sanoa int tähti px vastaa malloc koko int, vain heittää joitakin vähemmän Magic Numbers noin ohjelmaamme. Tämä tulee saada meille neljä tavua muistia kasasta, ja osoitin saamme takaisin sitä kutsutaan px. Ja sitten aivan kuten olemme tehty aiemmin me voi dereference px kohteeseen pääsyn että muisti. Miten saamme kokonaisluku käyttäjä? Voimme sanoa int x vastaa saada int. Se on melko yksinkertainen. Mitä jos haluamme luoda array X kelluu jotka elävät pinoon? float stack_array-- se nimi meidän array-- hakasulkuihin x. Joka luo meille array X kelluu jotka elävät pinoon. Voimme luoda erilaisia ​​kelluu joka elää kasaan, liian. Syntaksi saattaa näyttää hieman hankalampi, mutta voimme sanoa kellua tähti heap_array vastaa malloc X kertaa suurempi kellua. Minun täytyy tarpeeksi tilaa pitää X liukulukuarvoja. Joten sanoa Tarvitsen 100 kellukkeet, tai 1000 kellukkeet. Niin siinä tapauksessa olisi 400 tavua 100 kellukkeet, tai 4000 tavua 1000 kellukkeet, koska jokainen float vie neljä tavua tilaa. Kun teet tämän voin käyttää hakasulje Syntax heap_array. Aivan kuin tahdon päälle stack_array, I voi käyttää sen elementtejä erikseen käyttämällä heap_array nolla, heap_array yksi. Mutta muistuttaa syystä emme voi tehdä, että johtuu nimi array C on todella osoitin että taulukon ensimmäinen elementti. Niin että olemme julistamisesta joukko kelluu pinoon täällä on oikeastaan ​​hieman harhaanjohtava. Me todella ovat toinen koodiriviä siellä luo myös osoittimen kimpale muisti, että me sitten tehdä töitä kanssa. Tässä on suuri ongelma varataan dynaamisesti muisti kuitenkin, ja siksi se on todella tärkeää kehittää hyviä tapoja kun olet työskennellyt sen kanssa. Toisin kuin staattisesti julisti muisti, muisti ei automaattisesti palautetaan järjestelmä, kun toiminto on valmis. Joten jos meillä on tärkein, ja tärkein kutsuu funktiota f, kun f päättyy mitä se tekee ja palauttaa ohjelman hallinnan Takaisin kaikki muisti että f käytetty annetaan takaisin. Sitä voidaan käyttää uudelleen muulla ohjelma, tai jokin muu toiminto saa kehotti myöhemmin tärkeimmistä. Se voi käyttää tätä muistia uudestaan. Jos dynaamisesti varata muistia vaikka sinun täytyy erikseen kertoa joka olet tehnyt sen kanssa. Se tulee pitää kiinni sen sinulle, joka voisi johtavat ongelma sinua loppumassa muistia. Ja itse asiassa me joskus viitataan Tämän koska muistivuoto. Ja joskus nämä muistivuotokuvioista voi todella olla todella tuhoisa järjestelmän suorituskykyä. Jos olet usein internetin käyttäjä voit käyttää tiettyjä web-selaimet, enkä nimiä täällä, mutta jotkut selaimet siellä jotka ovat tunnettuja todella ottaa muistivuotoja jotka eivät saa vahvistettu. Ja jos jätät selaimen auki hyvin pitkän ajan kuluessa, päivää ja päivää, tai viikkoja, joskus saattavat huomata, että järjestelmä on käynnissä todella, todella hitaasti. Ja syy siihen on, että selain on jaettu muisti, mutta sitten ei kertonut järjestelmä että se on tehnyt sen kanssa. Ja niin, että jättää vähemmän muistia käytettävissä kaikkien teidän muiden ohjelmien on jakaa, koska olet leaking-- että web-selain Ohjelman vuotaa muistiin. Miten annamme muisti takaisin kun olemme tehneet sen kanssa? No onneksi se on erittäin helppo tapa tehdä se. Me vain vapauttaa se. Siellä on toiminto nimeltään ilmainen, se hyväksyy osoitin muisti, ja olemme hyvä mennä. Joten sanokaamme me olemme keskellä meidän ohjelma, haluamme malloc 50 merkkiä. Haluamme malloc array, joka voi pystyttävä pitämään 50 merkkiä. Ja kun saamme osoitin takaisin että, että osoitin nimi on sana. Teemme mitä olemme aikoo tehdä sana, ja sitten kun olemme tehnyt me vain vapauttaa se. Ja nyt olemme palanneet nuo 50 tavua muistia takaisin järjestelmään. Joitakin muita toiminto voi käyttää niitä. Meillä ei tarvitse murehtia kärsimystä muisti vuotaa koska olemme vapautettu sanan. Olemme antaneet muistin takaisin, joten olemme tehneet työtä se. Joten on kolme kultaista sääntöä, että jos pidettävä mielessä, kun olet dynaamisesti jaetut muisti kanssa malloc. Jokainen lohko muistia sinun malloc on vapautettava ennen ohjelman suorittaminen on päättynyt. Nyt uudelleen, että laite tai IDE tällaista tapahtuu sinulle joka tapauksessa kun sinä-- tämä tapahtuu joka tapauksessa kun ohjelma on päättynyt, kaikki muisti vapautetaan. Mutta se on yleensä hyvä koodaus käytännössä aina, kun olet valmis, vapauttaa mitä olet mallocd. Se sanoi, vain asioita, jotka olet mallocd pitäisi vapauttaa. Jos staattisesti julistaa kokonaisluku, int x puolipiste, joka elää pino, olet eivät sitten halua vapauttaa x. Niin vain asioita, jotka olet mallocd pitäisi vapauttaa. Ja lopuksi, älä ilmainen jotain kahdesti. Joka voi johtaa toinen outo tilanne. Joten kaikki, että olet mallocd on vapautua. Ainoat asiat, että olet malloc pitäisi vapauttaa. Ja älä ilmainen jotain kahdesti. Joten mennään läpi esimerkki tästä mitä jotkut dynaamisesti muisti saattaa näyttää sekoitettu on joidenkin staattinen muistia. Mitä voi tapahtua täällä? Katso jos voit seurata pitkin ja arvaa mitä tapahtuisi kun menemme läpi kaikki nämä riviä koodia. Joten sanomme int m. Mitä täällä tapahtuu? No tämä on melko yksinkertainen. Luon kokonaisluku muuttuja nimeltä m. Olen värittää vihreä, koska se on väri että käytän kun puhun noin kokonaisluku muuttujia. Se on laatikko. Sitä kutsutaan m, ja voit myymälä kokonaislukuja sen sisälle. Mitä jos en sano sitten int tähti? No se on melko samanlaisia. Olen luomassa laatikko kutsutaan. Se on pystyttävä pitämään int tähdet, osoittimia kokonaislukuja. Joten olen väritys Green-ish samoin. Tiedän, että se on jotain tehdä kokonaisluku, mutta se ei ole itse kokonaisluku. Mutta se on melko sama ajatus. Olen luonut laatikko. Molemmat oikeus nyt elää pinoon. Olen antanut heille molemmat nimet. int tähti b vastaa malloc koko int. Tämä voisi olla hieman hankala. Ottaa toisen ja miettiä, mitä odottaa tapahtua tässä kaaviossa. int tähti b vastaa malloc koko int. No tämä ei vain luoda yksi ruutu. Tämän itse asiassa luo kaksi laatikkoa. Ja se sitoo, se myös vahvistetaan kohta suhde. Olemme varataan yksi lohko muistia kasaan. Huomaa, että oikean yläkulman laatikkoon siellä ei ole nimeä. Me mallocd se. Se on olemassa kasaan. Mutta b on nimi. Se on osoitin muuttuja nimeltä b. Joka elää pinoon. Joten se on pala muistia joka viittaa toiseen. b sisältää osoitteen Tämän lohkon muistia. Se ei ole nimeä toisin. Mutta se osoittaa sen. Joten kun sanomme int tähti b vastaa malloc koko int, että oikeassa, että nuoli että piipahti oikealla puolella, että koko juttu, Otan sen näyttämään uudelleen, mitä tapahtuu. Kaikki tämä tapahtuu että riviäkään koodia. Nyt saamme hieman enemmän suoraviivainen uudelleen. vastaa ampersand m. Muistatteko mitä vastaa Ampersand m on? No se saa M: n osoite. Tai laittaa enemmän kaavamaisesti, pistettä m. vastaa b. OK joten tässä on toinen. Vastaa b. Mitä tulee tapahtumaan kaavion tällä kertaa? No muistuttaa, että Sijoitusoperaattori työt antamalla arvoa oikeus arvon vasemmalta. Joten sen sijaan osoittaa m, nyt viittaa samaan paikkaan, että b pistettä. ei osoita b, kohdissa, joissa b pistettä. Jos huomautti to b että olisi on yhtä suuri kuin ampersand b. Mutta sen sijaan vastaa b vain tarkoittaa, että ja b ovat nyt osoittaa samaan osoitteeseen, koska sisällä b on vain osoite. Ja nyt sisällä on sama osoite. m on 10, luultavasti selkein asia olemme tehneet vähän. Laita 10 ruutuun. Star b vastaa m + 2, muistan meidän viitteitä Video Mitä tähden b tarkoittaa. Aiomme dereference b ja laittaa jotkut arvo että muistipaikka. Tässä tapauksessa 12. Joten kun me dereference pisteen muistaa me vain matkustaa alas nuolta. Tai toisin sanoin, me Siirry että muistiosoitteen ja me manipuloida sitä jotenkin. Olemme laittaa arvoa siellä. Tällöin tähti b vastaa m plus 2 on vain Siirry muuttujan osoitteen sivulle b, Siirry muistin osoitteen sivulle b, ja laittaa m + 2 siellä, 12. Nyt olen vapaa b. Mitä tapahtuu, kun vapauttaa b? Muista mitä sanoin ilmaiseksi keinoin. Mitä minä puhun, kun vapauttaa b? Olen valmis työskennellyt se, oikea? Olen pääosin luopua muisti. Annan sen takaisin järjestelmään. En tarvitse tätä enää on mitä kerron heille, OK? Nyt jos sanon tähti vastaa 11 voit luultavasti jo kertoa, että jotain pahaa tulee tapahtumaan täällä, eikö? Ja todellakin, jos yritin, että olen luultavasti kärsisi segmentointi vika. Koska nyt, vaikka aiemmin että kimpale muisti oli jotain, että minulla oli pääsy, tässä vaiheessa nyt olen Muistia että ei ole laillista minun päästä. Ja kun me luultavasti muistaa, kun me käyttää muistia että meidän ei pitäisi koskea, se yleisin syy of segmentointi vika. Ja niin minun ohjelma olisi kaatua jos olen yrittänyt tehdä tätä. Joten jälleen se on hyvä saada hyviä käytäntö ja hyvät tavat syöpynyt työskenneltäessä malloc ja vapaa, niin että et kärsi segmentointi viat, ja että käytät sinun dynaamisesti muisti vastuullisesti. Olen Doug Lloyd tämä on CS50.