[Muzikos grojimo] David J. Malan: Gerai. Tai CS50. Ir tai yra 5 savaitės pradžia. Ir kaip jūs galbūt jau pastebėjote, kai medžiagos vis tiek daugiau sudėtinga, šiek tiek tankesnis. 

Ir tai labai lengva, ypač jei Jūs buvote šio įpročio tam tikrą laiką, būti bando rašinėti žemyn dauguma ką mes darome, mes norim pasakyti klasėje. Tačiau suprantame, kad nėra gero idealus pedagoginis požiūris mokymosi tokia medžiaga, ir medžiaga apskritai. Ir todėl mes džiaugiamės galėdami pranešame, kad CS50 nuosavą Gheng Gong pradėjo rengti kanoninė rinkinys pastabos už kursą, viltis kuris yra tai, kad, viena, tai ne tik kaip nuoroda ir išteklių peržiūrint medžiagą ir vyksta atgal per medžiaga, kuri gali turėti pabėgo jums pirmą kartą aplink, bet taip pat, kad jūsų vadovai gali būti daugiau iki ne žemyn, kai jį ateina laikas į paskaitą, taip, kad jums gali užsiimti daugiau rūpestingai, kaip ne daugiau scribbly. 

Turint tai sakė, ką jūs rasite ant svetainė yra tokie dokumentai kaip šis. Ir pranešimas, viršuje kairėje, ten ne tik turinyje, bet ir laiko kodai, iš karto šokti jus į atitinkamą dalį į vaizdo internete. Ir kas Chang čia padarė yra, iš esmės, dokumentais kas atsitiko tai pirma paskaita. Ir daugelis iš paskaitų yra jau yra internete dabar su šiuo URL. Ir mes toliau rašyti likusią iš tų, kurią šios savaitės pabaigoje, todėl nereikia pasinaudoti šia išteklių. 

Taigi be tolesnio ceremonija, mes pradėjome žievelės atgal sluoksnis, kuris buvo styginių tam tikrą laiką. Ir ką mes galime pasakyti eilutę iš tikrųjų yra paskutinė savaitė? Taigi char žvaigždė. Ir char žvaigždė, gerai, ką Ar tai iš tikrųjų reiškia? Na, visa tai laikas, jei mes buvo raginama funkciją, kaip getString ir saugojimas Vadinamasis grąža vertė getString į variable-- ji vadinama s tipas string-- mes buvo raštu kodo eilutę ten anksčiau. Ir tai tik tada, kai matau mano rašysenos čia padidintos man suvokti, kaip žiaurią tai. 

Tačiau, tarkime, kad dešinėje pusėje yra, vis tiek protingas vaizdavimas, kas vyksta jau visa tai laikas su getString. getString, žinoma, gauna eilutę. Bet ką tai iš tikrųjų reiškia? Tai reiškia, kad jis gauna iš riekė atmintis iš operacinės sistemos paskambinę funkciją, vadinamą malloc. Bet daugiau apie tai vėliau. Ir tada jis užpildo kad atminties riekė su raidėmis vartotojas įvestas, po, žinoma, null charakterio bruožų ar Backslash nulis pačioje pabaigoje. 

Tuo tarpu kairėje pusėje Šios istorijos, visą šį laiką, mes jau paskelbti kintamąjį, kaip s. Ir, kad kintamasis yra tai, ką dabar pradės skambinti žymeklį. Tai ne viduje, kuri lange mes įdėti eilutę, Daven per se, o mes įdėti toje aikštėje laukelio kairėje, ką tiksliai? Taip? 

PUBLIKA: iš adresą kur jis yra atmintyje. 

David J. Malan: Būtent. Kur Daven adresas yra atmintyje. Ir ne ten, kur visi Daven yra, per se, bet specialiai adresas ką? Taip? 

PUBLIKA: pirmasis simbolis. 

David J. Malan: pirmasis simbolis į Daven, kuris šiuo atveju, Aš pasiūliau buvo savavališkai ir nerealiai 1, OX1, kuris tiesiog reiškia, šešioliktainis skaičius 1. Bet tai tikriausiai bus būti žymiai didesnis skaičius kad mes galime padaryti su 0x kaip priešdėlis, atstovaujanti šešioliktainis charakterį. Ir todėl, kad mums nereikia žinoti, kur iš Daven simbolių poilsio yra, nes tai, ką paprastas dizainas sprendimas, kuris buvo priimtas prieš daugelį metų? Taip? 

PUBLIKA: Kairinis pasvirasis brūkšnys 0. David J. Malan: Taip, tiksliai. Backslash 0 leidžia jums, nors ir linijinis laikas, neigia eilutę, vaikščioti iš kairės į dešinę, su pasiūlymu dėl kilpa, ar laiko kilpa, ar kažkas panašaus , kad ir nustatyti, oi, čia yra šios konkrečios eilutės pabaigos. Taigi tik su adresu Styga pradžia mes galime prieiti prie visumos tai, nes visa tai, o, Styga neseniai buvo char žvaigždė. 

Taigi, tai tikrai gerai, ir toliau naudoti CS50 biblioteka ir tai abstrakcija, taip sakant, bet mes pradeda rodyti tiksliai tai, kas jau vyksta po visą šį laiką. Taigi jums gali prisiminti šį pavyzdį, taip pat nuo paskutinio karto, palyginti 0, kuris iš tikrųjų nebuvo palyginti. Bet mes pradėjome spręsti tai. 

Bet, kaip galbūt kvalifikacijos, galėčiau sudominti žmogų rausva dramblys šiandien taip pat padarė Chang? Kaip apie jus prieš? [Nesigirdi]. Nagi iki. 

Ir tuo tarpu, kaip sugalvoti, tegul apsvarstyti ir tik akimirką, ką šis kodas buvo iš tikrųjų daro. Tai skelbiantis du kintamuosius iki viršuje, s ir t, ir raginama getString. Tai nėra labai patogus programa, nes jis negali pasakyti, ką daryti. Bet tegul tiesiog manyti, kad mes sutelkiant dėmesį į sultingas dalis. Ir tada mes, jei s lygi lygi t, jis turėtų pasakyti printf, Jūs įvedėte tą patį. Sveiki. Koks tavo vardas? 

Janelle: Janelle. David J. Malan: Janelle, nice to meet you. Taigi jūsų uždavinys ne ranka už šį dramblį yra pirmasis atkreipti mums, kas paveikslėlį kuriai atstovauja tiems pirmieji du linijos. Taigi s ir t, gali būti atstovaujama, kaip ekrane? Ir jūs galite tiesiog atkreipti jį su pirštu į šį dideliame ekrane. 

Taigi, čia yra dvi puses į kiekvienas šios lygties pusėje. Taigi, čia yra s į kairę, ir tada getString dešinėje. Ir tada ten t kairėje, ir tada getString dešinėje. Taigi, kaip gali mes pradėti piešimo vaizdą, kad atstovauja tai, kas vyksta čia iš atminties, būtų jums pasakyti? Ir leiskite man jums paaiškinti ką jūs darote, kaip jūs einate. 

Janelle: Gerai. Na, visų pirma, būtų prašoma jums gauti įvesties eilutę. Ir tai store-- oh, atsiprašau. David J. Malan: Gerai. Geras. Ir tai vadinama tai, ką? O, gerai. Tęsk. Aš nenorėjau nutraukti. Janelle: Atsiprašome. Taigi būtų įvesties jį į adresas of-- nežinote. Aš negaliu tiksliai prisiminti skaičių, bet aš manau, kad buvo pradėti su 0. 

David J. Malan: Tai viskas gerai, nes aš padariau numerius iki, todėl nėra teisingas atsakymas. 

Janelle: Pradedant nuo 0 lanko. 

David J. Malan: Gerai, kad elementas 0. Žinoma. 

Janelle: Ir tada, jei buvo kaip tik dviejų letter-- 

David J. Malan: Gerai, su Jumis. 

Janelle: Taigi elementas 0, ir tada elementas 1 arba elementas 2. David J. Malan: Ir kuris gabalas nuotrauka tu pieši dabar? Kvietimas getString? Arba s deklaracija? 

Janelle: deklaracija S, manau. Oi, getString, nes tai būti įvedamas į kiekvieną [? plotas. ?] 

