[Muziciranja] DAVID J. Malan: U redu. Ovo je CS50. I ovo je početak tjedna 5. I kao što ste primijetili, Neki od materijala dobiva malo više kompleks, malo gušće. I to je vrlo lako, pogotovo ako se bili ste u naviku za neko vrijeme, da se pokušava piskarati dolje najviše ništa što činimo, govorimo u klasi. Ali shvatite, da nije možda Idealna pedagoški pristup učenju ovu vrstu materijala, i materijal općenito. I tako smo zadovoljstvom objaviti da je CS50 vlastiti Gheng Gong je počeo pripremati kanonsko Skup bilješke za tečaj, nada što je to, jedan, to ne služe samo kao Referentna i resursa za pregledavanje materijala i ide natrag kroz materijal koji bi mogli imati pobjegao vam prvi put okolo, ali također, tako da vaše glave može biti više gore nego prema dolje, kada ga dođe vrijeme za predavanje, tako da bi mogao angažirati više zamišljeno, kao za razliku od više scribbly. Uz to, rekao je, ono što ćete naći na Web stranica je takve dokumente koji to. I obavijest, u gornjem lijevom uglu, postoji ne samo sadržaj, ali i vremenski kodovi koji odmah će vam skočiti u odgovarajućem dijelu u video online. A što je Chang ovdje je učinio je, u biti, dokumentirani ono što se dogodilo u ovom Posebno predavanje. A mnogi od predavanja su Već sada online s ovim URL. I dalje ćemo objaviti ostatak onih do kraja ovog tjedna, pa ne iskoristiti taj resurs. Dakle, bez dodatnih teškoća, počeli smo guliti natrag sloj koji je bio Niz za neko vrijeme. A ono što smo rekli niz zapravo je prošlog tjedna? Dakle char zvijezda. I char zvijezda, dobro, što nije to zapravo znači? Pa, sve ovo vrijeme, ako ste Zvao funkciju, kao getString i skladištenje tzv povratnog Vrijednost getString u variable-- to se zove S Type string-- smo pisanje linija koda tamo gore. I to je samo kad vidim da Rukopis ovdje veliča ne shvaćam koliko je to grozno. Međutim, pretpostavimo da je, Na desnoj strani je, ipak, razumni prikaz onoga što je odlazeći na sve ovo Vrijeme s getString. getString, naravno, dobiva niz. No, što to zapravo znači? To znači da dobiva komad memorije od operativnog sustava pozivom funkcije, nazvao malloc. No, više o tome kasnije. I onda se popunjava koji komad memorije sa slovima korisnik upisali u, nakon čega, naravno, null karakter, ili Obrnuta kosa crta nula na samom kraju. U međuvremenu, na lijevoj strani ove priče, sve ovo vrijeme, mi smo bili proglašenja varijable, kao što ih godina. I to je ono što se sada varijabla će početi pozivati ​​pokazivač. Nije okvir unutar kojega stavimo string, Daven, sama po sebi, već smo stavili na tom trgu okvir s lijeve strane što točno? Da? PUBLIKA: adresu gdje se nalazi u memoriji. DAVID J. Malan: Točno. Adresu gdje Daven Nalazi se u memoriji. A ne gdje svi Daven nalazi, po sebi, ali je posebno adresa od čega? Da? PUBLIKA: Prvi znak. DAVID J. Malan: Prvi znak u Daven, koji, u ovom slučaju, Predložio sam bio samovoljno i nerealno 1, Ox1, što samo znači heksadecimalni broj 1. No, to vjerojatno ide biti mnogo veći broj da bismo mogli izvući s 0x kao prefiks, predstavlja heksadecimalni karakter. I zato nam ne treba znati gdje Ostatak od likova Daven su, zbog onoga što jednostavan dizajn Odluka da je napravljen prije mnogo godina? Da? PUBLIKA: Kosa crtica 0. DAVID J. Malan: Da, točno. Obrnuta kosa crta 0 omogućuje, iako u linearnog vremena, proći niz, hoda s lijeva na desno, sa za petlju, ili neko vrijeme petlje, ili nešto slično da, i odrediti, oh, ovdje je kraj ovom nizu. Dakle, sa samo adresu na početak niza, možemo pristupiti u cijelosti da, jer je sve ovo vrijeme, Niz je upravo char zvijezda. Tako da je sigurno u redu nastaviti koristiti CS50 knjižnica i to apstrakcija, da se tako izrazim, ali ćemo početi vidjeti točno Što se događa Ispod cijelog tog vremena. Tako da se može sjetiti ovaj primjer, također, iz prošlog vremena, usporedite 0, koji nije zapravo usporediti. No, počeli smo da se riješi ovo. No, kao što je možda pijanka, možda sam nekoga zanima u Pink Elephant danas, također izradio Chang? Kako o vama ispred? [Nečujan]. Dođi gore. A u međuvremenu, kako ste došli do, ajmo razmislite na trenutak što taj broj zapravo radi. To je proglašenje dvije varijable gore top, S i T, i zove getString. To nije vrlo user-friendly program, jer vam ne govori što da rade. Ali neka je samo pretpostaviti da smo s naglaskom na sočnom dijelu. A onda nam je činiti, ukoliko jednak jednaka t, to bi trebalo reći printf, ste upisali istu stvar. Pozdrav. Koje je tvoje ime? Janelle: Janelle. DAVID J. Malan: Janelle, Lijepo vas je upoznati. Dakle, vaš izazov na Ruka za ovu slona je prvi privući nam sliku onoga što je bude zastupljena u prve dvije linije. Dakle, s i t može biti predstavljeni kako na ekranu? A možete jednostavno povući s prst na tom velikom ekranu. Dakle, tu je dvije polovice na svaka strana te jednadžbe. Dakle, tu je i na lijevoj strani, a onda getString na desnoj strani. A tu je t na lijevoj strani, a zatim getString na desnoj strani. Pa kako bismo mogli početi crtež sliku koja predstavlja ono što se događa ovdje u memoriji, biste rekli? I neka mi vam objasniti što radite kao i ti ići. Janelle: U redu. Pa, prvo, da bi se molba da se ulazni niz. I to bi store-- Oh, ispričavam se. DAVID J. Malan: U redu. Dobro. I to se zove ono? Oh, u redu. Imajte ide. Nisam te htio prekidati. Janelle: Žao mi je. Dakle, to bi ugradio u adresa nije of-- sigurni. Ne mogu se točno sjetiti broja, ali vjerujem da je počevši s 0. DAVID J. Malan: To je sve u redu, jer sam napravio brojeve gore, tako da nema pravi odgovor. Janelle: Polazeći od 0 luku. DAVID J. Malan: U redu, tako da je element 0. Naravno. Janelle: I onda, ako je kao što je samo dva letter-- DAVID J. Malan: U redu, natrag na vas. Janelle: Tako je element 0, a onda je element 1 ili 2 elementa. DAVID J. Malan: A koji komad Slika crtaš upravo sada? Poziv na getString? Ili deklaracija s? Janelle: Deklaracija S, vjerujem. Oh, getString, jer bi biti unesene u svakom [? područje. ?] DAVID J. Malan: Dobro. Točno. Iako je to učinkovito vraća niz, podsjetimo, kad se vratimo niz, možemo Indeks se u tom nizu, koristeći 01 i 2. Tehnički gledano, to su vjerojatno zastupa pojedine adrese, ali to je u redu. Dakle, pretpostavimo, ako ja mogu samo brzo proslijediti tamo gdje smo stali Posljednji put, ako je jedan od žice bio g b e, Obrnuta kosa crta 0, čime predstavlja Gabe-a ulaz, kako bi mogli zastupamo a sada? Ako je to sjećanje koje je vraćen od strane getString? Janelle: Biste li se zastupa luku? DAVID J. Malan: Do luku? Pa, nema. Recimo, slikovito, neka mi samo ići naprijed i predlaže da se, ako je to e, to je povratna vrijednost getString. A što ste izvučeni to kao 0, 1, 2, koji je savršeno razumno, jer mi Možete indeks u nizu, kao takva. Ali, samo da bi bili u skladu s Posljednji put, neka mi ići naprijed i proizvoljno predlaže da ovaj je adresa 1, to je adresa 2, To je adresa 3, i tako dalje. I tako, samo da se super Jasno, što se događa ići u S kao rezultat toga Prva linija koda, biste rekli? Janelle: Adresa 1? DAVID J. Malan: Točno. Dakle adresu 0x1. A u međuvremenu, neka mi ići naprijed i duplikat mnogo od onoga što ste učinili i dodati svoj vlastiti t ovdje. Da mi je tip u Gabea ponovno, drugi put, kad zatraži getString, gdje je, naravno, je Gabe ići? Pa, presumably-- Janelle: Kao i ovdje? DAVID J. Malan: Da. Janelle: Ili je to također u istim okvirima? DAVID J. Malan: Dopustite mi predlažemo, da, točno, tako da se u tim dodatnim kutijama. No, ono što je ključno je to da se, čak i iako sam nacrtana to prilično blizu together-- 0x1, ovo 0x2-- je u stvarnosti, to sada moglo biti adresu 0x10, Na primjer, i 0x11 i 0x12, i tako dalje. I tako, ako je to slučaj, što će se završiti ovdje u t? Janelle: 0x10? DAVID J. Malan: Točno. Tako 0x10. I tako sada, posljednje pitanje. Vi ste, daleko, morao je raditi Najteže za slona do sada. Do sada, ako sam podići kod opet, kad radim, u skladu tri, ukoliko jednak jednaka t, ono što sam ja zapravo usporedbom da smo izvučeni ovdje? Janelle: Dvije adrese? DAVID J. Malan: Točno. Pa ja govorim je S jednak jednaka t? Drugim riječima, je jednaka 1 do 10 jednako? I naravno, Očigledan odgovor je sada, nema. I tako je ovaj program je u konačnici će ispisati ono što biste rekli? Janelle: Biste li se, ste upisali istu stvar? DAVID J. Malan: Dakle, ako s je 1, a T je 10? Janelle: Upisali ste različite stvari. DAVID J. Malan: Točno. Upisali ste različite stvari. U redu. Dakle, pljesak, ako smo mogli, ovdje. [Pljesak] To je bilo bolno. Znam. Lijepo učinili. Dakle, sada ćemo vidjeti, ako ne možemo zafrkavati, osim što je bio popraviti. I naravno, kada smo fiksne ovo-- što sam sada ćemo predstavljati u green-- smo napravili nekoliko poboljšanja ovdje. Prvo, baš kao zdravog razuma ček, ja sam prvo provjere ukoliko jednak null i t jednak nuli. I samo da bude jasno, kad bi mogla s ili t biti nula u kodu kao što je ovaj? Kada bi mogao s ili t biti nula. Da? PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Ako niz koji korisnik upisali u je predugačka da stane u memoriju, ili neki čudno kutak slučaj kao što je to, getString, kao što ćemo vidjeti, doslovno Danas, u svojoj dokumentaciji, kaže da će se vratiti kao null Posebna vrijednost Sentinel, ili samo neka vrsta poseban simbol to znači da je nešto pošlo po zlu. Dakle, želimo provjeriti da, jer ispada da je nulta je vrlo opasno vrijednost. Često, ako pokušate nešto učiniti s null uključuje function-- to prolazi kao ulaz, za instance-- tu funkciju možda vrlo će srušiti i, s njim, skinu cijeli program. Dakle, ova treća linija sada je samo zdrav razum ček, provjerama, ako hoćete. To je dobar naviku sada nam da se u svakom trenutku smo pokušati iskoristiti vrijednost koja moglo, potencijalno, biti nula. Sada, ovdje četvrtoj liniji, "Ako strcmp (s, t)," dobro, što je to govorite? Pa, rekao je da je to bio vrlo jezgrovito nazvana funkcija za gudački usporedbe. I njegova svrha u životu je da usporedite njegov prvi argument protiv njega, drugo, ali ne u smislu njihove adrese, kao što smo učinili nenamjerno trenutak Prije s crvenom kodom, ali a usporediti ta dva žice u ljudskoj intuitivno način uspoređujući to, protiv toga, protiv toga, protiv toga, i onda zaustavljanja ako i kada je jedan ili oboje mojih prstiju udari kosu crtu 0. Tako je netko prije nekoliko godina provedena strcmp implementirati za nas funkcionalnosti da smo se nadali bismo imati stečen po samo uspoređujući dvije jednostavne vrijednosti. Sad iskreno, ja bi crtež sve ove različite brojeve. No, stvarnost je, bio sam čineći to se cijelo vrijeme. I tako neka mi samo ići naprijed i piskarati ove out da bi točku koja, na kraju dana i kreće prema naprijed, nismo zapravo događa da je stalo ono što se odnosi stvari su zapravo u memoriji. Dakle, ja ne idem na njih skrenuti vrste brojeva toliko više, Ja sam samo apstraktno to daleko malo više prijateljski sa samo strelice. Drugim riječima, ukoliko je pointer, dobro, neka je samo to nacrtati, doslovno, kao pokazivač, strelica pokazuje sa sebe na nešto drugo, i ne previše brinuti više o minutia tih adresa koji je, opet, sam napravio svejedno. No, vidjet ćemo te adrese, Ponekad, kada pogrešaka kod. Sada je u međuvremenu, ovaj program ovdje popravci, naravno, taj problem se usporedbom te dvije žice. Ali mi naletio na još jedan problem. To je od kopije programirati posljednji put, pri čemu, bio sam pokušava kapitalizirati samo prvi znak u nizu. No, ono što je simptom vidjeli smo zadnji put kada korisnik upisao u vrijednosti, kao što su Gabe malim slovima, za S, onda smo dodjeljuje S u t, kao u trećoj liniji tamo, i onda sam pokušao kapitalizirati t nosač 0? Koji je učinak promjenom t nosač 0 ovdje? PUBLIKA: To promijenilo s. DAVID J. Malan: Da, Promijenio sam s, što je dobro. Zato što se doista događa? Pa, dopustite mi da vidim mogu očistiti se ove slike, kako slijedi. Ako i je, opet, riječ g, A, B, E, Obrnuta kosa crta, 0 i S nastavit ćemo crtež kao kutija ovdje, ali nema više adresa. Stanimo izmišljati stvari. Ajmo nacrtati pojednostaviti svijet. Kad sam proglasiti t sa gudački t, koji stvara taj komad memorije. Trg se događa da se 32 bita u većini računala. U stvari, ako ste ikada čuli Računalo ima 32-bitnu arhitekturu, stvarno fancy-govoriti, da je samo znači da se koristi 32-bitne adrese. I kao tehnički stranu, Ako ste ikada pitali Zato starija računala, ako stvarno pokušao juha ih s puno RAM-a, mogao je samo imati maksimalno od četiri gigabajta RAM-a, Pa to je zato što, doslovno, staro računalo moglo samo računati kao visok kao 4 milijarde, 4 milijarde bajtova, jer je to bio koristite 32-bitni Brojevi za adrese. No, u svakom slučaju, u ovom primjer, priča je puno jednostavnije. t je samo još jedan pointer, ili Stvarno char zvijezda, zvani niz. A kako ne želim ažurirati ovu sliku sada s tom drugom linija koda, nakon točke, dot, dot? Kad sam napraviti niz t jednaka e-zarez, kako se promijeniti ovu sliku? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Da. Točno. Upravo sam stavio strijelu iz T box na istoj adresi, Isto prvo slovo u dao. Ili tehnički, ako je to momak je još uvijek na 0x1, to je kao da sam imala 0x1 ovdje i 0x1 ovdje. Ali opet, tko mari o adresama? To je samo ideja koja je sada važno. Dakle, to je ono što se događa ovdje. Pa naravno, ako to ne t nosač 0, što je niz zapis, od course-- i iskreno, to izgleda kao što postoji niz ovdje, ali sada je to čudno stvar. Znamo da je programski jezik, C, nudi vam tu mogućnost, pri čemu se, čak i kada je t pokazivač, ili s je pokazivač, još uvijek možete koristiti da se upoznate, ugodno uglata zagrada zapis otići na prvi element, i drugi element, ili bilo koji element da je kazaljka pokazuje da, jer, navodno, to je, kao što je u ovom slučaju pokazujući na nekom polju. Pa kako ćemo riješiti to? Iskreno, ovo je mjesto gdje je dobio malo neodoljiv na prvi pogled. No, ovdje je nova i poboljšana verzija. Dakle, prvo, ja sam uzimajući osloboditi od CS50 knjižnici, samo izložiti, da je doista char zvijezda, samo sinonim. I t je također char zvijezda. No, ono što se događa na desna strana te linije gdje je T dodijeljena je vrijednost? Što je malloc? Što to strlen? Što je sizeof (char)? Zašto, dovraga, to čini Linija izgledaju tako složeno? Što to radi na visokoj razini? Što je to spremanje ut? Da? PUBLIKA: To je dodjelom Određena količina memorije. To je za pohranu, pretpostavljam, slova [nečujan]. DAVID J. Malan: Savršen. Savršeno. Prošlo dodjele određena količina memorije za pohranu, vjerojatno, budući slova. I posebno, malloc Stoga se vraća ono? PUBLIKA: Vraćanje [nečujan]? DAVID J. Malan: Točno. Vrativši adresu tog sjećanja, što je fancy način govoreći, vraća adresu Prvi bajt tog sjećanja. Teret je na mene da ne zaboravite koliko memorije zapravo sam dodijeljeno ili pitao za malloc. Sad koliko je to? Pa, iako postoji Puno zagradama ovdje, malloc traje samo jedan argument. I ja sam navodeći strlen od S, pa bi ja kao i mnogi bajtova kao što postoje u sekundi, ali dodati. Zašto? Da? PUBLIKA: 0 Obrnuta kosa crta. DAVID J. Malan: Točno. Moramo napraviti malo rutine. Pa zato što postoji Obrnuta kosa crta 0, što je bolje zapamtiti da. Inače, idemo stvoriti niz koji nema tu posebnu terminator. U međuvremenu, samo da se super analni, ja sizeof (char) imaju, Samo u slučaju da netko radi Moji Kod ne na CS50 aparata, ali možda drugo računalo ukupno kojoj znakova su jedan bajt, prema konvenciji, ali dva bajtova, ili nešto veće od toga. To je samo da se super, Super zaziru pogreške. Iako, u stvarnosti, to je najvjerojatnije će biti 1. Sada je, u međuvremenu, idem naprijed i kopirati string, t nosač ja jednako t nosač s. I ja ću odgoditi do prošlotjednog izvorni kod kako bi vidjeli što se događa. No, ključna takeaway, a Razlog zbog kojeg sam stavio kod sada u zelenom, je zbog toga vrlo zadnju liniju, T nosač 0 jednak toupper, ima učinak kapitaliziranje koji niz? T i / ili e? Ta posljednja linija koda. Samo t, jer ono što je dogodilo ovaj put, ako sam nešto poništi taj zadnji korak, što se dogodilo je, kad sam nazvati malloc, Ja u biti dobiti komad memorije koji je iste veličine kao i original, jer to je aritmetika jesam. Ja spremanje u t adresi tog komad memorije. Iako ovo izgleda lijepo i lijepa, lijepo i prazno, Stvarnost je tu je, što ćemo zadržati poziv, vrijednosti smeće ovdje. Taj komad memorije mogli vrlo dobro su korišteni prije, nekoliko sekundi, prije nekoliko minuta. Tako da apsolutno može biti brojevi ili slova tamo, samo slučajno. Ali oni ne vrijede, dok sam Osobno naseliti ovaj komad memorije sa stvarnim broj znakova, kao što sam učiniti da za petlje tamo. U redu? Tako sada, vrhunac ova tri primjera koji su naizgled slomljen posljednji put, to Zamijeni primjer, ova funkcija radio je u smislu da zamijenili A i B. No, to nije posao u kojem drugom smislu? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Da mi je pozvati ovu funkciju od another-- Na primjer, iz funkcije kao što su glavni, gdje Imam varijablu X i Y, kao što sam učinio prošli tjedan, isti broj, i ja proći u xiy za swap, a zatim pozvati Swap-- to, naravno, je točna verzija je ono što smo o tome da se vidjeti-- nije uspjelo. Dakle, ono što se popraviti? Pa, pa samo da bude jasno, neka mi ići naprijed i-- daj mi jednu sekundu ovdje, i vidjeti ako ja mogu vam pokazati posljednji, koji je će biti in-- da vidimo mogu li pronaći ovo stvarno fast-- redu, [nečujan]. OK, tu je. Dakle ignorirati naredbe sam samo tipkati. Želim da dohvatiti na Last minute primjer iz prošlog vremena, koji sada se zove swap. Dakle, nema Swap je mjesto gdje smo stali zadnji put, pri čemu, ja inicijalizira x 1, y na 2. I onda nazvati Swap, prolaze u 1. i 2.. A onda je ova funkcija radio je u nekom smislu, ali nije imao stalni utjecati na xiy. Dakle, pitanje je pri ruci, kako sada mi zapravo riješili taj problem? Što je rješenje pri ruci? Pa, u swap.c, koja je nova i danas, primijetiti nekoliko razlika. X i Y su isti. No, ono što je očito drugačije o liniji 25? Što je novo tamo, ako se sjećate kako je to izgledalo malo prije? PUBLIKA: [nečujan]. DAVID J. Malan: Da. Tako su znakove za novi komad sintakse, ne samo u ovom programu, ali općenito u CS50. Do sada, ja ne mislim vidjeli smo primjere ili zapravo govorio o njima u bilo detalja, osim, možda, preventivno U sekciji, znak za struju ovako. Pa, ispada da je jedan znak za struju od posljednjih komada nove sintakse ćemo naučiti. Sve to znači da je adresu neke varijable. U kojoj nema adrese x živjeti? No, ono što ne adresa y živjeti? Jer, ako Temeljni problem prije je da su X i Y su se prošli kao kopija, ono što mi stvarno želite raditi je osigurati Swap s kao blago Karta koja vodi do mjesta gdje xiy zapravo su u RAM-u, tako da je Zamijeni može pratiti taj kartu i otići gdje god x ili y označava mjesto i promjenu stvarne vrijednosti 1 i 2 postoji. Dakle Zamijeni treba nešto mijenjati. I na prvi pogled, to može Čini se malo sličan char zvijezde. I doista je. Tako je kazaljka na kakvu vrstu podataka, na temelju tog označenog dijela? Tako da je int. Dakle, više nije int, to je adresa int. A na sličan način, b sada ide biti adresu int. Dakle, kada sam sada nazvati Swap od glavne, Neću dati Swap 1 i 2. Ja ću ga dati kao Ox-nešto i Ox-nešto, dvije adrese koje će dovesti Zamijeni svojim stvarnim mjestima u memoriji mog računala. Tako sada, moj preostalo provođenje treba promijeniti tad. Ono što je očito sada drugačije U ove tri linije koda? Tu ti prokleti zvijezde sve više mjesta, u redu? Dakle, ono što se ovdje događa? Da? PUBLIKA: To je očito [nečujan]. DAVID J. Malan: Točno. Dakle, u ovom context-- a to nije bilo Najbolji dizajn odluka, doduše, prije mnogo godina. U ovom kontekstu, u kojem samo trebate zvijezdu, a vi nemate tip podataka, kao int, odmah s lijeve strane, umjesto da imate znak jednakosti, jasno, U tom kontekstu, kad kažu zvijezde, to znači ići na adresu koja je u. Pratite kartu s blagom, da se tako izrazim. A u međuvremenu, u skladu 37, to znači istu stvar. Idi na adrese, i staviti ono tamo? Što god je na Mjesto koje b određuje. Drugim riječima, ići na b. Uzmite tu vrijednost. Idi na i, po jednakim potpisati, operater zadatak, stavi tu vrijednost postoji. Slično tome, int temp je samo int. Ništa se treba promijeniti o temp. To je samo rezervna stakla iz Annenberg neko mlijeko ili sok od naranče. Ali ja trebam reći, ići na b. Idi na tu destinaciju i stavite vrijednost na temp postoji. Dakle, ono što se događa tada? Kad sam se zapravo zvati Swap ovaj put, ako je ovaj prvi ladica ovdje predstavlja Main, ova druga ladica predstavlja Swap, kada Ja prođe Ampersand xi y ampersand od Glavni na swap, samo da bude jasno, što je to stog okvir prijemni? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Adresu X i adresu y. A možete misliti na njih poput poštanske adrese. 33 Oxford Street i 35 Oxford Street, a vi želite premjestiti dvije zgrade da su na tim mjestima. To je neka vrsta smiješno ideje, ali to je sve što podrazumijevamo pod adresu. Gdje se u svijetu može da pronađete one dvije ints? Gdje u svijetu možete pronaći one dvije zgrade? Dakle, ako je konačno, nakon toliko vremena sam ići u današnjem izvornog koda i sastaviti Zamijeni i trčanje ./swap, konačno, za Prvi put mi zapravo vidimo da je moje vrijednosti su doista uspješno zamijenio. A sada, možemo čak potrajati NAPOMENA ovog u, recimo, gdb. Dakle, pustite me u istu datoteku. Dopustite mi ići naprijed i pokrenuti GDB od ./swap. I sada, u zamjenu, ja ću otići naprijed i postaviti break u glavni izbornik. A sada ću otići naprijed i pokrenuti program. A sada vidimo moj broj zastao na toj liniji. Ako sam ići naprijed i ispis x, ono što sam trebao vidjeti ovdje? To je pitanje. Opet reći? PUBLIKA: [nečujan]. DAVID J. Malan: Tako slučajnih brojeva, možda. Možda sam se posreći, i to je lijepo i jednostavno, kao što je 0. No, možda je to neki slučajni broj. U ovom slučaju, dobio sam sretan. To se događa samo da bude 0. Ali, to je doista sreća, jer ne dok sam upisati sljedeći, a zatim ispisati x ima da linija koda, linija 19, izvršen. U međuvremenu, ako upišete naprijed opet, i Sada ispisati y, idem vidjeti 2. Sada, ako sam upisati sljedeći, to će dobiti malo zbunjujuće, jer sada, printf će se pojaviti na zaslon, kao što je učinio. x je 1. Idemo to učiniti opet. A sada, evo gdje stvari se zanimljiva. Prije nego što sam nazvati swap ili čak korak u nju, neka je uzme malo zaviriti. x je, opet, 1. Y je, naravno, brzo razum ček, 2, tako da nije teško bilo. No, što je znak za struju x? Odgovor, to je vrsta funky gleda. Ali int zvijezda u zagradi je samo BDP način da se kaže ovo je adresa. To nije int, da je kazaljka na Interesi, ili na drugi način poznat kao adresu. Što je to luda stvar? Nikada nismo vidjeli nešto dosta ni prije. Dakle, ovo je adresa u moje računalo je Sjećanje na kojem x dogodi živjeti. To je Ox-nešto. A to je, iskreno, zašto Ja sam počeo crtati strijele, umjesto brojeva, jer tko stvarno brine da je vaš int je na određeni Adresa da je to veliko. Ali bffff0c4, to su sve doista heksadecimalni znamenki, koji su 0 do f. Dakle, nećemo boraviti previše dugo o tome što su te stvari. Ali, ako sam isprintati y, Naravno, vidim 2. No, znak za struju y, vidim ovu adresu. I obavijest, za znatiželjne, Kako udaljeni su X i Y? Možete ignorirati većinu adresu. Četiri bajtova. I to je u skladu s našim ranije tvrde da koliko je velik int? Četiri bajtova. Dakle, izgleda da je sve ske lijepo, kao što ste mogli nadati, u sjećanju. Tako sada, neka je samo brzo naprijed do kraja ove priče. Idemo naprijed i upišite korak, zaroniti u swap funkciji. Sada primijetiti, ako sam tip, to je identičan adresu X. Ako sam tip B, to je identično na adresu y. Pa što bih trebao vidjeti ako ja recimo, idu na adresu u? Dakle ispisati zvijezda. Dakle zvijezda znači ići tamo, u tom kontekstu. Ampersand znači ono što je adresa. Dakle zvijezda sredstva 1. I ispis zvijezda b daje mi 2. I neka mi pretpostavljamo, za sada, da barem kod koje nastavlja izvršavati sada može biti obrazloženo kroz na taj način. No, mi ćemo ponovno ovu ideju prije dugo. Dakle, ova verzija Swap sada je točna i omogućuje nam da zamijene ovu posebnu vrstu podataka. Dakle, bilo kakva pitanja tada Swap? Na zvijezdu? Na adresu? I vidjet ćete, s Problem set 4, na neki način, ali je problem postaviti 5, definitivno, kako je to stvari koje su korisne i dobiti mnogo više ugodno s njima, kao rezultat. Bilo što? U redu. Dakle malloc je, opet, ova funkcija da je samo dodjeljuje memorije, memoriju Dodjela. A zašto je to korisno? Pa, sve ovo vrijeme, ste koristili malloc. Ako uzmete u obzir kako sada getString djela, po svoj prilici, to je molba nekoga za komad memorije, bilo kada korisnik upiše string u, jer mi sigurno ne znam, kao CS50 osoblja, koliko je velika ta žice koje ljudi će upisati moglo biti. Tako ćemo, po prvi put, početi oguliti natrag koliko su CS50 knjižnica djela, preko nekoliko primjera koji će nas odvesti tamo. Dakle, ako sam otvoriti gedit i otvoriti scanf 0, ćemo vidjeti sljedeći kod. Scanf 0, dostupan na internetskim stranicama za Danas, ima relativno malo linija koda Ovdje, 14 do 20.. I da vidimo što radi. Ona izjavljuje int, pod nazivom x. Ona kaže nešto poput, broj molim te. A sada je, kaže, scanf% ja, & x. Dakle, postoji hrpa novih stvari tamo. No, scanf, možete nekako mislim da o kao suprotnost printf. printf, naravno, ispisuje na zaslon. scanf vrsta skeniranja od korisnika Tipkovnica je nešto što on ili ona je upisali. % Ja je baš kao i printf. To znači da očekujem korisniku da tip int. A sad, zašto misliš da možda se prolazi scanf & x? Ako je svrha u životu scanf je da se nešto od korisnika, ono što je smisao to prolazi, i x, sada? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Što god sam, ljudski, upisati, moj ulaz će biti spašen na tom mjestu. To nije dovoljno, podsjetimo, samo prođe u X, jer smo već vidjeli, svaki put kad prođe samo sirovu varijablu, kao int, u nekoj drugoj funkciji, Naravno, to ne može promijeniti promjenjiva, ali ne trajno. To se ne može imati učinak na početak. To samo može promijeniti svoju lokalnu kopiju. Ali ako se, umjesto toga, ne znaš daj mi stvarni int, ali ti mi dati upute do da je int, ja sada, kao scanf, sigurno, ja mogu slijediti da adresu i staviti broj postoji tako da ćete imati pristup do njih kao dobro. Dakle, kada sam pokrenuti ovaj program, da vidimo. Napravite scanf 0 dot crtu, scanf 0. A ako sam sada upisati broj kao 50, hvala na 50. Ako ja sada upisati broj kao negativna 1, negativan 1. Sada upišite broj kao 1,5, hm. Zašto je moj program ignorirati me? Pa, zato što je jednostavno, rekla sam što očekivati ​​samo int. U redu. Dakle, to je jedna verzija toga. Uzmimo stvari na višu razinu i Predlažem da to nije dobro. I ovdje leži vrlo jednostavan primjer kako bismo mogli početi pisati kod da drugi ljudi mogu iskoristiti ili kompromis radeći loše stvari. Dakle linije 16, tako slično u duhu kako bi prije, ali nisam proglašavanje int ovaj put. Ja sam proglašavanje char zvijezdu, zvani nizu. No, što to zapravo znači? Dakle, ako ja ne navesti address-- i Ja sam ga zovete samovoljno, tampon, ali ja bi mogao nazvati to je, da se simple-- i onda sam to učiniti, objasnite mi, ako bi mogao, na temelju prethodne logika, ono scanf radi u skladu 18, Ako pass% si tampon, koja je adresa? Što je scanf, ako se primjenjuju Točno ista logika kao verziji 0, će pokušati učiniti ovdje, kada korisnik upiše nešto u? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Scanf, po logici ranije, će poduzeti niz da je ljudsko upisali in-- to je sada niz, to nije broj, po svoj prilici, ako on ili ona cooperates-- i to će pokušati staviti niz u spomen na bilo kojoj adresi tampon određuje. I to je super, jer tampon je doista trebao biti adresa. Ali ja tvrdim ovaj program je lud u vrlo ozbiljan način, jer ono što je vrijednost buffer po defaultu? Što sam inicijaliziranu u? Koji komad memorije? Nisam, zar ne? Dakle, iako sam izdvojila char zvijezda koja se više ne zove e, on je umjesto toga se zove, pa buffer-- ajmo privući varijable ime sada kao buffer-- ako nisam zove getString ili malloc ovdje, to zapravo znači da tampon je samo neka smeća vrijednost. Sada, što to znači? To znači da sam rekla scanf očekivati ​​niz od korisnika. I znate što? Bez obzira na to što se ukazuje to-- i crtam upitnik, ali u stvarnosti, to će biti nešto poput Ox1, 2, 3, zar ne? To je neka lažna vrijednost koja je upravo se događa da se tamo od prije. Dakle, drugim riječima, to je kao da je samo tampon ukazujući na nešto u sjećanju. Nemam pojma što. Dakle, ako sam upisati u Gabe sada, to se događa pokušati staviti g-A-B-e / 0 postoji. No, tko zna što je to? I u prošlosti, bilo Vrijeme smo pokušali dotaknuti memorija koja ne pripada za nas, što se dogodilo? Ili skoro svaki put. Segmentacija kriv, zar ne? Ova strelica, nemam pojma gdje je to za pokazivanje. to je samo neki slučajni vrijednost. I naravno, ako tumače Slučajni kao adresu, ćeš ići na neki slučajni destinacija. Dakle, Gabe možda doista nesreći moj program u ovom slučaju ovdje. Dakle, ono što možemo učiniti to je gotovo jednako loše? Razmotrite ovo treći i Konačni primjer scanf. Ova verzija je bolji u kojem smislu? Ako ste zadovoljni s Prethodna problema, to je bolje. Zašto? PUBLIKA: [nečujan]. DAVID J. Malan: Dobro. Dakle, ovaj slučaj liniji 16. Bolje je, u smislu da smo izričito dodjele neku uspomenu. Mi ne koristite malloc, koristimo tjedan 2 pristup samo proglašenje niz. I što smo rekli prije toga niz je samo niz likova, pa to je potpuno legitimno. No, to je, naravno, što je što na umu, fiksne veličine, 16. Dakle, ovaj program je potpuno siguran, ako sam tip u žice jedan znak, dva znaka žice, 15 znakova. No, čim sam početi upisivati ​​16, 17, 18, 1000 niz znakova, Gdje je taj niz će završiti? Bit će to završiti dijelom ovdje. Ali onda tko zna što još je izvan granica u ovom nizu? To je kao da imam proglasio 16 polja ovdje. Dakle, umjesto da izvuku sve 16, mi ćemo Samo pretvarati da sam nacrtana 16. Ali, ako sam onda pokušati pročitati niz To je mnogo više, kao i 50 znakova, Ja ću početi stavljajući a, b, c, d, X, Y, Z. A to je vjerojatno neki drugi segment memorije da, opet, može izazvati moj program za sudar, jer nisam tražio ništa više nego samo 16 bajtova. Dakle, koga briga? Pa, evo CS50 knjižnica. I većina to je samo kao i upute do vrha. CS50 knjižnica, sve ovo vrijeme, ima tu crtu u liniji 52. Vidjeli smo typedef, ili vidjet ćete typedef u pset 4, koji je upravo stvara sinonim pri čemu char zvijezda može biti više nazivanom nizu. Dakle, to je jedan od Nekoliko trening kotači smo upotrijebiti tajno ispod haube. U međuvremenu, ovdje je funkcija, getchar. Sada je očito, ne postoji tijelo na njega. A u stvari, ako se držim pomicanje, ja zapravo ne vidi sve implementacije od tih funkcija. Kao provjeru uračunljivosti, zašto je to tako? PUBLIKA: [nečujan]. DAVID J. Malan: Da. Dakle, ovo je zaglavlje datoteke. I zaglavlje datoteke sadrže prototipova, plus neke druge stvari, čini se, kao typedefs. No, u CS50.c, koji smo Nikad vam se izravno, , ali je u CS50 aparata sve ovaj put, duboko u svojim mapama, primijetiti da postoji cijeli hrpa funkcija ovdje. U stvari, neka je pomaknite prema dolje. Idemo ignorirati većina njih, za sada. No, pomaknite se dolje do getInt i vidjeti kako getInt radi. Dakle, ovdje je getInt. A ako ste ikad doista stalo kako doći int radi, ovdje je njegova dokumentacija. I među stvarima što kaže je li vam govori ono što su rasponi vrijednosti može vratiti. To je u biti negativno 2 milijarde do pozitivnog 2000000000, dati ili uzeti. I to ispada, sve to Vrijeme, iako nikada nismo je li ga provjerili, ako nešto pođe po zlu, ispada da su svi ovaj put, getInt ima bio povratka posebna konstanta, a ne null, int_max nego što je Konvencija samo programer. To znači ovdje je posebna vrijednost. Pobrinite se da provjerite za to, samo u slučaju da nešto pođe po zlu. Ali nikada nismo smeta s tim da se danas, jer opet, to je značilo da se pojednostavi. No, kako se getInt se provodi? Pa, jedan, to traje nema argumente. Znamo da. To vraća int. Znamo da. Pa kako se to radi ispod haube? Tako da je očito beskonačan petlje, barem izgled jednog. Uočite da smo pomoću getString. Dakle, to je zanimljivo. getInt poziva naša funkcija, getString. I sad zašto bi to biti slučaj? Zašto bih ja bio obrambeni ovdje u liniji 165? Ono što bi se moglo dogoditi u skladu 164, samo da bude jasno? To je isti odgovor kao i prije. Može biti samo iz memorije. Nešto pođe krivo s getString, Moramo biti u stanju podnijeti. A razlog zbog kojeg sam se ne vrati null je da, tehnički, null pointer. getInt mora vratiti int. Tako sam samovoljno odlučio, u biti, da je 2 milijarde, više ili manje, ide biti posebnu vrijednost koja nikada ne mogu zapravo dobili od korisnika. To je samo jedna vrijednost idem trošiti za zastupanje kod pogreške. Tako sada, stvari postaju malo fancy. I to nije sasvim ista funkcija kao i prije, ali to je vrlo slično. Dakle, primijetite, izjavljujem ovdje, u redu 172, i int n i char c. A onda sam koristiti ovaj funky liniju, sscanf, što ispada ne skenirati niz od tipkovnice. To stoji postojeći niz koji Korisnik već upisali u. Dakle, već sam pozvao getString, koji znači imam niz u memoriji. sscanf je ono što bih pozvati funkciju gramatičku analizu. Izgleda na žici sam upisali u, slovo po slovo, i radi nešto korisno. Niz koji je pohranjen u liniji. I znam da samo odlaskom back up ovdje i reći, oh, u redu, Nazvao sam ga i ovaj put, ali linija. I sada je to malo drugačije. No, to zapravo znači, iz razloga smo nešto će mahati naše ruke na danas, da smo provjeru na vidjeti ako korisnik ne upiše i int i možda još jedan znak. Ako korisnik upisao u int, to je će biti pohranjeni u N, jer sam prolazi to po adresi, Novi trik smo vidjeli danas. Ako korisnik također upisali u poput 123x, da je x će završiti Pismo u znak c. Sada ispada da sscanf će mi reći, inteligentno, koliko varijable je sscanf Uspješno moći ispuniti. Dakle, po toj logici, ako je funkcija Ja provedbi je getInt, ali da provjeravam, Potencijalno, za korisnika da su se upisali u int slijedi nešto drugo, ono što želim sscanf a povratna vrijednost doista biti? Ako je svrha da se Upravo int od korisnika? Dakle, ako sscanf vraća 2, što to znači? Korisnik upisali u nešto kao, doslovno, 123x, što je samo glupost. To je pogreška, a Želim da provjerite za to. Dakle, ako korisnik upiše to na, od strane Ova logika, ono što radi sscanf vratiti, bi ti rekao? Dakle, to će se vratiti 2, jer je 123 će ići ovdje, i x će završiti ovdje. Ali ja ne želim da se x ispunjena. Želim sscanf uspjeti samo u punjenje u prvoj od varijabli. I to je razlog zašto sam želite sscanf za povratak 1. A ako je to malo preko glave u ovom trenutku, to je sasvim u redu. Shvatite da, da je jedan od Vrijednosti getInt i getString je da radimo ispitati kritički od Puno pogreške provjere kao što je ovaj, tako da, da, to je moguće prilično upisati ništa na tipkovnici, i mi ćemo ga uhvatiti. I zasigurno, osoblje, sigurno neće biti izvor bug u svoje Program, jer smo u obrani provjera za sve glupo stvari koje korisnik može učiniti, kao što je tipkanje niz, kada ti stvarno htjela int. Tako je za now-- ćemo doći natrag na ovo prije long-- ali sve ovo vrijeme, getString i getInt imaju bio ispod haube koristite ovu Osnovna ideja adrese memorije. Pa sad, idemo napraviti stvari Malo više user-friendly. Kao što vam je poznato, od Binky posljednjem put-- ako moj miš će cooperate-- tako smo imali ovog zakona, koji iskreno rečeno, prilično je besmisleno. Ovaj kod postiže ništa korisna, ali to je bio primjer da je profesor Parlante koristi kako bi se predstavljaju što se događa u Program uključuje memoriju. Tako ćemo prepričavati to Priča super kratko. Ove prve dvije linije, u Engleski, učiniti ono što biste rekli? Samo u razumno ljudsko, ali malo tehničke uvjete, uzeti ubod. PUBLIKA: [nečujan]. DAVID J. Malan: OK, ti si uspostavi Adrese za vaše xiy varijable. Ne sasvim, jer X i Y nisu varijable u tradicionalnom smislu. X i Y su adrese ili će se pohraniti adrese. Dakle, pokušajmo to još jednom. Nije loš start, iako. Da? PUBLIKA: [nečujan]. DAVID J. Malan: Dobro. Mislim da je to malo čišći. Izjavljujući dva goniča, dva broja. I mi smo nazivajući ih X i Y. Ili ako smo izvući ovo kao na slici, opet, prisjetiti jednostavno da sve radimo s tom prvoj crti je crtež kutiju kao što je ovaj, s nekim smeća vrijednosti u njemu, i nazvavši ga X, a zatim još jedna kutija kao što je ovaj, s nekim smeća vrijednosti u njemu, nazivajući ga y. Mi smo proglasili dva upućuje da u konačnici će pohraniti adresu int. Dakle, to je sve što postoji. Dakle, kada Binky je to učinio, glina baš izgledao ovako. I Nick je samo vrsta zavrsio strelice, kao da oni ne upućuju nigdje posebno, jer oni su samo Vrijednosti smeće. Oni nisu izrijekom inicijalizira nigdje posebno. Sada sljedeća linija broj, podsjetimo, bio to. Dakle, u razumnoj mjeri razumljiv, ali nešto tehnički engleski, što je ovo linija koda radiš? Da? PUBLIKA: [nečujan]. DAVID J. Malan: Savršen. Prošlo raspoređivanju komad memorija koja je veličina int. I to je pola odgovora. Odgovorio si pravo polovica izraza. Ono što se događa na lijeva strana znaka jednakosti? Da? PUBLIKA: i dodjeljuje je na varijable x? DAVID J. Malan: i dodjeljuje je na varijable x. Dakle, da ponovim, desnim bočnim izdvaja dovoljno memorije za pohranu int. Ali malloc posebno vraća adresu tog komad memorije, što ste Samo predložio dobiva pohranjena u X. Dakle, ono što je Nick i zadnji put s Binky je on vukao tu pokazivač van, glina, sada ukazati na bijelom komad memorije koja je jednaka veličini int. I doista, to je značilo zastupati četiri bajta. Sada, pored linija koda to učinio, zvijezda x dobiva 42. Dakle, 42 je jednostavan na desna strana, smisao života. Lijevoj strani, zvijezda x znači što? I to bi moglo imati gone-- to je u redu. U redu. PUBLIKA: U osnovi, idite na [nečujan] DAVID J. Malan: Dobro. PUBLIKA: [nečujan]. DAVID J. Malan: Točno. Lijevoj strani znači ići x. x je adresa. To je kao 33 Oxford Streetu, ili Ox1. A zvijezda x znači ići na to adresu i staviti ono tamo? 42. Dakle, doista, to je upravo ono što je Nick učinio. Počeo je s By, u biti, psihički pokazujući prstom na x, slijedeći strelice na bijeli okvir na desnoj ruci strana, te stavljajući broj 42 tamo. No tada su se stvari dobio malo opasno, zar ne? Binky je o tome da izgubi glavu. Star y iznosi 13, peh, što znači? Dakle zvjezdicom y sredstva idu na adresu u y. No, ono što je adresa u y? U redu, to je smeće vrijednost, zar ne? Ja ga izvukao kao upitnikom. Nick ga je nacrtao kao sklupčana strelice. I čim se pokušati napraviti zvijezdu y, rekavši ići tamo, ali ne postoji legitimna adresa, to je neka lažna mjesto, Program će se srušiti. I Binky glava ide odletjeti ovdje, kao što je učinio. Dakle, na kraju, ovaj program bio samo stan od mana. To je bio lud programa. I to je trebalo popraviti. A jedini način, stvarno, kako to popraviti bi, primjerice, ovaj redak, koje nismo ni dobili, jer Program srušio prerano. No, ako smo to riješili, što Učinak ne radi y jednake x ima? Pa, to u suštini ukazuje na y bez obzira na vrijednost x je pokazujući na. Tako je u Nickov priču, ili Binky priča, oboje X i Y su pokazujući na bijeli komad memorije, tako da, na kraju, kad vas nemojte glumiti y jednak 13 opet, ćete završiti stavljanjem 13 u Odgovarajuće mjesto. Dakle, sve ove linije su savršeno legitimna, osim ove, kad se to dogodilo prije vas zapravo dodjeljuje y neku vrijednost. Sada srećom, ne znaš moraju razmišljati kroz sve od tih vrsta pitanja na svoju vlastitu. Dopustite mi ići naprijed i otvoriti prozor terminala ovdje i otvoriti, samo na trenutak, Super kratki program koji također je vrsta besmisleno. To je ružno. To ne postiže ništa korisno. No, to ne pokazuju probleme memorije, pa ćemo pogledati. Glavni, super jednostavna. To očito poziva funkciju, f, a zatim se vraća 0. To je vrsta teško nered ovo gore. Dakle, Glavni je prilično dobra, do sada. Dakle, f je problematično. I jednostavno ne staviti puno napor u to imenovanje Ovdje, kako zadržati fokus na kodu. F ima dvije linije. I da vidimo ono što se sada događa. Dakle, s jedne strane ovdje-- i dopustite mi da to u skladu s prethodnim example-- s jedne strane, Lijeva strana je radi ono što, na engleskom jeziku? To je-- PUBLIKA: Stvaranje pokazivač. DAVID J. Malan: Stvaranje pokazivač na int i zove se x. Dakle, to je stvaranje jedne od tih kutija Stalno crtanje na zaslonu osjetljivom na dodir. A sada, na desnoj ruci- strani, malloc naravno izdvaja komad memorije. I samo da bude jasno, kako koliko memorije je to očito dodjele, ako ste upravo vrsta učiniti math ovdje? Dakle, to je 40 bajtova. I znam da je samo zato što znam Interesi, na CS50 aparata, u najmanju ruku, četiri bajta. Dakle, 10 puta 4 je 40. Dakle, to je spremanje xu, adresa prvog od 40 ints da Osigurana su sredstva prostora natrag, na leđa, na leđa, na leđima. I to je ono što je ključno o malloc. To ne uzeti malo memorije ovdje, malo ovdje, malo ovdje. To vam daje jedan komad memorije, istodobnoj, od operativnog sustava. Sada što je to, x nosač 10 jednaka 0? Samovoljno linija koda. To ne postiže ništa korisno. No, zanimljivo je, jer x nosač 10--? Da? PUBLIKA: [nečujan]? DAVID J. Malan: x nosač 10 ne mora biti jednak nuli. Null detalj samo dolazi u igru sa žicama, na kraju niza. No, dobra misao. Koliko je veliko to polje, čak i iako sam izdvojila 40 bajtova? To je 0 do devet, zar ne? To je 10 ints, ukupno. 40 bajtova, ali 10 ori-, indeksirane 0 do 0. Pa što je to x nosač 10? To je zapravo neka Nepoznata vrijednost smeća. To je memorija koja ne pripada meni. Ne bi trebalo da se dira bajt broj 41, 42, 43, 44. Idem malo predaleko. I doista, ako sam pokrenuti ovaj Program, to bi moglo vrlo dobro srušiti. Ali ponekad mi se posreći. I tako samo pokazati ovo-- i iskreno, nikad se ne zna prije vas Ne it-- Trčimo to. To zapravo nije pad. Ali, ako sam to, za promjenu primjer, biti poput 1000, da bi ovo stvarno namjerno, da vidimo Ako možemo dobiti ga na sudar ovaj put. U redu, to nije srušiti. Kako bi bilo 100.000? Idemo ga preurediti, a sada ga ponoviti. U redu. Uf. U redu. Dakle, očito, opet, to segmenti memorije, da se tako izrazim, su razmjerno veliki, tako da možemo doći opet i opet sretni. Ali na kraju, nakon što dobijete smiješno i stvarno ići daleko na zaslonu, dodirnete memorije koja stvarno, stvarno ne pripada vama. Ali iskreno, to vrste kukaca idu biti teže i teže shvatiti na svoju vlastitu. No, srećom, kao programera, imamo alate koji omogućuju nam da to učiniti za nas. Dakle, to je, možda, jedan od najružnijih programa, čak i ružniji od GDB je izlaz. Ali, to je uvijek ima liniju ili dvije koje su super korisne. Valgrind je program koji pomaže ne ispravljanje program, sami po sebi, ali naći povezanog s pamćenjem problemi, posebno. To će automatski pokrenuti svoj kôd za što i tražiti najmanje dvije stvari. Jedan, jeste li nešto učiniti slučajna kao dodir memorije koji ne pripada vama? To će vam pomoći da pronađete one slučajeve. I drugo, to će nam pomoći nađete nešto što se zove curenja memorije, što smo potpuno ignorirali, naivno, već neko vrijeme i blaženo. No, ispostavilo se, sve ovaj put, kad god je to ste pozvani getString u tako da su mnogi od naših programa, pitaš pogonski Sustav za memoriju, ali imate bilo sjećanje ikada davanje natrag, radi unalloc, ili besplatno, kako se zove. Ne, zato što nikada nisam zatražio od vas da to učinite. Ali sve ovo vrijeme, programi ste pisali u C su curenje memorije, tražeći radom Sustav za sve Memorija za gudače i sitnica, ali nikada ga predaje natrag. I sada je to malo od pojednostavljivanje, ali ako ste ikada pokrenuti svoj Mac ili vaše računalo za neko vrijeme, otvaranje puno programa, Možda zatvaranja programa, i iako je tvoj Računalo nije srušio, to je sve tako puno sporiji, kao da je stvarno korištenjem puno memorije ili resursi, iako, ako nisi ni dirati tipkovnicu, koji bi mogao be--, ali ne bi mi uvijek biti da su programi radite sami su curenje memorije. I oni stalno postavljaju OS za više i više memorije, ali zaboravljajući o tome, zapravo ne koriste, ali Stoga uzimajući memorije daleko iz drugih programa koji bi ga žele. Dakle, to je uobičajeno objašnjenje. Sada je ovdje gdje je Valgrind Izlaz je u potpunosti krvoločan onima manje i udobnije podjednako. No, zanimljivo stvar je u pravu ovdje. To mi govori nevažeći pisati o Veličina četiri događa u ovom programu, Konkretno, na liniji 21. memory.c. Ako idem na liniji 21, hm, ima uistinu je nevažeća pisati veličine četiri. Zašto veličine četiri? Pa, ovo number-- a mogao biti anything-- je Int. Dakle, to je četiri bajta. Tako sam stavljajući četiri bajta u kojoj oni ne pripadaju. To je ono što Valgrind zapravo mi govori. Štoviše, to će također reci mi, kao što ćemo vidjeti, kao što to radi u budućem pset, ako i kada ste procurila memorije, koja je doista Imam, jer sam nazvao malloc, ali nisam zapravo zove, u ovom slučaju, besplatno, koje smo na kraju ćemo vidjeti je suprotno od malloc. Pa sad, mislim, završni primjer. Dakle, ovaj je malo više kompliciranih, ali to je možda Najveći razlog za budite oprezni s memorijom, i razlog da su mnogi programi i / ili web-poslužitelja, čak i do današnjeg dana, preuzimaju negativci negdje na internetu, koji su na neki način slanjem lažnih pakete na poslužitelj pokušava kompromitirati svoje račune, ili uzeti vaše podatke, ili samo uglavnom preuzeti stroj. Buffer overflow, kao ime sugerira, sredstva preplavljen ne int, ali tampon. I tampon je samo fancy način se kaže da je hrpa memorije. I doista, nazvao sam niz Prije tampon, umjesto s. Jer ako je to tampon, kao u smislu YouTube, ili svaki put kad gledate video, možda ste vidjeli riječ kašnjenje, točka, točka, točka. To je nevjerojatno neugodno. A to samo znači da vaš video player pokušava preuzeti puno bajtova, puno bajtova iz videa s interneta. Ali to je spor, pa je pokušava preuzeti hrpa njih ispuniti tampon, spremnik, tako da je imate dovoljno bajtova da se može onda vam pokazati video, bez zaustavljanja stalno. No, ispostavilo se, možete imati tampon na ovo veliko. Ali pokušati staviti ovoliko podataka u da, i vrlo loše stvari mogu dogoditi. Tako na primjer, pogledajmo Ovo posljednje teaser za primjer. Ovo je još jedan program za da je, na prvi pogled, ne učiniti ništa super korisne. To je dobio glavnu ulogu da nazove tu funkciju, f. I to je funkcija, f, ovdje, ima char polje, pod nazivom C, veličine 12. A onda je to pomoću Nova funkcija zove strncpy. Ispada da, uz ovaj jednostavan, jednostavna linija koda, samo dvije linije, smo napravili moj cijeli program, i zbog toga, cijeli moj računalo, i moj korisnički račun, te mi je teško voziti potencijalno ranjivi na bilo koga tko zna, te je dovoljno dobar za pokretanje ovaj program s određenim naredbenog retka argument. Drugim riječima, ako je to negativac stavlja unutar argvargv [1] upisivanjem na tipkovnici vrlo posebno izrađenih string, ne abc, 123, ali u suštini, binarni simboli koji predstavljaju izvršnu kod, program koji je on ili ona napisala, s ovim jednostavan program, koji je Predstavnik tisuća programa koji su na sličan način ranjivi, pretpostavljam, on ili ona u konačnici može izbrisati sve datoteka na moj hard disk, dobiti treperi brz, tako da on ili ona može upišite naredbi na vlastitu, e-mail sve datoteke u sebi. Sve što mogu učiniti, on je ili ona može učiniti s ovim brojem. Nećemo sasvim riješiti to još. A u stvari, to će uključiti malo sliku kao što je ovaj, koji uskoro ćemo doći razumjeti sve bolje. No, za danas, idemo završiti što je, nadam se, nešto više razumljivo XKCD šala, dok smo nastavili sljedeći put. U redu. Vidimo se u srijedu. [Muziciranja] Govornik: A sada, duboko misli, po Daven Farnham. Memorija je poput skakanja u hrpu zlatno lišće u nedjelju popodne. Vjetar puše, bacanje svoje hair-- oh, nedostaje mi dani when-- [Smijeh]