[Speel van musiek] David J. MALAN: Alle reg dit is CS50 en dit is die begin van die vyfde week. So vandag, onder jou sitplek kussings, jy sal dit nie vind nie. Maar bo, moet jy hierdie, 'n min teken van ons waardering vir al die werk wat jy in die spel van Vyftien. Eenvoudig verwyder die klein sirkel op die onderste om te begin speel vir die res van die klas. So onthou dat, of weet dat die probleem wat vier, wat uitgegaan het hierdie naweek, behels die skryf van 'n ander spel. Maar hierdie keer is dit behels die gebruik van 'n werklike grafiese gebruikerskoppelvlak, nie 'n tekstuele koppelvlak soos Spel van Vyftien was. En die wedstryd wat voorlê van julle, As jy nog nie gesien het nie hierdie volgende, lyk 'n bietjie iets soos hierdie. Ek gaan om te gaan in my terminale venster hier in GDB. En ek gaan om voort te gaan en die bedryf personeel oplossing, wat jy kan toegang na die uitvoer update 50 as gewoonlik. Maar ek gaan om dit te sit in 'n klein geheime af, 'n bietjie Easter eier, sogenaamde God af, deur om God in argv1. En ek het my eie rigtings te volg, loop dit in my eie probleem gestel gids. So nou sien jy 'n volledige weergawe van die spel van die tempo. In werklikheid, dit is nie-hande af. So dit is eintlik - monde van al sou jy wees - redelik triviaal God af te implementeer in Tempo, in teenstelling met spel van Vyftien, wat sommige van julle dalk aangepak het vir die hacker-uitgawe. In Breakout is dit voldoende om in God af om net te doen wat, intuïtief met die paddle? Net maak dit gelyk aan wat ook al die horisontale posisie van die bal. En so lank as wat jy doen in lockstep met die bal beweeg Hierdie wedstryd sal nooit, ooit, ooit mis die bal en jy sal elke keer wen. Maar in hierdie week se uitgawe hacker daar is meer as net God af. Daar is 'n aantal ander funksies. Onder hulle is, lasers. So dat as jy regtig ongeduldig raak jy kan begin af te skiet die stene en 'n paar ander. En vir dié van julle wat wil kalibreer standaard versus hacker uitgawe, kan ek sien dat hierdie week se hacker uitgawe is doelbewus 'n bietjie meer uitvoerbaar, sê, as God af was met die spel van Vyftien. So as jy op soek is na 'n rek en jy soek vir 'n paar ekstra pret funksies te doen duik in as van belang. Nou, meer prakties, laat my daarop uit een ding as well. GDB, wat sommige van julle kan nog nie ' raak persoonlik, wat is goed. Maar dit is nou regtig die tyd om gewoond te raak om hierdie en gemaklik met hierdie hulpmiddel want dit sal jou lewe baie makliker, werklik. Per Rob se lesing oor GDB 'n paar weke gelede, onthou dat GDB is 'n debugger. Dit is 'n instrument waarmee jy jou program, maar hardloop dit stap vir stap, lyn deur lyn, sodat jy kan rondom steek, sodat jy dinge sien gebeur, so wat jy kan uitdruk waardes van veranderlikes. In kort, dit gee jou soveel meer krag as printDef doen. Nou weliswaar, die koppelvlak is redelik arcane. Swart en wit tekstuele koppelvlak vir die grootste deel. Die opdragte is ietwat moeilike om te onthou by die eerste. Maar selfs al is dit dalk neem jy die helfte 'n uur, 'n uur, wat aan die begin te sit belegging van tyd in dit, glo my. Beslis deur semester se einde sal dit red jy 'n orde van grootte meer tyd as dit. So vroeg in die week duik in En in terme van tempo, weet dat jy kan dit doen so lank as wat jy die verspreiding kode of jou eie kode in vordering in jou Pst4 gids. Weet dat jy gdb kan hardloop. / Tempo. Dit gaan om oop te maak 'n venster soos hierdie. Kom ek gee myself meer van 'n terminale venster. En dan wat ek gaan om voort te gaan en doen nie, is dit nie net loop nie. Ek gaan na die eerste stel 'n breek punt Onthou, wat dit moontlik maak om jou te breek uitvoering op 'n spesifieke plek. Net om te hou dinge eenvoudig ek gaan te breek by lyn een net deur te tik die nommer een. Laat my eintlik heropen hierdie venster want dit is om 'n bietjie klein daar. So wat ek nou gaan om hier te doen, is om As ek open my terminale venster. Kom op, daar gaan ons. So as ek nou terug te gaan na Dropbox, Pst4 en hardloop gdb. / tempo ingaan, sien Ek gaan om te breek een op te stel 'n breek punt op lyn een. En nou is ek gaan om te gaan voor en tipe voer. En wanneer ek dit doen, sien niks lyk om te gebeur. Daar is geen pop-up. Daar is geen grafiese gebruikerskoppelvlak nie. Maar dit is te verstane, want ek is letterlik by lyn een in my program. En sien dat ek vinnig het gestuur, nou spesifiek na 62, omdat al die dinge op die top van hierdie lêer dinge soos kommentaar en konstantes en oninteressante dinge vir nou. So nou is ek in die hoof-, dit lyk, op lyn 62. En dit is net die verspreiding kode, herroep. As ek oop hierdie deur gaan, op soortgelyke wyse, in my drop box gids in Pst4, in breakout.c. En as ek blaai af en af ​​en af, en laat my gaan voort en draai op my lyn nommers. Wat ek sal sien, as ek blaai af na lyn 62, is presies die lyn wat Ons het gestop op. So hierdie lyn hier, 62, is waar ons gaan wees. So nou in GDB, as ek gaan voort en tik nou volgende, gaan dit gaan voer die lyn. En siedaar, ons het die sogenaamde g venster. Indien nie vertroud met wat 'n GWindow is, nie te bekommer nie. Die spec sal jou bekendstel aan dit, soos sowel as 'n aantal walkthrough videos ingesluit in die spec. Maar laat ons nou maak dit 'n bietjie meer interessant. Laat my toe om die venster te beweeg oor aan die kant 'n bietjie. Laat my toe om die venster 'n bietjie groter, sodat ek kan sien nog baie meer. En nou, laat my gaan voort en die volgende weer doen. En daar is my bakstene. As ek tik die volgende weer nou sien ek die bal. En as ek tik die volgende weer nou sien ek die paddle. En gelukkig hierdie gedit is nie werklik saam te werk deur te wys my alles wat ek wil hê. Maar nou as ek volgende doen weer, volgende weer, ek is net verklaar 'n paar veranderlikes. En ek kan druk enige een van hierdie ouens uit. Print bakstene, afdrukke lewens. En nou as ek voortgaan om te doen volgende, merk dat ek sal binnekant van die loop. Maar die kode gaan uit te voer presies soos ek verwag. So toe ek hierdie funksie, wag vir Click, gaan dit te doen dit letterlik dat. So ek het skynbaar beheer verloor oor die program. GDB is nie gee my 'n ander vinnige. Maar nie te bekommer nie. Gaan na my spel, iewers klik. En siedaar, nou dit verder te line 86. So weer, dit is van onskatbare waarde, uiteindelik, vir ontfouting probleme. Want jy kan letterlik stap vir stap deur jou kode, druk dinge en nog baie, baie, baie meer. Maar vir nou, die instrumente alleen moet kry jy mooi ver. So ons is, natuurlik, 'n blik by Grafiese nou, al van 'n skielike. En nou het ons wêreld kry 'n bietjie meer interessant. En jy weet, dalk van 'n paar van die videos aanlyn dat ons hierdie kortbroek wat jy het al kyk as deel van die probleem stelle. En hulle het geskiet, doelbewus, teen 'n wit agtergrond. En sommige van hulle het die onderrig Genote trek 'n paar teks op die skerm wat is oorgetrek aan die kant van hulle. Maar natuurlik, dit is nie al wat interessant in die werklike wêreld. Dit is net 'n lesing saal met 'n groot wit skerm en 'n agtergrond. En ons wonderlike produksie span soort van maak alles lyk mooi na die feit deur opduik uit of oortreksel enigiets ons doen of wil nie. Nou net om te motiveer om hierdie week en regtig, waar jy kan gaan, uiteindelik, met 'n rekenaar wetenskap. Nie net na die probleem stel vier. Maar na 'n ander kursus of 'n hele kurrikulum dit is ongelooflik wat jy kan doen deesdae in terme van beelde in die besonder. Sommige van julle het dalk gesien het hierdie vloei rondom aanlyn. Maar ek het gedink ek wil wys, net vir 'n paar minute, 'n kykie van wat rekenaartegnologie en wat CGI, rekenaargrafika kan doen deesdae met 'n bekende lied en miskien film. [MUSIEK - LANA DEL Ray, "Jonk en mooi] Spreker 1: Dit is net 'n bietjie amazing, miskien, net hoe alomteenwoordige - [Applous] Spreker 1: Ek het nou net afgelaai het. Maar dit is regtig ongelooflik, dink ek, net hoe alomteenwoordige sagteware en die kode en gereedskap soos dit werklik is. So dit is 'n voorsmakie van die rigting waarin jy kan gaan. O, nee meer toestel vandag. Wel, dit is eintlik tragies tydsberekening gegewe die punt wat ek net probeer maak. Alle reg, so laat ons begin Fusion weer. Herinner my later. Alle reg, en jy moet gekry het 'n e-pos as 'n eenkant as jy het 'n sien soos dit. Alle reg, so onthou dat dit die laaste week ons begin om te skil terug hierdie later bekend as string. string herinner aan 'n data tipe wat verklaar in die CS50 biblioteek. En dit is deel van die opleiding wiele wat sal nou begin om af te neem. Dit was 'n nuttige konsep vroeg op. Maar nou is dit gaan om meer te kry interessant en meer kragtige eintlik sien dat onder die enjinkap, 'n string is net wat het ons gesê? Ja, so dit is 'n sogenaamde char *. En die * daar dui dat daar 'n soort van adres betrokke is. En so wanneer jy sê char * jy net beteken 'n veranderlike wie se data tipe is 'n wyser nou. Die feit dat daar is die ster is daar beteken net dat jy 'n word verklaar sogenaamde wyser. En dit wyser gaan blykbaar slaan die adres van die, van Natuurlik, 'n kar. Nou hoekom maak dit sin? Wel, wat is 'n string onder die enjinkap? Wel, vir 'n geruime tyd het ons gesê: dat 'n string onder die enjinkap is net h-e-l-l-o, byvoorbeeld. Maar ons het gepraat oor hierdie as word, in wese, 'n skikking. En 'n skikking sal dan kyk 'n bietjie meer soos hierdie, met elk van hierdie toegang tot 'n byt. En dan het ons gesê dat daar is ' iets spesiaals hier agter, die agteroorskuisstreep 0, of nul Terminator. So al hierdie tyd, is dit hier is 'n string. Maar regtig, 'n string is eintlik 'n adres. En adresse, soos ons sal sien, is dikwels voorafgegaan met 0x deur konvensie. Wat beteken 0x dui? Is daar iemand weet? So dit beteken net heksadesimale. Sodat jy kan onthou, eintlik, van Pst 1, glo ek, een van die warm-up vrae eintlik gevra oor heksadesimale notasie in bykomend tot binêre en desimaal. En die motivering hier is dat met heksadesimale jy het 16 syfers tot jou beskikking. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, gevolg deur a, b, c, d, e, f. En as jy reken al die up, kry jy 'n totaal van 16. So dit is in teenstelling met desimale, waar ons 'n 10 syfers, 0 tot nege. Dit is in teenstelling met die binêre waar ons moet net 0 en 1. Maar aan die einde van die dag kan jy net verteenwoordig dieselfde getalle nie, maar ietwat anders. En heksadesimale is algemeen omdat as dit blyk uit - en ons sal sien hierdie later in die loop - selfs wanneer ons op die web ontwikkeling in die konteks van HTML en kleur kodes, heksadesimale is lekker. Omdat elke syfer, blyk, verteenwoordig vier stukkies perfek. So is dit net 'n soort van lyne mooi as ons sal uiteindelik sien. So dit mag wees Ox123 of iets soos dié, wat die volgende aandui adres 123 iewers binnekant van my rekenaar se geheue. Maar natuurlik, 'n paar probleme As gevolg van hierdie onderliggende implementering. En onthou dat ek 'n steek op implementering van 'n funksie soos hierdie - vergelyk stamp 0 dot c verlede week, wat selfs al is dit lyk soos dit was reg is, is dit eenvoudig nie vergelyk twee snare korrek. Ek het weg hoof gegooi, en ek het gegooi weg van die kommentaar net te fokus op die kode wat van belang hier. En dit is in rooi, want dit is karretjie. Om watter rede? Wel, op die top is daar wanneer ek verklaar 'n string, wat werklik aan die gang onder die enjinkap? Wel, laat ek gaan oor na die skerm hier en trek nie. So ek verklaar, weer, string s GetString. So ek gaan om voort te gaan en nou trek s vir wat dit werklik is. Dit gaan 'n vierkantige hier te wees. En ek gaan om te eis dat dit is 32 stukkies. Ten minste is dit gewoonlik, ten minste op die CS50 toestel in 'n baie van rekenaars. Ek gaan om dit te noem s. Maar nou onthou dat ons genoem GetString. So GetString opbrengste, natuurlik, 'n string. As die gebruiker in h-e-l-l-o tree die string hallo kry teruggekeer. En dat string, as ons net sê, eindig iewers in jou rekenaar se geheue met 'n agteroorskuisstreep 0 aan die einde. Ek sal teken dit soos die skikking - of aangrensende blok karakters - dat dit eintlik. En nou, wat is GetString eintlik terugkeer? Wat het GetString is terug al hierdie tyd? Wel, sê ons, in weke voor, dit gee 'n string. Maar meer tegnies nie, wat GetString terugkeer glo? Publiek: 'n adres. Spreker 1: 'n adres. Spesifiek dit gee die adres van die eerste hap, wat dit ookal is. Ek hou net die gebruik van een, twee, drie want dit is gerieflik. Dit gee die adres van die eerste karakter in die string. En ons het verlede week gesê dat wat voldoende is. Want ons kan nie altyd uit te vind waar die einde van die tou net deur iterating oor dit, miskien, met 'n vir lus of 'n rukkie lus of iets soos dat, net op soek na "agteroorskuisstreep 0", die spesiale brandwag karakter. En dan weet ons dat die string gebeur om te wees van die lengte - in hierdie geval - vyf. So tegnies wat GetString doen is dit terug Ox123 in hierdie geval. En tegnies wat dan gebeur, is dat ons slaan, binnekant van s, Ox123. Aan die einde van die dag, selfs al is dit is 'n nuwe konsep, wysers, hulle is net veranderlikes. Maar dit gebeur stukkies op te slaan wat gesamentlik verteenwoordig 'n adres. So tegnies al wat hulle kry gestoor in s is Ox123. Maar ons mense - insluitende vandag af - is regtig nie van plan om te sorg, tipies, wat die werklike adres is van sommige stuk van die geheue. Dis net te lae vlak van detail te intellektueel interessant. So ek gaan om dit ongedaan te maak. En in plaas daarvan, meer 'n hoë vlak, sê net dat wanneer ons praat oor die wysers Ek gaan net trek meer gebruikers-vriendelike pyl wat dra die dieselfde idee en abstrakte weg van die Besonderhede van wat die werklike onderliggende adres is. Nou as ons gaan terug na die kode, wat verlede week gebeur het as ons string t gelyk GetString? Wel, as ek weer soort in Hello Hierdie keer het ek gaan kry 'n ander deel van die geheue. h-e-l-l-o agteroorskuisstreep 0. Maar omdat Ek geroep GetString 'n tweede keer - en ek weet dit uit te kyk na die bron-kode vir GetString - selfs al is dit toevallig dat hallo was getik in twee keer, GetString is nie gaan probeer om te optimaliseer en slim wees. Dit is net gaan nog 'n stuk van te kry geheue van die rekenaar, wat gaan wees by 'n ander adres. Kom ons arbitrêr sê net 456. En dan wat dit gaan om terug te keer? Dit gaan 456 om terug te keer en bêre dit in t. So, wat is werklik aan die gang, op die linkerkant is ek het nog 'n stuk van die geheue, 32 stukkies tipies. En daar gaan Ox456 om te gaan. Maar weereens, ek stel nie belang in hierdie spesifieke getalle nie. Ek gaan net om abstrak teken dit as 'n pyl. So, dit is nou 'n nuwe verduideliking. Maar dit is presies dieselfde idee wat gebeur al hierdie tyd. En so is die rede dan, dat hierdie eerste weergawe van vergelyk was karretjie verlede week is die rede waarom? Wanneer jy doen as s gelyk is gelyk aan t wat jy werklik onder die enjinkap te vergelyk? Jy vergelyk die adresse. En net intuïtief, duidelik, Ox123 gaan nie gelyk Ox456. Hierdie syfers, daardie stukkies is net anders. En so konsekwent, het verlede week gesê jy tik verskillende dinge, selfs al is die woorde is woordeliks dieselfde. Sodat ons dit regmaak. In leketaal, wat was die fix? GEHOOR: Gebruik 'n funksie. Spreker 1: Gebruik 'n funksie. Of sterre is beslis betrokke is, maar gebruik 'n funksie wat om te doen? Gehoor deur die toue te vergelyk. Spreker 1: die snare te vergelyk. So het die fundamentele probleem hier was dat ek net die oorweging van die kwaliteit van snare word gedefinieer deur vergelyking van hul adresse. En natuurlik dis net stom nou eenmaal jy verstaan ​​wat gaan aan onder die kap. Om werklik te vergelyk snare om te sien of Hulle is gelyk in die manier waarop 'n mens sal oorweeg om twee toue om gelyk te wees ons nodig het om hulle te vergelyk karakter vir karakter vir karakter. Nou ek kon gedoen hierdie baie tediously. Maar vertroulik, ons is gebruik van 'n for-lus. En net vergelyk s bracket i teen t bracket i. s bracket i plus 1 teen t bracket i plus 1, en so meer, binne 'n soort van lus. En as ek sien enige twee karakters wat verskil, of as ek besef dat ooh, s is korter as t of langer as t Ek kan dadelik sê onwaar is, hulle is nie dieselfde nie. Maar as ek kry deur middel van s en t en sê dieselfde, dieselfde, dieselfde, dieselfde, dieselfde, die einde van die beide stringe, kan ek sê waar, hulle is gelyk. Wel, gelukkig, jare gelede iemand geskryf dat-kode vir ons. En hulle het dit StrComp vir string vergelyk. En selfs al is dit 'n bietjie counter intuïtief, StrComp terugkeer 0 indien daardie twee snare, s en t is dieselfde. Maar dit gee negatiewe waarde as s moet kom voor t alfabeties of positiewe waarde as dit moet kom na t alfabeties. So as jy ooit iets wil sorteer, dit blyk dat StrComp is nuttig. Omdat dit nie net sê Ja of nee, gelyk of nie. Dit gee jou 'n gevoel van die bestel graag 'n woordeboek krag. So StrComp, s komma t is gelyk aan gelyk aan 0 beteken dat die snare is werklik gelyk. Want wie het hierdie funksie jaar gelede vermoedelik gebruik om 'n lus vir of 'n rukkie lus of iets soos dit te integreer oor die karakters weer en weer en weer. Maar twee probleem ontstaan ​​hier. Dit was copy0.c. En die twee in rooi is want dit is gebrekkig. En wat het ons hier doen? Wel, ek het GetString. En ek geberg die terugkeer waarde in s. So dit is nogal baie dieselfde as hierdie top deel van die prentjie. Maar wat kom nadat dit? Wel, laat ek gaan voort en ontslae te raak van 'n hele klomp van hierdie. Ons sal rewind in die tyd waar ons net het s, wat nou in ooreenstemming met lyn een daar. Ek is so. As s gelyk aan 0. Nou, 'n vinnige kant nota, wanneer dalk GetString terugkeer 0? Daar is nie genoeg geheue. Reg? Dit is selde dat dit gaan gebeur nie, beslis op 'n rekenaar wat het honderde Megs of selfs gigs RAM. Maar dit kan, in teorie, terug 0, veral as die gebruiker nie saam te werk. Daar is maniere om te maak asof jy nie ingevoer enigiets en truuk GetString in die terugkeer 0 effektief. So dit gaan om te kyk vir daardie. Want as enige van julle het begin om te kry, reeds, segmentering foute - wat waarskynlik 'n bron van 'n paar frustrasie - dit is byna altyd die gevolg geheue-verwante fout. Een of ander manier wat jy deurmekaar met betrekking tot 'n wyser, selfs al is jy nie besef daar was 'n wyser. So kan jy dalk veroorsaak het segmentering foute so vroeg as week een gebruik iets soos 'n for-lus of 'n rukkie lus en 'n skikking deur te gaan te ver verby die grense van 'n skikking wat jy verklaar, in week twee in besonder. Jy kan dit gedoen het, selfs in probleem stel vier met tempo. Selfs al is jy waarskynlik nie gesien het nie enige sterre in die verspreiding kode vir Breakout, dit blyk dat diegene GRect en GOval en ander sulke dinge, dit is eintlik wenke onder die kap. Maar Stanford, soos ons, soort van huide dat die detail ten minste vir die biblioteke doeleindes, net soos wat ons doen vir string en char *. Maar GRect en GOval en al daardie dinge wat jy ouens is of sal gebruik word om hierdie week is uiteindelik geheue adresse. Jy weet net nie doen nie. Dit is dus nie verbasend dan, miskien, sodat julle reis oor 'n paar segmentering foute. Maar wat interessant is hier en nou, As nadat ons gaan vir 0 ons doen string t kry s. Wel, laat ek verklaar t. Ek gaan om dit te trek as 'n vierkant, 32 stukkies, noem dit t. En dan gaan ek te doen kry is. Wel, wat beteken dit? Wel, dit is 'n bietjie moeilik om te dink daaroor prentjie wys. Maar laat ons daaroor dink wat binne in x? Wat is letterlik binne hierdie veranderlike? Die waarde Ox123. So as ek sê string t kry s, wat net beteken letterlik neem die getal in s, wat Ox123 en sit dit Ox123. Of picturaal, as ek soort van abstrakte weg van die detail dit het die effek van letterlik doen hierdie so goed. So nou, dink terug aan verlede week toe ons voortgegaan om kapitalistiese T. Ek het T bracket 0. Wel, T bracket 0, selfs al is dit 'n wyser, kan jy hanteer dit asof dit is 'n skikking, met 'n vierkantige hakienotasie. So waar is die T bracket 0? Wel, dit is die h. En so wanneer ons dat die lyn van kode, twee boonste, wat in daardie c type.h kop lêer, dis waar dit verklaar. Jy kapitaliseer hierdie H. Maar Natuurlik, dit is presies dieselfde h dis binnekant van s, om so te spreek. En so nou het jy of verander gekapitaliseer beide die oorspronklike en die sogenaamde kopie. Omdat jy nie 'n kopie in die manier wat 'n mens sou wou hê dit moet wees. So wat was die fix hier, in copy1.c laaste week? Funksies, sodat ons kan eintlik kopieer die string. En fundamenteel, doen wat ons nodig het om te doen om die string te kopieer? Wel, in hierdie groen weergawe hier Ek is gaan dit redelik lae vlak te doen. Daar is eintlik funksies hulle kan help met hierdie. Maar die mees basiese een, en die mees bekende een, ten minste, sal binnekort bekend aan ons, is die volgende - so een op die eerste lyn van die kode in groen nou. Ek het net oorgeskryf is as char *. Daar is geen funksionele verskil daar. Ek het net weggegooi die CS50 biblioteek en Ek noem dit wat dit is, 'n char *. Nou dot, dot, dot, want daar was sommige foutkontroles dit is nie interessant om te praat oor die weer. So nou t verklaar word. Dit is ook 'n kar *. So ek het 'n bietjie vierkant op die skerm soos tevore. Maar op die regterkant, malloc, ons gesê het, is die geheue toeken. So ken sommige stuk van die geheue. En hoeveel grepe doen ons eintlik wil te ken, lyk dit? Wel, die string lengte van s. So as dit is hallo dis gaan wees vyf. Ons sal sê h-e-l-l-o. So vyf grepe. Maar dan plus 1, waarom 1? Die 0 karakter. As ons laat nie ruimte vir hierdie man ons dalk per ongeluk 'n situasie skep waar die string is h-e-l-l-o. En dan die volgende keer is GetString genoem en ek tik in, byvoorbeeld, David, D-'n-v-i-d, die rekenaar gaan om te dink dat s eintlik h-e-l-l-o-d-a-v-i-d, want daar is geen breek tussen in daardie woorde. Dus moet ons wat breek. So ons wil nie vyf. Ons wil ses grepe. En grepe wat ek sê. Maar dit is werklik tyd grootte van kar. Tegnies kar is byna altyd 'n enkele byte. Maar net om ons kode draagbare, om so te praat, sodat dit werk op verskillende rekenaars selfs al is hulle dalk wees ietwat anders onder die kap, ek gaan om te generies sê grootte van kar sodat my-kode altyd werk. En ek het dit nie te heropstel net omdat ek opgradeer my rekenaar of gebruik 'n paar verskillende platform. So ek het 6 keer die grootte van 'n kar, wat gebeur om te wees 1. Dus beteken dit dat malloc kon gee my ses grepe. Wat is dit eintlik doen? Wel, laat my rol terug in tyd hier waar ons is in die storie. So as ek terug gaan hier, het ek verklaar 'n char * t genoem. Ek het nou genoem malloc vir ses grepe. En nou gaan ek daardie ses te trek grepe net soos die skikking vroeër. Maar ek weet eintlik nie wat is binne hierdie skikking. As jy geheue toeken dit blyk dat jy kan nie glo dat daar is 'n paar bekend waarde daar. Dit kon gewees het wat gebruik word deur iets anders, 'n ander funksie, 'n ander lyn van die kode wat jy geskryf het. Dus sal ons in die algemeen noem hierdie vullis waardes en trek hulle, miskien, as vraagtekens, net aandui dat ons weet nie wat is eintlik daar. En dit is nie 'n groot deal so lank as wat ons is slim genoeg om dié te vervang vullis waardes met nommers of karakters wat ons omgee. So in hierdie geval wat gaan ek doen? Wel, my lyn van die kode volgende, ek het vier. Int ek kry 0, n kry die string lengte van s. So 'n bekende vir lus. Ek is minder as of gelyk aan n, wat gewoonlik hierbo. Maar hierdie keer is dit doelbewuste. Ek + +, en dan het ek net doen t bracket ek kry is. Omdat my prentjie lyk soos hierdie by hierdie oomblik, gestoor in t is die adres van die ewekansige stuk van die geheue wie se waardes is onbekend. Maar so gou as wat ek doen t bracket 0 wat sit my hier. En wat eindig om daar geteken het? Ons eindig om h. Want dit is wat aan s bracket 0. En dan is dieselfde ding vir e, en l en l, en o. n, hoekom het ek gaan deur 'n gelyk is aan n? As gevolg van die 0 karakter. So net om duidelik te wees, dan, as ek eintlik vee wat hierdie gemors waardes is en dan eintlik trek wat ek verwag, is dit 's bracket 1, 2, 3, 4, plus dit is sleep nuwe karakter. En so nou as ons voortgegaan om verby die kol, dot, dot in hierdie korrekte weergawe en gekapitaliseer t bracket 0 Ek sal, Natuurlik, kapitaliseer word net hierdie man hier, wat konseptueel, was uiteindelik die doel te bereik. So dit is al wat die wyser is. En jy is met behulp van hulle vir weke nou in die konteks van snare. Maar onder die enjinkap hulle 'n bietjie meer ingewikkeld. Maar as jy dink oor hulle in hierdie geïllustreerde vorm Ek stel voor dat hulle waarskynlik nie alles wat skrikwekkend soos hulle dalk die eerste lyk op die eerste oogopslag, veral met so 'n nuwe sintaks. Enige vrae oor die wysers, snare, of karakters? Ja? GEHOOR: Kan jy terug gaan na die [onhoorbaar]? Spreker 1: Natuurlik. GEHOOR: So hoe kom in jou heel laaste lyn, het jy nie 'n * t lyn en 'n * s in die lyn? Jy hoef nie die verwysing na die - Spreker 1: Ag, 'n baie goeie vraag. Hoekom het ek nie 'n * t en 'n * s? Omdat kortliks, verlede week, soos in ons ruil funksie, het ek sê dat wanneer jy het 'n wyser die wyse wat jy daar gaan soos ons gedoen het fisies op die verhoog, was om werklik gebruik om die ster operateur. Dit blyk dat hierdie vierkante-bracket notasie wat ons sal noem sintaktiese suiker, wat net 'n sexy manier sê dit is snelskriknotasie vir presies wat jy beskryf. Maar dit is 'n bietjie meer intuïtief. En op die risiko van die maak van hierdie lyk meer ingewikkeld as wat dit moet wees, wat regtig hier aangaan is die volgende - As ek sê * t wat beteken dat na die adres gestoor in t. So letterlik, as t is die stoor die adres van die h aanvanklik, * t beteken hier. Nou, wat beteken t bracket 0 beteken? Presies dieselfde ding. Dit is net 'n bietjie meer gebruiker vriendelik te skryf. Maar ek is nog nie klaar nie. Ek kan nie net sê * t kry * s. Want wat sou ek dan doen? Ek sal dit wees om h, h, h, h, h dwarsdeur die hele ding. Reg? Omdat * t is gaan na die adres in t. Maar ons is binnekant van 'n lus. En watter waarde ek die verhoog, natuurlik, op elke iterasie? i. Maar daar is 'n geleentheid hier, reg? Selfs al is dit voel soos dit is om 'n bietjie meer gesofistikeerd as die vierkant-hakienotasie wat ons gebruik het vir 'n geruime tyd - laat my ongedaan my h verandering daar - selfs al is dit nou 'n bietjie Persoon, die basiese idee, as * t beteken hier en * t is net gaan na die adres in t. Maar wat was die adres in t? Die aantal hou ons gebruik? Soos Ox456, laat ons dit terug bring net ter wille van die bespreking. Wel, as ek wil om te kry op die e in t string, ek wil net om te gaan na, wese, 456. Of liewer, 457. Ek het net een nodig het om by te voeg. Maar ek kan dit doen nie, reg? Omdat t, selfs al het ek hou tekening dit is nou as 'n pyl, dit is net 'n nommer, Ox456. En as ek nog een dat, of meer in die algemeen, as ek voeg ek by dat ek kan kry eintlik presies waar ek wil. So as ek eintlik doen - en dit is wat nou bekend wyser rekenkundige - Ek kan verwyder hierdie lyn. Wat, eerlik, ek dink helderder en 'n bietjie meer gebruikersvriendelik te lees. Maar dit is nie minder nie korrek nie. Hierdie lyn van die kode nou is die gebruik van wyser rekenkundige. Dit sê gaan na die volgende adres - Wat ook al die begin van t is, wat is t plus i, wat aanvanklik is 0, wat is groot. Want dit beteken dat die begin van t plus 1, plus 2, plus 3, en so meer. En dieselfde deal met s. So sintaktiese suiker vir hierdie. Maar verstaan ​​wat regtig aangaan onder die kap, sou ek argumenteer, is werklik nuttig in en van die self. Want dit beteken nou is daar nie baie meer magie aan die gang onder die kap. Daar is nie van plan om baie meer lae wat ons kan terug skil vir jou. Dit is c. En dit is om die programmering. Regtig 'n goeie vraag. Alle reg, so hierdie was dat karretjie program wat ek het verwys na vroeër. swap gebrekkig was. Indien nie blyk te werk. Onthou dat net soos met die melk en die oranje sap - wat ek begin drink vandag se demonstrasie. So net soos met die oranje sap en die melk, het ons 'n te gebruik tydelike veranderlike, tmp, 'n te hou tydelik sodat ons kan dan verander sy waarde en dan werk b. Maar hierdie funksie, het ons gesê of hierdie program in wat hierdie funksie geskryf was verkeerd en verkeerd is, hoekom? Ja? GEHOOR: [onhoorbaar]. Spreker 1: Presies, wanneer jy noem ruil - of meer in die algemeen, wanneer jy noem die meeste 'n funksie - indien die argumente vir daardie funksie is primitief, so te sê, ints en karakters en dubbelspel en dryf, dinge sonder sterre, is jy verby in 'n afskrif van die argument. So as x is 1 en y was 2, is 'n lopende te wees 1 en b gaan wees 2. Maar hulle gaan om anders te wees stukke van stukkies, verskillende dele van geheue wat gebeur te stoor identiese waardes. So hierdie kode is super volmaakte op die uitruiling van a en b. Dit is nie goed op die uitruiling van - in verlede week se voorbeeld - x en y. Omdat weer, hulle is in die verkeerde omvang. Nou, hoe het ons gaan oor die belangrikheid van hierdie? Ons het die funksie te maak kyk 'n bietjie minder mooi. Maar weereens, oorweeg wat Dit beteken net. En eintlik, laat my, vir konsekwentheid, verander een ding en dit is dus identies aan wat ons nou net gedoen het. Soos ek genoem het verlede week, is dit nie saak waar dit gaan. In werklikheid, tipies sou jy sit die ster langs die veranderlike naam. Maar ek dink dit sou wees om 'n bietjie makliker te maak die * langs die oorweeg data tipe as wat beteken dit is 'n wyser na 'n int in hierdie geval. So, wat doen ek hier? Ek sê nie gee my 'n int gevolg deur 'n ander int, noem hulle A en B. Gee my die adres van 'n int. Gee my die adres van 'n ander int. Noem diegene spreek a en b. En dan met behulp van die * notasie af hieronder, gaan na elk van die adresse as wat nodig is om óf kry of stel die waarde daarvan. Maar daar is 'n uitsondering hier. Hoekom het ek nie 'n * by tmp? Hoekom moet ek dit nie doen nie, byvoorbeeld? Dit voel asof ek moet net almal gaan uit en stel die hele ding. Ja? GEHOOR: [onhoorbaar]. Spreker 1: Ek het nie verklaar tmp as 'n string. So dit sou verklaar, in hierdie geval, 'n tmp om die adres van 'n int. Maar dit is nie heeltemal wat ek wil hê, vir 'n paar van die redes. Publiek: Jy wil nie om hulle te ruil. Spreker 1: Presies, ek wil nie te ruil iets met tmp. tmp is net week-een dinge. Al wat ek wil hê, is 'n veranderlike 'n nommer te stoor. Ek het nie eens omgee adresse op hierdie oomblik. Ek moet net 32 ​​stukkies of so 'n int te stoor. En ek wil om te sit in die 32 stukkies alles wat nie in 'n, om so te praat nie, maar wat op 'n, net om presies te wees. Want as 'n is 'n adres, * n beteken gaan daar en kry die waarde 1. Byvoorbeeld, in verlede week se voorbeeld of in B se geval, kry die waarde van 2. So, wat regtig aangaan? Laat my 'n prentjie hier wat net terg uitmekaar deel van vandag. Maar dit sal voortgaan om te verskyn vir 'n geruime tyd. Hierdie, ek eis, is wat jou rekenaar se geheue lyk soos wanneer jy 'n program, 'n program. Wanneer jy 'n program by die heel boonste van jou rekenaar se geheue - so dink hierdie reghoek, waarlik, as jou rekenaar se geheue of geheue, al 101 miljard grepe van dit, al twee biljoen grepe, al twee GB van dit, ongeag die hoeveelheid wat jy het, is, Kom ons teken dit as 'n reghoek. En ek beweer dat wanneer jy 'n program soos Microsoft Word of Chrome of iets soos dit, die stukkies wat Microsoft of wat Google het - in die geval van die programme - gelaai word in jou rekenaar se geheue waar hulle kan meer word uitgevoer vinnig en gevoed in die CPU, wat is die brein van die rekenaar. En in TAM hulle gestoor word op die heel top van jou program, om so te praat. Met ander woorde, indien dit is 'n stuk van geheue, wanneer jy dubbel kliek op Microsoft Word, die stukkies kom van die hardeskyf. Hulle raak gelaai in RAM. En ons sal stoot hulle tot op die heel boonste van hierdie reghoek konseptueel. Wel, die res van jou geheue is gebruik vir verskillende dinge. Op die heel boonste jy sien inisialiseer data en uninitialize data. Dit het te doen, vir die grootste deel, met konstantes of globale veranderlikes wat waardes. Maar meer op die ander tyd. Dan moet jy die hoop, wat Ons kom terug na. Maar aan die onderkant is die deel wat veral nou related. Dit is die sogenaamde stapel. So net soos in die meeste 'n D saal hier op kampus, moet jy die bak wat net stapel op die top van mekaar waarop jy kan sit kos en noem maar op. Die stapel in 'n rekenaarstelsel is baie soortgelyk. Behalwe dat die skinkbord, as ons gebruik in die eetsaal, natuurlik, is bedoel om dinge op die bak of die rame - as ons bel hulle - in 'n rekenaar geheue gebruik word om vas te hou veranderlikes en waardes. So, wat gaan regtig op onder die enjinkap? Wel, laat ek flip oor na die skerm hier. En laat ons fokus net op die onderste deel vir 'n oomblik. As dit is die onderste gedeelte van my rekenaar se geheue dit blyk toe ek noem die funksie hoof - wat gebeur, eerlik, outomaties vir my - Ek kry 'n stuk van die geheue op die onderkant van my RAM so te praat. En dit is waar die hoof is plaaslike veranderlikes te gaan. Dit is waar argc en bevat SPASIES miskien gaan, en enige veranderlikes ek verklaar binnekant van die belangrikste. Het hulle uiteindelik aan die onderkant van my rekenaar se geheue. Nou veronderstel dat hoof oproepe 'n funksie soos ruil, soos dit gedoen het die afgelope week? Wel, ons in wese 'n nuwe skinkbord, 'n nuwe raam, op my deel van die geheue. En ek gaan om dit te beskryf wat deel uitmaak van die ruil-funksie. Nou wat binne in ruil? Wel, gebaseer op verlede week se program en die een wat ons net 'n uittreksel uit gesien het, binnekant van ruil se raam, of ruil se skinkbord, is wat veranderlikes? Wel, a en b. Want dit was in die plaaslike argumente, plus 'n derde, tmp. So regtig, ek kon trek hierdie 'n bietjie meer skoon. Laat my gaan voort en ongedaan te maak die etiket. En laat my daarop aanspraak maak dat jy weet wat? 'n is waarskynlik gaan om te eindig hier. B gaan eindig hier. En tmp gaan eindig hier. Nou, die bestel mag 'n bietjie anders. Maar konseptueel dit is die idee. En net gesamentlik, dit is wat ons sal ruil se raam noem, of eetsaal skinkbord. En dieselfde deal met die hoof. Maar ek sal nie teken nie. Maar dit is waar argc en bevat SPASIES en enige van sy plaaslike veranderlikes soos x en y kan net so goed wees. So nou oorweeg wat regtig gebeur wanneer jy bel ruil. Wanneer jy bel ruil, uitvoering kode soos hierdie, is jy verby in, in die karretjie weergawe, A en B as afskrifte van x en y. So as ek trek nou nie hierdie op die skerm - gekry het om beter op hierdie - So het die storie wat ek vertel het om myself was in hierdie karretjie weergawe, wanneer ons noem ruil verby in letterlik a en b as heelgetalle, wat regtig gebeur? Wel, wat regtig gebeur is dit. Laat my gaan voort en ongedaan te maak net skoon te maak 'n paar ruimte hier. So dit is my rekenaar se geheue. So as ek, byvoorbeeld - eintlik Kom ons doen dit op hierdie manier - As ek beweer dat dit is x, stoor die waarde 1 Net soos verlede week. En dit is y, die stoor van die waarde 2 Net soos verlede week. En dit is die belangrikste, as ek roep, ruil, sodoende myself en toegang tot 'n b en tmp, ek gaan om te eis dit is 'n en dit is 1. Dit is b. Dit is 2. Dit is die sogenaamde tmp. En aanvanklik, dit het 'n gemors waarde totdat ek eintlik stoor in dit 'n, wat is 1. Toe het ek gaan voort en verander om 'n wat? B se waarde. En so nou het ek twee hier. En dan het ons gesê b kry tmp. Weer, net soos 'n gesonde verstand kyk, die derde reël van die kode hier is eenvoudig dit een, b kry tmp. En so laastens, wat doen ek? Ek gaan voort en verander b te wees wat die waarde van tmp is, wat is 1. Ek raak nie tmp weer. Maar nou is die probleem so gou as omruil opbrengste, want dit is nie uitdeel terug 'n bietjie waarde, is daar geen terugkeer verklaring uitdruklik in dit. Wat eintlik gebeur? Wel, in wese al die geheue - OK, blykbaar die uitveër hou net een vinger op 'n tyd - net verdwyn. Nou in werklikheid is dit nie iewers heen gaan. Maar jy kan dink dit nou as vraagtekens. Want dit is nie meer eintlik in gebruik. En niks word gedoen met daardie waardes. So in die geval van die groen weergawe van hierdie kode is wat in plaas om geslaag het in ruil? So spreek. So het die adres van x en die adres van y. So as ons hierdie storie 'n laaste her-vertel tyd, en ek eintlik trek ruil weer maar met wysers, dit is 'n, hierdie om b, en dit word tmp, wat eintlik gestoor in 'n in hierdie groen weergawe van my kode waar ek verby in adresse? Dit gaan 'n verwysing na x wees. So ek kan trek 'n pyl. Maar laat ons gebruik dieselfde arbitrêre byvoorbeeld as tevore. Kom ons sê dat dit iets soos Ox123. En dit gaan wees Ox127 omdat dit is vier grepe weg, want dit is 'n int, so Ox127. En weer, ek neem 'n paar vryhede met die nommers. Hulle is baie kleiner as wat hulle sou eintlik wees en in 'n ander orde. Maar dit is hoe die prentjie is nou anders. Maar toe ek die gebruik van hierdie groen-kode en ek kry int tmp nie * n. * 'N manier om die volgende te doen, neem die spreek dit is in 'n en gaan na dit, wat is 1. En dit is wat ek dan in tmp. Intussen, in die volgende lyn van die kode hier, * 'n kry b, wat beteken dit? Wel, * a, so hier gaan kry * b, wat beteken daar gaan. En dit beteken het die waarde daar. Ten slotte, die laaste reël van die kode eenvoudig sê * b kry tmp. So b sê daar gaan oorskryf met tmp wat, in hierdie geval, gaan te wees, weer, 1. En dit is die rede waarom die groen weergawe van ons kode werke, terwyl die rooi weergawe nooit gedoen het nie. Dit het alles net neer op hoe die geheue bestuur word en waar dit eintlik geplaas in jou rekenaar se geheue. En vir nou, dit is een van die dinge wat dat die stapel is wat gebruik word vir. Vrae oor die uitleg? Op riglyne? Of ruil? Alle reg, so malloc, herroep, het iets soos hierdie. Dit was 'n super eenvoudige voorbeeld. En dit was die een wat Binky ingestel om ons te, al is dit heel vinnig aan die einde van die klas. Sjoe, daar gaan ons weer. So onthou dat dit was die voorbeeld wat Binky ingestel om ons te, al is dit ietwat vinnig aan die einde van die klas. En hier is ons gebruik malloc regtig vir die tweede keer. Omdat die eerste keer wat ons gebruik het om dit te skep genoeg geheue toeken genoeg RAM 'n string te stoor. Hierdie tyd Binky het dit eenvoudig. So dit is net stoor 'n int, blykbaar. En dit is heeltemal fyn. Dit is 'n bietjie vreemd, eerlik, te gebruik malloc een int toe te ken. Maar die punt van Nick se Claymation was eintlik net die storie vertel van wat gebeur of nie gebeur wanneer jy mishandel geheue. So in hierdie geval, is hierdie program het 'n paar dinge. In die eerste geval is hier, dit verklaar 'n wyser genoem x na 'n int. Dit verklaar dan 'n wyser genoem y na 'n int. Dit slaan dan in x, wat? Iemand anders nou. Wat kry gestoor in x volgens die derde reël van hierdie program? GEHOOR: [onhoorbaar]. Spreker 1: Wel, nie heeltemal grepe, per sê. Meer presies te wees nou. Wat kry gestoor in x? 'N adres, ek dink ek het dit gehoor. So wat beteken malloc terugkeer? malloc behaviorally ken 'n stuk van die geheue. Maar hoe kry jy toegang tot dit? Dit gee wat? Die adres van die eerste byte in die deel van die geheue. Nou, dit is super eenvoudig. Dit is net een byte, wat beteken dat die spreek ons ​​terug kry is die adres van die hele ding. So gestoor in x dan is die adres van daardie deel van die geheue. Intussen, wat gebeur volgende? So eintlik, laat ons gaan voort en trek dit uit ware vinnig. So as ons gaan oor na die skerm hier en ons speel dit uit int * x en y int * gaan wat om te doen vir my? Ek beweer dat dit net gaan om te doen iets soos hierdie en noem dit x, en hierdie en noem dit y. Intussen het die derde reël van die kode is gaan die grootte van 'n int te ken, wat gebeur om te wees - jammer as ek sê een voor ek bedoel een int - vier grepe op 'n tipiese rekenaar. Ten minste met die CS50 toestel. So dit gaan om te wys dit, wie weet? Iewers hier. En dit gestoor word op 'n sekere adres Os, wie weet? Maar wat gaan kry terug is dat adres. Maar ons sal trek hierdie picturaal as net 'n pyl soos dit. Nou in die volgende lyn * x kry 42. Wat beteken * x beteken in leketaal? Gaan net daar. Gaan na daardie adres. Of in ander woorde, volg die pyl en sit 42 daar. Maar dan is daar iets sleg gebeur te Binky, reg? Onthou dat die lyn vyf hier, * y kry 13, inderdaad 'n ongelukkige nommer, gedoen het wat vir ons? Wel, * y beteken daar gaan. Wel, het dit nie gegee 'n waarde nie, reg? Die kode het nie y om geïnisialiseer na iets. Ons het x word geïnisialiseer na 'n adres. Maar y verklaar is tot bo-op. Maar dan moet 'n kommapunt, geen waarde is eintlik sit in dit. So dit is regverdig om dit te noem 'n gemors waarde. Wie weet wat is daar? Dit is die oorblyfsels van die stukkies wat gebruik is deur 'n paar vorige lyn van die kode in my program. So as ek sê daar gaan, dit is soos, Ek het geen idee waar hierdie pyl gaan aan die einde. En dit is wanneer jy gewoonlik kry 'n segmentering skuld. Indien jy per ongeluk dereference, so te praat, of gaan na 'n adres wat nie eintlik 'n wettige adres, slegte dinge gebeur. En dit is presies wat gebeur het Binky te dink. So onthou dat die storie wat Nick was vertel hier was dieselfde idee as wat Ek het getrek met die illusie van kryt op die bord is daar. X en Y is verklaar. Daarna het ons toegeken is die grootte van 'n int en bewaar dit in x. Toe het die volgende lyn wat ons gedoen het * x. Dit was Nick se towerstaffie van ontwysing. Dit het 42 in die geheue uitgewys deur x. Maar dit is hier waar dinge skeefgeloop het. Reg? Ons het probeer om dereference y. Maar y het 'n paar valse waarde, reg? Dit pyl in die onderste linker-hand draai, is dit nie eintlik verwys na iets. Dit is soort van doen wat ek het hier op die bord. So slegte dinge gebeur, segmentering skuld, of Binky skuld, in hierdie geval. Maar as ons dan los dat deur dit te doen x kry y hoe die storie verander? Wel, as ek doen x y kry, wat effektief dieselfde as om te sê wat ook al dit is, bees-iets gaan dieselfde wees hier, Bees-iets. Of picturaal ons sal trek 'n pyl. So hier op die bord met Binky, met die volgende lyn van kode, * y beteken daar gaan. Waar is daar? Dit beteken hier. En wanneer ons werk wat om te wees 13 dit behels net gaan en skryf 13 nou hier. So miskien nie heeltemal eenvoudig op die eerste oogopslag. Maar om te vat en dieselfde jargon te gebruik dat Binky is hier gebruik, so die eerste twee ken die wysers, x en y, maar nie die pointees. En pointees is nie 'n algemeen gebruikte term. Maar wyser is absoluut. Maar dit is wat daar gewys by in Binky se naam. Hierdie volgende reël, natuurlik, ken 'n int pointee. So 'n stuk van die geheue - as ek het oor op die regterkant is daar - en stel x gelyk te wys om dit te. Dit dereferences x 42 te slaan in die geheue wat dit is wys. En dan is dit natuurlik was 'n slegte ding nie. Omdat y is nie wys aan enigiets nie. Dit is vasgestel nie. So, dit is nog steeds karretjie program. Net omdat ons waai deur die kode reël vir reël en gesê: Ag wel, laat dit crash daar. Dit is 'n slegte ding nie. Kans is die program net gaan aborteer geheel en al op die lyn. Maar as jy was om te verwyder die ongeluk reël en vervang dit met die laaste twee lyne is daar wat jy ken - gebruik wyser opdrag - y om aan te dui x as punt t. En dan moet jy dereference y in 'n baie veilige manier. So waar laat dit ons? Wel, blyk dit dat onder die enjinkap in die CS50 biblioteek, wysers is deurgaans gebruik. En ons sal eintlik begin om te skil terug wat laag voor lank. Maar dit blyk ook 'n uitdrukking wat sommige van julle dalk bekend wees met, veral diegene wat meer gemaklik, is eintlik dié van 'n baie gewilde webwerf, of Stapeloorvloei, hierdie dae. Maar dit het eintlik baie tegniese betekenis. Ons weet nou wat 'n stapel is. Dit is soos 'n stapel van bak binnekant van 'n eetsaal. Of binnekant van jou rekenaar se geheue sy diegene rame wat gebruik word deur funksies. Wel, dit blyk dat as gevolg van daardie baie eenvoudige implementering van geheue en die rame op die sogenaamde stapel, kan jy eintlik beheer neem van 'n rekenaarstelsel redelik maklik. Jy kan hack in 'n stelsel as mense soos ons het nie geskryf nie ons kode besonder goed. As mense soos ons gebruik om stukke van die geheue of die gebruik skikkings - selfs meer algemeen - maar soms vergeet van die om te kyk grense van ons verskeidenheid as jy dalk jouself soms en herhaalde manier om te ver verby die einde 'n skikking. In die beste geval, jou program mag dalk net crash. Segmentering skuld, soort van verleentheid. Nie groot nie, maar dit is nie noodwendig 'n baie slegte ding. Maar as jou program is eintlik op 'n ware gebruikers se rekenaars, as dit is wat uitgevoer op 'n webwerf wat die werklike ewekansige mense op die internet is slaan, laat mense veroorsaak slegte dinge op jou kode is oor die algemeen nie 'n goeie ding, want beteken dit 'n geleentheid om te neem beheer van die rekenaar. En dit gaan om te kyk 'n bietjie kripties. Maar ek het gedink ek wil bang met hierdie laaste voorbeeld hier. Hier is 'n voorbeeld van die kode. En daar is 'n goeie Wikipedia artikel wat loop deur dit in meer detail. Ek het groot aan die onderkant roeping cat, verby in bevat SPASIES van 1. En dit is net sodat jy kan hardloop die program en slaag 'n arbitrêre insette. En dan cat verklaar word tot bo as die aanvaarding van 'n string, of meer presies, 'n char *. Dit verklaar dan 'n verskeidenheid van karakters. Noem dit 'n buffer, meer in die algemeen, van grootte 12. So 12 karakters kan pas binne van die skikking met die naam c. En dan is dit gebruik maak van hierdie nuwe funksie, wat is 'n nuwe, maar nie moeilik om te verstaan, geheue kopie. Dit afskrifte van die geheue van die bar, wat die veranderlike afgelope n, wat ook al die gebruiker getik in 1 bevat SPASIES in c. Hoeveel grepe? Die string lengte van bar. So met ander woorde, indien die gebruiker in h-e-l-l-o betree, die string lengte van hallo is vyf. So vyf van dié grepe gaan kry gekopieer na die skikking met die naam c, wat is van grootte 12. Maar wat die gebruiker in 'n baie langer woord wat is 13 karakters of 14 karakters of 100 karakters of meer? Waar gaan hulle om te gaan? Wel, dit raam, wat skinkbord in die eetsaal stapel, hulle gaan om daar te gaan. En dit is net gaan om te begin vervang ander dinge wat reeds op die stapel, oorloop die stapel, om so te spreek. So picturaal, dink dit op hierdie manier. Dit is net 'n kleurvolle weergawe van die prentjie het ons teken. Aan die onderkant, kom ons sê, is die vernaamste. En op die top, wat jy nou sien is die raam, kleurgekodeerde nou, vir 'n funksie genoem cat. Maar wat interessant is hier oor cat is dat hier is sy raam. So dit is getrek, net soos ek gedoen het, maar in die lig blou. En nou is dit is waar c bracket 0 gaan. En dit is waar c bracket 11 gaan beland. Met ander woorde, dit gebeur met verteenwoordig te word as 'n vierkant. Maar as jy net aanhou plop grepe af - of karakters - hulle gaan aan die einde tot by die plek 0 al die pad tot tot 11 want dit is 0 kruip. Maar waar is die 13de karakter gaan aan die einde? Waar is die 14de? Waar is die 50 karakter gaan aan die einde? Dit is die gang te hou om af te gaan. Want selfs al het ons getrek word om die prentjie met die stapel grootword, die adresse, dit blyk, gaan uit klein adresse, klein wysers, tot groot adresse. So hou dit net gaan op en op. Dus, as die gebruiker in hallo, dit is groot. Geen fout, geen probleem, almal se kluis. Maar as die gebruiker in wat ons sal noem opponerende kode, verteenwoordig generies as 'n, aanval, aanval, aanval, aanval, wat kan gebeur? Wel, as al die insette wat die gebruiker getik in is nie net 'n vriendelike of beledigende string van die karakters. Dit is eintlik 'n reeks van karakters dat as jy saamgestel het, dit is eintlik kode. Miskien is dit kode wat verwyder al die lêers op jou hardeskyf of stuur spam of iets soos dit. Let daarop dat wat is die sleutel hier is dat Indien die slegte ou het gelukkig genoeg is om te vervang die rooi deel van die geheue - wat ek nie trek op my foto, maar hierdie Wikipedia prentjie hier het - sy sogenaamde terugkeer adres. Wanneer kos opbrengste, toe ruil opbrengste, hoe weet die rekenaar om te gaan uit hier af hier? Of in die tegnologie segment bo, hoe beteken dit weet om te gaan van die ruil kode - die 0's en 1 se waaruit ruil - Terug na die hoof? Daar is 'n sogenaamde terugkeer adres gestoor in dieselfde stapel raam, op dieselfde kafeteria skinkbord. Dus, as die slegte ou is slim genoeg om te sit aanval kode, aanval kode, aanval kode, en kry gelukkig genoeg - dikwels deur middel van verhoor en fout - te oor skryf dat die rooi adres, met die adres en kennisgewing die heel boonste. Kennisgewing 0835C080. Dit is geskryf agteruit tot bo vir redes sal ons dalk heroorweeg. Dit is dat die getal. So as die slegte man kry gelukkig genoeg is of is slim genoeg om die rooi te vervang strook van die geheue met die adres van kode wat hy of sy een of ander manier het ingespuit in jou rekenaar, raai wie se kode gaan word teruggekeer na sodra cat gedoen uitvoering? Die slegte ou se kode. So hierdie aanval kode, AAA, weer, dalk stuur spam, kan verwyder al die lêers op jou hardeskyf. Maar dit is wat werklik 'n Stapeloorvloei is, of 'n Bufferschrijding, of 'n buffer oorloop aanval. En dit is ongelooflik, ongelooflik algemene tot hierdie dag saam met programme wat geskryf is in C, C + +, en selfs 'n paar ander tale. Op daardie vreesaanjaende noot, ons sal eindig met 'n grap. [Gelag] Sien julle op Woensdag. By die volgende CS50 - So ek is al uit skyf lampe vandag nie, maar wag, vet-vrye melk, die helfte van die telefoon boek, die oranje sap dat ek gedrink het vandag. USB kabel, 'n sleutel. [Speel van musiek]