David J. Malan: Geras. Būtent. Nors tai veiksmingai grąžina masyvo, prisiminti, kai mes grįžti eilutę, galime rodyklė į tą eilutę, naudojant 01 ir 2. Techniškai, tai yra tikriausiai atstovaujamos atskirų adresai, bet tai gerai. 

Taigi tarkime, jei aš galiu tik greitai perduoti, kur mes nerašomas paskutinį kartą, jei vienas iš stygos buvo g B LT, Kairinis pasvirasis brūkšnys 0, tokiu būdu atstovauja Gabe s įėjimas, kaip gali mes atstovaujame ai dabar? Jei tai atmintis, kuri yra buvo grąžinta getString? 

Janelle: Ar tai būtų atstovaujamos lanku? 

David J. Malan: Pagal lanku? Na, ne. Leiskite tik pasakyti, pavaizduotomis piktogramo-, leiskite man tiesiog eiti į priekį ir pasiūlyti, kad, jei tai ai, tai yra gražinama reikšmė getString. Ir jūs atkreipė tai, kaip 0, 1, 2, kuris yra visiškai pagrįsta, nes mes gali indeksuoti į eilutę, kaip toks. Bet tiesiog, kad būtų suderinama su paskutinį kartą, leiskite man eiti į priekį ir savavališkai pasiūlyti, kad šis yra adresas 1, tai adresas 2 tai adresas 3, ir taip toliau. Ir taip, tiesiog super aišku, kas vyksta eiti į s kaip kad rezultatas Pirmoji eilutė kodo pasakytumėte? 

Janelle: Adresas 1? 

David J. Malan: Būtent. Taigi spręsti 0x1. Ir tuo tarpu, leiskite man eiti į priekį ir dubliuoti daug ką padarei ir įdėti savo paties k čia. Jei aš būčiau įveskite Gabe vėl, antrą kartą, , kai pasirodys su getString, kur, Žinoma, yra gabe ketinate eiti? Na, presumably-- 

Janelle: Kaip čia? David J. Malan: Taip. Janelle: Arba jis taip pat tų pačių langelių? David J. Malan: Leiskite pasiūlyti, taip, tiksliai, todėl šių papildomų dėžės. Bet kas raktas dabar yra tai, kad net nors aš sudarytas jie gana arti together-- 0x1, tai yra 0x2-- iš tikrųjų, tai dabar gali būti adresas 0x10, Pavyzdžiui, ir 0x11, ir 0x12, ir kt. Ir taip, jei tai toks atvejis, tai, kas vyksta, kad galų gale čia t? 

Janelle: 0x10? David J. Malan: Būtent. Taigi 0x10. Ir todėl dabar, paskutinis klausimas. Jūs, iki šiol teko dirbti Sunkiausia drambliui iki šiol. Iki šiol, jei aš atsigriebti kodą vėl, kai aš padaryti, atsižvelgiant trijų, jei s lygus lygus k, ką aš iš tikrųjų lygindami, kad mes sudarytas čia? 

Janelle: Du adresai? David J. Malan: Būtent. Taigi aš sakau yra S lygi lygi t? Kitaip tariant, yra 1 lygi lygi 10? Ir, žinoma, Akivaizdus atsakymas dabar yra, ne. Ir taip ši programa yra galiausiai ketinate spausdinti, ką pasakytumėte? 

Janelle: Ar tai būtų, Jūs įvedėte tą patį? 

David J. Malan: Taigi, jei s yra 1 ir t yra 10? 

Janelle: Jūs įvedėte skirtingus dalykus. 

David J. Malan: Būtent. Jūs įvedėte skirtingus dalykus. Viskas gerai. Taigi plojimų, jei galėtume, čia. [Plojimai] Tai buvo skausminga. Aš žinau. Gražiai padaryta. Taigi dabar galime pamatyti, jei mes negalime erzinti išskyrus ką nustatyti buvo. Ir, žinoma, kai mes fiksavome this-- kuri dabar aš atstovauju green-- mes padarėme keletą patobulinimų pora čia. Pirma, tik kaip sveiko proto Tikrinti, aš pirmą kartą patikrinti jei s lygi niekinis ir t lygi null. Ir tiesiog, kad būtų aišku, atveju gali būti s arba t niekinis kodą panašaus? Kai gali s ar t yra niekinis. Taip? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Būtent. Jei eilutė, vartotojas įvedėte yra per ilgas kad tilptų į atmintį, arba kai keista kampe atvejis, kaip kad, getString, kaip matysime, pažodžiui Šiandien savo dokumentus, sako, kad ji grįš null kaip ypatingą sarginių vertė, ar tiesiog tarsi specialus simbolis tai reiškia, kad kažkas negerai. Taigi, mes norime patikrinti kad, nes paaiškėja, kad niekinis yra labai pavojinga vertė. 

Dažnai, jei bandysite daryti kažką null apimantis function-- perduoti ją kaip indėlį, už instance-- šią funkciją gali labai bus katastrofos ir su juo, imtis žemyn visą savo programą. Taigi ši trečioji linija dabar yra tiesiog sveikas protas patikrinti, klaidų tikrinimas, jei bus. Štai geras įprotis dabar mums patekti į bet kuriuo metu mes pabandykite naudoti vertę, kuri potencialiai gali būti niekinis. 

Dabar, ketvirtoje eilutėje čia "Jei strcmp (s, t)," gerai, kas tai omenyje? Na, mes sakėme, tai buvo labai trumpai pavadinta funkcija styginių palyginimas. Ir jos gyvenimo tikslas yra palyginti jo pirmasis argumentas prieš jį, antra, bet ne pagal jų adresus, kaip mes netyčia padarė akimirka prieš su raudona kodą, tačiau o palyginti šių dviejų virvelės žmogiškai intuityvus būdas, lyginant, prieš tai tai, prieš tai, prieš tai, ir tada sustabdyti, jeigu ir kai vienas arba abu mano pirštus hitai Atgal nerijos velniop 0. Taigi kažkas metų prieš įgyvendinama strcmp įgyvendinti mums funkcionalumas kad mes tikėjomės mes Dotarłeś tiesiog lyginant du paprastus vertybes. 

Dabar atvirai, aš nuolat piešinį visų šių įvairių skaičių. Tačiau realybė yra, aš buvau ateityje jie iki visą laiką. Ir todėl leiskite man tiesiog eiti į priekį ir rašinėti tai iš padaryti tašką, kad tuo tikslu dienos ir juda į priekį, mes ne iš tikrųjų vyksta rūpintis kas kreipiasi viskas yra iš tikrųjų atmintyje. Taigi, aš nesiruošia daryti tai rūšių skaičių tiek daug daugiau, Aš tiesiog abstrakti tai toli šiek tiek daugiau draugiškas su vos strėlių. 

Kitaip tariant, jei s žymeklis, gerai, tegul tiesiog piešti, pažodžiui, kaip rodykle, rodykle iš sau ką nors kita, , o ne nerimauti per daug apie Šių adresų individualiųjų požymių kuris, vėlgi, aš vistiek. Bet mes pamatysime tuos adresus, kartais, kai derinimo kodą. 

Dabar tuo tarpu, ši programa čia pataisymai, žinoma, kad lyginant problema šios dvi eilutės. Bet mes įvažiavo į kitą problemą. Tai buvo iš kopijos programuoti paskutinį kartą, , pagal kurią, aš bandžiau pasinaudoti tiesiog Pirmasis simbolis eilutę. Bet tai, kas buvo simptomas mes matėme paskutinį kartą, kai vartotojas įvedėte vertė, kaip Gabe mažosiomis raidėmis, nes s, tada mes priskirti s į t, kaip trečioje eilutėje ten, ir tada aš bandžiau pasinaudoti t laikiklį 0? Koks buvo poveikis keičiasi t laikiklį 0 čia? 

PUBLIKA: Jis pakeitė s. 

David J. Malan: Taip, Aš pakeičiau s, taip pat. Nes tai, kas buvo iš tiesų vyksta? Na, leiskite man pamatyti, jei aš galiu išvalyti iki šio paveikslėlyje, taip. 

Jei s, vėlgi, žodis g A, B, E, Backslash, 0 ir S mes toliau kuriame kaip dėžutėje čia, bet ne daugiau adresai. Leiskite nebedaryti dalykų. Leiskite tiesiog atkreipti paveikslėlį supaprastinti pasaulį. 

