[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.