[Muzika]
>> DOUG Lloyd: OK kështu që një sugjerim para fillimit këtu.
Nëse ju nuk e keni shikuar videon në pointers ju mund të dëshironi për të bërë këtë për herë të parë.
Sepse kjo video është një tjetër mënyrë për të punuar me pointers.
>> Kështu ajo do të flasim në lidhje me disa koncepte
që ne të mbuluar në pointers video të, dhe ne jemi
do të komentoj mbi to tani, duke supozuar se ata janë tashmë të
lloj i kuptuar.
Pra, kjo është vetëm paralajmërimi juaj i drejtë se në qoftë se ju jeni duke parë këtë video
dhe ju nuk e kanë parë pointers Video, ajo mund lloj
fluturojnë mbi kokën tuaj pak.
Dhe kështu që ajo mund të jetë më mirë për të parë atë në atë mënyrë.
>> Pra, ne kemi parë tashmë një mënyrë për të punuar me pointers,
i cili është shpallim një variabel dhe pastaj ne
të deklarojë një ndryshore, një akrep variabël, që tregon për të.
Pra, ne kemi krijuar një ndryshueshme me një emër, ne kemi
krijoi një ndryshore të dytë me një emër, dhe ne pika se ndryshueshme dytë
në atë të parë.
Ky lloj ka një Problemi pse, sepse ajo
na kërkon që të dini saktësisht sa e kujtesës sa ne jemi
do të duhet momentin programi ynë është hartuar.
>> Pse eshte ajo?
Sepse ne duhet të jetë në gjendje për të përmendur apo të identifikojnë të gjitha variablave të mundshme
ne mund të hasni.
Ne mund të kemi një rrjet që mund të jetë në gjendje të mbajë një shumë të informacionit,
por kjo nuk është ende e saktësisht saktë të mjaftueshme.
Po në qoftë se ne nuk e dimë, çfarë nëse ne nuk kemi ide
sa ne do të duhet në kohën e kompilimit?
Ose çfarë nëse programi ynë do të të kandidojë për një kohë vërtet të gjatë,
pranuar përdorues ndryshme të dhënave, dhe ne nuk mund të vërtetë
vlerësojnë nëse ne jemi do të ketë nevojë për 1000 njësi?
>> Ajo nuk është si ne mund të thonë se në rreshtin e komandave
të hyjë sa shumë sende ju mendoni se ju do të duhet.
E pra çfarë nëse kjo mend është e gabuar?
Kujtese dinamik lloj na lejon rrugën
për të marrë rreth këtij problemi të veçantë.
Dhe mënyrën se si ajo e bën atë është duke përdorur pointers.
>> Ne mund të përdorim pointers për merrni qasje në mënyrë dinamike
kujtesës ndarë, kujtesës që është ndarë si programin tuaj po kandidon.
Kjo nuk është alokuar në kohën e kompilimit.
Kur ju dinamike ndajë kujtim ajo vjen nga një pishinë
e kujtesës e njohur si grumbull.
Më parë të gjithë Memory ne kemi punuar me gjatë
ka ardhur nga një grup e kujtesës e njohur si rafte.
Një mënyrë e mirë për të në përgjithësi të mbajtur në rregull mind-- dhe këtë
nuk ka gjithmonë të mbajë e vërtetë, por shumë e shumë pothuajse
gjithmonë mban true-- është se çdo herë ju jepni një emër ndryshueshme atë
ndoshta jeton në rafte.
Dhe çdo herë që ju nuk e bëni të japë një ndryshore një emër,
që ju mund të bëni me kujtesën dinamike ndarja, ajo jeton në grumbull.
>> Tani unë jam natyrë e paraqitur këtë si në qoftë se ka këto dy pishina të kujtesës.
Por ju mund të keni parë këtë diagram, e cila është përgjithësisht
një përfaqësim i çfarë kujtesës duket si,
dhe ne nuk do të kujdesen për të gjithë stuff në krye dhe në fund.
Ajo që na intereson është kjo pjesë në e mesme këtu, tog dhe rafte.
Siç mund ta shikoni nga duke kërkuar në këtë diagram,
këto në fakt nuk janë dy pishina të veçanta të kujtesës.
Kjo është një pishinë të përbashkët të kujtesës ku ju filloni, në këtë vizuale
ju filloni në fund dhe të fillojnë mbushur deri
nga thellësia me rafte, dhe ju të fillojë në krye dhe të fillojnë mbushur
nga lart poshtë me tog.
Por kjo me të vërtetë është njëjtë pishinë, kjo është vetëm
spote të ndryshme, vende të ndryshme në kujtesën që janë duke u ndarë.
Dhe ju mund të drejtuar nga kujtim nga ose të paturit
tog shkuar gjatë gjithë rrugës në fund, ose kanë
rafte shkojnë të gjithë rrugën në krye, ose që kanë tog dhe rafte
takohen kundër njëri-tjetrit.
Të gjithë ata mund të jenë kushtet që shkaktojnë programin tuaj
për të dalë jashtë kujtesës.
Pra, mbani në mend.
Kur ne flasim për tog dhe rafte
ne jemi me të vërtetë duke folur për njëjtën copë e përgjithshme e kujtesës, vetëm
Pjesë të ndryshme të kësaj kujtesës.
>> Pra, si nuk kemi marrë dinamike ndarë kujtesës në vendin e parë?
Si funksionon programi ynë të marrë kujtesës si ajo e running?
E pra C ofron një funksion të quajtur malloc, përcaktuesi kujtesës, e cila
ju bëni një telefonatë për të, dhe ju të kalojë në Sa bytes e kujtesës që ju dëshironi.
Pra, në qoftë se programi juaj është duke dhe ju doni një Runtime integer,
ju mund të mallock katër bytes i kujtesës, malloc kllapa katër.
>> mallock do të shkojnë nëpër duke kërkuar nëpërmjet një mase,
sepse ne jemi në mënyrë dinamike caktimin e kujtesës,
dhe ajo do të kthehet tek ju një tregues për këtë kujtesë.
Ajo nuk ju jap se memory-- kjo nuk do t'i jepte një emër,
kjo ju jep një tregues për të.
Dhe kështu kjo është arsyeja pse përsëri thashë kjo është e rëndësishme për të ndoshta
kanë shikuar video Pointers para se të merrni shumë larg në këtë.
Pra malloc do të ju jap përsëri një akrep.
>> Nëse mallock nuk mund të ju jap ndonjë kujtesës për shkak se ju keni dalë jashtë,
ajo do të ju jap përsëri një tregues null.
A ju kujtohet çfarë ndodh nëse ne provoni dhe dereference një tregues null?
Ne vuajnë një faj seg, e drejtë?
Kjo ndoshta nuk është e mirë.
>> Pra, çdo herë që bëni një telefonatë për malloc ju gjithmonë, gjithmonë
duhet të kontrolloni nëse janë apo jo treguesin ajo ju dha përsëri është i pavlefshëm.
Nëse kjo është, ju keni nevojë për t'i dhënë fund programin tuaj sepse në qoftë se ju provoni dhe dereference
tregues null ju do të jeni të vuajnë një defekt segmentimit
dhe programi juaj është i duke shkuar për të rrëzuar gjithsesi.
Deri sa nuk kemi statike të marrë një numër të plotë?
>> int x.
Ne kemi bërë ndoshta që një bandë e herë, e drejtë?
Kjo krijon një ndryshore të quajtur x që jeton në rafte.
Si nuk kemi dinamike të marrë një numër të plotë?
Int yll px barabartë malloc 4.
>> Ose më shumë në mënyrë të përshtatshme ne do të them yll int PX
është e barabartë me madhësinë malloc e int, vetëm për të hedhur disa më pak
numrat magjike rreth programit tonë.
Kjo do të marrë për ne katër bytes të memories nga plehrat,
dhe tregues marrim kthehen në atë që quhet px.
Dhe pastaj ashtu si ne kemi bërë më parë ne
mund dereference PX të hyni në këtë kujtesë.
Si mund të merrni një numër të plotë nga përdoruesit?
Ne mund të themi int x është e barabartë me të int.
Kjo është shumë i thjeshtë.
Çfarë nëse duam të krijojmë një rrjet nga x gjithandej që jetojnë në rafte?
noton stack_array-- ky është emri i array-- tona kllapa katrore x.
Kjo do të krijojë për ne një array nga x gjithandej që jetojnë në rafte.
Ne mund të krijojë një grup të gjithandej që jeton në grumbull, too.
Sintaksa mund të duket një pak më shumë i rëndë,
por ne mund të themi noton yll heap_array barabartë
herë malloc x Madhësia e noton.
Unë kam nevojë për hapësirë ​​të mjaftueshme për të mbajtur x lundrues vlerat pikë.
Pra, thonë se unë duhet 100 gjithandej, ose 1000 gjithandej.
Pra, në këtë rast do të 400 bytes për 100 gjithandej,
apo 4000 bytes për 1000 gjithandej, sepse secili noton merr
katër bytes të hapësirës.
>> Pas bërë këtë unë mund të përdorni të katror Sintaksa kllapa në heap_array.
Ashtu si unë do të në stack_array, unë mund të hyni në elementet e saj në mënyrë individuale
përdorur heap_array zero, një heap_array.
Por kujtojnë arsyen ne mund të bëjë atë është për shkak se emri i një grup në C
është me të vërtetë një tregues për Elementi i parë që Array së.
Pra, fakti se ne jemi një deklarues grup i gjithandej në rafte këtu
është në fakt një pak mashtruese.
Ne me të vërtetë jemi në Linja e dytë e kodit atje
gjithashtu duke krijuar një tregues për një copë të kujtesës që ne pastaj të bëjë disa punë me të.
>> Këtu është problemi i madh me dinamike ndarë kujtesës edhe pse,
dhe kjo është arsyeja pse është e vërtetë e rëndësishme që të zhvillojnë disa zakone të mira
kur ju jeni duke punuar me të.
Ndryshe deklaruar statike kujtesës, kujtesa juaj
nuk është kthyer automatikisht në sistemi kur funksioni juaj është bërë.
Pra, nëse ne kemi kryesor, dhe kryesore quan një funksion
f, kur f përfundon çfarëdo qoftë ajo është duke bërë dhe kthen kontrollin e programit
Mbrapsht në kryesore, të gjithë e kujtesës se f përdorur është dhënë përsëri.
Ajo mund të përdoret përsëri nga ndonjë program tjetër,
apo ndonjë funksion tjetër që merr quajtur më vonë në kryesore.
Ajo mund të përdorni të njëjtin kujtesën mbi përsëri.
>> Nëse ju dinamike të siguroj kujtesë pse
ju keni për të në mënyrë eksplicite them të sistem që ju jeni bërë me të.
Ajo do të mbajnë atë për ju, e cila mund të të çojë në një problem të ju mbaron
e kujtesës.
Dhe në fakt ne nganjëherë i referohemi në këtë si një rrjedhje kujtesës.
Dhe ndonjëherë këto rrjedhjet e kujtesës në fakt mund të jetë me të vërtetë shkatërruese
për ecurinë e sistemit.
>> Nëse ju jeni një përdorues i shpeshtë në internet ju mund të përdorni shfletues web të caktuara,
dhe unë nuk do emrin emra këtu, por ka disa shfletues web atje
që janë të njohur për të pasur në të vërtetë rrjedhjet e kujtesës që nuk do të marrë fikse.
Dhe në qoftë se ju largoheni shfletuesi juaj i hapur për një periudhë shumë të gjatë kohore, ditë
dhe ditë, apo javë, ju ndonjëherë mund të vëreni se sistemi juaj
është duke të vërtetë, me të vërtetë ngadalë.
Dhe arsyeja për këtë është se shfletuesi ka ndarë kujtesën,
por pastaj nuk i tha të sistemit se kjo është bërë me të.
Dhe kështu që lë pak memorie në dispozicion për të gjitha programet tuaja të tjera
që të ketë për të ndarë, për shkak se ju jeni leaking-- se web browser
Programi rrjedh kujtesës.
Si mund të japin kujtesës prapa kur ne jemi duke bërë me të?
E pra për fat të mirë kjo është një mënyrë shumë e lehtë për të bërë atë.
Ne vetëm të lirë atë.
Ka një funksion të quajtur të lirë, ajo pranon një tregues për kujtesë,
dhe ne jemi të mirë për të shkuar.
>> Pra, le të thonë se ne jemi në mesi i programit tonë,
ne duam të malloc 50 karaktere.
Ne duam të malloc një grup që mund të aftë për të mbajtur 50 karaktere.
Kur ne të merrni një tregues kthehet në se, emër që akrep është fjala.
Ne bëjmë çdo gjë që ne jemi do të bëni me fjalë,
dhe pastaj kur ne jemi bërë ne vetëm të lirë atë.
Dhe tani ne kemi kthyer ato 50 bytes i kujtesës përsëri në sistem.
Disa funksion tjetër mund t'i përdorë ato.
Ne nuk duhet të shqetësohen për një vuajtje rrjedhje kujtim, sepse ne kemi liruar fjalën.
Ne kemi dhënë kujtesës prapa, kështu që ne jemi bërë duke punuar me të.
Pra, ka tre rregullat e arta që duhet
të mbahet në mend kur ju jeni dinamike ndarjen e kujtesës
me malloc.
Çdo bllok i kujtesës që ju malloc duhet të lirohen
para programin tuaj përfundon running.
Tani përsëri, në pajisje ose në IDE ky lloj i ndodh për ju gjithsesi
kur ju, duke filluar kjo do të ndodhë gjithsesi kur programi juaj është ndërprerë,
gjithë Memory do të lirohet.
Por kjo është në përgjithësi e mirë coding praktikë që gjithmonë, kur ju jeni bërë,
të lirë atë që keni mallocd.
>> Ajo tha se, vetëm gjëra që ju keni mallocd duhet të lirohen.
Nëse ju statike të deklarojë një numër i plotë, int x gjysmë-zorrës së trashë,
që jeton në rafte, ju mos pastaj duan të x lirë.
Pra, vetëm gjëra që ju keni mallocd duhet të lirohet.
>> Dhe së fundi, nuk bëni diçka të lirë dy herë.
Që mund të çojë në një situatë tjetër i çuditshëm.
Pra, çdo gjë që ju keni mallocd duhet të lirohen.
Vetmet gjëra që ju keni malloc duhet të lirohet.
Dhe mos bëni diçka të lirë dy herë.
>> Pra, le të kalojnë nëpër një shembull këtu e asaj që disa ndarë dinamike
kujtesës mund të duket si i përzier në me disa kujtesës statike.
Çfarë mund të ndodhë këtu?
Shih nëse ju mund të ndiqni së bashku dhe me mend se çfarë është
do të ndodhë si të shkojmë nëpër të gjitha këto rreshta të kodit.
>> Pra, ne themi m int.
Çfarë ndodh këtu?
E pra kjo është shumë i thjeshtë.
Kam krijuar një variabël integer quajtur m.
Unë ngjyra atë të gjelbër, sepse kjo është ngjyra
që unë e përdor kur unë jam duke folur rreth variablave numër i plotë.
Kjo është një kuti.
Ajo që quhet m, dhe ju mund të integers dyqan brendësi të saj.
>> Çka nëse unë pastaj thonë yll int një?
E pra kjo është shumë e ngjashme.
Unë jam duke krijuar një kuti të quajtur.
Është i aftë për të int mbajnë yjet, pointers integers.
Kështu që unë jam ngjyrosur atë të gjelbër-ish si.
>> Unë e di se ka diçka të bëjë me një numër të plotë,
por ai vetë nuk është një numër të plotë.
Por kjo është shumë e shumë të njëjtën ide.
Unë kam krijuar një kuti.
Të dyja këto të drejta tani jetojnë në rafte.
Unë e kam dhënë atyre dy emra.
>> Ylli int b barabartë me madhësinë malloc të int.
Kjo mund të jetë pak e ndërlikuar.
Ndalo një sekondë dhe mendoni se çka ju do të presin që të ndodhë në këtë diagram.
Ylli int b barabartë me madhësinë malloc të int.
>> E pra kjo nuk ka vetëm të krijojë një kuti.
Ky fakt krijon dy kuti.
Dhe ajo e lidhjeve, ai gjithashtu krijon një pikë në një marrëdhënie.
Ne kemi ndarë një bllok e kujtesës në grumbull.
Vini re se top box drejtë atje nuk ka një emër.
>> Ne mallocd atë.
Ajo ekziston në grumbull.
Por b ka një emër.
Kjo është një variabël pointer quajtur b.
Që jeton në rafte.
>> Pra, kjo është një pjesë e kujtesës që tregon për një tjetër.
b përmban adresën e atij bllok të memories.
Ajo nuk ka një emër ndryshe.
Por ajo tregon për të.
Pra, kur themi yll int b barabartë Madhësia malloc e int, se ka të drejtë,
se shigjetë që popped deri në anën e djathtë atje, se gjithë gjë,
Unë do të duhet të duket përsëri, është ajo që ndodh.
E gjithë kjo ndodh në se linjë të vetme të kodit.
Tani ne do të merrni pak më shumë drejtpërdrejtë përsëri.
një është e barabartë m ampersand.
A ju kujtohet se çfarë një është e barabartë m simbol është?
E pra kjo është një merr adresën e M.
Ose të vënë më shumë diagram, një pikë në m.
>> një është e barabartë me b.
OK kështu që këtu është një tjetër.
Një është e barabartë me b.
Çfarë do të ndodhë në diagramin këtë kohë?
>> E pra kujtojnë se Punimet operatori detyrë
duke caktuar vlerën në të drejtë me vlerën në të majtë.
Pra, në vend të një duke treguar për të m, një tani vë në të njëjtin vend që pikat b.
një nuk ka pikë të b, një Pikët Pikët ku b.
>> Nëse një vuri të b që do të kanë qenë një është e barabartë me ampersand b.
Por në vend të një është e barabartë me b vetëm do të thotë se dhe b janë tani
duke treguar të njëjtën adresë, sepse brenda B është vetëm një adresë.
Dhe tani brenda një është e njëjtë adresa.
m është e barabartë me 10, ndoshta më gjë drejtpërdrejtë
ne kemi bërë në pak.
Vendos 10 në kuti.
Star b barabartë m plus 2, kujtohet nga jonë pointers Video çfarë yll b thotë.
Ne jemi duke shkuar për dereference b dhe vënë disa vlera në atë vend e kujtesës.
Në këtë rast 12.
>> Pra, kur ne dereference një pikë kujtojnë ne vetëm të udhëtuar poshtë arrow.
Ose thënë ndryshe, ne të shkojë në atë adresë e kujtesës
dhe ne e manipuluar atë në një farë mënyre.
Ne kemi vënë disa vlera në atje.
Në këtë rast yll b është e barabartë m plus 2 është vetëm
shkoni në variablin vuri në dukje nga b, shkoni në kujtesën vuri në dukje nga b,
dhe të vënë m plus 2 në atje, 12.
>> Tani unë të lirë b.
Çfarë ndodh kur unë të lirë b?
Mos harroni atë që kam thënë do të thotë pa pagesë.
Çfarë jam unë duke thënë se kur unë të lirë b?
>> Unë jam bërë duke punuar me të, e drejtë?
Unë në thelb heqin dorë kujtesën.
Unë jap atë përsëri në sistem.
Unë nuk kanë nevojë për këtë më është atë që unë jam duke u thënë atyre, OK?
>> Tani në qoftë se unë them një yll është e barabartë me 11 ju mund ndoshta
tashmë them se diçka e keqe do të ndodhë këtu, apo jo?
Dhe me të vërtetë në qoftë se unë u përpoq që unë ndoshta do të vuajnë një defekt segmentimit.
Sepse tani, edhe pse më parë se copë e kujtesës
ishte diçka që unë kam qasje në, në këtë pikë
tani unë jam duke hyrë në kujtesën se nuk është e ligjshme për mua për të hyrë.
>> Dhe si ne ndoshta do të kujtoj, kur ne Access Memory
se ne nuk jemi duke menduar për të prekur, kjo është shkaku më i zakonshëm
e segmentimit faji. Dhe kështu programi im
do të rrëzimit në qoftë se unë u përpoq për të bërë këtë.
Pra, përsëri kjo është një ide e mirë për të marrë të mirë praktikë dhe të mirë zakonet e rrënjosura
kur punojnë me malloc dhe të lirë, kështu që ju të mos vuani segmentimit
gabimet, dhe që ju të përdorni juaj ndarë dinamike
kujtesës me përgjegjësi.
>> Unë jam Doug Lloyd kjo është CS50.