Kai aš pareiškiu, k su styginių t, , kuris sukuria tą atminties riekė. Aikštė atsitinka būti 32 bitai daugelyje kompiuterių. Iš tiesų, jei jūs kada nors girdėjote apie kompiuteris turintis 32 bitų architektūrą, tikrai išgalvotas kalbėti, kad tik reiškia, kad jis naudoja 32 bitų adresus. Ir kaip techninė žemę, jei jūs kada nors susimąstėte, kodėl vyresnio amžiaus kompiuteriai, jei jums iš tikrųjų bandė sriuba juos su daug RAM, gali turėti tik daugiausiai keturių gigabaitų RAM, gerai, kad dėl to, pažodžiui, jūsų senas kompiuteris galėtų tik skaičius toks didelis, kaip 4 Milijardas 4 milijardas baitų, nes ji buvo naudojant 32-bitų numeriai adresus. 

Tačiau bet kuriuo atveju, tai Pavyzdžiui, istorija daug paprastesnis. t yra tik dar vienas žymeklis, arba tikrai char žvaigždė, taip pat žinomas kaip styga. Ir kaip aš noriu atnaujinti šį paveiksliuką dabar su tuo antroje eilutėje kodą po taškelio, dot, dot? Kai aš styginių t lygi ai kabliataškį, kaip tai vaizdas pasikeis? Taip? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Taip. Būtent. Aš tiesiog įdėti rodyklę nuo t dėžutė tuo pačiu adresu, pati pirmoji raidė išvedė. Arba techniškai, jei tai vaikinas vis dar buvo ne 0x1, tai kaip nors turėjau 0x1 čia ir 0x1 čia. Bet vėl, who cares apie adresus? Tai tiesiog idėja, kad dabar svarbiausia. Taigi, tai yra tai, kas vyksta čia. Taigi, žinoma, jei jūs darote t laikiklio 0, kuris yra masyvas žymėjimas, iš course-- ir atvirai, tai atrodo kaip ten masyvas per čia bet dabar ten tai keistai dalykas. Žinokite, kad programavimo kalba, C suteikia jums šią funkciją, , pagal kurią, net jei t yra žymeklis, arba s žymeklis, Jūs vis dar galite naudoti, kad susipažinę, patogus kvadratinių laikiklis notacijos eiti į pirmąjį elementą, arba antrasis elementas, arba bet koks elementas, kad žymeklis būtų nukreipta į, nes, matyt, ją yra, kaip šiuo atveju, nukreipta į tam tikrą masyvo. 

Taigi, kaip mes išspręsti šią problemą? Atvirai kalbant, tai yra, kai jis gavo tiek absoliuti iš pirmo žvilgsnio. Bet čia yra nauja ir patobulinta versija. 

Taigi, pirmiausia, aš gaunu atsikratyti CS50 bibliotekoje, tik atskleisti, kad S yra tikrai char žvaigždė, tiesiog sinonimas. Ir t pat char žvaigždė. Bet tai, kas vyksta ant dešinioji pusė tos linijos kur t yra priskiriama vertė? 

Kas yra malloc? Ką tai strlen? Kas yra sizeof (char)? Kodėl gi tai daro linija atrodo taip sudėtinga? Kas tai daro aukšto lygio? Kas tai saugoti t? Taip? PUBLIKA: Tai paskirstant tam tikras atminties. Tai saugoti, manau, raidės [nesigirdi]. 

David J. Malan: Perfect. Puikiai. Tai paskirstant tam tikras suma atminties laikyti, matyt, ateities raides. Ir visų pirma, malloc Todėl grįžimas ką? 

PUBLIKA: Grįžtant prie [nesigirdi]? David J. Malan: Būtent. Grįžtant prie tos atminties adresą, kuris yra išgalvotas būdas pasakyti, grąžina adresą Pirmas baitas tos atminties. Pareiga yra man prisiminti kiek atminties aš iš tikrųjų paskirstyti ar prašoma malloc už. 

Dabar, kiek tai yra? Na, nors ten iš skliausteliuose daug čia malloc trunka tik vieną argumentą. Ir aš nurodant strlen iš S, todėl suteikti man kaip ir daugelis baitai, nes yra s, bet ir pridėti vieną. Kodėl? Taip? 

PUBLIKA: Backslash 0. David J. Malan: Būtent. Mes turime padaryti šiek tiek namų ruošos. Taigi nes ten Backslash 0, mes norime geriau prisiminti. Priešingu atveju, mes ketiname sukurti eilutę, kuri neturi tokios specialios terminatorius. 

Tuo tarpu, tiesiog super analinis, turiu sizeof (char), tik tuo atveju, kažkas eina My kodas ne ant CS50 prietaiso, bet gal skirtingų kompiuterių iš viso, kur simbolių yra vienas baitas, pagal susitarimą, bet du baitų, ar kažkas daugiau nei tai. Tai tiesiog super, super nelinkęs klaidų. Nors, iš tikrųjų, tai greičiausiai bus 1. 

Dabar, tuo tarpu, aš einu į priekį ir kopijuoti eilutė, t laikiklis i lygi t laikiklis s. Ir aš atidėti iki praėjusios savaitės kodo pamatyti, kas vyksta. Bet svarbiausia Takeaway, ir Priežastis, kodėl aš įdėti kodą dabar žalia, yra todėl, kad tą pačią paskutinę eilutę, t laikiklis 0 lygi toupper, turi įsigaliojo Kapitalizacija kuris seka? t / ar s? Tai paskutinė eilutė kodą. 

Tiesiog t, nes tai, kas atsitiko ir šį kartą, jei aš šiek tiek anuliuoti, kad paskutinis žingsnis, kas atsitiko, kai aš skambinti malloc, Aš iš esmės gauti atminties riekė tai yra tokio pat dydžio kaip originalas, nes tai aritmetinis aš. Aš saugojimo t adresą tos atminties riekė. Nors tai atrodo gražiai ir graži, gražus ir tuščias, Realybė yra ten, ką mes išlaikyti skambina, šiukšlių vertybes čia. Tai atminties riekė might labai gerai buvo naudojamas anksčiau, kelias sekundes, prieš kelias minutes. Taigi gali visiškai būti numeriai arba raidės ten, tiesiog atsitiktinai. Bet jie negalioja, kol aš aš užpildyti šią atminties riekė su realiais simboliais, kaip aš padaryti, kad už linijos ten. Visa tiesa? 

Taigi, dabar, iš kulminacija šie trys pavyzdžiai kad buvo, atrodytų, skaldytų paskutinį kartą, tai Sukeisti pavyzdys, ši funkcija dirbo ta prasme, kad jis pavertė a ir b. Bet tai nepadėjo kokiu kitu prasme? Taip? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Būtent. Jei aš būčiau skambinti šią funkciją iš another-- pavyzdžiui, nuo panašaus pagrindinis, kur funkcija Turiu kintamasis, x ir y, kaip I padarė praėjusią savaitę, pats kodas, ir aš pereiti į x ir y Sukeisti ir tada skambinti Swap-- tai, Žinoma, yra teisinga versija yra tai, ką mes apie see-- ji neveikia. Taigi, kas yra pataisyti? 

Na, taip, tiesiog, kad būtų aišku, leiskite man eiti į priekį and-- duoti man vieną antra čia ir pamatyti jei aš galiu parodyti jums naujausia, kuris bus in-- pažiūrėkime, jei galiu rasti tai realus fast-- Gerai, [nesigirdi]. Gerai, ten yra. Taigi ignoruoti komandas aš tiesiog rašyti. Noriu gauti ne paskutinės minutės pavyzdys nuo paskutinio karto, o dabar vadinama ne Sukeisti ryšius. 

Taigi ne Sukeisti kur mes baigėte paskutinį kartą, , pagal kurią, aš inicializuoti x 1 ir y 2. Aš tada skambinti Sukeisti, einančios į 1 ir 2. Ir tada ši funkcija dirbo tam tikra prasme, tačiau ji neturėjo nuolatinės Poveikis x ir y. Taigi po ranka klausimas, kaip dabar mes iš tikrųjų išspręsti šią problemą? Kas yra po ranka sprendimas? 

