[MUSIK SPELA] DAVID J. MALAN: Okej. Detta är CS50. Och detta är början på veckan 5. Och som ni kanske har märkt, en del av materialet blir lite mer komplex, den lilla tätare. Och det är väldigt lätt, särskilt om du har haft för vana under en tid, att försöka klottra ner mest allt vi gör, vi säger i klassen. Men inse, det är kanske inte den ideala pedagogik att lära sig den här typen av material, och material i allmänhet. Och så är vi glada att meddela att CS50 egen Gheng Gong har börjat förbereda en kanonisk uppsättning anteckningar för kursen, hopp om vilket är att, en, dessa inte bara fungera som en referens och en resurs för att granska materialet och går tillbaka genom material som kan ha undgått dig första gången, men också så att era huvuden kan vara mer upp än ned, när den börjar bli dags att föreläsa, så att du kan engagera mer eftertänksamt, som skillnad från mer kladdig. Med det sagt, vad du hittar på hemsidan är sådana handlingar som denna. Och varsel, uppe till vänster, finns det inte bara en innehållsförteckning, men också tidskoder som kommer omedelbart hoppar du till lämplig del i videon på nätet. Och vad Chang här har gjort är i huvudsak dokumenterade vad som hände i det här särskilt föreläsning. Och många av föreläsningarna är redan på nätet nu med den här webbadressen. Och vi kommer att fortsätta att lägga upp resten av dem i slutet av denna vecka, så tar nytta av denna resurs. Så utan vidare, vi började att skala tillbaka det skikt som har varit sträng för en tid. Och vad gjorde vi säger en sträng faktiskt förra veckan? Så röding stjärna. Och röding stjärna, ja, vad gjorde det egentligen? Tja, hela tiden, om vi har krävt en funktion, som getString och lagring den så kallade retur värdet av getString i en variable-- det kallas s typ string-- vi har skrivit kodraden där uppe ovan. Och det är bara när jag ser min handskrift förstorade här jag inser hur förfärligt det är. Men låt oss anta att, på höger sida är ändå en rimlig skildring av vad som är pågått allt detta tid med getString. getString naturligtvis blir en sträng. Men vad betyder det egentligen? Det betyder att det blir en del av minne från operativsystemet genom att anropa en funktion som kallas malloc. Men mer om det senare. Och då fyller den del av minnet med bokstäverna användaren har skrivs in, följt av, naturligtvis, en nolltecken, eller omvänt snedstreck noll i slutet. Under tiden, på vänster sida av denna berättelse, hela tiden, vi har att förklara en variabel, som s. Och den variabeln är vad nu kommer börja ringa en pekare. Det är inte en låda inuti varav vi sätter strängen, Daven, per se, utan vi lägger i den rutan rutan till vänster vad exakt? Yeah? PUBLIK: Adressen till där den ligger i minnet. DAVID J. MALAN: Exakt. Adressen där Daven ligger i minnet. Och inte där alla Daven ligger, per se, men specifikt till adressen av vad? Yeah? PUBLIK: Första tecknet. DAVID J. MALAN: Det första tecknet i Daven, som i detta fall, Jag föreslog var godtyckligt och orealistiskt 1, OX1, vilket bara innebär att hexadecimal antal 1. Men det kommer förmodligen att vara ett mycket större antal att vi kan dra med en 0x som prefix, representerar ett hexadecimalt tecken. Och eftersom vi inte behöver veta var resten av karaktärerna i Daven är, på grund av vad enkel design beslut som gjordes för många år sedan? Yeah? PUBLIK: omvänt snedstreck 0. DAVID J. MALAN: Ja, exakt. Det omvända snedstrecket 0 gör att du, om än i linjär tid, att korsa strängen, gå från vänster till höger, med en for-loop, eller en stund loop, eller något liknande det, och bestämmer, oh, här är slutet av denna speciella sträng. Så med bara adress början av en sträng, Vi kan komma åt helheten av det, eftersom allt detta samtidigt, en sträng har just varit en char stjärna. Så det är säkert bra att fortsätta använda den CS50 biblioteket och denna abstraktion, så att säga, men vi ska börja se exakt Vad har hänt under hela den här tiden. Så ni kanske minns det här exemplet, också, från förra gången, jämföra 0, vilket egentligen inte jämföra. Men vi började att lösa detta. Men som kanske en uppdaterare, skulle jag intressera någon i en rosa elefant i dag, också av Chang? Hur du framför? [Ohörbart]. Kom upp. Och under tiden, när du kommer upp, låt oss överväga för ett ögonblick vad denna kod faktiskt gör. Det förklarar två variabler upp topp, s och t, ​​och ringer getString. Detta är inte en mycket användarvänligt program, eftersom den inte berätta vad de ska göra. Men låt oss bara anta att vi är med fokus på den saftiga delen. Och sedan gör vi, om s är lika med lika t, bör den säga printf, du skrev samma sak. Hej. Vad heter du? Janelle: Janelle. DAVID J. MALAN: Janelle, Trevligt att träffas. Så din utmaning handen för elefant är att först dra oss en bild av vad som är representeras i dessa två första linjer. Så s och t kan vara representerade hur på skärmen? Och du kan bara dra den med fingret på denna stora skärmen. Så det finns två halvor till varje sida av den ekvationen. Så det finns s till vänster, och sedan getString till höger. Och sedan finns det t till vänster, och sedan getString till höger. Så hur kan vi börjar rita en bild som representerar vad som händer här i minnet, skulle du säga? Och låt mig låta dig förklara vad du gör när du går. Janelle: OK. Jo, först, det skulle vara fråga dig att få indatasträngen. Och det skulle store-- oh, sorry. DAVID J. MALAN: OK. Bra. Och detta kallas vad? Åh, OK. Fortsätt. Jag menade inte att störa. Janelle: Förlåt. Så det skulle input den till adressen of-- osäker. Jag kan inte exakt ihåg numret, men jag tror att det börjar med 0. DAVID J. MALAN: Det är okej, eftersom jag gjorde siffrorna uppåt, så det finns inget rätt svar. Janelle: Från och med 0 bågen. DAVID J. MALAN: OK, så elementet 0. Visst. Janelle: Och sedan om var som bara två letter-- DAVID J. MALAN: OK, tillbaka till dig. Janelle: Så elementet 0, och då elementet 1 eller element 2. DAVID J. MALAN: Och vilken del av bilden drar du just nu? Uppmaningen till getString? Eller förklaringen s? Janelle: Deklarationen av s, tror jag. Åh, det getString, eftersom det skulle läsas in i varje [? område. ?] DAVID J. MALAN: Bra. Exakt. Även om detta på ett effektivt sätt returnerar en array, återkallelse, när vi kommer tillbaka en sträng, kan vi index in i den sträng med 01 och 2. Tekniskt sett dessa är förmodligen representeras av enskilda adresser, men det är bra. Så antar, om jag kan bara snabbt vidarebefordra till där vi slutade förra gången, om en av strängarna var g a b e, omvänt snedstreck 0, därigenom representerande gabe ter ingång, hur kan vi representerar er nu? Om detta är det minne som är returnerats av getString? Janelle: Skulle det vara representeras av en båge? DAVID J. MALAN: Med en båge? Tja, nej. Låt oss bara säga, pictorially, låt mig bara gå vidare och föreslår att, om detta är er, detta är returvärdet för getString. Och du har dragit detta som 0, 1, 2, som är helt rimligt, eftersom vi kan indexera i strängen, som sådan. Men bara för att vara i linje med förra gången, låt mig gå vidare och godtyckligt föreslår att denna är adressen 1, detta är adressen 2, detta är adressen 3, och så vidare. Och så, bara för att vara super klart, vad som händer att gå i er som ett resultat av att första raden av kod, skulle du säga? Janelle: Adress 1? DAVID J. MALAN: Exakt. Så itu 0x1. Och under tiden, låt mig gå vidare och duplicera mycket av vad du gjort och lägga min T här. Om jag skulle skriva in gabe igen, en andra gång, när du ombeds med getString, där, naturligtvis, gabe kommer att gå? Tja, presumably-- Janelle: Som på här? DAVID J. MALAN: Ja. Janelle: Eller det är också i samma lådor? DAVID J. MALAN: Låt mig föreslå, ja, exakt, så i dessa ytterligare lådor. Men vad är nyckeln nu är att även även om jag har ritat dem ganska nära together-- 0x1, detta är 0x2-- i verkligheten, det nu kan vara adress 0x10, till exempel, och 0x11 och 0x12, och så vidare. Och så, om så är fallet, vad som kommer att hamna här i t? Janelle: 0x10? DAVID J. MALAN: Exakt. Så 0x10. Och så nu, sista frågan. Du har överlägset, var tvungen att jobba på svårast för en elefant hittills. Nu, om jag drar upp koden igen, när jag gör, i linje tre, Om s är lika med är lika med t, vad är jag egentligen jämföra att vi har ritat här? Janelle: De två adresserna? DAVID J. MALAN: Exakt. Så jag säger är s lika lika med t? Med andra ord är en lika lika med 10? Och naturligtvis, det självklara svaret är nu, nej. Och så det här programmet är ytterst kommer att skriva ut det, skulle du säga? Janelle: Skulle det vara, du skrev samma sak? DAVID J. MALAN: Så om s är 1 och t är 10? Janelle: Du skrev olika saker. DAVID J. MALAN: Exakt. Du skrev olika saker. Okej. Så en applåd, om vi kunde, här. [Applåder] Det var smärtsamt. Jag vet. Snyggt gjort. Så nu ska vi se om vi inte kan retas isär vad fix var. Och naturligtvis, när vi fast detta-- som jag ska nu representera i green-- Vi gjorde ett par förbättringar här. Först, bara som en förstånd kolla, jag först kontrollera Om s är lika med noll och t är lika med noll. Och bara för att vara tydlig, då kanske s eller t vara null i kod som denna? När kan s eller t vara null. Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Om strängen som användaren skrev i är alldeles för lång att passa in i minnet, eller något konstig hörn fall som detta, getString, som vi får se, bokstavligt talat idag, i sin dokumentation, säger den ger null som en speciell sentinel värde, eller bara typ av en speciell symbol som betyder något gick fel. Så vi vill kontrollera att eftersom det visar sig att null är en mycket farlig värde. Ofta om du försöker göra något med null involverar en function-- passerar det som indata för instance-- denna funktion kan mycket kommer att krascha och, med det, ta ner hela programmet. Så denna tredje raden är nu bara en sanity kolla, felkontroll, om ni så vill. Det är en god vana nu oss att komma in när som helst vi försöker använda ett värde som kunde potentiellt vara null. Nu, i den fjärde raden här, "Om strcmp (s, t)," bra, vad är det att hänvisa till? Tja, sa vi att detta var ett mycket kortfattat uppkallad funktion för strängjämförelse. Och dess syfte i livet är att jämföra sitt första argument mot det andra, men inte i termer av deras adresser, som vi gjorde oavsiktligt ett ögonblick sedan med den röda koden, men snarare att jämföra dessa två strängar i mänskligt intuitivt sätt genom att jämföra detta mot detta, mot detta, mot detta, och sedan stoppa, om och när en eller båda av mina fingrar träffar ett omvänt snedstreck 0. Så någon år sedan genomfört strcmp att genomföra för oss funktionaliteten att vi hoppades att vi skulle ha fått genom att bara jämföra två enkla värden. Nu ärligt talat, jag håller ritning alla dessa olika siffror. Men verkligheten är, jag har varit göra dessa upp hela tiden. Och så låt mig bara gå vidare och klottra dessa ut att göra en punkt som i slutet av dagen och framåt, Vi är inte riktigt kommer att bry sig om vilka adresser saker är faktiskt i minnet. Så jag tänker inte dra dessa typer av siffror så mycket längre, Jag är bara en abstrakt detta bort en lite mer vänligt med bara pilar. Med andra ord, om s är en pekare, väl, låt oss bara göra det, bokstavligen, som en pekare, en pil som pekar från sig själv till något annat, och inte oroa sig alltför mycket mer om minutiae av dessa adresser som, återigen, gjorde jag upp ändå. Men vi får se dessa adresser, ibland, när felsökning kod. Nu under tiden, det här programmet här uppe fixar, naturligtvis, det problemet genom att jämföra dessa två strängar. Men vi stötte på ett annat problem. Detta var från kopian programmera förra gången, vari, jag försökte att kapitalisera bara det första tecknet i en sträng. Men vad var symptomet vi såg förra gången då en användare skrivit in ett värde, som gabe små bokstäver, för s, då vi tilldelade s in t, som i den tredje raden där, och sedan försökte jag kapitalisera t bygel 0? Vad var effekten av ändra t fäste 0 här? PUBLIK: Det ändrade talet. DAVID J. MALAN: Ja, Jag bytte s, liksom. För vad som verkligen pågick? Nåväl, låt mig se om jag kan städa upp denna bild, enligt följande. Om s är, återigen, ordet g, a, b, e, snedstreck, 0, och S vi ska fortsätta rita som en låda här, men inga fler adresser. Låt oss sluta göra saker. Låt oss bara rita en bild att förenkla världen. När jag förklarar t med snöre t, som skapar denna bit av minnet. Fyrkantig råkar vara 32 bitar i de flesta datorer. Faktum är, om du någonsin har hört talas om en dator som har en 32-bitars arkitektur, riktigt fancy-tala, som bara betyder att den använder 32-bitarsadresser. Och som en teknisk åt sidan, Om du någonsin undrat varför äldre datorer, om du faktiskt försökte soppa upp dem med massor av RAM, kunde bara ha högst fyra gigabyte RAM, väl det beror på, bokstavligt talat, din gamla dator kunde bara räkna så högt som 4 miljarder, 4 miljarder byte, eftersom det var med 32-bitars nummer för adresser. Men i alla fall, i detta exempel berättelsens mycket enklare. t är bara en annan pekare, eller verkligen en röding stjärna, aka sträng. Och hur gör jag vill uppdatera den här bilden nu med den andra raden av kod, efter punkt, prick, pricka? När jag gör string t är lika med s semikolon, Hur ändrar den här bilden? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Ja. Exakt. Jag satte bara en pil från t box till samma adress, samma första bokstav i gav. Eller tekniskt, om detta Killen var fortfarande på 0x1, det är som om jag hade 0x1 här och 0x1 här. Men återigen, vem bryr sig om adresserna? Det är bara tanken att nu betyder något. Så det här är vad som händer här. Så naturligtvis, om du gör t fäste 0, vilket är array notation, av course-- och ärligt talat, det ser som det finns en matris över här, men nu finns det här konstiga. Vet att programmeringsspråket, C, erbjuder denna funktion, varigenom, även om t är en pekare, eller s är en pekare, Du kan fortfarande använda den välbekanta, bekväm klammer notation för att gå till den första delen, eller den andra delen, eller någon del att att pekaren pekar till grund, förmodligen, det är, som i detta fall, pekar på några array. Så hur ska vi fixa detta? Ärligt talat, det är där den fick ett lite överväldigande vid första anblicken. Men här är en ny och förbättrad version. Så först, jag får bli av med CS50 biblioteket bara för att exponera att s är verkligen en röding stjärna, bara en synonym. Och t är också en röding stjärna. Men vad som händer på högra sidan av denna linje där t tilldelas ett värde? Vad är malloc? Vad det är strlen? Vad är sizeof (char)? Varför i helsike gör detta line ser så komplicerat? Vad gör den på en hög nivå? Hur är det att lagra i t? Yeah? PUBLIK: Det tilldela ett viss mängd minne. Det är för att lagra, antar jag, brev [ohörbart]. DAVID J. MALAN: Perfect. Perfect. Det allokera en viss mängden minne att lagra, förmodligen, framtida bokstäver. Och framför allt, malloc Därför återvänder vad? PUBLIK: Returnera [ohörbart]? DAVID J. MALAN: Exakt. Returnera adressen till det minnet, vilket är ett finare sätt att säga, returnerar adressen för den första byten i detta minne. Det åligger mig att komma ihåg hur mycket minne jag faktiskt tilldelats eller bad malloc för. Nu hur mycket är det? Tja, även om det finns en massa parenteser här, malloc tar bara ett enda argument. Och jag ange strlen för s, så ge mig så många bytes som det finns i er, men lägga en. Varför? Yeah? Publik: Den omvända sned 0. DAVID J. MALAN: Exakt. Vi måste göra lite städning. Så eftersom det finns ett omvänt snedstreck 0, skulle vi bättre komma ihåg att. Annars kommer vi för att skapa en sträng som har inte den där speciella terminator. Under tiden, bara för att vara super anal, jag har sizeof (char), bara i fall någon kör min kod inte på CS50 apparaten, men kanske en annan dator sammanlagt där chars är en byte, enligt praxis, men två bytes, eller något större än så. Det är bara att vara super, super främmande för fel. Även om, i verkligheten är det mest sannolikt kommer att bli en 1. Nu, under tiden, jag gå vidare och kopiera sträng, t fäste i lika t fäste s. Och jag kommer att skjuta till förra veckans källkod för att se vad som händer. Men nyckeln takeaway, och Anledningen till att jag lägger koden nu i grönt, beror på att det allra sista raden, t bygel 0 lika TOUPPER, har effekten av att Aktivering vilken sträng? t och / eller s? Den sista raden i koden. Bara t, eftersom det är hände den här gången, om jag ångrar något där sista steget, vad som har hänt är, när jag ringer malloc, Jag får i huvudsak en bit av minne det är samma storlek som originalet, eftersom det är det aritmetiska jag gjorde. Jag lagrar in t adressen av den del av minnet. Även om detta ser trevligt och vackra, trevliga och tom, verkligheten är att det finns, vad vi ska hålla ringer, sopp värden här. Denna bit av minnet kanske mycket väl har använts tidigare, några sekunder, för några minuter sedan. Så det kan absolut vara tal eller bokstäver där, bara av en slump. Men de är inte giltigt, tills jag själv fylla denna bit av minnet med de faktiska tecken, vilket jag göra på det för loop där. Okej? Så nu, klimax dessa tre exempel som till synes var bruten förra gången, Detta Swap exempel denna funktion arbetat i den meningen att den bytte a och b. Men det fungerade inte i vad andra mening? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Om jag skulle kalla denna funktion från another-- exempelvis från en funktion som huvud, där Jag har en variabel, x och y, som jag gjorde förra veckan, samma kod, och jag passerar på x och y till Pendla och sedan ringa Swap-- detta, naturligtvis, är den korrekta versionen är vad vi håller på att se-- det inte fungerade. Så vad är fix? Tja, så bara för att vara klart, låt mig gå vidare och-- ge mig en sekund här, och se om jag kan visa er den sista, som blir in-- låt oss se om jag kan hitta denna verkliga fast-- OK, [ohörbart]. OK, det är det. Så ignorera de kommandon jag bara skriva. Jag vill att det ska hämta på i sista minuten ett exempel från förra gången, vilket kallas nu ingen Swap. Så ingen Swap är där vi slutade förra gången, varigenom, initierad jag x till 1 och y till 2. Jag sedan ringa Swap, som går under 1 och 2. Och sedan denna funktion arbetat i någon mening, men det hade ingen permanent effekt på x och y. Så frågan till hands är, hur nu vi faktiskt åtgärda problemet? Vad är lösningen till hands? Tja, i swap.c, vilket är nytt i dag, märker ett par skillnader. x och y är samma. Men vad är helt klart annorlunda linje 25? Vad är nytt där, om du kommer ihåg hur det såg ut en sekund sedan? PUBLIK: [ohörbart]. DAVID J. MALAN: Ja. Så et-tecken är en ny bit av syntax inte bara i det här programmet, men också mer allmänt i CS50. Hittills tror jag inte Vi har sett några exempel eller egentligen talade om dem på något detalj, utom, kanske, i förebyggande syfte i snitt, ett et-tecken som den här. Tja, det visar sig et-tecken är ett av de sista bitarna av ny syntax vi kommer att lära sig. Allt det betyder är att adressen för en viss variabel. Vid vilken adress betyder x bor? Men vad adress betyder y bor? För om det grundläggande problem innan var att x och y gick vidare som kopior, vad vi verkligen vill göra är att ge Swap med som en skatt karta som leder till där x och y faktiskt finns i RAM, så att Swap kan följa den kartan och gå dit x eller y markerar fläcken och ändra de faktiska värdena 1 och 2 där. Så Swap behöver förändras något för. Och vid första anblicken, denna styrka verkar lite liknande röding stjärna. Och faktiskt är det. Så en är en pekare till vilken typ av data, baserat på detta markerade delen? Så det är en int. Så en är inte längre en int, det är adressen till en int. Och på samma sätt, är b nu går att vara adressen till en int. Så när jag nu kallar Swap från Main, Jag tänker inte ge Swap 1 och 2. Jag ska ge den som Ox-något och Ox-någonting, två adresser som kommer att leda Byt till deras verkliga placeringen i datorns minne. Så nu, min återstående genomförandet måste förändras en smula. Vad är naturligtvis annorlunda nu i dessa tre rader kod? Det finns dessa jävla stjärnor alla överallt, okej? Så vad händer här? Yeah? PUBLIK: Det är naturligtvis [ohörbart]. DAVID J. MALAN: Exakt. Så i detta context-- och det var inte den bästa designen beslutet visserligen år sedan. I detta sammanhang, där du har bara en stjärna, och du inte har en datatyp, som int, omedelbart till vänster, stället har du ett likhetstecken, tydligt, i detta sammanhang, när du säger stjärna en, det innebär att gå till adress som är i en. Följ skattkarta, så att säga. Och under tiden, i linje 37, Det betyder samma sak. Gå till adress a, och satte det där? Vad är på plats som b anger. Med andra ord går till b. Få det värdet. Gå till en och, per den lika underteckna, uppdraget operatören, sätta det värde där. På samma sätt är int temp bara en int. Inget behöver förändras om temp. Det är bara en reservglas från Annenberg för lite mjölk eller apelsinjuice. Men jag måste säga, gå till miljarder. Gå till den destinationen och sätta värdet i temp där. Så vad händer då? När jag faktiskt kalla Swap den här gången, om denna första magasinet här representerar Main, denna andra bricka representerar Swap, när Jag passerar et-x och-tecken y från Main till Pendla, bara för att vara tydlig, vad är detta stackram mottagande? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Adressen x och adressen till y. Och du kan tänka på dessa som postadress. 33 Oxford Street och 35 Oxford Street, och du vill flytta de två byggnaderna som finns på dessa platser. Det blir liksom en löjlig idé, men det är allt vi menar med adress. Var i världen kan du hittar dessa två Ints? Var i världen kan du hitta dessa två byggnader? Så om slutligen, efter all denna tid som jag gå in i dagens källkod och kompilera Byt och springa ./swap, slutligen, för den första gången gör vi faktiskt se att mina värderingar har faktiskt bytts framgång. Och nu kan vi även ta notera detta i t.ex. gdb. Så låt mig gå in i samma fil. Låt mig gå vidare och köra gdb för ./swap. Och nu, i Swap, jag ska gå framåt och sätta en brytpunkt i Main. Och nu ska jag gå framåt och kör programmet. Och nu ser vi min kod pausats på den linjen. Om jag går vidare och skriva ut x, vad ska jag ser här? Det är en fråga. Säg igen? PUBLIK: [ohörbart]. DAVID J. MALAN: Så slumptal, kanske. Kanske jag har tur, och det är trevligt och enkelt, som 0. Men kanske är det något slumptal. I det här fallet, jag hade tur. Det råkar bara vara 0. Men det är verkligen tur, eftersom inte förrän jag skriver nästa och sedan skriva ut x har att kodrad, rad 19, avrättats. Under tiden, om jag skriver nästa gång, och nu skriva ut y, jag ska se 2. Om jag skriver nästa, det kommer att bli lite förvirrande, för nu, printf kommer att visas på skärmen, som den gjorde. x är 1. Nu gör vi det igen. Och nu, här där det blir intressant. Innan jag kallar Swap eller till steget in i den, låt oss ta en liten titt. x är, återigen, en. Y är, naturligtvis, en snabb förstånd kolla, 2, så inte svårt där. Men vad är et tecken x? Svar, det slags funky ser. Men int stjärnan inom parentes är bara BNP: s sätt att säga detta är en adress. Det är inte en int, det är en pekare till en int eller annars känd som en adress. Vad är denna galna sak? Vi har aldrig sett något riktigt som förut. Så det här är adressen i datorns minnet av där x råkar leva. Det är Ox-någonting. Och det är, ärligt talat, varför Jag har börjat rita pilar, istället för siffror, för vem bryr sig egentligen att din int är på en viss adress som är så stor. Men bffff0c4, dessa är alla faktiskt hexadecimala siffror, som är 0 till f. Så vi ska inte uppehålla mig alltför länge på vad dessa saker är. Men om jag skriver ut y, Naturligtvis ser jag 2. Men et-tecken y, jag ser den här adressen. Och varsel, för den nyfikne, Hur långt ifrån varandra är x och y? Du kan ignorera de flesta av adressen. Fyra byte. Och det är i linje med vår tidigare hävdar att hur stor är en int? Fyra byte. Så det ser ut som allt är kö fint, som ni kanske hoppas, i minnet. Så nu, låt oss bara snabbspolning framåt till slutet av denna berättelse. Låt oss gå vidare och skriva steg, att dyka i Swap-funktionen. Nu märker, om jag skriver en, det är identisk med adressen för x. Om jag skriver b, det är identiskt till adressen för y. Så vad ska jag se om jag säger, gå till adressen a? Så ut stjärna en. Så stjärnan betyder gå dit, i detta sammanhang. Ampersand betyder vad är adressen. Så stjärnan ett medel 1. Och skriv ut stjärnan b ger mig 2. Och låt mig anta, för tillfället, att åtminstone den kod som fortsätter att exekvera nu kan vara motiverade igenom på det sättet. Men vi ska se över denna idé snart. Så denna version av Swap är nu korrekt och tillåter oss att byta denna särskilda typ av data. Så några frågor då på Swap? På stjärna? På adress? Och du kommer att se, med Problemet set 4, sorts, men problemet set 5, definitivt, hur dessa saker är användbara och få mycket mer bekväm med dem, som följd. Vad som helst? Okej. Så malloc är, återigen, denna funktion som bara allokerar minne, minne tilldelning. Och varför är detta bra? Tja, hela tiden, du har använt malloc. Om du anser nu hur GetString verk, förmodligen, är det frågat någon för en bit av minne, när som helst användaren skriver en sträng in, eftersom vi verkligen visste inte, eftersom CS50 personal, hur stor de strängar som människor kommer att skriva kan vara. Så låt oss, för första gången, börjar skal tillbaka hur den CS50 biblioteket fungerar, med hjälp av ett par exempel som kommer att leda oss dit. Så om jag öppnar gedit och öppna upp scanf 0, vi kommer att se följande kod. Scanf 0, finns på hemsidan för idag, har relativt få rader kod här, 14 genom 20. Och låt oss se vad den gör. Det förklarar en int, som kallas x. Den säger något i stil med, nummer tack. Och nu säger, scanf% i, och x. Så det finns en massa nya saker där. Men scanf, kan du typ av tro för som motsatsen till printf. printf naturligtvis utskrifter till skärmen. scanf slags skanningar från användarens tangentbords något han eller hon har skrivit. % I är precis som printf. Detta innebär förväntar användaren att skriva ett int. Och nu, varför tror du att jag kan passera scanf & x? Om syftet i livet för scanf är att få något från användaren, vad är meningen med passerar den, & x, nu? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Vad jag, människan, skriv in, min ingång kommer att sparas på den platsen. Det är inte tillräckligt, minns, att bara passera i x, för vi har sett redan, varje gång du passerar bara en rå variabel, som en int, till någon annan funktion, säker, det kan ändra på det variabel, men inte permanent. Det kan inte ha en effekt på Main. Det kan bara förändra sin egen lokala kopia. Men om man istället, du behöver inte ge mig den verkliga int, men du ger mig vägbeskrivning till att int jag nu, att vara scanf, säkert, kan jag följa det itu med och sätta ett nummer där så du har tillgång till det också. Så när jag kör det här programmet, låt oss se. Gör scanf 0 dot snedstreck, scanf 0. Och om jag nu skriver ett nummer som 50, tack för 50. Om jag nu skriver ett nummer som negativ 1, för den negativa 1. Jag nu skriver ett nummer som 1,5, hm. Varför programmet ignorera mig? Jo, för att helt enkelt, sa jag det att förvänta sig endast en int. Okej. Så det är en version av denna. Låt oss ta upp saker ett snäpp och föreslår att detta inte är bra. Och häri ligger ett mycket enkelt exempel om hur vi kan börja skriva kod att andra människor kan utnyttja eller kompromissa genom att göra dåliga saker. Så linje 16, så lika i anden till tidigare, men jag är inte förklara det int den här gången. Jag förklarar det röding stjärna, aka sträng. Men vad betyder det egentligen? Så om jag inte anger ett address-- och Jag kallar det godtyckligt, buffert, men jag kan kalla det är, att vara simple-- och då jag gör det, förklara för mig, om du kunde, baserat på tidigare logik, vad scanf gör i linje 18, Om passet% s och buffert, vilket är en adress? Vad är scanf, om man tillämpar exakt samma logik som version 0, ska försöka att göra här, när det användaren skriver något i? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Scanf, av logik tidigare, kommer att ta strängen att det mänskliga typbestämd in-- det nu en sträng, det är inte ett nummer, förmodligen, om han eller hon cooperates-- och det kommer att försöka sätta det sträng i minnet oavsett på vilken adress buffert anger. Och det här är bra, eftersom buffert verkligen är tänkt att vara en adress. Men jag hävdar detta program är buggy i en mycket allvarligt sätt, för vad värdet är buffert som standard? Vad har jag initierat in? Vilken bit av minnet? Jag har inte, eller hur? Så även om jag har tilldelats en char stjärna som inte längre kallas s, det istället kallas, buffer-- så Låt oss dra variabeln namn nu som buffer-- om jag har inte kallas getString eller malloc här, som effektivt innebär att buffert är bara några sopor värde. Nu vad betyder det? Det betyder att jag har berättat scanf att förvänta sig en sträng från användaren. Och vet du vad? Vad denna sak pekar att-- och jag drar frågetecken, men i verkligheten, det kommer att bli något som OX1, 2, 3, eller hur? Det är en falsk värde som bara råkar vara där från förr. Så med andra ord, det är som om bufferten är bara pekar på något i minnet. Jag har ingen aning om vad. Så om jag skriver in gabe nu, det kommer att försöka sätta g-a-b-e / 0 där. Men vem vet vad det är? Och i det förflutna, något gången vi har försökt att röra minne som inte tillhör för oss, vad som hänt? Eller nästan varje gång. Segmente fel, eller hur? Denna pil, jag har ingen aning om var det är pekar. det är bara några slumpmässigt värde. Och naturligtvis, om man tolkar ett slumpmässigt värde som en adress, du kommer att gå till några random destination. Så gabe kanske faktiskt krasch mitt program i det här fallet. Så vad kan vi göra det är nästan lika illa? Tänk på detta tredje och sista exempel på scanf. Denna version är bättre på vilket sätt? Om du är bekväm med det tidigare problem, det här är bättre. Varför? PUBLIK: [ohörbart]. DAVID J. MALAN: Bra. Så här fallet av linje 16 är bättre, i den meningen att vi uttryckligen fördela en del minne. Vi använder inte malloc, vi använder vecka 2 tillvägagångssätt för att bara förklara en matris. Och vi har sagt att en sträng är bara en rad av tecken, så detta är helt legitimt. Men det är, förstås, som du noterar, fast storlek, 16. Så det här programmet är helt säker, om jag skriver i en teckensträngar, två tecken strängar, 15 teckensträngar. Men så fort jag börjar skriva 16, 17, 18, 1000 teckensträngar, där den strängen kommer att hamna? Det kommer att hamna delvis här. Men vem vet vad är utanför gränserna av detta särskilda array? Det är som om jag har förklarade 16 lådor här. Så i stället för att dra ut alla 16, vi ska bara låtsas att jag har dragit 16. Men om jag sedan försöker läsa en sträng det är mycket längre, liksom 50 tecken, Jag ska börja sätta a, b, c, d, x, y, z. Och det är förmodligen något annat minnessegment att, återigen, kan orsaka mitt program att krascha, eftersom jag inte har bett om något mer än bara 16 byte. Så vem bryr sig? Tja, här är CS50 biblioteket. Och de flesta av detta är bara liksom instruktioner upp överst. Den CS50 bibliotek, hela tiden, har haft denna linje i linje 52. Vi har sett typedef eller kommer du att se typedef i pset 4, som bara skapar en synonym vari char stjärnan kan vara mer enkelt till som sträng. Så detta är en av de några stödhjul vi har använt i hemlighet under huven. Under tiden, här är funktionen, getchar. Nu uppenbarligen, det finns ingen kropp till det. Och faktiskt, om jag håller rullning, det gör jag faktiskt inte ser några implementationer av dessa funktioner. Som en sanity check, varför är det? PUBLIK: [ohörbart]. DAVID J. MALAN: Ja. Så det här är rubrikfilen. Och huvudfiler innehåller prototyper, plus lite annat, tycks det, liknande typedefs. Men i CS50.c, som Prisjakt aldrig gett dig direkt, men har varit i CS50 apparaten alla den här gången, djupt inne i sina mappar, märker att det finns en hel gäng funktioner här. Faktum är, låt oss rulla nedåt. Låt oss bortse från de flesta av dem, för nu. Men bläddra ner till getInt och se hur getInt fungerar. Så här är getInt. Och om du någonsin verkligen brydde sig hur får int fungerar, här är dess dokumentation. Och bland de saker den säger är det talar om för dig vad de värdeintervall som den kan återvända. Det är i huvudsak negativt 2 miljarder till positiv 2 miljarder, ge eller ta. Och det visar sig, allt detta tid, även om vi har aldrig hade du kontrollera om det, Om något går fel, det visar sig att alla den här gången har getInt återvänder en speciell konstant, inte null, utan snarare int_max, vilket är bara en programmerare konvent. Det betyder här är ett speciellt värde. Se till att kontrollera för detta, bara om något går fel. Men vi har aldrig brytt med att hittills, eftersom igen, denna menas att förenkla. Men hur getInt får genomföras? Jo, man tar det inga argument. Vi vet att. Den returnerar en int. Vi vet att. Så hur fungerar det under huven? Så det finns uppenbarligen en oändlig slinga, åtminstone utseendet en. Lägg märke till att vi använder getString. Så det är intressant. getInt kallar vår egen funktion, getString. Och nu varför skulle detta vara fallet? Varför blir jag defensiv här i linje 165? Vad kan hända i linje 164, bara för att vara tydlig? Det är samma svar som tidigare. Kan bara vara slut på minne. Något går fel med getString, vi måste kunna hantera det. Och anledningen till att jag inte återvänder null är att det tekniskt är null en pekare. getInt måste returnera en int. Så jag har godtyckligt beslutade, i huvudsak, att 2 miljarder, ge eller ta, går att vara ett speciellt värde som jag kan aldrig faktiskt få från användaren. Det är bara det ena värdet jag ska till spillo för att representera en felkod. Så nu, det blir lite finare. Och det är inte riktigt samma funktion som tidigare, men det är mycket lika. Så märker, förklarar jag här, i linje 172, både en int n och en char c. Sen använder jag denna funky linje, sscanf, som det visar sig inte igenom en sträng från tangentbordet. Den står en existerande sträng som användaren har redan skrivits in. Så jag har redan ringt getString, vilket betyder att jag har en sträng i minnet. sscanf är vad du skulle ringa en parsfunktion. Det ser ut på strängen jag har skrivit in, tecken för tecken, och gör något nyttigt. Denna sträng lagras i linje. Och jag vet att bara genom att gå backa upp här och säga: Åh, OK, Jag kallade det inte är den här gången, men linjen. Och nu detta är lite annorlunda. Men det betyder i praktiken, av skäl vi något våg våra händer på i dag, att vi kontrollerar att se om användaren skrivit in och int och kanske ett annat tecken. Om användaren skrivit in en int, det är kommer att lagras i n, för att jag är passerar detta med adress, nytt trick som vi har sett i dag. Om användaren skrivit också i liknande 123x, att x kommer att hamna en bokstav i tecken c. Nu visar det sig att sscanf kommer att tala om för mig, intelligent, hur många variabler sscanf framgångsrikt kunna fylla. Så genom denna logik, om funktionen Jag genomförande är getInt, men jag kollar, potentiellt, för användaren att ha skrivit in en int följt av något annat, vad vill jag sscanf s returvärdet verkligen vara? Om syftet är att få bara en int från användaren? Så om sscanf returer 2, vad betyder det? Användaren skrivit in något som, bokstavligen, 123x, vilket är bara nonsens. Det är ett fel, och Jag vill kontrollera om det. Så om användaren skriver detta, genom denna logik, vad gör sscanf återvända, skulle du säga? Så det kommer att gå tillbaka 2, eftersom 123 kommer att gå in här, och x kommer att hamna här. Men jag vill inte att x att få fylld. Jag vill sscanf bara lyckas fyller den första av dess variabler. Och så det är därför jag vill sscanf att returnera en. Och om detta är lite över huvudet för tillfället, det är helt bra. Inse dock att en av de värden av getInt och getString är att vi gör en fan av mycket felkontroll så här så att det hittills, kan du ganska mycket skriver något på tangentbordet, och vi kommer att fånga den. Och vi säkert, det personal, kommer definitivt inte vara källan till ett fel i ditt programmet, eftersom vi är på defensiven kontroll av alla de dumma saker som en användare kan göra, som att skriva en sträng, då du verkligen ville int. Så för nu-- vi kommer tillbaka till detta innan long-- men hela tiden, getString och getInt har varit under huven med hjälp av denna grundidé adresser i minnet. Så nu ska vi göra det hela lite mer användarvänliga. Som ni kanske minns, från Binky förra time-- om min mus kommer cooperate-- så Vi hade denna kod, som ärligt talat, är ganska meningslöst. Denna kod ger inget användbar, men det var det exempel som professor Parlante används för att representera vad som pågår i en Programmet omfattar minne. Så låt oss återberätta detta story super kort. Dessa två första raderna, i Engelska, vet vad, skulle du säga? Precis i någorlunda mänskligt, men något tekniska termer, ta en stab. PUBLIK: [ohörbart]. DAVID J. MALAN: OK, du är upprättandet adresser för din x och y variabler. Inte riktigt, eftersom x och y inte är variabler i traditionell mening. x och y är adresser eller kommer att lagra adressen. Så låt oss prova det här en gång till. Inte en dålig start, men. Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Bra. Jag tror det är lite renare. Deklarera två pekare, två heltal. Och vi kallar dem x och y. Eller om vi skulle dra detta som en bild, återigen, minns helt enkelt att alla vi gör med den första linjen drar en ruta som denna, med lite skräp värde i det, och kalla det X, sen en annan låda som denna, med några sopor värde i den, kalla det y. Vi har förklarat två pekare som slutligen kommer att lagra adressen till en int. Så det är alla där. Så när Binky gjorde detta, den lera precis såg ut så här. Och Nick bara typ av insvept pilarna, som om de inte pekar någonstans i synnerhet eftersom de är bara sopor värden. De är inte explicit initierad någonstans i synnerhet. Nu nästa rad av kod, minns, var det här. Så i någorlunda användarvänligt, men något teknisk engelska, vad är det här kodraden gör? Yeah? PUBLIK: [ohörbart]. DAVID J. MALAN: Perfect. Den fördelning av bit av minne som är storleken på en int. Och det är halva svaret. Du svarade rätt halv av uttrycket. Vad som händer på vänster om likhetstecknet? Yeah? PUBLIK: Och delar den till variabeln x? DAVID J. MALAN: Och delar den till variabeln x. Så för att Recap, höger allokerar tillräckligt med minne för att lagra en int. Men malloc specifikt returnerar adressen av denna bit av minnet, som du har just föreslagit får lagras i x. Så vad Nick gjorde förra gången med Binky är Han släpade att pekaren ut, leran, att peka nu på en vit bit av minnet som är lika med storleken på en int. Och faktiskt, det är tänkt att representera fyra byte. Nu, nästa kodrad gjorde detta, blir stjärn x 42. Så 42 är enkel på höger sida, meningen med livet. Vänster sida, betyder stjärna x vad? Det kan också ha gone-- det är OK. OK. PUBLIK: I grund och botten, gå till [ohörbart] DAVID J. MALAN: Bra. PUBLIK: [ohörbart]. DAVID J. MALAN: Exakt. Vänster sida betyder gå till x. x är adressen. Det är som 33 Oxford Street, eller OX1. Och stjärnan x betyder gå till den itu med och sätta vad där? 42. Så ja, det är precis vad Nick gjorde. Han började med med, väsentligen, mentalt pekar ett finger mot x, efter pilen till den vita rutan till höger sidan, och sätta nummer 42 där. Men sedan det blev ett lite farligt, eller hur? Binky är på väg att förlora sitt huvud. Star y är lika med 13, otur, betyder vad? Så stjärniga y medel går till adressen i y. Men vad är adressen i y? Okej, det är skräp värde, eller hur? Jag ritade det som ett frågetecken. Nick drog det som en hoprullad pil. Och så fort du försöker gör stjärnan y, sade åka dit, men det finns inte en legitim adress, det är lite falsk plats, Programmet kommer att krascha. Och Binky huvud går att flyga bort här, som den gjorde. Så i slutändan, det här programmet var bara platta ut fel. Det var en buggy program. Och det behövde fastställas. Och det enda sättet, egentligen, för att åtgärda det skulle vara, till exempel, denna linje, som vi inte ens få till, eftersom programmet kraschade för tidigt. Men om vi skulle fixa det här, vad Effekten gör gör y lika x har? Tja, det i huvudsak pekar y på oavsett värde x pekar på. Så i Nick berättelse, eller Binky berättelse, både x och y pekade på den vita bit av minnet, så att, slutligen, när du do stjärnan y är lika med 13 igen, du hamnar sätta 13 i lämplig plats. Så alla dessa linjer är perfekt legitimt, utom den här, när det hände innan du faktiskt tilldelats y något värde. Nu tack och lov, du behöver inte måste resonera igenom alla av dessa typer av frågor på egen hand. Låt mig gå vidare och öppna upp ett terminalfönster här och öppna upp för en liten stund, en super kort program som också är en slags meningslöst. Det är fult. Det behöver inte uppnå något användbart. Men det visar frågor minne, så låt oss ta en titt. Main, super enkelt. Den uppmanar tydligen en funktion, f och sedan returnerar 0. Det är typ av svårt att förstöra detta. Så Main är ganska bra, än så länge. Så f är problematiskt. Och bara inte lägga mycket möda på att namnge den här, för att hålla fokus på koden. f har två rader. Och låt oss se vad som nu händer. Så å ena sidan här-- och låt mig göra Detta överensstämmer med tidigare example-- å ena sidan, den vänstra sidan är gör vad, på engelska? Det är-- PUBLIK: Att skapa en pekare. DAVID J. MALAN: Att skapa en pekare till en int och kalla det x. Så det skapar en av dessa boxar Jag håller rita på pekskärmen. Och nu, på den högra sida, malloc, naturligtvis, avsätter en del av minnet. Och bara för att vara tydlig, hur mycket minne är det tydligen tilldela, om du bara slags gör matten här? Så det är 40 byte. Och jag vet att bara för att jag vet att en int å CS50 apparaten åtminstone är fyra byte. Så 10 gånger 4 är 40. Så detta lagrar en x, adressen den första av 40 Ints som har tilldelats utrymme tillbaka, att backa, backa, till baksidan. Och det är det som är nyckeln om malloc. Det tar inte en lite minne Här, lite här, lite här. Det ger dig en bit av minnet, intill varandra, från den operativa systemet. Nu vad om det här, x fäste 10 är lika med 0? Godtyckligt kodrad. Det behöver inte uppnå något användbart. Men det är intressant, eftersom x bygel 10--? Yeah? PUBLIK: [ohörbart]? David J. MALAN: x bygel 10 inte behöver vara noll. Noll detalj bara kommer in i bilden med strängar, vid slutet av en sträng. Men en bra tanke. Hur stor är denna matris, även även om jag har tilldelats 40 bytes? Det är 0 till nio, eller hur? Det är 10 Ints, totalt. 40 byte, men 10 ints, indexeras 0 till 0. Så vad är att x fäste 10? Det är faktiskt en del okänt sopor värde. Det är minnet som inte tillhör mig. Jag ska inte röra det byte nummer 41, 42, 43, 44. Jag ska lite för långt. Och faktiskt, om jag kör det här program, kan det mycket väl krascha. Men ibland, vi har tur. Och så bara för att visa detta-- och ärligt talat, du aldrig veta innan du gör det-- låt oss köra. Det faktiskt inte krascha. Men om jag ändrar detta, för exempel vara som 1000, för att göra detta verkligen avsiktlig, låt oss se om vi kan få det att krascha den här gången. OK, det inte krascha. Vad sägs om 100.000? Låt oss göra om det, och nu kör den. OK. Phew. Okej. Så uppenbarligen återigen, dessa segment av minnet, så att säga, är ganska stora, så vi kan ha tur och om igen. Men till slut, när du får löjligt och verkligen gå långt ut på skärmen, du rör minne som verkligen, verkligen tillhör inte dig. Men ärligt talat, dessa typer av buggar kommer att vara svårare och svårare att räkna ut på egen hand. Men tack och lov, som programmerare, vi har verktyg som tillåter oss att göra detta för oss. Så detta är kanske en av de värsta program, ännu fulare än gdb produktion. Men det har alltid en linje eller två som är super bra. Valgrind är ett program som hjälper du inte felsöka ett program, per se, men finner minnesrelaterade problem, specifikt. Det kommer automatiskt att köra din kod för du leta efter åtminstone två saker. Ett, har du gjort något oavsiktlig liknande kontakten minne som inte tillhör dig? Det kommer att hjälpa dig att hitta dessa fall. Och två, kommer det att hjälpa du hittar något som kallas minnesläckor, vilket vi har helt ignoreras, naivt, under en tid och tänkt. Men det visar sig, alla denna tid, närhelst du har ringt getString in så många av våra program, du frågar operativsystemet system för minne, men du har någon minnesbild av att någonsin ge det tillbaka, gör unalloc, eller gratis, som det kallas. Nej, för vi har aldrig bett dig att göra det. Men all denna tid, de program du har skrivit i C har läcker minne, frågar rörelse Systemet för allt fler minne för stråkar och allt, men aldrig lämna tillbaka den. Och nu detta är lite av en överförenkling, men om du någonsin köra din Mac eller din dator under en längre tid, öppning massor av program, kanske stänga program, och även om din Datorn har inte kraschat, det blir så mycket långsammare, som om det är riktigt använder mycket minne eller källor, även om, om du inte ens röra tangentbordet, som kunde vara-- men inte always-- kunde vara att programmen du kör har själva minnesläckor. Och de håller ber operativsystemet för mer och mer minne, men glömmer det, faktiskt inte använder den, men Därför tar minnet bort från andra program som kanske vill det. Så det är en vanlig förklaring. Nu här är där Valgrind s utsignal är helt ohyggliga till de mindre och bekvämare lika. Men det intressanta grejer är rätt upp här. Det säger mig en ogiltig skrivning av storlek fyra händer i det här programmet, i synnerhet, på rad 21 i memory.c. Om jag går till rad 21, hm, det faktiskt är en ogiltig skrivning av storlek fyra. Varför storlek fyra? Nåväl, detta number-- och det skulle kunna vara anything-- är en int. Så det är fyra byte. Så jag sätter fyra byte där de hör inte. Det är vad Valgrind är faktiskt talar om för mig. Dessutom kommer det också säg mig, så vi får se, som du kör det i en framtida pset, om och när du har läckt minne, vilket faktiskt Jag har, för jag har ringt malloc, men jag har faktiskt inte heter, i det här fallet, gratis, som vi så småningom får se är motsatsen till malloc. Så nu, tror jag, ett sista exempel. Så här är lite mer svårbegripliga, men det är kanske den största anledningen till var försiktig med minnet, och anledningen till att många program och / eller webbservrar, även till denna dag, övertas av skurkar någonstans på internet som är på något sätt skicka falska paket till din server försöker kompromissa dina konton, eller ta dina data, eller bara allmänhet tar över en maskin. Buffer overflow, som namnet antyder, medel fyllda inte en int, men en buffert. Och en buffert är bara ett finare sätt att säga att det är en massa minne. Och faktiskt, ringde jag en sträng före buffert, istället för s. För om det är en buffert, som i YouTube mening, eller någon tid som du tittar på en video, du kanske har sett ordet buffring, dot, dot, punkt. Det är otroligt irriterande. Och det betyder bara att videospelare försöker ladda ner massor av byte, massor av byte från en video från Internet. Men det är långsam, så det försöker att ladda ner ett gäng av dem att fylla en buffert, en behållare, så att du har tillräckligt med byte som den kan då visa videon, utan paus hela tiden. Men det visar sig, kan du ha en buffert för detta stora. Men försök att sätta denna mycket data i det, och mycket dåliga saker kan hända. Så till exempel, låt oss titta på denna slutliga teaser av ett exempel. Detta är ett annat program att det vid första anblicken, inte göra något super bra. Det har fått en huvudfunktion som anropar den funktionen, f. Och den funktionen, f, här uppe, har en char array, som kallas c, i storlek 12. Och då är det med hjälp av denna ny funktion kallad strncpy. Det visar sig att, med denna enkla, enkel rad kod, bara två rader, Vi har gjort min hela programmet, och därmed hela min dator, och mitt användarkonto och min hårda köra potentiellt sårbara för alla som vet och är tillräckligt bra för att köra detta program med en viss kommandorad argument. Med andra ord, om denna onde sätter insida argvargv [1] genom att skriva vid tangentbordet en mycket speciellt utformad sträng, inte abc, 123, men i huvudsak binära symboler som representerar körbara kod, ett program som han eller hon skrev, med denna enkla program, vilket är representativ för tusentals program som är lika sårbar, förmodar, han eller hon kan slutligen bort alla filerna på min hårddisk, få en blinkande prompt så att han eller hon kan skriva kommandon på egen hand, maila alla filer till mig själv. Allt som jag kan göra, han eller hon kan göra med denna kod. Vi kommer inte riktigt lösa detta ännu. Och faktiskt, det kommer att innebära en liten bild så här, som vi snart kommer att förstå allt bättre. Men för idag, låt oss sluta den vad är, förhoppningsvis, en något mer förståe XKCD skämt, tills vi återupptar nästa gång. Okej. Vi ses på onsdag. [MUSIK SPELA] Speak: Och nu, djupt tankar, av Daven Farnham. Minnet är som att hoppa in i en hög med gyllene löv på en söndag eftermiddag. Vind blåser, gungade din hair-- åh, jag saknar dagarna when-- [LAUGHTER]