[Muusika mängib] DOUG LLOYD: OK nii soovitus Enne siin. Kui te ei ole vaatasin videot suunanäitajaks võiksite teha esimene. Kuna see video on teine töömeetod suunanäitajaks. Nii see läheb rääkima umbes mõned mõisted et me katta ka suunanäitajaks video, ja me oleme läheb ilustada neid nüüd eeldades, et nad on juba omamoodi aru. Nii et lihtsalt oma õiglane hoiatus et kui te näete seda videot ja sa ei ole näinud viiteid video, see võib omamoodi lennata üle oma pea natuke. Ja nii oleks parem seda vaadata selles järjekorras. Nii et me oleme juba näinud võimalus töötada koos suunanäitajaks, mis on meil välja kuulutada muutuv, ja siis me Kinnitan teise muutuja osuti muutuja, mis osutab ta. Nii oleme loonud muutuja nime, me oleme loodud teise muutuja nimi, ja juhime et teise muutuja sel esimesena. Selline on probleem küll, sest see nõuab, et me teame täpselt kui palju mälu oleme läheb vaja praegu Meie programm on koostatud. Miks nii? Sest me peame suutma nimetada või selgitada kõik võimalikud muutujad Me võime kohata. Oleksime massiivi, mis võivad olla suudab palju informatsiooni, aga see ei ole veel täpselt piisavalt täpne. Mis siis, kui me ei tea, Mis siis, kui me ei tea, kui palju me vajame kompileerimise ajal? Või mis siis, kui meie programm kestab väga kaua aega, vastu erinevate kasutajate andmed ja me ei saa hinnata, kas me oleme läheb vaja 1000 ühikut? See ei meeldi saame öelda käsureal sisestage kui palju punkte sa arvad, et sa pead. Noh, mis siis, kui see oletus on vale? Dünaamiline mälu eraldamise omamoodi lubab meile teed saada umbes seda probleemi. Ja kuidas ta seda teeb on kasutada vihjeid. Me saame kasutada viiteid pääse dünaamiliselt eraldatud mälu, mälu, mis on jaotatakse oma programm töötab. See ei ole eraldatud kompileerimise ajal. Kui dünaamiliselt eraldada mälu see pärineb bassein mälu tuntud kui hunnik. Varem kõik mälus me oleme töötanud käigus on pärit bassein mälu tuntakse virna. Hea võimalus üldiselt pidage mind-- ja see reegel alati ei pea paika, aga päris palju peaaegu alati hoiab true-- on see, et mis tahes kord, kui muutuja nime Tõenäoliselt elab virna. Ja iga kord, kui seda ei tee annab muutuja nimi, mida saate teha koos dünaamilise mälu jaotamist, see elab hunnik. Nüüd ma olen selline, esitades seda kas seal on need kaks basseinid mälu. Aga olete näinud seda diagramm, mis on üldiselt esindamine Mis mälu välja näeb, ja me ei kavatse hoolivad kõik kraami tipus ja allosas. Mida me hoolime on see osa Lähis siin, hunnik ja korstna. Nagu näete, mida Vaadates seda skeemi, Nende tegelikult ei ole kahe eraldi basseinid mälu. See on üks ühine bassein mälu kus hakkate, selle visuaalne hakkate allosas ja alustada tangivad alt koos virna ja sina teksti algusest ja alustada tangivad ülalt alla koos hunnik. Aga see on tõesti Sama pool, see on lihtsalt eri kohtades, erinevates kohtades mälu, mida jaotatakse. Ja saab otsa mälu, mis on kas hunnik minna kogu tee põhja või on virna minna kogu tee üles, või kellel on pinust kohtuda üksteise vastu. Kõik need võivad olla tingimused mis põhjustavad oma programmi otsa mälu. Nii et hoidke seda silmas pidades. Kui me räägime hunnik ja korstna me tegelikult räägime sama üldise patakas mälu, vaid erinevatel osadel, et mälu. Niisiis, kuidas me saame dünaamiliselt eraldatud mälu esimese koha? Kuidas meie programmi saada mälu nagu see töötab? Noh C on funktsioon, mida nimetatakse malloc, mälu eraldaja, mis Teile helistada ja sa liigu kui palju baiti mälu, mida soovite. Seega, kui teie programm töötab ja sa tahad täisarv runtime, võite mallock neljabaidilist mälu, malloc sulgudes neli. mallock läheb läbi Vaata läbi hunnik, sest me oleme dünaamiliselt eraldada mälu, ja siis tagasi sa kursor, et mälu. See ei anna teile, et memory-- see ei anna talle nime, see annab sulle viida seda. Ja seepärast ongi jälle ma ütlesin et see on oluline, et võibolla jälginud viiteid video enne kui me liiga palju sellesse. Nii malloc läheb teile tagasi pointer. Kui mallock ei anna teile mingit mälu, sest olete otsa, see annab sulle tagasi nullviida. Kas sa mäletad, mis juhtub, kui me proovida ja apparent nullviida? Me kannatavad seg süü, eks? See ilmselt ei ole hea. Nii et iga kord, kui helistada to malloc sa alati, alati on vaja kontrollida, kas pointer ta andis sulle tagasi on null. Kui see on, mida vaja lõpetada oma programmi sest kui sa püüad ja apparent null pointer sa lähed kannatavad killustatust süü ja teie programm on kukku niikuinii. Niisiis, kuidas me staatiliselt saada täisarv? int x. Me oleme ilmselt teinud kamp korda, eks? See loob muutuja nimega x, kes elab virna. Kuidas me dünaamiliselt saada täisarv? Int star px võrdub malloc 4. Või õigem me tahaks öelda int star px võrdub malloc suurus int, lihtsalt visata mõned vähem magic numbrid ümber meie programmi. See läheb saada meile nelja baiti mälu hunnik, ja kursor saame tagasi nimetatakse seda px. Ja siis nagu me oleme seda varem teinud oleme saab apparent px, et juurde, et mälu. Kuidas saada täisarv kasutaja? Me ei saa öelda, int x võrdub saada int. See on üsna lihtne. Mis siis, kui me tahame luua massiivi X ujukid, mis elada korstna? float stack_array-- see on nimi Meie array-- nurksulgudes x. See loob meile hulgaliselt X ujukid, mis elada virna. Me ei saa luua massiivi ujukid kes elab hunnik ka. Süntaks võib tunduda veidi kohmakas, kuid me ei saa öelda, float star heap_array võrdub malloc x korda suurem float. Mul on vaja piisavalt ruumi, et hoida x ujukoma väärtusi. Nii et mul on vaja 100 ujukite või 1000 ujukid. Nii et juhul oleks 400 baiti 100 ujukid, või 4000 baiti 1000 ujukid, sest iga float võtab neljabaidilist ruumi. Pärast seda ma ei kasuta nurksulg süntaksi kohta heap_array. Just nagu ma oleks edasi stack_array, ma pääseb selle elemendid eraldi kasutades heap_array null, heap_array üks. Aga meelde põhjus, miks me ei saa seda teha sellepärast, et nimi massiivi C on tõesti viit et massiivi esimene element. Nii, et me tunnistamise massiivi ujukeid stack siin on tegelikult natuke eksitav. Me tõesti on teine ​​rida koodi seal Samuti luua kursori patakas mälu, mis me siis teeme mõned tööd. Siin on suur probleem dünaamiliselt eraldatud mälu küll, ja see on põhjus, miks see on tõesti oluline arendada häid harjumusi kui te töötate koos sellega. Erinevalt staatiliselt deklareeritud mälu, mälu automaatselt ei tagastata süsteemi, kui teie ülesanne on teha. Nii et kui meil on peamine ja Peamised nõuab funktsiooni f, siis f viimistluse iganes seda teed ja naaseb kontroll programmi Tagasi, kõik mälu et f kasutatakse antakse tagasi. Seda saab kasutada jälle mõne muu programmi või mõni muu funktsioon, mis saab nimetada hiljem peamine. Seda saab kasutada sama mälu jälle. Kui teil dünaamiliselt mälu eraldada kuigi sa pead selgelt öelda süsteem, mis sa oled teinud seda. Seda saad hoida peale seda teile, mis võiks põhjustada probleeme teist otsa mälu. Ja tegelikult me ​​mõnikord viidata sellele nagu Mälulekke. Ja mõnikord need mälulekked võib tegelikult olla väga laastav süsteemi jõudlust. Kui teil on sagedased internetikasutaja võite kasutada teatud brausereid, ja ma ei nimeta nimesid siin, kuid seal on mõned veebibrauserid seal mis on tuntud oleks tegelikult mälulekked et ei saada fikseeritud. Ja kui sa jätad oma brauseri avatud väga pikka aega, päeva ja päeva või nädalat, mõnikord Võib märgata, et teie süsteem on töötab tõesti aeglaselt. Ja selle põhjuseks on see, et brauser on eraldatud mälu kuid siis ei rääkinud süsteemi et ta on teinud seda. Ja nii, et jätab vähem mälu saadaval kõik teie teised programmid on jagada, sest sa oled leaking-- et veebilehitseja Programm lekib mälu. Kuidas me anname mälu tagasi kui me teinud on? Noh õnneks on see väga lihtne viis seda teha. Me lihtsalt vaba ta. Seal on funktsioon nimega tasuta, ta võtab kursor mälu ja me oleme hea minna. Ütleme, et me oleme ka Keset meie programmi, tahame malloc 50 tähemärki. Tahame malloc massiivi, mis võivad mahub 50 tähemärki. Ja kui me osuti tagasi et see kursor nimi on sõna. Me teha mida iganes me kavatseb teha sõna, ja siis, kui me teinud me lihtsalt vaba ta. Ja nüüd oleme tagasi need 50 baiti mälu tagasi süsteemi. Mõned teised funktsiooni saab neid kasutada. Me ei pea muretsema kannatusi mäluleke sest oleme vabanenud sõna. Me andsime mälu tagasi, nii ongi kõik töötab ta. Nii on kolm kuldreeglit, mis tuleks tuleb silmas pidada, kui sa oled dünaamiliselt eraldada mälu koos malloc. Iga ploki mälu sa malloc tuleb vabastada Enne oma programmi lõpetab töötamise. Nüüd jälle, et seadme või IDE sellist juhtub nagunii kui Sa-- see juhtub niikuinii Kui teie programm on lõpetatud, kõik mälu ilmub. Aga see on üldiselt hea kodeerimine Praktikas on alati, kui sa oled teinud, tasuta mida olete mallocd. See tähendab, et ainsad asjad, mis olete mallocd tuleks vabastada. Kui te staatiliselt tunnistada täisarv, int x semikoolon, kes elab virna, siis ei, siis tahad, et vabastada x. Nii ainsad asjad, mis sa oled mallocd tuleks vabastada. Ja lõpuks, ärge tasuta midagi korda. See võib kaasa tuua teine ​​imelik olukord. Nii et kõik, mis sa oled mallocd tuleb vabastada. Ainult asju, mida olete malloc tuleks vabastada. Ja ärge tasuta midagi korda. Nii lähme näitena siin mida mõned dünaamiliselt eraldatud mälu tunduda segatud sisse mõned staatilised mälu. Mis võib juhtuda siin? Vaadake, kas saate jälgida mööda ja arvan, mida on juhtub, kui me läheme läbi kõik need rida koodi. Nii me ütleme int m. Mis juhtub siin? Jah, see on üsna lihtne. Ma loon täisarv muutuja nimega m. Ma värvi see roheline, sest see värv et ma kasutan, kui ma räägin umbes täisarv muutujad. See on kast. Seda nimetatakse m, ja te saate poest täisarvud sees on. Mis siis, kui ma siis ütlen int tärniga? Noh, et on päris sarnased. Ma koostan kasti nimega. See mahub int tähed, vihjeid täisarvud. Nii et ma värvimine see roheline-ish samuti. Ma tean, et see on midagi pistmist täisarv, kuid see ei ole iseenesest täisarv. Aga see on üsna sama mõte. Olen loonud kasti. Mõlemad õigus nüüd elan virna. Ma olen andnud neile mõlemad nimed. int star b võrdub malloc suurus int. See võiks olla natuke keeruline. Võtke hetk ja mõelda, mida sa ootaks juhtuda sellel skeemil. int star b võrdub malloc suurus int. Noh see ei ole lihtsalt luua üks kast. See loob tegelikult kaks kasti. Ja see haakub see sätestab ka punkt suhe. Me oleme eraldatud üks plokk mälu hunnik. Pange tähele, et üleval paremal kastis seal ei ole veel nime. Me mallocd ta. See on olemas hunnik. Aga b on nimi. See on pointer muutuja nimega b. See elab virna. Nii et see on tükk mälu mis osutab mõni teine. b sisaldab aadress Selle ploki mälu. See ei ole veel nime teisiti. Aga see juhib ta. Nii et kui me ütleme, int star b võrdub malloc suurus int, et seal, et nool, et hüppasid üles paremal pool seal, et kogu see asi, Võtan tundub uuesti, on see, mis juhtub. Kõik, mis juhtub et koodirida. Nüüd saad natuke rohkem lihtne uuesti. a on võrdne ampersand m. Kas te mäletate, milline võrdub ampersand m on? Noh, et on saab m aadressi. Või panna rohkem diagrammiliselt punktisüsteemi m. a on võrdne b. OK, nii et siin on veel üks. A on võrdne b. Mis juhtub skeemile seekord? Noh meelde tuletada, et omistamisoperaatorile tööd määrates väärtuse kohta õigus väärtus vasakul. Nii asemel osutades m, praeguseks juhib samas kohas, et b punkti. ei viita B, A lõikumispunktid b punkti. Kui terava b-, mis olnud võrdne ampersand b. Aga selle asemel võrdub b lihtsalt tähendab, et ja b on nüüd osutades samal aadressil, sest sees b on lihtsalt aadress. Ja nüüd sees on sama aadress. m võrdub 10, ilmselt Kõige lihtsam asi Me oleme teinud natuke. Pane 10 kasti. Star b võrdub m pluss 2, mäletate Meie viiteid video, mida täht b tähendab. Me läheme apparent b ja panna mingi väärtus, et mälu asukohta. Sel juhul 12. Nii et kui me apparent punkti, mäleta me lihtsalt sõita mööda nool. Või teisiti öeldes, me minna, et mälu aadress ja me manipuleerida seda mingil moel. Panime mingi väärtus seal. Sel juhul star b võrdub m pluss 2 on lihtsalt minna muutuja poolt esile tõstetud b, mine mälu, millele viitab b, ja panna m pluss 2 seal, 12. Nüüd ma vabaks b. Mis juhtub, kui ma vabaks b? Pea meeles, mida ma ütlesin tasuta vahendeid. Mida ma öelda, kui ma vabaks b? Ma olen teinud koostööd, eks? Ma sisuliselt loobuma mälu. Ma annan selle tagasi süsteemi. Ma ei pea seda enam on mida ma räägin nendega OK? Nüüd, kui ma ütlen, tärniga võrdub 11 saab ilmselt juba öelda, et midagi halba juhtub siin, eks? Ja tõepoolest, kui ma proovisin, et ma ilmselt kannaksid killustatust süü. Sest nüüd, kuigi varem, et patakas mälu oli midagi, mis mul oli juurdepääsu, sel hetkel nüüd ma juurdepääsu mälu ei ole õiguslikke mulle juurde. Ja nagu me ilmselt mäletate, kui me Access Memory et me ei peaks puudutama, see on kõige levinum põhjus on segmenteerimine süü. Ja nii minu programmi krahhi, kui ma püüdsin seda teha. Nii jälle, et see on hea mõte hea tavade ja heade harjumuste juurdunud töötamisel malloc ja tasuta, nii et sa ei kannata segmenteerimine vead, ja mida saate kasutada Sinu dünaamiliselt eraldatud mälu vastutustundlikult. Ma olen Doug Lloyd see on CS50.