Na, swap.c, kuris yra naujas ir šiandien, pastebėsite skirtumus pora. x ir y yra tas pats. Bet kas yra aiškiai skiriasi apie 25 eilutėje? Kas naujo ten, jei jūs žinote, kaip ji atrodė prieš sekundę? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Taip. Taigi jungimo simboliai yra naujasis kūrinys sintaksė ne tik šioje programoje, bet ir apskritai CS50. Iki šiol, aš nemanau, kad mes matėme jokių pavyzdžių ar tikrai kalbėjo apie juos bet detalė, išskyrus, galbūt, Preemptively skyriuje, kaip tai ampersand. Na, it turns out ampersand yra vienas paskutinių gabalų naujos sintaksės mes ketiname mokytis. Visa tai reiškia, adresas tikru kintamuoju. Tuo, ką adreso x gyventi? Bet kas adreso y gyventi? Nes jei pagrindinė problema prieš buvo, kad x ir y gauna naudos iš kopijos, ką tikrai nori daryti yra suteikti Sukeisti su panašiu lobis žemėlapis, kuris veda ten, kur x ir y, faktiškai yra RAM, kad Sukeisti galite sekti, kad žemėlapį ir eiti ten, kur x ir y žymi vietoje ir pakeisti faktines reikšmes 1 ir 2 ten. 

Taigi Sukeisti reikia šiek tiek pakeisti taip pat. Ir iš pirmo žvilgsnio, tai gali atrodo šiek tiek panašus į char žvaigždė. Ir iš tiesų jis yra. Taigi yra rodyklė, kokio tipo duomenis, remiantis šio paryškintos dalis? Taigi, tai vid. 

Taigi nebėra int tai iš int adresas. Ir panašiai, b dabar vyksta būti iš int adresas. Taigi, kai aš dabar vadiname Sukeisti iš esmės, Nesiruošiu duoti SWAP 1 ir 2 dalys. Aš ruošiuosi duoti jį kaip Jaučio kažkas ir Jaučio kažkas, du adresai, kurie bus sukelti Sukeisti jų faktinį vietose Mano kompiuteris atmintyje. 

Taigi dabar, mano likusi įgyvendinimas reikia keisti tad. Kas akivaizdžiai skiriasi dabar šių trijų eilučių kodo? Yra suknisti kompai žvaigždutės visi visur, viskas gerai? Taigi, kas čia vyksta? Taip? 

PUBLIKA: Tai akivaizdžiai [nesigirdi]. 

David J. Malan: Būtent. Taigi šiuo context-- ir tai buvo ne dizainas sprendimas geriausias, tiesa, prieš metus. Šiame kontekste, kur Jums tereikia žvaigždė, ir jūs neturite duomenų tipą, kaip int, nedelsiant į kairę, o tu turi vienodą ženklą, aiškiai, Šiame kontekste, kai jūs sakote, žvaigždė, tai reiškia, kad eiti į adresas tai yra. Sekite lobių žemėlapį, taip sakant. 

Ir tuo tarpu, pagal 37, tai reiškia tą patį. Eiti į adresų a ir įdėti ką ten? Nepriklausomai yra vieta, b nurodo. Kitaip tariant, eiti į b. Gauk šią vertę. Eiti į, o už lygūs pasirašyti, priskyrimo operatorių, įdėti šią vertę ten. 

Panašiai, int temp yra tik vid. Nieko reikia keisti apie temp. Tai tiesiog atsarginis stiklas Annenberg dėl tam tikrų pieno ir apelsinų sulčių. Bet aš reikia pasakyti, eikite į b. Eiti į tą paskirties vietą ir įdėti vertę temp ten. Taigi, kas vyksta tada? Kai aš iš tikrųjų skambinti Sukeisti šį kartą, jei šis pirmasis padėklas čia atstovauja Main, tai antras dėklas atstovauja Sukeisti, kai Galiu perduoti Ženklas x ir y ampersand iš Pagrindinė Sukeisti, tiesiog, kad būtų aišku, kas tai yra kamino rėmas priimanti? Taip? 

PUBLIKA: [nesigirdi]. David J. Malan: Būtent. X adresas ir y adresas. Ir jūs galite galvoti apie tai kaip pašto adresais. 33 Oxford Street ir 35 Oxford Street, ir jūs norite perkelti du pastatai kad yra ne tose vietose. 

Tai tarsi juokinga idėja, bet tai viskas, ką mes vadiname adresą. Kur pasaulyje galima jums rasti šiuos du int? Kur pasaulyje galima rasti tuos du pastatus? Taigi, jei pagaliau, po visą šį laiką aš eiti į šiandienos kodo ir kaupia Apsikeitimo sandorių ir paleisti ./swap, galiausiai, už Pirmą kartą mes iš tikrųjų matyti, kad mano vertybės yra iš tiesų Sėkmingai pavertė. Ir dabar, mes netgi galite imtis dėmesį tai, tarkim, gdb. 

Taigi leiskite man eiti į tą patį failą. Leiskite man eiti į priekį ir paleisti gdb apie ./swap. Ir dabar, Swap, aš ruošiuosi eiti į priekį ir nustatyti lūžio tašką Maino. Ir dabar aš ruošiuosi eiti į priekį ir paleisti programą. Ir dabar mes matome savo kodą pristabdoma tos linijos. 

Jei aš einu į priekį ir spausdinti x, ką turėčiau pamatyti čia? Tai klausimas. Pasakykite, kad dar kartą? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Taigi atsitiktiniai skaičiai, gal. Gal man pasisekė, ir tai gražus ir paprastas, kaip ir 0. Bet gal tai kai atsitiktinių skaičių. Šiuo atveju, aš laimingas. Jis tiesiog taip atsitinka, kad būtų 0. Bet tai iš tiesų laimė, nes ne tik aš įrašykite kitą, ir tada spausdinti x yra, kad linija kodą, linija 19, buvo įvykdytas. 

Tuo tarpu, jei aš tipo šalia ir vėl dabar atsispausdinti y, aš ruošiuosi pamatyti 2. Dabar, jei aš tipo šalia, jis ketina gauti šiek tiek klaidina, nes dabar, printf ketina pasirodyti ekranas, kaip jis tai padarė. x yra 1. 

Leiskite tai padaryti dar kartą. O dabar, štai kur viskas pasidaro įdomu. Prieš aš vadinu Sukeisti ar net žingsnį į jį, tegul šiek tiek žvilgtelėti. x yra, vėlgi, 1. Y yra, žinoma, greitai normalumas Tikrinti, 2, todėl nėra sunku ten. Bet kas yra ampersand x? Atsakymas, tai rūšies funky ieško. Bet int žvaigždė skliausteliuose yra tik GDP būdas pasakyti tai adresą. Tai ne int, tai rodyklė į int, arba kitaip žinomas kaip adresą. 

Kas tai yra beprotiškas dalykas? Mes niekada kažką labai patiko, kad prieš. Taigi tai yra mano kompiuteryje adresas atmintis kur x atsitinka gyventi. Tai Jaučio kažkas. Ir tai, tiesą sakant, kodėl Aš pradėjau rengti rodykles, vietoj skaičiaus, nes kas tikrai rūpi kad jūsų int yra ypač adresas tai, kad didelis. Bet bffff0c4, visa tai yra iš tiesų šešioliktainius skaitmenis, kuris yra 0 per f. 

Taigi mes neketiname sustoti per ilgai ką tie dalykai yra. Bet jei aš atsispausdinti y, Žinoma, aš matau 2. Bet ampersand m, matau šį adresą. Ir pranešimas, už smalsus, kaip toli vienas nuo kito, yra x ir y? Galite ignoruoti dauguma adresą. Keturi baitai. Ir tai atitinka mūsų anksčiau teigia, kad tai, kaip didelis yra int? Keturi baitai. Taigi atrodo, kad viskas rikiuojasi gražiai, kaip galite tikėtis, atmintyje. 

Taigi dabar galime tik pirmyn į šio straipsnio pabaigoje. Vykime į priekį ir įveskite žingsnį, pasinerti į Swap funkcija. Dabar pastebėsite, jei aš tipo, tai identiškas x adresą. Jei aš B tipo, tai vienodi į y adresą. Taigi, ką turėčiau pamatyti, jei aš sako, eikite adresu yra? Taigi spausdinti žvaigždė. Taigi žvaigždė reiškia eiti ten, šiame kontekste. Ženklas reiškia tai, kas iš adresas. Taigi žvaigždute priemones 1. Ir spausdinimo žvaigždė b suteikia man 2. 

