[MUSIC Playing] DAVID J. MALAN: Okay dette er CS50 og dette er starten på ugen fem. Så i dag, under dine sædehynder vil du ikke finde noget. Men ovenstående, bør du finde disse, en lille token af ​​vores påskønnelse for alt det arbejde, du lægger ind i Game of Fifteen. Du skal blot fjerne den lille cirkel på bund for at begynde at spille for resten af ​​klassen. Så husker det, eller ved, at sætte problemet fire, der gik ud i denne weekend, indebærer skrive et andet spil. Men denne gang det indebærer anvendelse af en faktiske grafisk brugergrænseflade, ikke en tekstuelle interface som Game of Fifteen var. Og det spil, der ligger foran dig, hvis du ikke har endnu ikke set denne næste, ser lidt noget som dette. Jeg har tænkt mig at gå ind i min terminal vindue her i GDB. Og jeg har tænkt mig at gå videre og køre personale løsning, som du kan få adgang efter at have kørt update 50 som sædvanlig. Men jeg har tænkt mig at sætte det ind i en lille hemmelig tilstand, lidt påskeæg, såkaldte Gud tilstand ved sætte Gud i argv1. Og jeg er nødt til at følge mine egne retninger, kører det i min egen Problemet sæt bibliotek. Så nu kan du se en komplet udgave af spillet Breakout. I virkeligheden er dette ikke-hænder mode. Så det er faktisk - henrykkede selvom du måske være - temmelig trivielt at implementere Gud tilstand Breakout, i modsætning til Game of Fifteen, som nogle af jer måske har tacklet for hackeren edition. I Breakout er det tilstrækkeligt på Gud tilstand til blot at gøre hvad, intuitivt med pagajen? Bare gør det lig uanset vandrette position er af bolden. Og så længe du gør dette i lockstep med bolden bevæger dette spil vil aldrig, aldrig, aldrig glip af bolden og du vil vinde hver gang. Men i denne uges hacker edition der er mere end bare Gud mode. Der er en række andre funktioner. Blandt dem,. Lasere Så hvis du virkelig får utålmodig du kan begynde at skyde ned murstenene og et par andre. Og for dem af jer der gerne vil kalibrere standard versus hacker edition, kan jeg se, at denne uges hacker edition bevidst er en lidt mere doable, siger, end Gud tilstand var sammen med Game of Fifteen. Så hvis du leder efter en stræk og du leder efter nogle ekstra sjov funktioner gør dykke i, hvis af interesse. Nu mere praktisk, så lad mig påpege ud én ting så godt. GDB, som nogle af jer måske endnu ikke har rørte personligt, hvilket er fint. Men nu er virkelig tid til at vænne til dette og komfortable med dette værktøj fordi det vil gøre dit liv meget lettere, virkelig. Per Robs forelæsning om GDB et par uger siden, husker at GDB er en debugger. Det er et værktøj, der lader dig køre din program, men køre det skridt for skridt, linje efter linje, du så kan stikke omkring, så du kan se ting, der sker, så at du kan printe ud værdier af variabler. Kort sagt, giver det dig så meget mere strøm end printDef gør. Nu ganske vist grænsefladen er temmelig mystisk. Sort og hvid tekstmæssige grænseflade for det meste. Kommandoerne er lidt hårde at huske på først. Men selvom det kan tage dig en halv en time, en time, for at sige, at upfront investering af tid i det, tro mig. Bestemt ved semesters ende vil spare du en størrelsesorden mere tid end det. Så tidligt i ugen dykke i. Og med hensyn til Breakout, ved, at du kan gøre dette, så længe du har distributionen kode eller din egen kode i gang i din Pst4 bibliotek. Vid, at du kan køre gdb. / Breakout. Dette kommer til at åbne op et vindue som dette. Lad mig give mig mere af en terminal vindue. Og hvad så jeg har tænkt mig at gå videre og gøre, det er ikke bare køre den. Jeg har tænkt mig først at sætte et break point tilbagekaldelse, som giver dig mulighed for at holde pause udførelse på et bestemt sted. Bare for at holde tingene enkle jeg har tænkt mig til at bryde på linje én lige ved at skrive nummer et. Lad mig faktisk genåbne dette vindue fordi det bliver en lidt lille der. Så hvad jeg vil nu gøre her, er hvis jeg åbner mit terminalvindue. Kom, der går vi. Så nu, hvis jeg går tilbage til dropbox, Pst4 og køre gdb. / breakout ind, mærke Jeg har tænkt mig at bryde en til at sætte et break point ved linie et. Og nu vil jeg til at gå fremad og type køre. Og når jeg gør det, bemærker noget synes at ske. Der er ingen pop up. Der er ingen grafisk brugergrænseflade endnu. Men det er forståeligt, fordi jeg er bogstaveligt talt ved linie et i mit program. Og mærke til, at jeg hurtigt har videresendt, specielt nu til 62, fordi alle de ting i toppen af ​​denne fil er ting som kommentarer og konstanter og uinteressant ting til nu. Så nu er jeg inde i main, det ser ud, på linje 62.. Og dette er kun fordelingen kode, tilbagekaldelse. Hvis jeg åbner dette op ved at gå, på samme måde, ind i min drop box mappe i Pst4, ind breakout.c. Og hvis jeg rulle ned og ned og ned, og lad mig gå videre og slå min linje numre. Hvad jeg vil se, om jeg rulle ned til linie 62, er netop den linje, vi har på pause på. Så denne linje her, 62, er hvor vi er ved at være. Så nu i GDB skrive, hvis jeg går videre og nu næste, skal du indtaste det kommer til at udføre den pågældende linje. Og vupti, vi har såkaldt g vinduet. Hvis bekendt med, hvad en GWindow er, ikke at bekymre dig. Den spec vil introducere dig til det, som samt en række præsentationsvideoer indlejret i spec. Men lad os nu gøre dette til en lidt mere interessant. Lad mig flytte dette vindue over til siden en lille smule. Lad mig gøre vinduet lidt større, så jeg kan se mere. Og lad mig nu gå videre og gøre næste gang. Og der er mine mursten. Hvis jeg skriver næste gang nu ser jeg bolden. Og hvis jeg skriver næste gang nu ser jeg pagajen. Og heldigvis gedit er ikke virkelig samarbejder ved at vise mig alt, hvad jeg vil have. Men nu, hvis jeg gøre næste gang, næste gang, jeg er bare erklære nogle variabler. Og jeg kan udskrive nogen af disse fyre. Print mursten, udskrifter liv. Og nu, hvis jeg fortsætter med at gøre Dernæst bemærke, at jeg vil være indersiden af ​​denne løkke. Men koden vil udføre præcis som jeg forventer. Så når jeg ramte denne funktion, Wait til Click, det kommer til at gøre det bogstaveligt talt det. Så jeg syntes at have mistet kontrollen over programmet. GDB er ikke at give mig en anden prompt. Men ikke at bekymre sig. Gå til mit spil, skal du klikke et eller andet sted. Og voila, nu er det videre til linje 86.. Så igen, det er uvurderligt, i sidste ende, for debugging problemer. Fordi du kan bogstavelig talt gå gennem din kode, udskrive ting ud og meget, meget mere. Men for nu, værktøjer dem alene bør få dig temmelig langt. Så vi er selvfølgelig at tage et kig på Graphics nu, lige pludselig. Og nu er vores verden bliver lidt mere interessant. Og du ved, måske, fra nogle af de videoer online, at vi har disse shorts, du har været at se som en del af problemet sæt. Og de er blevet skudt, bevidst, mod en hvid baggrund. Og nogle af dem har undervisningen Fellows trække noget tekst på skærm, der er overlejret på siden af ​​dem. Men selvfølgelig er det ikke alle, der interessant i den virkelige verden. Dette er blot en foredragssal med en store hvide skærm og en kulisse. Og vores fantastiske produktion team slags af gør alting ser smuk efter den kendsgerning ved at beskære ud eller overlejring noget vi gør eller ikke ønsker. Nu bare at motivere denne uge og virkelig, hvor du kan gå, i sidste ende, med datalogi. Ikke bare efter problem sæt fire. Men efter et andet kursus eller en hel curriculum det er utroligt, hvad du kan, gøre disse dage i form af grafik i særdeleshed. Nogle af jer har måske set det flyder rundt på nettet. Men jeg troede, jeg ville vise dig, for bare en par minutter, et glimt af hvad computerteknologi og hvad CGI, computergrafik kan gøre i disse dage med en velkendt sang og måske film. [MUSIC - LANA DEL RAY, "Ung og smuk] SPEAKER 1: Det er bare en lille smule forbløffende, måske, bare hvor allestedsnærværende - [Applaus] SPEAKER 1: Jeg har lige hentet det. Men det er virkelig forbløffende, tror jeg, bare hvordan allestedsnærværende software og kode og værktøjer som dette virkelig er. Så det er en smag af retningen hvor du kan gå. Åh, nej mere Appliance dag. Tja, det er faktisk tragisk timing givet punkt, jeg prøvede bare at gøre. Okay, så lad os starte Fusion igen. Påmind mig senere. Okay, og du bør have fået en e-mail som en sidebemærkning, hvis du fik en bemærke sådan. Okay, så minde om, at i sidste uge vi begyndte at skrælle tilbage denne senere kendt som streng. string minder en datatype, der er anmeldt i CS50 biblioteket. Og det er en del af støttehjul der vil nu begynde at tage fart. Det var et nyttigt begreb tidligt. Men nu er det kommer til at få mere interessant og mere kraftfuld til faktisk se, at under hætten, en streng er bare hvad, vi siger? Yeah, så det er en såkaldt char *. Og * der angiver, at der er en slags adresse involveret. Og så når du siger char * du bare betyde en variabel, hvis datatype er pointer nu. Det faktum, at der er den stjerne der betyder blot, at du er om en såkaldt pegepind. Og det pointer vil tilsyneladende gemme adressen på Selvfølgelig en char. Nu hvorfor det mening? Nå, hvad er en streng under hætten? Tja, for nogle gang, vi har sagt at en streng under hætten er bare t-e-L-L-o, f.eks. Men vi har talt om dette som være væsentlige, et array. Og et array ville så se lidt mere som denne, med hver af disse optage en bid. Og så har vi sagt, at der er noget særligt tilbage her, de backslash 0 eller null terminator. Så alt dette tidspunkt, her i har været en streng. Men virkelig, en streng er faktisk en adresse. Og adresser, da vi vil se, er ofte foranstillet 0x af konventionen. Hvad betyder 0x betegner? Er der nogen vide? Så det betyder bare hexadecimal. Så du måske husker, faktisk, fra Pst 1, tror jeg, en af ​​de varme-up spørgsmål faktisk bedt om hexadecimal notation i tillæg til binær og decimal. Og motivationen her er, at med hexadecimal har du 16 cifre til din rådighed. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, efterfulgt ved en,. b, c, d, e, f Og hvis man tæller alle dem op, du får en alt 16. Så dette er i modsætning til decimal, hvor vi har 10 cifre, 0 til ni. Det er i modsætning til binær hvor vi bare have 0 og 1. Men i slutningen af ​​dagen kan du bare repræsenterer de samme numre, men noget anderledes. Og hexadecimal er fælles, fordi så det viser sig - og vi vil se denne senere i kurset - også når vi får til webprogrammering i forbindelse med HTML og farvekoder, hexadecimal er rart. Fordi hvert ciffer, viser sig, repræsenterer fire bit perfekt. Så er det bare slags linjer op pænt da vi i sidste ende vil se. Så dette kunne være Ox123 eller noget sådan, betegner adresse 123 et sted inde i min computerens hukommelse. Men selvfølgelig opstå nogle problemer på grund af denne underliggende gennemførelse. Og huske, at jeg tog en kniv på gennemføre en funktion som denne - sammenligne dash 0 dot c i sidste uge, at selvom det lignede det var ret, er det simpelthen ikke sammenligne to strenge rigtigt. Jeg har smidt væk main, og jeg har smidt væk kommentarerne bare at fokusere på den kode, der er af interesse her. Og det er i rødt, fordi det er buggy. Af hvilken grund? Nå, i toppen er der, når jeg erklærede en streng, var, hvad der virkelig foregår under hætten? Nå, lad mig gå over til screene her og trække det. Så jeg erklærede igen, string s getString. Så jeg har tænkt mig at gå videre nu, og tegne s for, hvad det egentlig er. Det kommer til at være et kvadrat her. Og jeg har tænkt mig at hævde at der er 32 bits. I det mindste er normalt, i det mindste på CS50 apparat i en masse computere. Jeg har tænkt mig at kalde det er. Men nu minde om, at vi kaldet getString. Så getString afkast, selvfølgelig. en streng Hvis brugeren typer i h-e-l-l-o indtaste strengen hej bliver returneret. Og denne streng, som vi lige har sagt, slutter op et sted i computerens hukommelse med en omvendt skråstreg 0 ved udgangen. Jeg vil henlede dette ligesom array - eller sammenhængende blok karakterer - at det faktisk er. Og nu, hvad der getString faktisk vender tilbage? Hvad er getString været tilbage al den tid? Nå, vi siger, i uger før, den returnerer en streng. Men mere teknisk, hvad betyder GetString afkast tilsyneladende? PUBLIKUM: En adresse. SPEAKER 1: En adresse. Specifikt returnerer adressen den allerførste bid, uanset hvad det er. Jeg bare holde ved hjælp af en, to, tre fordi det er belejligt. Den returnerer adressen på den første tegn i strengen. Og vi sagde sidste uge, at der er tilstrækkeligt. Fordi vi altid kan regne ud, hvor enden af ​​strengen bare ved iteration over det, måske med en for sløjfe eller en while-løkke eller noget lignende at bare på udkig efter "omvendt skråstreg 0" den særlige sentinel karakter. Og så ved vi, at strengen sker for at være af længde - i dette tilfælde - fem. Så teknisk set hvad getString gør er det returnerer Ox123 i dette tilfælde. Og teknisk hvad så sker, er at vi opbevarer, indersiden af ​​s, Ox123. Ved slutningen af ​​dagen, men selv dette er nyt koncept, pegepinde, de er kun variabler. Men de tilfældigvis til at gemme bits, kollektivt repræsenterer en adresse. Så teknisk set alt, hvad de får lagres i s er Ox123. Men vi som mennesker - herunder dag og fremefter - virkelig ikke kommer til at passe, typisk, hvad den faktiske adresse er for nogle luns af hukommelse. Det er bare at lave detaljeret til være intellektuelt interessant. Så jeg har tænkt mig at fortryde dette. Og i stedet, mere højt niveau, bare sige at når vi taler om pointers Jeg har tænkt mig at bare trække mere brugervenlig pil, der formidler samme idé og abstracts væk oplysninger om, hvad den faktiske underliggende adresse er. Nu, hvis vi går tilbage til den kode, hvad skete i sidste uge, hvis vi har string t lig getString? Tja, hvis jeg igen, skriver i hej denne gang jeg har tænkt mig at få anden luns af hukommelse. h-e-L-L-o backslash 0. Men fordi jeg kaldte getString en anden gang - og jeg kender det fra ser på kildekoden til getString - selv selvom det er tilfældigt, at hello var indtastet to gange, getString er ikke vil forsøge at optimere og være klog. Det er bare at få en anden bid af hukommelse fra computeren, hvilket er kommer til at være på en anden adresse. Lad os vilkårligt bare sige 456. Og hvad er det kommer til at vende tilbage? Det kommer til at vende tilbage 456 og opbevar det i t. Så hvad der virkelig foregår på venstre side er jeg har en anden luns hukommelse. 32 bits typisk Og derinde kommer til at gå Ox456. Men igen, jeg er ikke interesseret i disse bestemte numre længere. Jeg skal bare til abstrakt tegne den som en pil. Så dette er nu en ny forklaring. Men det er nøjagtig de samme idé, der er er sket al denne tid. Og så grund så, at denne første version af Sammenlign var fejlbehæftet sidste uge, er hvorfor? Når du gøre, hvis s er lig lig t hvad er du virkelig under hætten sammenligning? Du sammenligner de adresser. Og bare intuitivt klart, Ox123 kommer ikke til lige Ox456. Disse tal, disse bits er bare forskellige. Og så konsekvent, i sidste uge sagde det du skriver forskellige ting, selvom ord var ordret det samme. Så vi løse dette. I lægmandssprog, hvad var fix? PUBLIKUM: Brug en funktion. SPEAKER 1: Brug en funktion. Eller stjerner er absolut involveret, men bruge en funktion til at gøre hvad? PUBLIKUM: At sammenligne strengene. SPEAKER 1: At sammenligne strengene. Så det grundlæggende problem her var at jeg bare var overvejer kvaliteten af ​​strenge, der skal defineres af sammenligning af deres adresser. Og selvfølgelig det er bare dum nu engang du forstår, hvad der foregår under hætten. For virkelig at sammenligne strenge at se, om de er ens i den måde, at et menneske ville overveje to strenge at være lig vi nødt til at sammenligne dem tegn for tegn for tegn. Nu kunne jeg have gjort denne meget kedelig. Men vitterligt er vi ved hjælp af en for-løkke. Og bare sammenligne s beslag I mod t beslag I. s beslag I plus 1 mod t beslag I plus 1, og så videre, inde en slags sløjfe. Og hvis jeg øje på to tegn, der forskellige, eller hvis jeg indser, at ooh, s er kortere end t eller længere end t Jeg kan med det samme sige falsk, de er ikke det samme. Men hvis jeg kommer igennem s og t og sige samme, samme, samme, samme, samme, ultimo begge strenge, kan jeg sige sand, er de ens. Nå, heldigvis, år siden nogen skrev, at koden for os. Og de kaldte det StrComp for string sammenligne. Og selvom det er en lidt counter intuitiv, StrComp returnerer 0, hvis de to strenge, s og t er de samme. Men det returnerer negativ værdi, hvis s bør komme før t alfabetisk eller positiv værdi, hvis det skulle komme efter t alfabetisk. Så hvis du nogensinde ønsker at sortere noget, det viser sig, at StrComp er nyttig. Fordi det ikke bare sige ja eller nej, lig med eller ej. Det giver dig en følelse af bestilling gerne en ordbog magt. Så StrComp, lig s komma t lig 0 betyder, at strenge er virkelig lige. Fordi hvem skrev denne funktion år siden formentlig brugt en for-løkke eller en while-løkke eller noget lignende at integrere over tegnene igen og igen og igen. Men problemet to opstod her. Dette var copy0.c. Og de to i rød er fordi det er fejlbehæftet. Og hvad gjorde vi her? Nå, først jeg kaldte getString. Og jeg gemt returværdien i sek. Så det er temmelig meget det samme som denne øverste del af billedet. Men hvad der kommer efter det? Nå, lad mig gå videre og slippe af en hel flok af dette. Vi tilbage i tide til, hvor vi bare har s, som nu er i overensstemmelse med line én deroppe. Jeg tjekke. Hvis s er lig med lig 0. Nu, et hurtig side bemærkning, når måske getString returnere 0? Der er ikke nok hukommelse. Right? Det er sjældent, at dette kommer til at ske, helt sikkert på en computer, der er fik hundreder af megs eller selv gigs RAM. Men det kunne i teorien tilbage 0, især hvis brugeren ikke samarbejder. Der er måder at lade som du ikke har indtastet noget og trick GetString til at vende tilbage 0 effektivt. Så det kommer til at tjekke for det. For hvis nogen af ​​jer er begyndt at får, allerede segmentering fejl - der sandsynligvis har været en kilde for nogle frustrationer - de er næsten altid resultatet hukommelse-relaterede fejl. En eller anden måde du har rodet op med hensyn til en pointer, selvom du ikke var klar der var en pegepind. Så du måske har fremkaldt segmentering fejl så tidligt som uge en hjælp noget som en for-løkke eller et stykke loop og et array ved at gå for langt forbi grænserne for nogle array, du erklærede i uge to i særdeleshed. Du har måske gjort det selv i problemer sæt fire med Breakout. Selvom du sikkert ikke har set enhver stjerner i distributionen koden for Breakout, viser det sig, at de GRect og GOval og andre sådanne ting, dem er faktisk pointers under hætten. Men Stanford, ligesom os, en slags af huder der detaljeret i det mindste for bibliotekerne formål, ligesom vi gør for snor og char *. Men GRect og GOval og alle de ting du fyre er eller vil bruge denne uge i sidste ende er hukommelse adresser. Du skal bare ikke kender det. Så det er ikke overraskende, da, måske, som du måske tur over nogle segmentering fejl. Men hvad er interessant her nu, hvis det efter vi kontrollere for 0 vi gør streng t får sek. Nå, lad mig erklære t. Jeg har tænkt mig at tegne den som en firkant, 32 bits, kalde det t. Og så jeg har tænkt mig at gøre, får s. Nå, hvad betyder det? Tja, det er lidt svært at tænke om det forestiller klogt. Men lad os tænke over hvad der er inde i x? Hvad er bogstaveligt talt inde i denne variabel? Værdien Ox123. Så når jeg siger string t får s, der bare bogstaveligt betyder tage nummer i s, hvilket er Ox123 og sætte det Ox123. Eller billedligt, hvis jeg slags abstrakt væk fra denne detalje har den virkning bogstaveligt gøre det så godt. Så nu, tænke tilbage til sidste uge, da vi fortsatte med at kapitalistiske T. I gjorde T beslag 0. Nå, T beslag 0, selvom det er en pointer, kan du behandle den, som om det er en matrix, med en kvadratisk beslag notation. Så hvor er T beslag 0? Tja, det er h. Og så når vi bruger denne linje kode, to øverste, som er i det c type.h header fil, det er hvor det erklærede. Du kapitalisere denne H. Men Selvfølgelig, det er nøjagtig de samme h, der er indersiden af ​​s, så at sige. Og så nu du har ændret eller kapitaliseret både den oprindelige og såkaldt kopi. Fordi du ikke lave en kopi i måde, at et menneske ville have det til at være. Så hvad var fix her i copy1.c sidste uge? Funktioner, så vi kunne faktisk kopiere strengen. Og fundamentalt, hvad vi har brug for at gøre for at kopiere strengen? Tja, i denne grønne version her er jeg vil gøre det temmelig lavt niveau. Der er faktisk fungerer de kunne hjælpe med dette. Men den mest grundlæggende en, og de mest velkendt en, i det mindste, vil snart være velkendt for os, er følgende - så man på den første linje kode i grøn nu. Jeg skrev s som char *. Der er ingen funktionel forskel der. Jeg bare smed CS50 bibliotek og Jeg kalder det, hvad det er, en char *. Nu dot, dot, dot, fordi der var nogle fejlkontrol, der er ikke interessant at tale om igen. Så nu t deklareres. Det er også en char *. Så jeg trak en lille firkant på skærmen som før. Men på den højre side, malloc vi sagde, er hukommelsen tildele. Så afsætte nogle luns af hukommelse. Og hvor mange bytes gør vi faktisk ønsker at tildele, virker det? Nå, strengen længden af ​​s. Så hvis det er hej, der er kommer til at være fem. Vi vil sige h-e-l-l-o. Så fem bytes. Men så plus 1, hvorfor? 1 De 0 tegn. Hvis vi ikke giver plads til denne fyr vi uheld kan skabe en situation, hvor strengen er h-e-L-L-o. Og så næste gang getString er kaldet og jeg skriver i, for eksempel, David D-a-v-i-d, computeren går at tro, at s er faktisk h-e-L-L-o-d-a-v-i-d fordi der er ingen pause i mellem disse ord. Så vi har brug for den pause. Så vi ønsker ikke fem. Vi ønsker seks bytes. Og bytes jeg siger. Men det er virkelig på tide størrelse char. Teknisk char er næsten altid en enkelt byte. Men bare for at gøre vores kode bærbare, så at sige, så det fungerer på forskellige computere, selvom de måske være noget anderledes under hætte, jeg kommer til at generisk sige størrelse af char så min kode altid arbejde. Og jeg behøver ikke at kompilere det bare fordi jeg opgradere min computer, eller brug nogle forskellige platform. Så jeg har fået 6 gange størrelsen af en char, hvilket sker for at være 1.. Så det betyder malloc kunne giv mig seks bytes. Hvad er det egentlig gør? Nå, lad mig rulle tilbage i tiden her , hvor vi er i historien. Så hvis jeg gå tilbage her, har jeg erklæret en char * kaldet t. Jeg har nu kaldt malloc for seks bytes. Og nu vil jeg til at trække disse seks bytes ligesom array tidligere. Men jeg ved faktisk ikke, hvad der er inde i denne matrix. Hvis du allokere hukommelse det sig, at du kan ikke tillid til, at der er nogle kendte værdi der. Det kunne have været brugt af noget andet, nogle andre funktioner, nogle andre linje kode, du skrev. Så vi vil generelt kalde disse skrald værdier og trække dem, måske, som spørgsmålstegn, blot indikerer, at vi ikke ved, hvad er faktisk der. Og det er ikke nogen big deal, så længe vi er kloge nok til at overskrive dem skrald værdier med tal eller chars, som vi holder af. Så i dette tilfælde, hvad skal jeg gøre? Nå, min linje kode næste, jeg har fire. int jeg får 0, n får streng længde sek. Så en velkendt for løkke. Jeg er mindre end eller lig med n, som normalt er oven. Men denne gang er det bevidst. I + +, og så vil jeg bare gøre t beslag I får sek. Fordi min billedet ligner dette på dette øjeblik, gemt på t er den adressen på denne tilfældige bid af hukommelse hvis værdier er ukendt. Men så snart jeg gør t beslag 0, der sætter mig her. Og hvad ender med at få trukket der? Vi ender med at sætte h. Fordi det er hvad der er på s beslag 0. Og så de samme ting for e, og L og L og o. n, hvorfor jeg går op gennem et lig n? På grund af den 0 tegn. Så bare for at være klar, så hvis jeg faktisk sletter alt disse skrald værdier er, og derefter rent faktisk trække i hvad jeg forventer, det er s beslag 1, 2, 3, 4, plus der er efterstillede ny karakter. Og så nu, hvis vi fortsatte forbi prik, dot, dot i denne korrekte version og kapitaliserede t beslag 0 Jeg vil af Selvfølgelig skal udnytte netop dette fyr her, hvilket begrebsmæssigt i sidste ende målet. Så det er alle de pointer er. Og du har brugt dem i flere uger nu i forbindelse med strengene. Men under hætten, de er lidt mere kompliceret. Men hvis du tænker over dem i denne billedlig form, foreslår jeg, at de er formentlig ikke alt det skræmmende, som de måske først synes ved første øjekast, især med en sådan ny syntaks. Eventuelle spørgsmål vedrørende pointere, strings, eller chars? Ja? PUBLIKUM: Kan du gå tilbage til [uhørligt]? SPEAKER 1: Sure. PUBLIKUM: Så hvordan kommer i din allersidste line, behøver du ikke have en * t linje og et * s på linjen? Har du ikke har henvisningen til - SPEAKER 1: Ah, en virkelig godt spørgsmål. Hvorfor kan jeg ikke har en * t og et * s? Fordi kortvarigt, i sidste uge, ligesom i vores swap-funktion, jeg siger, at når du har fået en pointer de midler som du går der, som vi gjorde fysisk på scenen, var faktisk bruge stjerne operatør. Det viser sig, at denne kvadrat-beslag notation er, hvad vi vil kalde syntaktisk sukker, der er bare en sexet måde siger det stenografi notation for præcis, hvad du beskriver. Men det er lidt mere intuitiv. Og risikoen for at gøre dette synes mere kompliceret end det behøver at være, hvad der virkelig foregår her er følgende - Hvis jeg siger * t, der betyder at gå til adressen lagres i t. Så bogstaveligt, hvis t gemmer adressen på h i første omgang, * t midler gå her. Nu, hvad t beslag 0 betyde? Samme nøjagtige ting. Det er bare lidt mere brugervenlig venlig at skrive. Men jeg er ikke færdig endnu. Jeg kan ikke bare sige * t får * s. For hvad skulle jeg gøre så? Jeg ville være at sætte h, h, h, h, h gennem det hele. Right? Fordi * t er at gå til adressen i t. Men vi er inde i en løkke. Og hvilken værdi jeg forøgning, naturligvis? på hver iteration I. Men der er en mulighed her, ikke? Selvom det føles som om det er at få lidt mere sofistikeret end kvadrat-beslag notation Vi har brugt et stykke tid - lad mig fortryde mit h forandring der - selvom det er nu at få lidt amatør, den grundlæggende ide, hvis * t betyder her, og * t er bare gå til adressen i t.. Men hvad var adressen i t? Antallet holder vi bruger? Ligesom Ox456, lad os bringe det tilbage netop af hensyn til diskussion. Tja, hvis jeg ønsker at få på ei t streng, jeg ønsker blot at gå til, væsentlige 456. Eller rettere, 457. Jeg har bare brug for at tilføje en. Men jeg kan gøre det, right? Fordi t, selvom jeg holder tegning det nu som en pil, er det blot et nummer, Ox456. Og hvis jeg tilføje en til det, eller mere generelt, hvis jeg tilføjer jeg til, at jeg kan faktisk få præcis, hvor jeg vil. Så hvis jeg rent faktisk gør det - og dette er, hvad der nu kaldes pointer aritmetik - Jeg kan fjerne denne linje. Hvilket er, helt ærligt, jeg tror klarere og lidt mere brugervenlig at læse. Men det er ikke mindre korrekt. Denne linje kode nu bruger pointer aritmetik. Det siger gå til efter adresse - uanset starten af ​​t er, som er t plus jeg, som i første omgang er 0, hvilket er fantastisk. Fordi det betyder starten på t plus 1 plus 2, plus 3, og så videre. Og den samme aftale med s. Så syntaktisk sukker til dette. Men at forstå, hvad der virkelig foregår under hætten, vil jeg hævde, er faktisk nyttige i sig selv. Fordi det betyder nu er der ikke meget mere magic foregår under hætten. Der vil ikke være mange flere lag, som vi kan skrælle for dig. Dette er ca. Og det er programmering. Virkelig godt spørgsmål. Okay, så dette var, at buggy program jeg henviste til tidligere. swap var behæftet med fejl. Hvis synes at arbejde. Husk på, at ligesom med mælk og appelsinsaft - som jeg startede drikker dagens demonstration. Så ligesom med appelsinsaft og mælken, vi nødt til at bruge en midlertidig variabel tmp, at holde en midlertidigt, så vi kunne derefter ændre værdien og derefter opdatere b. Men denne funktion, sagde vi, eller det program, hvor denne funktion blev skrevet var forkert og mangelfuld, hvorfor? Ja? PUBLIKUM: [uhørlig]. SPEAKER 1: Præcis, når du kalder swap - eller mere generelt, når man kalde de fleste enhver funktion - Hvis argumenterne til denne funktion er primitive, så at sige, ints og chars og double og flåd, ting uden stjerner, er du passerer en kopi af argumentet. Så hvis x var 1 og y var 2 er en going at være 1 og b vil være 2. Men de kommer til at være forskellige bidder af bits, forskellige bidder af hukommelse, som tilfældigvis opbevaring identiske værdier. Så denne kode er super perfekt at bytte a og b. Det er ikke god til at bytte - i sidste uges eksempel - x og y. Fordi igen, de er i den forkerte rækkevidde. Nu, hvordan gik vi gå om fastsættelse det? Vi havde at gøre funktionen ser lidt grimmere. Men igen, overveje, hvad dette blot betyder. Og faktisk, lad mig, for konsistens, ændre én ting, så det er identisk med hvad vi lige gjorde. Som jeg nævnte i sidste uge, er det ikke noget, hvor det går. Faktisk du typisk ville sætte stjerne ud for variabelnavnet. Men jeg tror, ​​det ville være lidt lettere at overveje * ved siden af datatype således, det er en pegepind til en int i dette tilfælde. Så hvad laver jeg her? Jeg siger ikke at give mig en int efterfulgt af en anden int, kalde dem a og b. Giv mig adressen på en int. Giv mig adressen på en anden int. Ring disse adresser a og b. Og derefter bruge * notation ned nedenfor, gå til hver af disse adresser som nødvendigt til enten at få eller indstille sin værdi. Men der er en undtagelse her. Hvorfor har jeg ikke en * ved siden tmp? Hvorfor skal jeg ikke gøre det, for eksempel? Det føles som om jeg bare skulle gå hele ud og korrigere det hele. Ja? PUBLIKUM: [uhørlig]. SPEAKER 1: Jeg har ikke erklæret tmp som en streng. Så det ville erklære, i dette tilfælde, en tmp til at være adressen på en int. Men det er ikke helt, hvad jeg vil, for et par grunde. PUBLIKUM: Du ønsker ikke at bytte dem. SPEAKER 1: Præcis, jeg ønsker ikke at bytte noget med tmp. tmp er bare uge én ting. Alt hvad jeg ønsker, er en variabel at gemme nogle tal. Jeg kan ikke engang bekymre sig om adresser på dette tidspunkt. Jeg har bare brug 32 bit så for at gemme en int. Og jeg ønsker at sætte i disse 32 bits hvad er ikke i en, så at sige, men hvad der er en, bare for at være mere præcis. For hvis en er en adresse, * et middel gå der og få værdien 1.. For eksempel i sidste uges eksempel eller b vedkommende få værdien af ​​2.. Så hvad der virkelig foregår? Lad mig tegne et billede her, der vil kun drille hinanden en del af i dag. Men det vil fortsætte med at blive vist i temmelig lang tid. Det jeg hævder, er, hvad din computers hukommelse ser ud, når du kører en program, et program. Når du kører et program øverst af din computers RAM - så tænk på denne rektangel, virkelig, som din computerens RAM eller hukommelse, alle 101 milliard bytes af det, alt to milliarder bytes, alle to gigabyte det, uanset mængde, du har, er, lad os tegne den som en firkant. Og jeg påstå, at når du kører et program som Microsoft Word eller Chrome eller noget lignende, de bit, Microsoft eller at Google skrev - i tilfælde af disse programmer - er indlæst i computerens hukommelse hvor de kan udføres mere hurtigt og føres ind i CPU'en, som er hjerner af computeren. Og i TAM de er gemt i det toppen af ​​dit program, så at sige. Med andre ord, det, hvis er en bid af hukommelse, når du dobbeltklikker på Microsoft Word, de bits kommer off harddisken. De bliver indlæst i RAM. Og vi vil skubbe dem op på toppen af denne rektangel konceptuelt. Nå, resten af ​​din hukommelse er bruges til forskellige ting. På toppen kan du se initialisere data og uninitialize data. Dette har at gøre, for det meste, med konstanter eller globale variabler der har værdier. Men mere om dem en anden gang. Så har du den bunke, der vi vil komme tilbage til. Men på bunden er den del, der er især Germane lige nu. Det er den såkaldte stack. Så ligesom i de fleste helst D hal her på campus, du har disse bakker, bare stables oven på hinanden, som kan du sætte mad og whatnot. Stakken i et edb-system er meget ens. Undtagen mens bakken, da vi bruger i spisesal, selvfølgelig, betød er at bære ting bakkerne eller rammer - som vi kalder dem - på en computers hukommelse bruges til at holde variabler og værdier. Så hvad der virkelig foregår under hætten? Nå, lad mig flipover til skærmen her. Og lad os nøjes med at fokusere på nederste del et øjeblik. Hvis dette er den nederste del af min computerens hukommelse det viser sig, når jeg kalder funktionen main - hvilket sker, helt ærligt, automatisk for mig - Jeg får en luns af hukommelsen på bunden af ​​mit RAM, så at sige. Og det er her main er lokale variable går. Det er hvor argc og argv måske hen, og eventuelle variable I erklære inde i main. De ender i bunden af min computers RAM. Antag nu, at de vigtigste opkald om funktion Ligesom swap, kunne lide det i sidste uge? Nå, vi hovedsagelig sætte en ny bakke, en ny ramme, på min luns af hukommelse. Og jeg har tænkt mig at betegne det som tilhører swap-funktion. Nu, hvad der er inde i swap? Nå, baseret på sidste uges program, og den, vi lige har set et uddrag fra, indersiden af ​​swaps ramme på eller swappens bakke, hvad er variabler? Nå, a og b. Fordi det var dens lokale argumenter plus en tredje tmp. Så virkelig, jeg kunne tegne det lidt mere rent. Lad mig gå videre og fortryde etiketten. Og lad mig påstå, at du ved, hvad? en er sandsynligvis kommer til at ende her. B kommer til at ende op her. Og tmp kommer til at ende op her. Nu bestilling måske være lidt anderledes. Men begrebsmæssigt det er ideen. Og netop kollektivt, dette er hvad vi vil kalde swappens ramme eller spisesalen bakken. Og den samme aftale med de vigtigste. Men jeg vil ikke gentegne det. Men det er der argc og argv og enhver sine lokale variabler som x og y kunne være så godt. Så nu overveje, hvad der virkelig sker når du kalder swap. Når du ringer til swap, udførelse kode som dette, er du passerer i buggy version a og b kopier af x og y. Så hvis jeg gør nu trækker denne på skærmen - fik at blive bedre til det - så historien jeg fortalte til mig selv var i denne fejlbehæftet udgave, når vi ringe swap passerer bogstaveligt a og b som heltal, hvad der virkelig sker? Nå, hvad der virkelig sker, er dette. Lad mig gå videre og fortryde bare for at rydde noget plads her. Så dette er min computers hukommelse. Så hvis jeg har, for eksempel - faktisk lad os gøre det på denne måde - hvis jeg hævder, at det er x, lagring værdien 1, ligesom i sidste uge. Og dette er y, lagring værdien 2 ligesom i sidste uge. Og det er vigtigste, når jeg kalder swap, derved give mig adgang til en og b og tmp, vil jeg hævde, at dette er en og dette er 1.. Dette er b.. Det er 2.. Dette kaldes tmp. Og i første omgang, det har nogle skrald værdi indtil jeg faktisk gemme i det, hvilket er 1. Så jeg gå videre og ændre en at være, hvad? B værdi. Og så nu har jeg to her. Og så sagde vi b. får tmp. Igen, ligesom en tilregnelighed kontrollere, den tredje linje kode her er simpelthen dette en, b får tmp. Og så endelig, hvad gør jeg? Jeg går videre og ændre på b for at være, hvad værdien af ​​TMP er, hvilket er 1. Jeg ikke røre tmp igen. Men nu er problemet så hurtigt som swap afkast, fordi det ikke er uddele tilbage vis værdi, er der ingen vej tilbage erklæring eksplicit i det. Hvad er der egentlig? Nå, hovedsagelig al denne hukommelse - OK, tilsyneladende viskelæderet lide kun én finger ad gangen - bare forsvinder. Nu i virkeligheden er det ikke steder. Men du kan tænke på det nu som spørgsmålstegn. Fordi det er ikke længere faktisk er i brug. Og intet sker med disse værdier. Så i tilfælde af grøn version af denne kode, hvad der i stedet blive ledes ind swap? Så henvender. Så adressen på x og adressen af ​​y. Så hvis vi re-fortæller denne historie en sidste tid, og jeg faktisk drage swap igen, men med pointere, bliver dette en, dette være b, og dette er tmp, hvad der er faktisk gemt i en i denne grønne version af min kode, hvor jeg passerer i adresser? Det kommer til at være en pegepind til x. Så jeg kunne tegne en pil. Men lad os bruge den samme vilkårlige eksempel som før. Lad os sige, at dette er noget som Ox123. Og det kommer til at være Ox127 fordi Det er fire bytes væk, fordi det er en int, så Ox127. Og igen, jeg tager nogle friheder med tallene. De er meget mindre, end de ville faktisk være og i en anden rækkefølge. Men det er, hvordan billedet er nu anderledes. Men når jeg bruger denne grønne kode og jeg int tmp får * et. * Et middel til at gøre følgende, tage tage der er i en og gå til den, hvilket er 1. Og det er hvad jeg derefter sat i tmp. I mellemtiden, i den næste linje kode her * a får b, hvad betyder det? Nå, * en, så gå her får * b, hvilket betyder derned. Og det betyder at sætte værdien til der. Endelig er den sidste linje kode sagde blot * b får tmp. Så b siger derned og overskrive det med tmp som i dette tilfælde, vil at være, igen, 1.. Og dette er grunden til, at grønne version af vores kode virker, mens den røde versionen aldrig gjorde. Det hele bare koges ned til, hvordan hukommelse er lykkedes, og hvor det er faktisk placeret i din computerens RAM. Og for nu, er, at en af ​​de ting, at stakken bliver brugt til. Spørgsmål om layout? På pointers? Eller på swap? Okay, så malloc, tilbagekaldelse, gjorde noget som dette. Dette var en super simpelt eksempel. Og det var den ene, der Binky introducerede os til, omend helt hurtigt i slutningen af ​​klassen. Dammit, der går vi igen. Så minde om, at dette var det eksempel, Binky introducerede os til, omend noget hurtigt i slutningen af ​​klassen. Og her har vi brugt malloc virkelig for anden gang. Fordi den første gang vi brugte det til at skabe nok RAM, afsætte tilstrækkelig RAM at gemme en streng. Denne gang Binky holdt det simpelt. Så det er til at gemme bare en int, tilsyneladende. Og det er helt fint. Det er lidt underligt, helt ærligt, at bruge malloc at tildele én int. Men pointen i Nicks claymation var egentlig bare fortælle historien om, hvad sker eller ikke sker, når du mishandler hukommelse. Så i dette tilfælde, program dette gjorde et par ting. I det første tilfælde her, erklærer det en pointer kaldet x til en int. Derefter erklærer en pointer kaldet y til en int. Derefter gemmer i x, hvad? En anden nu. Hvad bliver gemt i x ifølge den tredje linje i dette program? PUBLIKUM: [uhørlig]. SPEAKER 1: Nå, ikke helt bytes, pr sige. Være mere præcis nu. Hvad bliver gemt i x? En adresse, jeg tror jeg hørte det. Så hvad betyder malloc tilbage? malloc behaviorally allokerer en luns af hukommelse. Men hvordan ser det giver dig adgang til det? Den returnerer hvad? Adressen på den første byte i luns af hukommelsen. Nu, dette er super enkel. Det er bare én byte, hvilket betyder, at løse vi får tilbage er adresse af det hele. Så er lagret i x derefter, er adressen af denne luns af hukommelse. I mellemtiden, hvad der sker næste? Så egentlig, lad os gå videre og trække det ud virkelig hurtigt. Så hvis vi går over til skærmen her og vi spiller det ud int * x og int * y kommer til at gøre, hvad for mig? Jeg hævder, at det bare kommer til at gøre noget som dette og kalder det x, og dette og kalder det y. I mellemtiden, den tredje linje i koden er kommer til at allokere størrelsen af ​​en int, hvilket sker for at være - undskyld hvis jeg sagde en før jeg mente en int - fire byte på en typisk computer. Mindst med CS50 apparatet. Så dette kommer til at afsætte det, hvem ved? Somewhere herude. Og dette er gemt på nogle adresse Ox, hvem ved? Men hvad der kommer til at få returneret er denne adresse. Men vi vil drage dette billedligt som blot en pil som. Nu i den næste linje * x får 42. Hvad betyder * x betyder i lægmandssprog? Bare gå der. Gå til denne adresse. Eller med andre ord, skal du følge pil og sætte 42 der. Men så noget slemt er sket til Binky, right? Husk på, at linje fem her * y får 13, ja et uheldigt tal, gjorde hvad for os? Nå, * y midler gå der. Nå, dette er ikke blevet givet en værdi endnu, right? Koden har ikke y bliver initialiseret til noget. Vi havde x initialiseres til en adresse. Men y blev erklæret op øverst. Men så et semikolon, ingen værdi faktisk lægge i det. Så det er fair at kalde dette en skraldespand værdi. Hvem ved, hvad er der? Det er resterne af bits, der blev anvendt af nogle tidligere linje kode i mit program. Så hvis jeg siger gå der, det er ligesom, Jeg har ingen idé om, hvor denne pil er vil ende. Og det er, når du typisk få en segmentering skyld. Hvis du ved et uheld dereference, så at tale, eller gå til en adresse, der ikke er faktisk en legitim adresse, dårlige ting ske. Og det er præcis, hvad der skete at tænke Binky. Så minde om, at den historie, som Nick var fortæller her var den samme idé som hvad Jeg har tegnet med en illusion af kridt på tavlen der. X og Y er deklareret. Derefter vi tildelt størrelsen af en int og gemt det i x. Derefter den næste linje, vi gjorde * x. Dette var Nicks tryllestav af dereferere. At sætte 42 i hukommelsen påpeget af x. Men det er, hvor tingene gik grueligt galt. Right? Vi forsøgte at dereference y. Men y havde nogle falske værdi, right? At pilen i nederste venstre hjørne, er ikke faktisk peger på noget. Det er slags at gøre, hvad jeg gjorde her på tavlen. Så dårlige ting ske, segmentering fejl eller Binky fejl i dette tilfælde. Men hvis vi så løse, ved at gøre x får y hvordan gør historien forandring? Tja, hvis jeg gør x får y, der er i virkeligheden det samme som at sige hvad det er, Ox-noget vil være det samme her, Ox-noget. Eller billedligt vi tegne en pil. Så her på brættet med Binky, med den næste linje af kode, * y betyder derned. Hvor er der? Det betyder herovre. Og når vi opdaterer at for at være 13 det bare indebærer at gå og skriver 13 her nu. Så måske ikke er helt ligetil ved første øjekast. Men at opsummere og anvende samme jargon der Binky var ved hjælp her, så de to første fordeler de pejlemærker, x og y, men ikke de pointees. Og pointees er ikke en generelt anvendte udtryk. Men pointer er absolut. Men det er, hvad der bliver gjort på i Binkys nomenklatur. Denne næste linie, selvfølgelig, allokerer en int pointee. Så en luns af hukommelse - som jeg trak over på den højre side der - og sæt x svarer til at pege på den. Dette dereferences x for at gemme 42 i den hukommelse, det er at pege på. Og så er dette, selvfølgelig, var en dårlig ting. Fordi y ikke pegede på noget endnu. Dette løser det. Så dette er stadig buggy program. Bare fordi vi blæser gennem kode linje for linje og sige, åh ja, lad det gå ned der. Det er en dårlig ting. Odds er programmet er bare at afbryde helt på denne linje. Men hvis du skulle fjerne styrtede Line og erstatte den med de to sidste linier der du tildeler - hjælp pointer opgave - y at pege på x som litra t. Og så dereference y på en meget sikker måde. Så hvor efterlader det os? Nå, viser sig, at under hætten i CS50 bibliotek, er henvisninger anvendes overalt. Og vi vil faktisk begynde at skrælle tilbage, at laget inden længe. Men det viser også, et udtryk, der nogle af jer måske være bekendt med, især dem mere komfortable, er faktisk, at en meget populær website, eller stak overflow, disse dage. Men dette har faktisk meget tekniske betydning. Vi ved nu, hvad en stak er. Det er ligesom en stak af bakker indersiden af ​​en spisesal. Eller inde i computerens hukommelse Dens disse rammer som anvendes af funktioner. Tja, det viser sig, at på grund af det meget simpel implementering af hukommelse, og rammerne på den såkaldte stak, kan du faktisk tage kontrol af et edb-system forholdsvis let. Du kan hacke ind i et system, hvis folk som os ikke har skrevet vores kode særlig godt. Hvis folk som os bruger bidder af memory eller anvendelse arrays - endnu mere almindeligt - men nogle gange glemmer at kontrollere grænserne for vores array som du måske har selv nogle gange, og gentog alt for langt forbi enden et array. I bedste fald dit program måske bare ned. Segmenteringsfejl, kind pinligt. Ikke stor, men det er ikke nødvendigvis en enormt dårlig ting. Men hvis dit program er faktisk på virkelige brugernes computere, hvis det kører på en hjemmeside, at de faktiske tilfældige mennesker på internettet er ramt, lade mennesker fremkalde dårlige ting på din kode er generelt ikke en god ting, fordi Det betyder en mulighed for at tage kontrol af computeren. Og det kommer til at se lidt kryptisk. Men jeg troede, jeg ville skræmme dig med det sidste eksempel her. Her er et eksempel på kode. Og der er en god Wikipedia artikel, der går gennem dette nærmere. Jeg har main på bunden calling foo, der passerer i argv 1.. Og det er bare så du kan køre programmet, og videregive en vilkårlig indgang. Og så foo er erklæret op øverst som at acceptere en streng, eller mere præcist en char *. Derefter erklærer en vifte af tegn. Kald det en buffer, mere generelt, af størrelse 12. Så 12 chars kan passe inde i af den pågældende matrix kaldet ca. Og derefter anvender denne nye funktion, som er nyt, men ikke svært at forstå, hukommelse kopi. Den kopierer den hukommelse, bar, hvilket var den variable fortid n, uanset brugeren har indtastet i argv 1 ind ca. Hvor mange bytes? Strengen Længden af ​​baren. Så med andre ord, hvis brugeren skriver i h-e-l-l-o enter, strengen længden af hej er fem. Så fem af disse bytes vil få kopieres ind array kaldet C, som er af størrelse 12. Men hvad bruger typer i en meget længere ord, der er 13 tegn eller 14 tegn eller 100 tegn eller mere? Hvor vil de hen? Nå, det stel, der bakke i spisesalen stack, de kommer til at gå der. Og det er bare at begynde at overskrive andre ting, der allerede er på denne stakken, overfyldte stakken, så at sige. Så billedligt, så tænk på det på denne måde. Dette er blot en farverig udgave af det billede, vi har været tegning. Nederst, lad os sige, er vigtigste. Og på toppen, hvad du ser nu er rammen, farvekodede nu, for en funktion kaldet foo. Men hvad er interessant her om foo er, at her er dens ramme. Så det er trukket ligesom jeg gjorde, men i lyseblå. Og nu er det her c beslag 0 går. Og det er her c beslag 11 kommer til at ende. Med andre ord, sker det at være repræsenteret som en firkant. Men hvis du bare holde plopping bytes ned - eller tegn - de kommer til at ende op på placering 0 hele vejen op til 11, fordi det er 0 indekseret. Men hvor er den 13. tegn kommer til at ende? Hvor er det 14.? Hvor er den 50. tegn kommer til at ende? Det kommer til at holde på vej ned. For selvom vi har trukket billede med stakken vokser op, de adresser, viser det sig, gå fra små adresser, små pegepinde, til store adresser. Så det bare holder går op og op. Så hvis brugeren skriver i hej, det er fantastisk. Ingen bug, ikke noget problem, alles sikkerhed. Men hvis brugeren skriver i, hvad vi vil kalde kontradiktorisk kode, repræsenterede generisk som en, angreb, angreb, angreb, angreb, hvad kan ske? Tja, hvis alle de input, som brugeren indtastet er ikke bare nogle venlige eller stødende tegnstreng. Det er faktisk en sekvens af tegn at hvis du har kompileret den, det faktisk er kode. Måske er det kode, der sletter alle de filer på din harddisk eller sender spam eller noget lignende. Bemærk, at hvad der er nøglen her, er, at Hvis den dårlige fyr fik heldig nok til at overskrive den røde luns af hukommelse - som jeg ikke trække på min billede, men denne Wikipedia billede her har - sin såkaldte returadresse. Når fødevarer tilbage, når swap afkast, hvordan computeren ved at gå fra herop for at hernede? Eller i tech segment op over, hvordan betyder det kender til at gå fra swappen kode - den 0'er og 1'er der komponerer swap - tilbage til main? Der er en såkaldt returadresse opbevares i det samme stakramme, om det samme cafeteria bakken. Så hvis den dårlige fyr er klog nok til at sætte angreb kode, angreb kode, angreb kode og få heldige nok - ofte gennem trial and error - for at overskrive at rød returadresse med adressen og meddelelsen helt i top. Bemærk 0835C080. Det er skrevet baglæns op øverst for grunde vil vi måske revidere. Dette er det nummer. Så hvis den dårlige fyr bliver heldig nok eller er smart nok til at overskrive den røde fratage hukommelse med adressen på kode, som han eller hun har en eller anden måde sprøjtes ind i din computer, gæt hvis kode vil blive returneret til så snart foo sker udførelse? Den dårlige fyr kode. Så dette angreb kode, AAA igen, måske sende spam, kan slette alle de filer på din harddisk. Men det er hvad der virkelig en stak overflow er, eller et bufferoverløb eller et buffer overflow angreb. Og det er utroligt, utroligt almindelig til denne dag med programmer skrevet i C, C + +, og endda nogle andre sprog. På det skræmmende note, vil vi slutte med en vittighed. [Latter] Se dig på onsdag. Ved næste CS50 - Så jeg er alle ude af disk lamper i dag, men vente, fedtfri mælk, halv telefonen bog, appelsinsaft at jeg drak i dag. USB-kabel, en skruenøgle. [MUSIC Playing]