Ir leiskite man manyti, bent jau šiuo metu, kad bent kodas, pajamos vykdyti, dabar gali būti motyvuotas per tokiu būdu. Bet mes peržiūrėti šią idėją prieš ilgas. Taigi šis Sukeisti versija dabar teisinga ir leidžia mums apsikeitimo šį konkretų duomenų tipą. 

Taigi bet kokie klausimai tada Swap? Dėl žvaigždė? Dėl adreso? Ir jūs pamatysite, su problema nustatyti 4, rūšiuoti, bet problema nustatyti 5, tikrai, kaip jie viskas yra naudinga ir gauti daug daugiau patogu su jais, kaip rezultatas. Nieko ne visi? Viskas gerai. Taigi malloc, vėlgi, ši funkcija kad tik skiria atminties, atminties paskirstymas. Ir kodėl tai yra naudinga? Na, visa tai laikas, jūs jau naudojate malloc. Jei manote, kad dabar, kaip getString darbus, matyt, tai klausia ką nors iš riekė atminties, kada vartotojas įveda eilutę į, nes mes tikrai nežinojo, kaip CS50 darbuotojų, kaip didelis tuos stygos, kad žmonės ketina įvesti gali būti. 

Taigi leiskite, kad pirmą kartą, pradėti Nulupkite Kaip veikia CS50 biblioteka darbai, būdu iš pavyzdžių pora kad nuves mus ten. Taigi, jei aš atverti gedit ir atverti scanf 0, mes ketiname pamatyti šį kodą. Scanf 0, galima rasti už svetainės Šiandien yra gana keletą eilučių kodo čia 14 per 20. Ir pažiūrėkime, ką jis daro. Jis pareiškia, int, vadinamas x. Ji sako kažką panašaus skaičius prašom. Ir dabar ji sako, scanf% i & x. Taigi, čia yra naujų dalykų krūva ten. 

Bet scanf, galite rūšies galvoti iš kaip printf priešingai. printf, žinoma, grafika ekrane. scanf tarsi skenuoja nuo vartotojo klaviatūra kažkas jis ar ji įvedėte. 

% I kaip printf. Tai reiškia, tikėtis vartotojas tipo int. Ir dabar, kodėl manote, kad aš gali būti perduoti scanf & X? Jei į gyvenimą scanf tikslas yra gauti kažką iš vartotojo, kas yra prasmė perduoti ją, ir x, o dabar? Taip? 

PUBLIKA: [nesigirdi]. David J. Malan: Būtent. Nepriklausomai I žmogaus, įveskite, mano indėlis ketina būti išsaugotas toje vietoje. Tai nėra pakankamai, primename, kad tik pereiti į x, nes mes matėme jau, bet kuriuo metu jums praeiti tik žalio kintamasis, kaip int, prie kai kurių kitų funkcijų, Žinoma, ji gali pakeisti, kad kintamasis, bet ne visam laikui. Ji negali turėti įtakos pagrindinis poveikis. Tai gali pakeisti tik savo vietinį kopiją. Bet jei, vietoj to, jums nereikia man tikrąjį int, bet jūs man nurodymus kad int, aš dabar yra scanf, žinoma, aš galiu sekti, kad spręsti ir įdėti numerį ten todėl jūs turite prieigą prie jo taip pat. 

Taigi, kai aš paleisti šią programą, pažiūrėkime. Padaryti scanf 0 dot velniop, scanf 0. Ir jei aš dabar tipo numerį kaip 50 Ačiū už 50. Jeigu aš dabar įveskite panašaus skaičių neigiamas 1, už neigiamas 1. Aš dabar tipo numerio kaip 1,5, hm. Kodėl mano programa ignoruoja mane? Na, nes tiesiog pasakiau tai tikėtis int tik. Viskas gerai. Štai viena versija apie tai. Paimkime dalykų vienu žingsniu ir siūlyti, kad tai nėra gerai. Ir čia slypi labai paprastą pavyzdį kaip mes galime pradėti rašyti kodą kad kiti žmonės gali išnaudoti arba kompromisą, darant blogus dalykus. Taigi linija 16, toks panašus dvasia, kad anksčiau, bet aš ne dėl jo int šį kartą. Aš paskelbti ją char žvaigždė, taip pat žinomas kaip eilutę. 

Bet ką tai iš tikrųjų reiškia? Taigi, jei aš neturiu nurodyti address-- ir Aš vadiname tai savavališkai, buferis, bet aš negalėjau skambinti ji s, kad būtų simple-- ir tada aš tai padaryti, paaiškinkite man, jei remiantis ankstesnių galėtumėte, logika, kas scanf daro pagal 18, jei perdavimą% s ir buferio, kuris yra adresas? Kas yra scanf, jei taikoma tiksli pati logika kaip versijoje 0, einu bandyti daryti čia, kai vartotojas įveda kažkas? Taip? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Būtent. Scanf iki logika anksčiau, ketina imtis eilutę kad žmogaus įvedėte in-- tai dabar seka, tai ne skaičius, matyt, jei jis ar ji cooperates-- ir jis ketina bandyti įdėti, kad styginių atmintyje ne kokios adresą buferis nurodyta. Ir tai yra puiku, nes buferis iš tikrųjų reiškia būti adresas. 

Bet aš teigia, ši programa yra Buggy labai rimtas būdas, nes tai, ką vertės yra buferio pagal nutylėjimą? Ką aš inicializuoti į? Kas riekė atminties? Aš neturiu, tiesa? 

Taigi, nors aš skiriamos char žvaigždė, kad manimi nebėra vadinamas s tai vietoj vadinamas, buffer-- taip tegul atkreipti kintamojo vardą dabar kaip buffer-- jei aš ne vadinamas getString arba malloc čia kad iš esmės reiškia, kad buferis yra tik keletas šiukšlių vertė. 

Dabar ką tai reiškia? Tai reiškia, kad aš sakiau scanf tikėtis iš vartotojo eilutę. Ir žinote ką? Nepriklausomai šis dalykas yra nukreipta to-- ir piešiu klaustuką, bet iš tikrųjų, tai bus kažkas panašaus OX1, 2, 3, tiesa? Tai kai fiktyvus vertė, kad tik atsitinka, kad ten iš anksčiau. Taigi Kitaip tariant, tai tarsi buferis yra tik nukreipta į kažką atmintyje. Aš neįsivaizduoju, ką. 

Taigi, jei aš tipo Gabe dabar vyksta pabandyti įdėti G-a-b-e / 0 ten. Bet kas žino, kas tai yra? Ir praeityje, bet kartą mes bandėme paliesti atmintis, kuris nepriklauso mus, kas įvyko? Arba beveik kiekvieną kartą. Segmentavimas kaltė, tiesa? 

Tai rodyklė, aš neįsivaizduoju, kur jis nukreipta. tai tik keletas atsitiktinių vertė. Ir, žinoma, jei jūs interpretuoti Atsitiktinis dydis, adresą, jūs ketinate eiti į kai atsitiktinė vieta. Taigi gabe tiesų gali avarijos mano programa šiuo atveju čia. 

Taigi, ką mes galime padaryti, kad beveik taip blogai? Apsvarstykite šį trečiasis ir galutinis pavyzdys scanf. Ši versija yra geriau kokia prasme? Jei esate patenkintas ankstesnė problema, tai yra geriau. Kodėl? 

PUBLIKA: [nesigirdi]. David J. Malan: Geras. Taigi šis atvejis atitinka 16 yra geriau, ta prasme, kad mes aiškiai skiriant šiek tiek atminties. Mes ne naudojant malloc, mes naudojame savaitę 2 požiūris tiesiog skelbiantis masyvą. Ir mes sakėme anksčiau, kad eilutė yra tik simbolių masyvas, todėl tai yra visiškai teisėta. Bet tai, žinoma, kaip Jūs dėmesį, kad fiksuoto dydžio, 16. 

Taigi ši programa yra visiškai saugus, jei aš tipo vienu ženklų eilutes, du charakteris stygos, 15 simbolių sekas. Bet kaip tik aš pradedu rašyti 16, 17, 18, 1000 charakterio stygos, kur yra ta eilutė ketina baigti? Jis ketina baigti iš dalies čia. Bet tada, kas žino, ką dar yra už ribų Šio ypač masyvo? 

Tai tarsi aš paskelbė 16 langelius čia. Taigi, o ne atkreipti dėmesį visų 16, mes tiesiog apsimesti, kad aš sudarytas 16. Bet jei aš tada bandykite skaityti eilutę kad daug ilgiau, kaip 50 simbolių, Aš ruošiuosi pradėti naudoti a, b, c, d, x, y, z. Ir tai turbūt kai kurios kitos atminties segmentą kad, vėlgi, gali sukelti mano programa į avariją, nes aš neprašė nieko daugiau nei tik 16 baitų. 

Taigi, kas rūpi? Na, čia CS50 biblioteka. Ir dauguma tai tik kaip instrukcijų iki viršaus. CS50 biblioteka, visą šį laiką, turėjo šią eilutę, atitinkančią 52. Mes matėme Typedef arba pamatysite Typedef į pset 4, kuri tiesiog sukuria sinonimas, kai char žvaigždė gali būti daugiau tiesiog vadinama eilutę. Taigi, tai yra vienas iš Keletas mokymo ratai mes naudojamas slaptai po gaubtu. 

Tuo tarpu, čia yra funkcija, getchar. Dabar, matyt, nėra kūno į jį. Ir iš tiesų, jei aš nuolat slinkimo, aš ne iš tikrųjų matyti jokių diegimo Šių funkcijų. Kaip sveiko proto patikrinti, kodėl taip yra? 

PUBLIKA: [nesigirdi]. David J. Malan: Taip. Taigi tai yra failo antraštės. Ir header failuose yra prototipus, plius kai kurių kitų dalykų, atrodo, kaip tikrų tipų. Bet CS50.c, kuri mes niekada davė jums atvirai, bet buvo ir CS50 prietaiso visi šį kartą, giliai viduje jos aplankus, pastebėsite, kad ten visa krūva funkcijų čia. 

Iš tiesų, tegul slinkite žemyn. Leiskite ignoruoti dauguma jų dabar. Bet pereikite getInt ir pamatyti, kaip getInt veikia. Taigi čia yra getInt. Ir jei jūs kada nors tikrai rūpinosi, kaip gauti int veikia, čia yra jo dokumentai. Ir tarp dalykų, ji sako, tai jums pasakys, ką ji gali grįžti dydžių verčių skalės. Tai iš esmės neigiama 2 mlrd teigiamas 2 mlrd, suteikti arba užtrukti. 

Ir it turns out, visa tai laikas, nors mes niekada buvo patikrinti jį, jei kas nors negerai, paaiškėja, kad visi šį kartą, getInt turi buvo grįžta ypatingą pastovus, o ne niekinis, o int_max, kuris yra Tiesiog programuotojas konvencija. Tai reiškia, kad čia yra ypatinga vertybė. Įsitikinkite, kad patikrinti, ar tai tik jei kas nors negerai. Bet mes niekada nesiteikė su, kad iki šiol nes vėl, tai yra skirtas supaprastinti. 

Bet kaip getInt gauti įgyvendinama? Na, vienas, jis nesiima jokių argumentų. Mes žinome, kad. Ji grąžina int. Mes žinome, kad. Taigi, kaip jis veikia po gaubtu? 

Taigi ten, matyt, begalinis kilpa, bent vienas pasirodymas. Atkreipkite dėmesį, kad mes naudojame getString. Štai įdomus. getInt ragina mūsų funkcija, getString. O dabar, kodėl galėtų tai būti atvejis? Kodėl aš yra gynybinė čia atitinka 165? Kas gali atsitikti linija 164, tiesiog, kad būtų aišku? Tai tas pats atsakymas kaip ir anksčiau. Gali būti tik iš atminties. Kažkas negerai su getString, mes turime gebėti dirbti, kad. Ir priežastis, kodėl aš negrįžta null yra kad techniškai, NULL rodyklė. getInt turi grąžinti int. Taigi aš savavališkai nusprendė iš esmės, kad 2 mlrd, suteikti arba užtrukti, vyksta būti ypatinga vertę, kad aš niekada negali faktiškai gauti iš naudotojo. Tai tiesiog viena vertė Aš ruošiuosi atliekų atstovauti klaidos kodą. 

Taigi, dabar, ko gauti šiek tiek fantazijos. Ir tai ne visai tas pats funkcija kaip ir anksčiau, bet tai labai panašūs. Taigi pastebėsite, aš pareiškiu čia, linija 172, tiek int n ir char c. Ir tada aš naudoju šį funky linija, sscanf, kuris paaiškėja, nenuskaito iš klaviatūros eilutę. Ji stovi esamą eilutę, vartotojas jau įvedėte. Taigi, aš jau vadinamas getString, kuris tai turiu atmintyje eilutę. sscanf yra tai, ką norite skambinti parserem funkciją. Ji žiūri į eilutę aš įvestas, charakterį pobūdžio, ir daro kažką naudingo. Tai eilutė yra saugomi linijos. Ir aš žinau, kad tik vyksta atsarginę kopiją čia ir sako, oi, gerai, Aš pašaukiau jį ne s tai laikas, bet linija. 

Ir dabar tai yra šiek tiek kitoks. Bet tai iš esmės reiškia, dėl priežasčių, mes šiek tiek bangų mūsų rankas šiandien, kad mes Tikriname pamatyti, jei vartotojas turi įvesti ir int, o gal dar charakteris. Jei vartotojas įvedėte int, tai bus saugomi n, nes aš artimųjų tai pagal adresą, nauja triukas mes matėme šiandien. Jei vartotojas taip pat įvestas Panašiai 123x, kad x ketina baigti raidė simbolių c. 

Dabar paaiškėja, kad sscanf man pasakys, protingai, kiek kintamieji buvo sscanf sėkmingai galėtų užpildyti. Taigi pagal šią logiką, jei funkcija Aš įgyvendinančius getInt, bet aš patikrinti, potencialiai vartotojui į įvedėte int Po kažkas, ką aš noriu sscanf s Grąžina reikšmę tikrai turi būti? Jei tikslas yra gauti tik nuo naudotojo int? 

Taigi, jei sscanf grąžą 2, ką tai reiškia? Vartotojas turi įvesti kažkas panašaus, tiesiog, 123x, kuris yra tiesiog nesąmonė. Tai klaida sąlyga, ir Noriu patikrinti, kad. 

Taigi, jei vartotojas įveda tai, kurią tai logika, ką sscanf grįžti, Ar galėtumėte pasakyti? Taigi jis ketina grįžti 2, nes 123 ketina eiti čia ir x ketina baigti čia. Bet aš nenoriu x gauti užpildyti. Noriu sscanf tik pavyks pildymo pirma jos kintamųjų. Ir taip tai kodėl aš nori sscanf grąžinti 1. 

Ir jei tai virš galvos šiek tiek šiuo metu, tai visiškai gerai. Suprantu, nors, kad viena iš vertės getInt ir getString yra tai, kad mes darome su velniais tikrinti, kaip šis, kad daug klaidų , kad iki šiol, galite gana daug įrašykite nieko klaviatūroje, ir mes sugauti jį. Ir mes tikrai, darbuotojai, tikrai ne būti iš Bug šaltinis jūsų programa, nes mes gintis tikrinti visas kvailas dalykų, kad vartotojas gali padaryti, kaip rašyti eilutę, kai jūs tikrai norėjo int. Taigi now-- mes ateiti atgal į tai prieš long-- bet visą šį laiką, getString ir getInt turi buvo po kapotu, naudojant šį Pagrindinė idėja adresai atmintyje. 

Taigi dabar padarykime dalykus tiek patogesnis. Kaip Jūs galbūt žinote, iš Binky paskutinio LAIKĄ_ jei mano pelė bus cooperate-- taip mes turėjome šį kodą, kuris tiesą sakant, yra gana absurdiškas. Šis kodas pasiekia nieko naudinga, bet ji buvo pavyzdys kad profesorius Parlante naudojamas siekiant atstovauti kas vyksta programa, apimanti atmintį. 

Taigi leiskite atpasakoti tai istorija super trumpai. Šios pirmos dvi eilutės, visų Anglų, daryti tai, ką pasakytumėte? Tiesiog pagrįstai žmogaus, tačiau šiek tiek techniniai terminai, imtis Pabandyti. PUBLIKA: [nesigirdi]. 

David J. Malan: Gerai, jūs steigimo adresus savo x ir y kintamųjų. Ne visai, nes x ir y yra ne kintamieji tradicine prasme. x ir y yra adresai arba bus saugomi adresą. Taigi pabandykime dar kartą. Ne blogas pradžia, nors. Taip? 

PUBLIKA: [nesigirdi]. David J. Malan: Geras. Aš manau, kad tai šiek tiek švaresnis. Deklaruojančiojo dvi rodykles, du sveikieji skaičiai. Ir mes vadindami juos X ir Y. Arba, jei mes buvome atkreipti tai kaip paveikslėlyje, vėlgi, prisiminti paprasčiausiai, kad visi mes darome su šia pirmoje eilutėje rengia langelį, kaip tai, su tam tikru šiukšlių vertė jį, ir pavadino jį X, ir tada kitą kaip šis langelis, su tam tikru šiukšlių vertę joje, vadindami jį m. Mes paskelbė du rodykles, kad galiausiai bus saugomi iš int adresą. Taigi, kad viskas ten. 

Taigi, kai Binky tai padarė, molis tiesiog atrodė taip. Ir Nikas tiesiog rūšies suvynioti rodykles, tarsi jie nėra nukreipta niekur visų pirma, todėl, kad jie tiesiog Šiukšlių vertės. Jie nėra aiškiai inicializuoti bet visų pirma. 

Dabar kitas linija kodas, prisiminti, buvo tai. Taigi pagrįstai patogus, bet šiek tiek techninės anglų, kas tai yra iš kodas darai linija? Taip? 

PUBLIKA: [nesigirdi]. 

David J. Malan: Perfect. Tai paskirstant riekė atminties tai iš int dydis. Ir tai pusė atsakymo. Jūs atsakė teisę pusė išraiška. Kas vyksta dėl Kairėje pusėje lygybės ženklą? Taip? PUBLIKA: ir priskiria tai kintamojo x? 

David J. Malan: ir priskiria tai kintamojo x. Taigi, norint Priminti, dešinėje pusėje skiria pakankamai atminties saugoti int. Bet malloc specialiai grąžina adresą tos atminties riekė, kuri jūs tiesiog pasiūlė pasireiškia saugomi x. 

Taigi, ką Nikas padarė paskutinį kartą su Binky yra jis tempia, kad žymiklį out, molis, atkreipti dabar balto riekė atminties kad yra lygi int dydis. Ir iš tiesų, tai reiškia, atstovauti keturi baitai. 

Dabar, kitą eilutę kodo tai padarė, žvaigždutė x gauna 42. Taigi 42 yra paprasta ant dešinioji pusė, gyvenimo prasmė. Kairėje pusėje, žvaigždutė x reiškia ką? Tai taip pat gali turėti gone-- kad viskas OK. Gerai. 

PUBLIKA: Iš esmės, eikite į [nesigirdi] David J. Malan: Geras. PUBLIKA: [nesigirdi]. David J. Malan: Būtent. Kairėje pusėje reiškia eiti į x. x yra adresas. Tai tarsi 33 Oxford Street, arba OX1. Ir žvaigždė x reiškia eiti į, kad spręsti ir įdėti ką ten? 42. 

Taigi iš tiesų, tai būtent tai, ką Nikas padarė. Jis pradėjo su BY, iš esmės, psichiškai nukreipta į pirštą x, po rodykle baltojo laukelį dešinėje pusė, ir pradėti šį numerį 42 ten. Bet tada viskas gavo mažai pavojinga, tiesa? Binky yra apie prarasti galvą. 

Žvaigždžių y lygus 13, nepasisekimas, tai ką? Taigi y zvaigzdes priemonė eiti į adreso y. Bet kas yra Y adresas? Gerai, tai šiukšlių vertė, tiesa? Aš patraukė jį kaip klaustuko. Nikas patraukė jį kaip susilankstyti iki rodyklės. Ir kuo greičiau, kaip jūs bandote daryti y zvaigzdes, sakydamas ten, bet nėra teisėtas adresas, tai kai fiktyvus vieta, Programa vyksta į avariją. Ir Binky galva vyksta nulėkti čia, kaip tai įvyko. 

Taigi, galų gale, šios programos buvo tik iš fiksuoto trūkumas. Tai buvo Buggy programa. Ir tai reikia nustatyti. Ir vienintelis būdas, tikrai, siekiant ją išspręsti būtų, pavyzdžiui, ši eilutė, kurį mes net ne gauti, nes programa sudužo per anksti. Bet jei mes išspręsti šią problemą, ką poveikis daro daro y lygios x turi? Na, ji iš esmės nurodo y ne kokia x vertė yra nukreipta ne. 

Taigi Nikas istorija, arba Binky istorija, tiek x ir y buvo nukreipta į baltos riekė atminties, kad, galiausiai, kai jums tai y zvaigzdes lygi 13 kartą, jūs galų gale išleisti 13 tinkama vieta. Taigi visų šių linijų puikiai teisėtas, išskyrus šį vieną, kai tai atsitiko prieš jus faktiškai suteiktas y šiek tiek vertę. 

Dabar, laimei, jūs ne turi samprotauti per visus iš šių klausimų rūšių apie savo. Leiskite man eiti į priekį ir atidaryti iki terminalo lange čia ir atverti, nes tik šiuo metu, super trumpas programa, kuri taip pat yra tarsi beprasmiška. Tai negraži. Jis neturi pasiekti nieko naudingo. Bet tai įrodyti klausimus atminties, todėl galime pažvelgti. 

Pagrindinis, super paprasta. Tai, matyt, vadina funkciją, f, tada grąžina 0. Tai tipo sunku netvarka tai padaryti. Taigi pagrindinis yra gana gera, iki šiol. 

Taigi f yra problemiškas. Ir tik neišleido daug pastangų į pavadinti jį čia laikyti ant kodas dėmesio. f turi dvi linijas. Ir pažiūrėkime, kas dabar vyksta. Taigi, viena vertus, here-- ir leiskite man padaryti tai atitinka ankstesnių example-- viena vertus, Kairėje pusėje yra daryti tai, ką, angliškai? Tai is-- PUBLIKA: Sukurti rodyklę. David J. Malan: Sukurti rodyklę int ir raginama ją x. Taigi tai sukurti vieną iš šių langelių Aš nuolat piešimo ant jutiklinio ekrano. Ir dabar, ant dešinėje pusė, malloc, žinoma, yra skiriančio atminties riekė. Ir tiesiog, kad būtų aišku, kaip Kiek atminties yra tai, matyt, skyrimą, jei jūs tiesiog rūšies padaryti matematiką čia? 

Taigi, tai 40 baitų. Ir aš žinau, kad tik todėl, kad aš žinau, int ant CS50 prietaisą, bent jau yra keturi baitai. Taigi 10 kartų 4 40. Taigi, tai yra saugoti yra x, adresas pirmojo iš 40 int, kad buvo paskirstytos vietos atgal, atgal, atgal, į nugarą. 

Ir tai, ką raktas apie malloc. Ji neatsižvelgia į mažai atminties čia šiek tiek čia, tiek čia. Jis suteikia jums vieną riekė atminties, Kaimynystėje nuo veiklos sistema. 

Dabar, ką apie tai, x laikiklis 10 lygi 0? Savavališkas linija kodą. Jis neturi pasiekti nieko naudingo. Tačiau įdomu tai, nes x laikiklis 10--? Taip? 

PUBLIKA: [nesigirdi]? 

David J. Malan: x laikiklis 10 neturi būti tuščias. Null detalė tik ateina į žaidimą su stygos, ne iš eilutės pabaigos. Bet gera mintis. 

Kaip didelis yra šis masyvas, net nors aš skyrė 40 baitų? Tai 0 per devynių, tiesa? Tai 10 ints, iš viso. 40 baitų, tačiau 10 ints, indeksuojami 0 per 0. 

Taigi, kas yra, kad x laikiklis 10? Tai tikrai kai nežinoma šiukšlių vertė. Tai atmintis, kuri nepriklauso man. Aš neturėtų būti neliesti, kad baitų skaičius 41, 42, 43, 44. Aš ruošiuosi šiek tiek per toli. 

Ir iš tiesų, jei aš paleisti šią programa, ji gali labai gerai avariją. Bet kartais, mes gauti pasisekė. Ir taip tik parodyti this-- ir atvirai, Jūs niekada nežinote, prieš jus do it-- Bėkim tai. Tai iš tikrųjų nebuvo avariją. 

Bet jei aš tai pakeisti, ir Pavyzdžiui, kad bus kaip 1000, kad tai tikrai sąmoningas, pažiūrėkime, jei mes galime gauti jį katastrofos šį kartą. Gerai, jis nebuvo avariją. Kaip apie 100,000? Leiskite perdaryti jį, o dabar iš naujo paleisti jį. Gerai. Phew. Viskas gerai. Taigi, matyt, vėlgi, tai segmentai atminties, taip sakant, yra pakankamai didelis, todėl mes galime gauti pasisekė vėl ir vėl. Bet galų gale, kai gausite juokinga ir tikrai eiti toli ekrane, Palietus atmintį, kad tikrai, tikrai nepriklauso jums. 

Bet tiesą sakant, tai rūšių vabalų vyksta būti sunkiau ir sunkiau išsiaiškinti savo. Bet laimei, kaip programuotojai, mes turime įrankiai, kurie leidžia mums tai padaryti už mus. Taigi, tai, ko gero, vienas iš ugliest programas, net bjauresnis nei GDB produkcijos. Bet ji visada turi liniją arba du, kad yra super naudinga. 

Valgrind yra programa, kuri padeda jūs ne debug programą, per se, bet rasite atmintis susijusi problemos, ypač. Jis bus automatiškai paleisti savo kodą Jūs ir surasti bent dviejų dalykų. Vienas iš jų, tu kažką atsitiktinis, kaip touch atminties kad ne priklauso jums? Tai padės jums rasti tuos atvejus. 

Ir du, tai padės jums rasti kažką, vadinamą Atminties nutekėjimas, kurią mes visiškai ignoruojamas, naiviai, tam tikrą laiką ir palaimingai. Bet pasirodo, visi šį kartą, kai jūs vadinamas getString į tiek daug iš mūsų programų, Jūs esate klausia operacinės sistema atmintyje, bet turite atsiminimai kada nors suteikiant jai atgal, daro NEPASK arba nemokamai, kaip tai vadinama. Ne, nes mes niekada paprašė tai padaryti. 

Bet visa tai laikas, programos rašote C buvo nesandarus atminties, klausia operacinės sistema vis labiau ir labiau atminties styginiams ir Papuošalą, bet niekada atiduodami jį atgal. Ir dabar tai yra šiek tiek iš supaprastinimas, Bet jei jūs kada nors paleisti Mac arba Jūsų kompiuteris gana ilgą laiką, atidarymo daug programų, gal uždarymo programoms, ir nors jūsų kompiuteris nėra sudužo, tai vis tiek daug lėtesnis, kaip nors, tai tikrai naudojant daug atminties arba ištekliai, nors, jei nesate net neliesti klaviatūra, kad galėtų be-- bet ne always-- galėtų būti, kad programos jūs naudojate pačios turi Atminties nutekėjimas. Ir jie nuolat klausia OS daugiau ir daugiau atminties, tačiau pamiršta apie tai, nėra faktiškai naudojant jį, bet Todėl atsižvelgiant atmintį toli iš kitų programų, kurios gali norėti jį. Štai bendras paaiškinimas. Dabar čia, kur Valgrind s produkcija yra visiškai žiaurią tiems mažiau ir patogesnis panašūs. Bet įdomu Daiktai yra teisinga čia. Jis pasakojo neteisingą rašyti apie dydis keturių atsitiks šioje programoje, visų pirma, iš memory.c 21 eilutėje. 

Jei aš einu į liniją 21, hm, ten iš tikrųjų yra negaliojantis rašymo dydžio keturių. Kodėl dydis keturių? Na, tai number-- ir gali būti anything-- yra vid. Taigi tai keturi baitai. Taigi, aš išleisti keturi baitai kur jie nepriklauso. Štai ką Valgrind iš tikrųjų man sako. Be to, ji taip pat bus pasakykite man, kaip matysime, kaip paleisti tai būsimo pset, jei ir kai jūs nutekėjo atminties, kuri iš tiesų Turiu, nes aš vadinamas malloc, bet aš ne iš tikrųjų vadinamas, šiuo atveju, nemokamai, kurią mes galų gale pamatyti yra malloc priešais. 

Taigi, dabar, manau, galutinį pavyzdį. Taigi, tai viena yra šiek tiek daugiau paslaptinga, bet tai galbūt Didžiausia priežastis, kad Būkite atsargūs su atmintim, ir todėl, kad daug programų, ir / arba interneto serverių, net iki šios dienos, perėmė blogi vaikinai kažkur internete, kurie yra vienaip ar kitaip siųsti netikrą paketus į serverį bando sukompromituoti savo sąskaitas, arba imtis savo duomenis, arba tiesiog paprastai perimti mašina. Buferio perpildymas, kaip pavadinimas rodo, priemonės perpildyta ne int, bet buferio. Ir buferis yra tik išgalvotas būdas pasakyti, kad tai atminties krūva. 

Ir iš tiesų, aš vadinamas styginių prieš buferį, o ne s. Nes jei tai buferis, kaip "YouTube" prasme, arba bet kuriuo metu žiūrite vaizdo įrašą, jūs galėjote pastebėti žodį buferio, taškas, taškas, taškas. Tai neįtikėtinai erzina. Ir tai tik reiškia, kad jūsų vaizdo grotuvas bando atsisiųsti daug baitų, daug baitų iš iš interneto video. Bet tai lėtas, todėl jis bando atsisiųsti iš jų krūva užpildyti buferio, konteinerį, kad turite pakankamai baitų, kad ji gali tada parodyti jums video, be pristabdę nuolat. Tačiau it turns out, jūs galite turi buferį į tai didelis. Bet pabandykite įdėti tai daug duomenų jis, ir labai blogi dalykai gali atsitikti. Taigi, pavyzdžiui, pažvelkime tai galutinis kibinimas kaip pavyzdys. Tai dar viena programa kad, iš pirmo žvilgsnio, nieko super naudingo nedaro. Jis gavo Pagrindinė funkcija kad prašo šią funkciją, f. Ir, kad funkcija f, čia turi char masyvas, vadinamas C dydžio 12. Ir tada ji naudojant šią nauja funkcija vadinama strncpy. 

Pasirodo, kad su šia paprasta, paprasta linija kodą, vos dvi eilutės, mes padarėme visą savo programą, , todėl visos mano kompiuteryje, ir mano vartotojo sąskaita, ir mano kietajame vairuoti potencialiai pažeidžiamas visiems kas žino, ir yra pakankamai gera paleisti ši programa su tam tikra komandų eilutės argumentas. Kitaip tariant, jei tai blogas vaikinas kelia viduje argvargv [1] įvesdami prie klaviatūros labai specialiai meistriškai eilutė, o ne abc, 123, bet iš esmės, dvejetainiai simboliai, atspindintys vykdomąjį kodas, programa, kad jis ar ji parašė, su šia paprasta programa, kuri yra atstovas tūkstančių programų kad yra panašiai pažeidžiamos, Manyti, jis ar ji galiausiai gali ištrinti visus ant mano kietajame diske failus, gauti mirksi eilutę taip, kad jis arba ji gali įrašykite komandas savo, pašto visus failus į save. Viskas, ką galiu padaryti, jis ar ji gali daryti su šiuo kodu. 

Mes ne visai tai išspręsti dar. Ir iš tiesų, jis ketina įtraukti šiek tiek vaizdą kaip šis, kurį mes netrukus suprasti visi geriau. Tačiau šiandien, tegul baigiasi kas, tikiuosi, šiek tiek daugiau suprantama XKCD pokštas, kol mes vėl kitą kartą. Viskas gerai. Pasimatysime trečiadienį. 

[Muzikos grojimo] 

GARSIAKALBIS: Ir dabar, giliai mintys, pagal Daven Farnham. Atmintis yra tarsi šokinėja į į krūvą auksiniai lapai ant sekmadienio popietę. Vėjas pučia, supimas savo hair-- oh, aš praleisti dienas, when-- 

[Juokas]