>> [Muziek]
DAVID J. MALAN: Oke.
Dit is CS50, en dit het einde van week vier.
En een van de onderwerpen van vandaag is dat van digitale recherche,
de kunst van het herstellen van gegevens.
Inderdaad, hoewel je bent in het midden
op dit moment van de Vrede bij Drie en Breakout, volgende week,
de nadruk zal liggen op Juist dit domein.
>> Dus een van de coolste banen die ik ooit hadden was terug in de graduate school,
toen ik werkte voor de lokale Middlesex County District Attorney's
kantoor, het doen van forensisch werk.
Dus in wezen, het Massachusetts State Police, bij gelegenheid,
bij het werken aan de gevallen zou brengen in dingen als harde schijven
en diskettes en geheugenkaarten en dergelijke.
En ze zouden hen overhandigen voor mij en mijn mentor,
en ons doel was om bewijs te vinden, of er een, op deze media.
Nu, zou je gezien hebben glimpen van deze wereld van forensisch onderzoek
in de media, televisie en films.
Maar de baan die ik had, en durf te stellen dat de wereld,
is niet helemaal zoals je het zou zien.
Laten we eens kijken naar wat je waarschijnlijk hebt gezien.
[VIDEO AFSPELEN]
-OK.
Nu, laten we eens goed naar je.
>> [Muziek]
>> Wacht even het.
Lopen dat terug.
>> Wacht even.
Ga naar rechts.
-Er.
Bevriezen dat.
-Full-Scherm.
>> -OK.
Bevriezen dat.
-Tighten Op dat, wil je?
>> -vector In op die man door het achterwiel.
>> -ZOOM In hier op deze plek.
>> -Met De juiste apparatuur, het afbeelding kan worden vergroot en verscherpt.
>> Wat is dat?
>> -Het is een verbetering programma.
>> Kun je duidelijk dat je geen?
>> Ik weet het niet.
Laten we verbeteren het.
>> -Verbeter Sectie A6.
Ik verbeterde het detail, en--
Ik denk dat er genoeg te verbeteren.
Los om mijn scherm.
>> Ik verbeterde de bezinning in haar ogen.
-Laten Deze lopen door video enhancement.
>> -Edgar, Kunt u dit verbeteren?
>> -Hang Op.
>> -Ik Gewerkt aan deze reflectie.
>> Reflectie -Er's van iemand.
>> -Reflection.
-Er is een weerspiegeling van de man gezicht.
>> -het Reflectie!
-Er is een reflectie.
-ZOOM In op de spiegel.
U kunt een reflectie zien.
>> Kun je het beeld te verbeteren van hier?
Kun je het te verbeteren?
Kunnen we dit verbeteren?
Kun je het te verbeteren?
Wacht even op een tweede.
Ik zal verbeteren.
-ZOOM In de deur.
-maal 10.
-zoom.
-Verplaatsen In.
-Meer.
Wacht, stop.
-stop.
-PAUSE Het.
-Draai Ons 75 graden rond de verticale, alstublieft.
>> -stop.
Ga terug naar de kant de deur weer.
>> Hebbes een beeld enhancer die kan bitmap?
>> Misschien hebben we de Pradeep Singh kan gebruiken Werkwijze om in de ramen.
>> -De Software is state of the art.
>> -De Eigenwaarde is uitgeschakeld.
>> -Met De juiste combinatie van algorithms--
>> Hij is genomen verlichting algoritmen naar het volgende niveau,
en ik kan ze gebruiken om versterken deze foto.
>> Lock op en vergroten de z-as.
>> -Verbeter.
Verbeteren.
-Verbeter.
-Freeze En verbeteren.
[END VIDEO AFSPELEN]
DAVID J. MALAN: Dus dat zijn alle woorden, maar ze waren niet
toegepast in zinnen correct.
En inderdaad in de toekomst op elk ogenblik alsjeblieft, hoor je iemand zeggen dat het woord,
"Verbeteren", grinniken maar een klein beetje.
Want als je probeert te verbeteren, Zo, dit is wat er gebeurt.
>> Dus hier is een prachtige foto.
Dit is eigen Daven CS50's.
En stel dat we wilden focussen op de twinkeling in zijn ogen,
of de reflectie van de slechte kerel die duidelijk was
gevangen door de bewakingscamera.
Dit is wat er gebeurt als je inzoomen op een beeld dat
slechts een eindig aantal bits verbonden.
>> Dat is wat je zou krijgen.
En inderdaad, in het oog van Daven's is maar vier, misschien zes pixels
dat componeren precies wat werd er glimmende.
Dus Probleemverzameling Vier zal uiteindelijk u deze wereld te verkennen, met name
door de aard van iets wij noemen file i / o, waar
i / o is gewoon een mooie manier om zeggen input en output.
>> Tot nu toe zijn alle interacties we met een computer hebt gehad
grotendeels lid van de toetsenbord en het scherm,
maar niet zo veel met de harde schijf, of opslaan van bestanden buiten de degene die je
zelf schrijven.
Uw programma's tot nu toe hebben niet is het creëren en opslaan,
en updaten van hun eigen bestanden.
>> Nou, wat is een bestand?
Nou, zoiets als een JPEG.
Dit is een afbeelding die je misschien hebben of uploaden naar Facebook,
of zie overal op het web.
Inderdaad, die foto hebben we net zaag van Daven was een JPEG.
En wat interessant over bestanden als JPEG
is dat zij kunnen worden geïdentificeerd typisch, door bepaalde bitpatronen.
>> Met andere woorden, wat is het dat onderscheidt een JPEG van een GIF
van een PING uit een Word- document uit een Excel-bestand?
Nou, het is gewoon anders bitpatronen.
En die verschillende patronen zijn meestal aan het begin van deze bestanden.
>> Zodat wanneer uw computer opent een Word doc, of wanneer een computer opent een JPEG,
lijkt typisch bij de eerste paar bits in het bestand.
En als het herkent een patroon, het zegt, oh, dit is een beeld.
Laat me weer aan de gebruiker als grafisch.
Of, oh, dit ziet eruit als een Word-doc.
Laat me laten zien aan de gebruiker als een essay.
>> Dus bijvoorbeeld, JPEG, het blijkt, zijn
vrij gesofisticeerde onder de motorkap.
Maar de eerste drie bytes elkste JPEG u volgende drie cijfers.
Dus byte nul, een, en twee, in de meeste elke JPEG, 255, dan is het aantal
216, dan is het nummer 255.
>> En wat je zult in staat zijn te gaan doen volgende week
is eigenlijk eronder porren de motorkap van bestanden zoals JPEG
en als bitmap-bestanden, en het zien van wat is er altijd voor zo lang
als je met behulp van een computer geweest.
>> Maar wat is er meestal niet geschreven als decimale getallen als deze.
Informatici niet hebben de neiging in decimalen te spreken.
Ze niet echt in binaire spreken.
Typisch, als we willen om cijfers uit te drukken,
we eigenlijk gebruiken hexadecimale, die u zich wellicht herinnert
van, zeg, Probleemverzameling Een, die uitgedaagd
u na te denken over een ander systeem.
>> We natuurlijk vertrouwd met decimaal, nul tot negen.
We spraken over binary.
En we hebben niet echt veel here gebruiken
op uit, want computers zullen gebruiken.
Maar programmeurs zal zeer Vaak, maar niet altijd,
Gebruik hexadecimaal, wat betekent gewoon je hebt 16 letters in je alfabet,
in plaats van twee of 10.
>> Dus hoe kan je tellen tot hogere dan negen in hexadecimale?
Ga 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, alleen volgens afspraak.
Maar wat is belangrijk is dat elke Deze is een symbool.
Er is geen 10.
Er is geen 11, per se, omdat elke van uw cijfers, net als in decimale
en net als in binaire, moet gewoon zijn een enkel teken, volgens afspraak.
>> Dat is dan het alfabet we tot onze beschikking voor hexadecimaal.
Dus wat doet een JPEG eruit als je waren uit te schrijven die eerste drie
bytes niet als decimale maar bijvoorbeeld hexadecimaal?
En waarom is hex al wat nuttig?
>> Nou ja, een snelle blik op een voorbeeld.
Dus als ik schrijf uit de bits die vertegenwoordigen deze decimaal numbers--
Dit is misschien een beetje roestig zijn nu van een paar weken terug,
maar de linker en juiste zijn vrij gemakkelijk.
255 was het grootste aantal dat we kunnen vertegenwoordigen met acht bits.
Het was allemaal enen.
Dus het enige dat is mild Interessanter is de middelste.
En als je soort te doen uit de wiskunde, zal je afleiden dat, inderdaad,
dat patroon van een en nullen vertegenwoordigt 216.
Dus laten we gewoon bepalen voor nu dat deze correct zijn.
Maar waarom is dit interessant?
>> Welnu, een byte, uiteraard is acht bits.
En het blijkt dat als je denkt een byte twee stukjes vier bits,
als deze.
Laat me even wat ruimte toe te voegen.
Dus voordat na.
Ik heb net wat witte ruimte toegevoegd omwille hier visualisatie's.
Hoe kunnen wij nu vertegenwoordigen, zeg, hexadecimale elke quad bits,
elk stel van vier bits?
>> Dus bijvoorbeeld links nu hebben we 1111 in binaire.
Wat is dat nummer in decimale, als je uit de wiskunde?
Je hebt degenen die plek, de tweeën plaats, de fours plaats, en de achten plaats.
>> Publiek: 15.
DAVID J. MALAN: Het is 15.
Dus als we acht plus vier plus twee plus een, krijgen we 15.
Dus ik kon beneden schrijven 15 1111, maar het hele punt here
is hexadecimaal, niet decimaal.
Dus in plaats van naar beneden te schrijven 15, 1-5, Ik ga om te schrijven dat in hex,
die, als je terugdenkt, als je nul tot en met f, wat 15 gaat worden?
PUBLIEK: f.
DAVID J. MALAN: Zo blijkt uit het is f.
En je kunt werken dat uit door te zeggen, goed, als er een is 10, dan OK, f 15.
Dus inderdaad, we kunnen herschrijven dezelfde reeks nummers f f.
En dan, als we een beetje van wiskunde, we afleiden dat dat d.
Acht is vrij eenvoudig, omdat we een een op de achten plaats.
En dan hebben we nog een paar f f's.
>> Dus wat mensen hebben de neiging om te doen volgens afspraak wanneer zij gebruik maken van hexadecimale is ze gewoon
schrijf dit een beetje kort en bondig, zich te ontdoen van de meeste van die witte ruimte.
En alleen maar om super duidelijk te zijn lezers dat dit hexadecimale,
de eenvoudige conventie onder mensen wordt je schrijft nul
x, die geen andere betekenis heeft dan een visuele identificatie van,
hier komt een hexadecimaal getal.
>> En dan zet je de twee cijfers, f f in dit geval, dan d een, dan is f f.
Zo lang verhaal kort, hexadecimale gewoon de neiging
nuttig zijn omdat elk van de cijfers, nul tot en met f, perfect lijnen
met een patroon van vier bits.
>> Dus als je twee hexadecimale cijfers, nul tot en met F, opnieuw en opnieuw,
dat geeft je perfect acht bits of een byte.
Dus dat is de reden waarom het de neiging om zijn gewoonlijk nuttig.
Er is geen intellectuele inhoud echt verder dan dat,
andere dan de werkelijke nut.
>> Nu JPEG's zijn niet de enige bestandsformaten voor afbeeldingen.
U herinnert zich nog wel dat er bestanden als dit in de wereld,
althans van een paar jaar terug.
>> Dus dit was eigenlijk in Windows XP geïnstalleerd
op miljoenen pc's over de hele wereld.
En dit was een bitmap-bestand, BMP.
En een bitmap-bestand, zoals u zult zien krijgen week, betekent gewoon een patroon van punten,
pixels als ze worden opgeroepen, een kaart op beetjes, echt.
>> Dus wat is interessant, hoewel, over dit bestandsformaat, BMP, is
dat onder de motorkap, het meer dan drie bytes
die samen de header, dus te spreken, de eerste paar happen.
Het ziet er eigenlijk een beetje ingewikkeld op het eerste gezicht.
En je zult dit zien in de P set.
En het krijgen van iets bijzondere van deze nu
is niet zo belangrijk, omdat alleen het feit dat aan het begin van elk bitmap
bestand, een grafisch formaat, er is een hele hoop nummers.
>> Nu Microsoft, de auteur van dit formaat,
neigt deze bellen dingen niet ints en chars
en praalwagens maar woorden en d woorden en verlangt en bytes.
Dus ze zijn gewoon verschillende soorten data.
Ze zijn verschillende namen voor hetzelfde ding.
Maar je zult zien dat er in P Set Four.
>> Maar dit is slechts zeggen dat als een menselijke dubbelklikt op een aantal BMP-bestand op zijn
of haar harde schijf, en een venster opent up hem of haar dat beeld blijkt,
dat gebeurde omdat de operationele systeem waarschijnlijk gemerkt niet alleen
het BMP-bestand extensie in de bestandsnaam,
maar ook het feit dat er een aantal conventie om het patroon van stukjes
aan het begin van die bitmap-bestand.
>> Maar laten we nu focussen op zo'n ingewikkeld bestand,
maar in plaats daarvan op iets als dit.
Stel hier in GEdit, I alleen maar het begin
van een programma dat is vrij simpel.
Ik heb een aantal omvat boven.
Nu heb ik # include "structs.h", maar Ik ga terug naar die komen in een moment.
Maar dit is handig voor nu.
Dit is een programma dat gaat implementeren
zoals de database van de registrar.
Dus een database van studenten, en elke student in de wereld
heeft een naam en een huis en waarschijnlijk ook enkele andere dingen, maar we zullen het simpel houden.
Iedere student heeft een naam en een huis.
>> Dus als ik wilde een schrijven programma waarvan het doel in het leven
was gewoon te herhalen uit nul op maximaal drie,
als er drie studenten aan de Harvard University.
En ik wil gewoon te krijgen, met behulp van GetString, naam van elke student en huis,
en dan gewoon af te drukken die uit.
>> Dit is een soort als Week One, Week Twee dingen nu,
waar ik wil gewoon een voor lus of iets dergelijks.
En ik wil GetString een paar noemen keer, en vervolgens afdrukken f een paar keer.
Dus hoe zou ik dit doen, hoewel, wanneer zowel een naam en een huis
betrokken zijn voor elke leerling?
>> Dus mijn eerste instinct zou zijn om zoiets te doen.
Ik zou eerst zeggen, nou, geef me, zeggen, een array van strings uitgescholden.
En ik wil niet dat een hardcode drie hier.
Wat wil ik daar te zetten?
Zodat studenten, want dat is gewoon een constante aangegeven bovenaan,
zodat ik niet hoeft te hardcoden drie op meerdere plaatsen.
Op deze manier kan ik het veranderen een plaats, en dat een wijziging van invloed overal.
En dan zou ik doen reeks studenten gehuisvest.
>> En nu, ik zou zoiets doen for (int i = 0; i <STUDENTEN; ik ++.
Dus ik typ snel, maar dit is waarschijnlijk bekend syntax nu.
>> En nu, dit was meer recente.
Als ik zoek in de ie gezet naam van de student, ik denk dat ik dit doe.
En dan, geen namen maar huizen beugel i.
Ik doe dit, GetString, en laat me terug te gaan en bevestig deze lijn.
Eens?
Oneens?
Het is niet erg gebruiksvriendelijk.
Ik heb niet de gebruiker wat te doen horen.
>> Maar nu, als ik ook wilde later, laten we
zeg, printen deze dingen out-- dus TODO later.
Ik ga verder met doen dit-- dit misschien wel wil
een correcte uitvoering van de het krijgen van namen en huizen, drie
daarvan totaal van elk van een gebruiker.
>> Maar dit is niet erg goed ontwerp, toch?
Wat als een student heeft niet alleen een naam en een huis, maar ook een ID-nummer,
en een telefoonnummer, en een e-mailadres,
en misschien een home page, en misschien een Twitter handvat,
en een willekeurig aantal andere details gekoppeld aan een student of een persoon,
meer in het algemeen.
Hoe zouden we beginnen te voegen functionaliteit om dit programma?
>> Nou, ik voel me als de eenvoudigste manier zou zijn om zoiets te doen, laten we zeggen,
int ids STUDENTEN.
Dus ik kan al hun ID's daar te zetten.
En dan, iets zoals telefoonnummers,
Ik ben niet zeker hoe om te vertegenwoordigen dat gewoon nog niet.
Dus laten we verder gaan en gewoon bellen Dit twittert STUDENTEN, die
is een beetje vreemd, maar-- en een hoop meer velden.
>> Ik ben begonnen om effectief kopiëren en plakken hier.
En dit gaat behoorlijk groeien vrij snel logge, toch?
Zou het niet mooi zijn als er bekend in de wereld een datastructuur
niet als een int of een string, maar iets hoger, een abstractie, zodat
te spreken, die bekend staat als een student?
C kwam niet met ingebouwde functionaliteit voor studenten,
maar wat als ik wilde het zo geven?
>> Nou, het blijkt, ik ga het openen van een bestand structs.h hier genoemd,
en kunt u precies dat doen.
En we gaan beginnen dit nu te doen.
En onder de motorkap van P Set Drie, heb je al dit nu doet.
Er is niet zoiets als een g rect of een g ovale in de programmeertaal C.
>> Mensen van Stanford geïmplementeerd die typen gegevens door het gebruik van deze aanpak hier,
verklaren hun eigen nieuwe data typen met behulp van een nieuw zoekwoord
genoemd struct en andere een zogenaamde typedef.
Inderdaad, hoewel de syntax ziet er een beetje anders uit stuff
we al eerder gezien, in principe, het is super simpel.
>> Dit betekent gewoon "gedefinieerd type. '
Dat gaat om een ​​te zijn structuur en een structuur
is net als een container voor meerdere zaken.
En die structuur gaat naar een string genaamd naam hebben,
en een string genaamd huis.
En laten we zeggen, gewoon voor het gemak, dit hele datastructuur student.
>> Dus het moment dat je naar de puntkomma, je hebt nu
gemaakt van uw eigen gegevens soort genaamd student
dat nu staat naast int, en vlotter, en char, en touw,
en G rect en G ovaal en een afmeting van andere dingen die mensen hebben uitgevonden.
>> Dus wat is handig over dit nu is dat als ik terug te gaan
naar struct 0 en eindigen deze implementatie, die ik schreef
op voorhand hier, merken dat alle van de onvermijdelijke rommeligheid dat
stond op het punt om te beginnen gebeurt als ik toegevoegd telefoonnummers en twittert en alle
die andere dingen te een student's definitie,
nu is het bondig verpakt als slechts een scala aan studenten.
>> En elk van die studenten nu heeft meerdere dingen erin.
Dus dat laat alleen een vraag.
Hoe krijg je op de naam, en het huis, en de ID,
en wat anders is binnenkant van de student?
Super simpel, als goed.
Nieuwe syntaxis, maar een simpel idee.
>> Je gewoon index in de array, zoals wij deden vorige week en deze.
En wat is duidelijk de nieuw stuk van syntax?
Gewoon., Wat betekent "naar binnen gaan van de structuur en krijgt het gebied genaamd
naam, krijgt het veld met de naam huis, krijgen het veld genaamd student. "
>> Dus in P Set Drie, als je nog mee bezig,
en de meeste mensen nog steeds worden, beseffen dat als je
beginnen met dingen als g rects en g ovalen
en andere dingen die niet lijken te komen uit Week nul, een, of twee,
beseffen dat dat komt omdat Stanford een aantal nieuwe typen data verklaard.
>> En inderdaad, dat is precies wat we zullen doen, maar ook, in P Set Vier, wanneer
we beginnen om te gaan met dingen zoals afbeeldingen, bitmaps, en nog veel meer.
Dus dat is gewoon een teaser en een mentaal model voor wat er komen gaat.
Nu, ik procrastinated een beetje vanmorgen.
Ik was nogal nieuwsgierig om te zien wat Microsoft behang eigenlijk
ziet eruit als vandaag.
En het blijkt dat iemand in 2006 eigenlijk ging om bijna precies
dezelfde plek te fotograferen in werkelijkheid wat lijkt op dat deze dagen.
Het veld is nu een beetje overwoekerd.
>> Dus nu spreken van beelden, laten we terug te brengen Daven hier
op het scherm en Nicholas, en gewoon herinneren
dat als je wilt om met ons mee voor de lunch deze vrijdag, ga dan naar onze gebruikelijke URL
hier.
>> Dus waar hebben we laten staan ​​op maandag?
Introduceerden we dit probleem, toch?
Dit was schijnbaar een correct uitvoering van de swap,
waarbij u het nemen van twee integers, een met de naam van een, een zogenaamde b,
ze te verwisselen, net als Laura deed hier op het podium met de melk en het water,
door een tijdelijke variabele, of een lege beker,
zodat we in een b en een in kon zetten b zonder het maken van een puinhoop van dingen.
We gebruikten een variabele.
Het heet temp.
>> Maar wat was het fundamentele probleem met deze code op maandag?
Wat was het probleem hier?
Yeah.
>> Publiek: Het neemt meer ruimte in beslag.
>> DAVID J. MALAN: neemt meer ruimte, want ik ben met behulp van een variabele,
en dat is OK.
Dat is waar, maar ik ben gaan om te zeggen dat is OK.
Het is slechts 32 bits in het grand regeling van de dingen, dus geen big deal.
Andere gedachten?
Publiek: Het wisselt alleen de variabelen lokaal.
DAVID J. MALAN: Precies.
Het wisselt alleen de variabelen lokaal.
Omdat elke keer dat je belt een function-- toen ik de trays uit Annenberg
laatste keer, je hebt de belangrijkste op de bodem.
Zodra u een functie genaamd noemen swap, swap niet x en y te krijgen,
de oorspronkelijke waarden.
Wat doet swap get, hebben we beweren?
PUBLIEK: Exemplaren.
DAVID J. MALAN: Dus kopieën van hen.
Dus het wordt een en twee, als je herinneren aan het voorbeeld van de vorige keer,
maar een kopie van een en twee die met succes zijn verwisseld.
Maar helaas op het einde, deze waarden zijn nog steeds hetzelfde.
Dus we kunnen zien met onze nieuwe vriend, hopelijk GDB,
dat u of de TF's en Ca's hebben is je begeleiden in de richting van het volgende.
>> Dus geen swap recall lijkt like-- laten openstellen dit-- ziet er als volgt.
We geïnitialiseerd x om een, y tot twee.
Had een hoop druk f's.
Maar dan, de belangrijkste oproep hier was om te wisselen, wat
is precies de code we zag net een moment geleden.
Dat is juist op het eerste gezicht, maar functioneel,
Dit programma werkt niet, omdat het maakt niet permanent x en y wisselen.
>> Dus laten we dit zien, snel warm hier met GDB, een ./noswap.
Een bos van de overweldigende informatie die Ik zal ontdoen van met Control L te krijgen voor nu.
En nu, ik ga ga je gang en voer het uit.
En helaas, dat was niet bruikbaar.
Het liep het programma binnenkant van deze programma genaamd GDB, een debugger,
maar het liet me niet rond te snuffelen.
>> Dus hoe kan ik eigenlijk pauzeren uitvoering binnen dit programma?
Dus breken.
En ik kon breken op elke regelnummer, een, 10, 15.
Maar ik kan ook symbolisch breken door te zeggen pauze belangrijkste.
En dat gaat om een ​​pauze te stellen punt, blijkbaar op lijn 16 in de belangrijkste.
En waar is lijn 16?
Laten we gaan naar de code en gaan tot noswap.
En inderdaad, de stippellijn 16 is de allereerste in het programma.
>> Dus nu, als ik ga je gang en het type lopen deze keer, Enter, het gepauzeerd.
Dus laten we eens rond te snuffelen.
Print x-- waarom is x nul?
En negeren de dollar teken.
Dat is alleen voor liefhebber gebruik van het programma.
Waarom is x nul op dit moment?
Yeah.
>> Publiek: Het onderbroken vlak voor regel 16, niet echt op lijn 16.
DAVID J. MALAN: Precies.
GDB, standaard, heeft onderbroken uitvoering net voor lijn 16.
Dus het is niet uitgevoerd, wat betekent x is van een onbekende waarde.
En we hadden geluk dat het iets schoon als nul.
Dus nu als ik typ volgende, nu is uitgevoerd 16.
Het is me te wachten om uit te voeren 17.
Laat me gaan en druk op x.
Het is een.
Laat me gaan en druk y.
Wat moet ik nu?
>> PUBLIEK: [onverstaanbaar]
>> DAVID J. MALAN: Een beetje luider.
>> PUBLIEK: [onverstaanbaar]
DAVID J. MALAN: Niet helemaal een consensus.
Dus ja, we zien een aantal vuilnis waarde.
Nu, y 134514064 er.
Nou, het is gewoon een garbage waarde.
Mijn programma gebruikt RAM voor verschillende doeleinden.
Er zijn andere functies.
Andere mensen schreef in mijn computer.
Dus die stukken zijn gebruikt voor andere waarden, en wat ik zie
de resten van sommige eerder gebruik van dat geheugen.
>> Dus geen big deal, want zodra als ik typ volgende en vervolgens afdrukken y,
het is geïnitialiseerd op de waarde die ik wil.
Dus nu, laten we verder gaan een beetje sneller.
N voor de volgende.
Laten we het nog eens doen.
Maar ik wil niet te raken het hier, want als ik
willen zien wat er gaande is binnen swap, wat is de opdracht?
>> PUBLIEK: stappen.
>> DAVID J. MALAN: stappen.
Dus deze stappen me in een functie, in plaats van erover.
En nu, het is een beetje cryptisch eerlijk gezegd, maar dit is gewoon
vertelde me dat ik in lijn 33 nu.
En laten we dit opnieuw doen.
Print temp.
Garbage waarde, negatief deze keer, maar dat is gewoon nog steeds een vuilnisbak waarde.
Dus laten we nu doen, printen temp.
Het geïnitialiseerd op 1, waarbij was de waarde van x, aka een.
>> Nu, waar zijn onze a en x uit?
Nou, bericht in de belangrijkste, we noemde deze waarden x en y.
We vervolgens ze te wisselen volgende.
X kwam eerst, komma y.
En dan, swap kon noemen x en y.
Maar voor de duidelijkheid, het is noemde hen a en b.
Maar a en b zijn nu gaat worden afschriften van respectievelijk x en y.
>> Dus als ik ga terug naar GDB, temp is nu een en is nu een.
Maar als ik nu doen en nu doen afdrukken a, een al verplaatst.
De melk is in de voormalige gegoten glas sinaasappelsap is, of vice versa.
>> En als ik volgende keer doen, en nu als ik uitprinten als een sanity check,
Een nog twee, maar b is nu een.
Eerlijk gezegd, het is er nog steeds.
Kan me niet schelen wat temp is.
Maar zodra ik nu typ, laten we zeggen, blijven teruggaan, nu ben ik aan het einde
het programma.
En helaas, x is nog een en y nog twee.
>> Dus wat was het nut van GDB er?
Het hielp niet me te repareren het probleem per se,
maar hopelijk help me begrijpen door het realiseren van
dat ja, mijn logica is juist, maar mijn code is uiteindelijk niet hebben
een permanent effect.
Dus dat is een probleem dat we ga nu op te lossen vandaag.
>> Maar laten we er door middel van deze.
String is een leugen.
Het ook, niet een gegevenstype die bestaat in C. Het is
is een synoniem voor sommige tijd voor iets anders,
en we kunnen zien dat als volgt.
>> Laat me ga je gang en open een programma genaamd vergelijken-0.
En in plaats van te typen dit een uit, we beginnen te lopen door de code
Ik schreef al, maar het is slechts een paar regels.
Dus dit is te vergelijken-0.
En het eerste wat ik doe wordt steeds een regel tekst.
>> Maar let op wat ik ben doet voor de eerste keer.
Wat is er anders duidelijk over lijn 21?
Eigenlijk, wacht eens even.
Dit is een kopie van twee.
Dat is ook niet het juiste programma.
Oke, spoiler alert.
Oke, dus laat staan ​​dat.
Dat is het antwoord op een toekomstige vraag.
>> Hier is te vergelijken-0, en ik ben over een tekstregel krijgen.
Programma's veel eenvoudiger.
Dus dit is eenvoudig.
Dit is als Week One, Week Twee stuff op dit moment. reeks s = GetString.
Nu, ik zeg het nog eens hier beneden.
draad t = GetString.
En dan, het laatste wat in dit programma, zoals de naam al doet vermoeden,
wordt ik ga proberen om ze te vergelijken.
>> Als s, de eerste groep, evenaart = t, dan ben ik
gaan zeggen dat je hetzelfde typen.
Anders, ik ga om te zeggen je typt verschillende dingen.
Dus laten compileren en uitvoeren van dit programma.
Dus zorg vergelijken nul.
Ziet er goed uit.
Geen compilatie fouten.
>> Laat me gaan nu vooruit en typ ./compare-0.
Laat me gaan en iets te zeggen : Daven en iets: Rob.
En ik typ verschillende dingen.
So far, so good.
Programma lijkt juist te zijn.
>> Maar laten we weer draaien.
Zeg iets: Gabe.
Oke.
Misschien raakte ik spatiebalk of iets funky.
Laten we het nog eens doen.
Dus Zamyla.
Zamyla.
Verschillende dingen.
Dus wat is er aan de hand?
>> Dus we hebben deze twee lijnen van code, GetString twee keer genoemd.
En dan ben ik gewoon proberen te vergelijken s en t.
Maar wat echt dan is er gaande?
Nou, mijn handschrift over te slager dit voorbeeld enigszins.
En laten we eigenlijk gooien deze omhoog dan hier, als goed.
>> Dus we hebben een regel als reeks s = GetString.
Dus dat is gewoon de eerste interessante lijn van dat programma.
Maar wat al die tijd is geweest gebeurt onder de motorkap?
Nou, aan de linkerkant is string die een soort variabele,
en het heet s.
Dus ik weet dat dit het gebruik van het geheugen, of RAM, in mijn computer of andere manier.
Dus ik ga naar abstract trekken die als een vierkant.
32 bits, zo blijkt, maar meer op dat in de toekomst.
En dan, wat gebeurt hier?
>> Nou, natuurlijk getString krijgt een string van de gebruiker.
En GetString kreeg Zamyla of Gabe of Daven.
Dus laten we kiezen voor de eerste van degenen, die was Daven.
Zo effectief, wat GetString gekregen me in die eerste geval is D-a-v-e-n.
En dan, wat anders deed Het geeft me het geheim?
PUBLIEK: [onverstaanbaar]
DAVID J. MALAN: Ja, de / 0 of null karakter.
Dus het effectief gaf me een string.
Maar we al kennen van de vorige ziet dat een string is gewoon een array
van de personages, en het wordt beëindigd door deze speciale sentinel karakter / 0.
>> Maar als dit waar en dit is een vierkant,
Dit is duidelijk een veel grotere rechthoek.
En inderdaad, dat is, Ik eis, slechts 32 bits.
En dit is duidelijk meer dan 32 bits omdat dit waarschijnlijk
acht plus acht plus acht plus acht plus acht,
alleen vanwege bytes ASCII.
Hoe de heck gaan we passen Daven in dit kleine doosje hier?
>> Nou, wat is getString eigenlijk aan het doen?
Nou, dit raster vertegenwoordigt hier geheugen of RAM-geheugen van mijn computer.
Dus laten we willekeurig zeggen dat als elk daarvan vertegenwoordigt een byte,
dan kunnen we denken aan elke byte als hebbende een adres,
zoals 33 Oxford Street, of 34 Oxford Street, of 35 Oxford Street.
>> Dus net als huizen hebben adressen en gebouwen hebben adressen,
hiervoor individuele bytes van geheugen of nummers
die hen uniek te identificeren.
Nu, is arbitrair.
Maar om het simpel te houden, ik ga Gebruik hexadecimale gewoon volgens afspraak,
maar 0x betekent niets anders dan "dit is hexadecimaal."
en ik ga om te beweren dat de "D" eindigt bij Byte Een in het geheugen.
>> Ik heb niets anders aan de hand in geheugen, dus Daven kreeg de eerste plek
bij Byte One.
Dit dan zal 0x2 worden.
Dit gaat 0x3.
Dit gaat om 0x4 te zijn.
Dit gaat 0x5.
Dit gaat om 0x6 te zijn.
>> Maar zodra je begint te denken over wat het doen van de computer
onder de motorkap, kun je beginnen af ​​te leiden
hoe je, enkele jaren geleden, zou hebben C zelf geïmplementeerd.
Wat is GetString waarschijnlijk returning-- omdat
voelt alsof het niet terug Daven, per se,
want hij is zeker niet van plan te passen in deze kleine box--
dus wat is GetString waarschijnlijk terugkeren?
>> PUBLIEK: [onverstaanbaar]
>> DAVID J. MALAN: De locatie van Daven.
En het is dit gedaan Sindsdien Week One.
Wat GetString is echt terugkeer is niet een string, per se.
Dat is een van de kleine leugentjes om bestwil.
Het is de terugkeer van het adres van de tekenreeks in het geheugen, het unieke adres.
Daven woont op 33 Oxford Street.
Maar beknopter, Gavin woont bij 0x1, Adres Number One.
>> Dus wat wordt gezet in deze doosje daarna, om duidelijk te zijn,
is gewoon het adres van die string.
Dus al die tijd, dit heeft er aan de hand.
Maar wat dit zinspeelt op Nu is dat als alle s heeft
een aantal erin, wiens om je te stoppen, de programmeur,
van het zetten een willekeurig aantal in elke variabele en gewoon springen
tot dat deel van het geheugen?
En inderdaad, we zien wel dat is een bedreiging voor de volgende keer.
>> Maar voor nu, dit voelt onvoldoende.
Als ik zeg, krijg ik een snaar, je geeft me Daven.
Maar je hoeft niet echt geven me Daven.
Alles wat je me geven is het adres Daven's.
Hoe weet ik dan zeker waar Daven begint en ends--
het verhaal krijgt weird-- waar Daven begint en eindigt,
en dan, de volgende tekenreeks in het geheugen begint?
>> Nou, als je het uitdelen mij het begin van Daven,
wezen, hoe weet ik waar het einde van zijn naam is?
Die speciale null karakter, dat is des te belangrijker nu
als strings onder de kap zijn eenvoudig geïdentificeerd
uniek door hun locatie in het geheugen.
Dus al die tijd, dat is wat er gaande is.
>> Dus als we nu naar kijken de code hier, uit te leggen
als je zou de bug in lijn 26.
Waarom is Zamyla en Zamyla anders?
Waarom is Gabe en Gabe anders?
Ja, in de rug.
>> PUBLIEK: Ze hebben verschillende adressen.
>> DAVID J. MALAN: Simpelweg omdat ze hebben verschillende adressen.
Want als je GetString belt nogmaals, dat ik hier snel zal doen,
indien dit de tweede lijn, koord t, zoals ik deed in dat programma,
is gelijk aan een ander gesprek te GetString.
De volgende keer dat ik bel GetString, ik ga
een ander deel van het geheugen te krijgen.
>> GetString is toegestaan om het besturingssysteem te vragen
systeem voor meer en meer geheugen.
Het gaat niet om hetzelfde te hergebruiken zes bytes elke keer weer.
Het gaat om een ​​nieuwe te krijgen stuk geheugen, dat
betekent t gaat krijgen een andere waarde dan hier.
>> Dus als ik het doe s is gelijk aan = t, je bent niet te vergelijken
D tegen deze en A tegen deze en V tegen dit.
Je bent dit te vergelijken tegen deze, die
eerlijk gezegd is vrij useful-- useless-- is vrij nutteloos, omdat die echt
cares waar de snaren in het geheugen?
>> En inderdaad, dat hebben we niet.
En we zijn niet van plan om start bijzonder zorgzaam.
Slechts in zoverre problemen kunnen ontstaan en bedreigingen van de veiligheid kan ontstaan
we daadwerkelijk beginnen te schelen.
Dus laten we dit probleem op te lossen.
Blijkt dat, je het te repareren super gewoon.
>> En laten we eigenlijk, voordat ik blijkt dat weer, wat zou
je doen als in een CS50 klasse, en je moest implementeren
een vergelijking tegen twee snaren.
Je kunt duidelijk niet gewoon gebruik maken van s is gelijk aan = t.
Maar gewoon logisch, hoe zou je deze string vergelijken
tegen deze string met behulp van C-code?
Yeah.
>> PUBLIEK: Gewoon doen het lus [onverstaanbaar]
DAVID J. MALAN: Perfect.
PUBLIEK: [onverstaanbaar]
DAVID J. MALAN: Ja.
Gewoon gebruik maken van een lus of een while loop of wat dan ook.
Maar toepassen basisidee dat als Dit is een stuk geheugen of een array
en dit is, itereren over allebei tegelijkertijd.
En de letters vergelijken.
>> En je hebt om een ​​te zijn beetje voorzichtig, want je
heb een vinger niet wilt om voorbij de andere
omdat een string langer dan de andere.
Dus je gaat te willen om te controleren op deze bijzondere waarde aan het eind, null.
Maar het is echt, in het einde, zo simpel is dat.
En eerlijk gezegd, hebben we niet nodig om dat wiel opnieuw uit te vinden.
Hier is versie twee.
En wat ik ga zeggen is dat In plaats van het vergelijken s evenaart = t,
Ik ga in plaats daarvan gaan zeggen, of de tekenreeks vergelijking van s komma t de waarde = 0.
Nu, wat is touwtje te vergelijken?
>> Het blijkt, het is een functie die wordt geleverd met een C, waarvan het doel in het leven
is om twee strings te vergelijken.
En roer te vergelijken, als we lezen zijn man pagina of documentatie of CS50
referentie, zal gewoon je vertellen dat roer
vergelijken rendement ofwel een negatief nummer of een positief getal of nul,
waar nul betekent dat ze gelijk.
>> Dus gewoon gissen.
Wat zou het betekenen als roer vergelijken rendement
negatieve waarde of positieve waarde?
PUBLIEK: Groter dan of kleiner dan.
DAVID J. MALAN: Ja, groter of kleiner dan.
Dus als je wilde een hele afstand bos van strings in een dictionary--
zo zullen we uiteindelijk beneden de road-- perfecte functie om mogelijk te gebruiken,
omdat het gaat om dat te doen vergelijking van snaren voor je, en zeg
je doet komt voor b, of doet b treden voordat een alfabetisch.
We kunnen precies dat doen.
>> En merkt dat ik deed een andere ding in dit voorbeeld.
Wat is er nog meer veranderd in dit hoofdfunctie?
Char *.
En dit is dat andere leugentje om bestwil.
Al die tijd, wanneer je hebt het schrijven van touw,
we zijn in het geheim te herschrijven string char * zodat clang eigenlijk
begrijpt u.
>> Met andere woorden, in CS50.h en als we uiteindelijk zullen zien,
we maakten een synoniem genoemd reeks dat is hetzelfde als char *.
En voor nu, maar dat het weet * In deze context tenminste
betekent het adres.
>> Het adres van wat?
Nou, het feit dat ik zei char *, en niet int * of drijven *,
betekent dat char * is het adres van een char.
Dus dit doosje hier, aka snaar, is echt van het type char *,
dat is gewoon een mooie manier om te zeggen, In deze box wordt een adres te gaan.
En wat betekent dat adres verwijzen naar?
Blijkbaar een char.
>> Maar we konden absoluut hebben int * en andere dingen.
Maar voor nu, char * is echt de meest eenvoudig en een plaats.
Dus dit probleem gaat stijgt echter weer.
>> Stel dat ik dit programma open.
Eens kijken of nu kunnen we voorspellen wat is er mis met deze code.
Dus in dit programma, copy-0, ik ben gaan om verder te gaan en opnieuw te bellen
GetString en opslaan van de waarde in s.
>> En dan, waarom doe ik dit, net als een herinnering uit het verleden weken?
Wij deden dat GetString soms null geretourneerd.
Wat betekent het als GetString retourneert nul?
Er ging iets mis.
Het betekent waarschijnlijk dat de string is te grote, uit het geheugen van de computer.
Het gebeurt super, super, super zelden, maar het zou kunnen gebeuren.
We willen om te controleren op het, en dat is alles wat we doen.
>> Omdat we nu zullen zien, als je dat niet begint te controleren gewoonlijk voor dingen
zoals null, zou je daadwerkelijk van start te gaan
naar adressen in het geheugen, dat zijn ongeldig.
En je gaat om te beginnen met het induceren meer en meer segmentatie fouten.
Of in een Mac of een PC, net waardoor een computer te hangen
of een programma te bevriezen, in potentie.
>> Dus nu, ik beweer in copy-0.c, dat ik ga naar deze strings te kopiëren door middel
van lijn 28.
En dan, ik ga conclusie onderaan
hier dat ik ga een van hen wijzigen.
>> Zo merkt dit.
Ik bel onze oude vriend strlen.
En verklaren Engels wat deze lijn 34 aan het doen is?
Wat doet t beugel 0 vertegenwoordigen aan de linkerkant.
Yeah.
>> PUBLIEK: eerste teken van t?
DAVID J. MALAN: eerste teken van t.
Dat is het.
Eerste teken van t, ik wil om de hoofdletters versie toewijzen
van het eerste teken in t.
Dus dit is kapitaliseren de eerste letter.
En dan, het laatste wat ik doe in dit programma is Ik eis hier is
het origineel, s, en hier is de kopie, t.
>> Maar op basis van het verhaal dat we net vertelde over wat snaren werkelijk zijn,
wat is lijn 28 echt doen en wat
de resulterende fout gaan te zijn op het scherm?
>> Dus eerst, de eerste vraag 28.
Wat is draad t = s echt aan het doen?
Als we de linker side hier draad t = s;
dat geeft me een doos hier en een doos hier.
En stel dat dit adres is 0x, laten we zeggen, 50 dit keer, willekeurig.
Wat doet draad t = s doen onder de motorkap?
>> PUBLIEK: [onverstaanbaar]
>> DAVID J. MALAN: Het slaat het geheugen pakken daar, dus 0x50 gaat daar.
Dus als nu, ga ik naar de eerste karakter in t en hoofdletters het,
wat moet ik doen om effectief s?
Ik ben echt hetzelfde te doen, toch?
Want als Adres 0x50-- en gewoon, ik niet veel ruimte op het bord niet hebben hier,
maar aannemen dat dit hier 0x50 beneden, ergens in het geheugen van mijn computer.
>> En ik heb, bijvoorbeeld, Gabe hier in kleine letters, zoals deze.
En ik heb gezegd t beugel 0 wordt gekapitaliseerd.
Nou, t beugel 0 is de eerste letter in t.
Zo weinig g gaat uitgegroeid tot grote G. Maar het probleem
is, wat doet s wijzen ook op?
>> PUBLIEK: Dezelfde.
>> DAVID J. MALAN: precies dezelfde dingen.
Dus een eenvoudige uitleg misschien, zelfs als de syntax is een beetje raar.
Dus laten we dit doen.
Maak copy-0 en vervolgens ./copy-0.
Zeg iets: Gabe.
En helaas, beiden ze zijn nu geactiveerd,
maar voor die ten grondslag liggen aan reden dat we gewoon
nu te maken met adressen.
>> Dus hoe kunnen we beginnen te address-- no pun intended--
hoe kunnen we inspelen op een dit probleem?
Nou, in copy1.c, de dingen gaan om een ​​beetje ingewikkelder te krijgen.
Maar ik zou een aanspraak conceptueel eenvoudige oplossing.
>> Zo hard op het eerste gezicht te krijgen.
Niet makkelijk voor de eerste te zijn keer dat je het uittypen, misschien,
maar als het probleem is dat gewoon doen t = s gewoon
kopieert het adres, wat, weer als ik kan halen op je,
zal de oplossing voor het daadwerkelijk kopiëren van een string?
>> PUBLIEK: We zullen waarschijnlijk Gebruik een lus weer.
>> DAVID J. MALAN: Ja.
Dus gaan we een lus weer nodig.
En omdat als we willen kopiëren een tekenreeks s in andere tekenreeks,
willen we waarschijnlijk om het te doen teken voor teken.
Maar het probleem is, als Dit is oorspronkelijk s,
nu moeten we expliciet beginnen toewijzen van geheugen voor t.
>> Met andere woorden, laten we hertekenen dit een laatste keer.
Als dit touwtje s = GetString.
En laten we dit hier, als goed.
Dit is GetString.
En dan is het beeld iets zoals dat gaat als voorheen,
G-a-b-e / 0.
Dat ziet er een beetje iets als dit.
En s daarom noemen we dit 0x50, en dat gaat zijn 51, 52.
>> Dus dit is 0x50.
En dan, ik doe touw t.
In het geheugen, dat zal alleen maar geef me een pleintje als dit.
Dus wat is de belangrijkste stap nu?
Als ik wil s kopiëren naar t, wat leeg moeten we hier in te vullen?
Of wat hebben we nodig om doen op hoog niveau?
Yeah?
Iemand?
Yeah.
>> PUBLIEK: We moeten [onverstaanbaar].
DAVID J. MALAN: Ja, we nodig hebt in deze blanco te vullen.
Ik kan niet kopiëren en vervolgens kapitaliseren naam Gabe's
totdat ik vraag het besturingssysteem voor een stuk geheugen
dat minstens zo groot als het origineel.
Dus dat laat ons achter met een vraag.
>> Hoe vraag ik het besturingssysteem niet gewoon voor een eenvoudige kleine pointer--
zoals deze wordt genoemd, een adres, een pointer-- niet
voor een eenvoudig doosje zoals dit heet een string?
Hoe kan ik de operationele vragen systeem voor een groot deel van het geheugen?
Tot nu toe heb ik alleen gekregen die terug indirect door te bellen GetString.
Dus hoe wordt getString zelfs om zijn geheugen?
>> Nou, het blijkt dat er deze andere functie hier
dat we nu beginnen te gebruiken.
Nu, dit ziet er veel meer cryptische than-- en ik ben de enige die het-- kan zien
deze lijn ziet er veel meer cryptische dan moet het op het eerste gezicht.
Maar laten we plagen uit elkaar.
>> Aan de linkerkant, ik heb char * t.
Dus in het Engels, laten we beginnen met het formuleren van goede zinnen in technisch jargon.
Dus dit is het toewijzen van een variabele van het type char * genaamd t.
Nu, wat betekent dat eigenlijk?
>> Nou, dat betekent, wat ga ik in deze variabele genaamd t te zetten?
Een adres van een char.
Dus dat is gewoon het eenvoudiger, meer redelijke manier
beschrijven de linkerkant.
Dus dat maakt dit vak hier alleen.
Dus de rechterzijde, Vermoedelijk gaat
te wijzen dat groter stuk van het geheugen hoe?
Dus laten we deze plagen elkaar.
>> Het is overweldigend op het eerste gezicht, maar wat is er aan de binnenkant hier?
Ten eerste is er malloc, die is blijkbaar onze nieuwe vriend,
"Geheugen toe te wijzen."
Dus dit is het argument wordt doorgegeven in, dus het is een vrij grote argument.
Dus laten we deze plagen elkaar.
>> strlen van s, natuurlijk vertegenwoordigt de--
Publiek: Het aantal tekens.
DAVID J. Malan: Gewoon de aantal tekens in s.
Dus de lengte van s, de oorspronkelijke tekenreeks.
So G-a-b-e.
Dus het is waarschijnlijk vier in dit geval.
Waarom doe ik 1 na bellen strlen van s?
PUBLIEK: [onverstaanbaar]
DAVID J. Malan: Voor dat speciale null karakter.
Als je mij vraagt ​​wat is de lengte van Naam Gabe's, ik ga zeggen vier.
Onder de motorkap, maar, moet ik die vijfde byte voor het nul karakter.
Dus dat is de reden waarom ik doe het 1.
>> Nu voor het geval u werkt met deze programma op een andere computer dan, laten we zeggen,
de CS50 apparaat, waarbij de grootte van een char
anders zou kunnen zijn uit mijn eigen computer--
blijkt dat ik dit mag noemen operator sizeof, vraag gewoon de computer,
wat de grootte van een char op deze computer?
>> En door het vermenigvuldigen van de vijf in dit bijvoorbeeld door de grootte van een char die
Op de meeste computers zal gewoon een, malloc
zal toewijzen voor mij deze grote stuk van het geheugen hier aan de rechterkant.
En het gaat om return-- is een function-- dus het
ga terug naar mij wat?
Publiek: Het adres?
DAVID J. MALAN: Het adres van wat?
PUBLIEK: Van het geheugen toegewezen?
DAVID J. Malan: Van de geheugen is toegewezen.
Dus ik heb geen idee, eerlijk gezegd, waar dit gaat eindigen.
Ik ga om te stellen dat het zal eindigen op 0x88.
Volkomen willekeurig, maar ergens anders dan 0x50,
omdat het besturingssysteem, wat Windows en Mac OS voor mij doen, is
zorg ervoor dat het geven van me verschillende brokken van RAM.
>> Dus dit is de waarde waar deze stuk van het geheugen zou kunnen eindigen.
Dus dit is wat eindigt hier, 0x88.
Dus nu duidelijk, ik kan begrijpen dat dit niet hetzelfde als deze,
omdat ze te wijzen op verschillende delen van het geheugen.
Dus als ik nu eigenlijk wil dit kopiëren in, laten we het doen uw voorgestelde oplossing.
>> Laten we gewoon gaan, maak een lus, en doe t beugel i krijgt s beugel i.
Want nu kan ik gebruiken Dit matrix-achtige notatie,
want hoewel malloc zeer generiek wijst me geheugen,
geheugen is gewoon aaneengesloten bytes.
Byte, byte, byte, rug aan rug aan rug.
>> Ik kan zeker als een programmeur behandelen als een matrix, waarin
betekent dat ik kan gebruiken deze eindelijk bekend notatie van slechts enkele vierkante haken.
>> Dus laat ik daar te pauzeren, want Dit is veel tegelijk, zelfs
maar de achterliggende idee om samen te vatten dat tekenreeks, al die tijd,
is geen nieuw soort data per se.
Het is gewoon een zogenaamde pointer, een adres van een personage,
die gewoon betekent dat het een aantal dat door menselijke conventie
hebben we de neiging om te schrijven als 0x iets.
>> Maar het is gewoon een nummer, zoals 33 Oxford Street,
die toevallig ook de te Adres CS gebouw.
Eventuele vragen over deze gegevens?
Yeah?
>> PUBLIEK: Waarom doen we controleren voor t gelijk aan nul?
>> DAVID J. MALAN: Waarom doen we vraagt ​​t gelijk aan nul?
Als we lezen het documentation-- grote question-- voor malloc,
het gaat om te zeggen in kleine lettertjes, soms malloc zou null terug,
net als GetString.
En inderdaad, GetString null geretourneerd indien beurt malloc retourneert null,
omdat GetString gebruikt malloc.
>> En dat zou kunnen gebeuren als de OS, Mac OS, Windows, wat dan ook, is gewoon
uit het geheugen voor u.
Dus dat is wat er gebeurd is.
>> En laat me onthullen een ander ding dat zou wel eens blow your mind
of geheel te ver over de lijn.
Maar laat ik trek de Hetzelfde voor de lus voor het kopiëren,
die een moment geleden, recall was deze. t beugel i krijgt s beugel i.
>> Mooi en gebruiksvriendelijk.
Voelt alsof Week Two opnieuw.
Maar deze versie kan eigenlijk herschreven als deze, die cryptische ziet.
Het is een techniek genaamd pointer rekenkunde, adres rekenkunde.
Maar waarom werkt dit?
>> Nu hinderlijk, de auteurs van C speelt in
het * symbool voor verschillende doeleinden.
We hebben gezien dat al een keer gebruikt, char *, wat betekent "geef me een variabele
dat gaat bevatten het adres van een char. "
Dus char * in die context betekent "geef me een variabele."
>> Helaas, als je de * zonder gebruik een woord aan de voorkant ervan, zoals char,
het is nu wel de dereference operator.
En we zullen meer van dit zien voordat lang.
Maar het betekent gewoon "go there."
Het is hetzelfde als zeggen, als iemand mij overhandigd op een stuk papier "33 Oxford Street,"
als ik dat doe "* 33 Oxford Street," dat betekent "Gaan op de weg naar het CS gebouw."
>> Dus * betekent gewoon gaan als er is geen woord aan de voorkant ervan.
Dus wat is t, om duidelijk te zijn?
t is het adres van de brok geheugen dat werd gegeven terug naar mij.
s is het adres van wat duidelijkheid, in het voorbeeld dat we hebben besproken,
van kleine letters Gabe?
s is het adres van--
Publiek: De string.
DAVID J. MALAN: Van oorspronkelijke naam Gabe's.
Dus het is het adres van Dit stuk van het geheugen.
Dus als ik zeg t + i-- i, bericht, is gewoon onze oude vriend.
Het is gewoon een index variabele dat is itereren van nul op maximaal
de lengte van de tekenreeks s.
Dus het gaat om nul, dan een, dan twee, dan drie, dan vier.
Dus laten monteren van deze nieuwe Scratch-achtige puzzelstukjes, als je wil,
hoewel, opnieuw, de syntax is veel meer mysterieuze dan Scratch.
Dus t is een adres + ik zal me geven
een getal, want het zijn allemaal nummers die we al tekenen als hex.
Maar ze zijn gewoon nummers.
>> Dus als het adres van t wij zeiden was 0x88, wat is 0x88 plus nul.
Zelfs als je niet comfortabel met nog een hex, neem een ​​gok.
>> Publiek: Het origineel.
>> DAVID J. MALAN: Still 0x88.
Dus wat doet * 0x88 betekenen?
Het betekent, "go there", wat betekent effectief, "zet uw vinger hier."
En nu aan de rechterzijde van deze uitdrukking, * en dan in parens,
s + i s betekent, dat de pakken hier van de kleine g.
s + 0 is natuurlijk, s, ongeacht s is.
>> Dus nu, het is * s, die net als * 33 Oxford Street betekent ga naar het adres
s.
Dus hier is deze vinger, rechterhand.
Dus wat ga ik kopiëren in wat?
Het ding aan de rechterkant, dat is gabe, weinig g hier, naar hier.
>> En dus tot gevolg dat eerste iteratie van de lus,
zoals u voorgesteld, ook al ziet het er crazy ingewikkelder dan iets
we eerder hebben gezien, is gewoon te zeggen ga hier en kopieer dat personage hier.
Het geeft je een kaart om beide locaties.
>> En we zullen veel meer van dit te zien.
Maar voor nu, de hoop is gewoon om introduceren een aantal van deze fundamentele ideeën.
En inderdaad, laten we eens kijken naar een definitieve programma hier,
en dan de beloofde claymation, die zal alles in orde te maken.
Oke.
Dus laat me daar gaan we openen up--.
Dus laten mij-- we terug kom om deze foto duurde niet lang.
Laat me hier openen van deze laatste voorbeeld.
>> Dus hier is een super, super programma dat bewerkstelligt
niets in het leven dat het volgende doet.
Het verklaart de eerste twee variabelen, x en y, die geen getallen die tijd,
per se.
Ze zijn geen gehele getallen, per se.
Ze zijn blijkbaar int *.
Dus gewoon iedereen, wat betekent het als uw gegevens soort, de variabele,
is van het type int * sterren?
Dat is het adres van een int.
>> Dus ik heb geen idee waar het is.
Het betekent gewoon "te zetten, uiteindelijk, het adres van een int hier. "
0x50, 0x88, waar het ook is in geheugen, wordt een adres te gaan daar.
En dat is wat y zal zijn, ook.
>> Als ik nu zeg x = malloc (sizeof (int)), Dit is een mooie manier om te zeggen,
hey besturingssysteem, via malloc, geef mij genoeg geheugen voor de grootte
van een int, die waarschijnlijk zal worden 32 bits of vier bytes.
>> Dus wat doet malloc terugkeren?
Malloc keert een adres.
Dus wat gaat krijgen opgeslagen in x?
Het adres van de brok van geheugen, de vier bytes, dat malloc
net gevonden voor mij door te vragen het besturingssysteem.
>> Nu ondertussen, regel vier hier, het * x = 42.
Gewoon om duidelijk te zijn, wat gebeurt daar beneden?
Aan de linkerkant, * x.
dat is net als * 33 Oxford Street.
Dus * x betekent wat?
>> PUBLIEK: Ga naar.
>> DAVID J. MALAN: Ga naar dat adres.
Overal waar dat stuk van geheugen, naar het.
En zet wat er, uiteraard?
Publiek: 42.
DAVID J. MALAN: 42.
Oke, * y, hetzelfde idee.
Ga naar het adres in y.
Zet het getal 13 er, maar wat is y op dit moment?
Publiek: Er is geen geheugen voor y.
DAVID J. MALAN: Er is geen geheugen voor y.
Dus wat doet y waarschijnlijk bevatten, zoals we hebben gezegd?
>> PUBLIEK: Garbage.
>> DAVID J. MALAN: Sommige garbage waarde.
Nu, garbage waarde nog een getal.
Het kan nog steeds worden verward met een adres.
Het is alsof iemand krabbelde iets naar beneden,
en ik verkeerd geïnterpreteerd als betekenis sommige gebouwen in de straat.
En als je gewoon proberen in te gaan sommige gebouw dat je niet de eigenaar,
of een stuk van het geheugen moet je niet is gegeven, kan slechte dingen gebeuren.
Computer kan crashen, of een andere onbepaald gedrag zou kunnen gebeuren.
>> Dus de intro, dan, om Binky is dit.
Ik herinner me nog, 20 sommige oneven jaren later,
waar ik was toen ik eindelijk begrepen pointers.
>> Dat wil zeggen, als je Laat hier drie minuten
en denk ik niet begrijpen pointers, realiseren
Ik heb bedacht voor 20 jaar voor wat gekke reden
wanneer en waarom het uiteindelijk tot zinken gebracht in, zitten met mijn onderwijs
collega, Nishat Mehta in de achterkant van Eliot Dining Hall.
Nu, ik heb onthouden Dit omdat dit
een van de onderwerpen die ik in bijzonder, worstelde met.
En dan, uiteindelijk geklikt, zoals ik durf te zeggen een heleboel onderwerpen
uiteindelijk wil.
En nu, om dat te laten voelen alle gelukkiger en des te meer overtuigend,
laten we eens een laatste blik in onze laatste drie minuten hier bij Binky,
van onze vriend, Nick Parlante van Stanford.
>> [VIDEO AFSPELEN]
>> He, Binky.
Wakker worden!
Het is tijd voor pointer plezier.
>> Wat is dat?
Meer informatie over pointers?
Oh, goody!
>> Nou, om te beginnen, ik denk dat we ga een paar pointers nodig.
>> -OK.
Deze code kent twee wijzers, die kunnen wijzen op gehele getallen.
-OK.
Nou, ik zie de twee wijzers, maar ze lijken niet te wijzen op iets.
>> Dat klopt.
Aanvankelijk pointers wijzen niet op om het even wat.
De dingen die ze wijzen op zijn geroepen pointees, en de oprichting ervan is
een afzonderlijke stap.
>> Oh, rechts, rechts.
Dat wist ik.
De pointees zijn gescheiden.
Eh, dus hoe maak je een pointee toewijzen?
>> -OK.
Nou, deze code toewijst een nieuw integer pointee,
en dit deel sets x om te wijzen op het.
>> He, dat ziet er beter uit.
Dus maak er iets aan te doen.
>> -OK.
Ik zal dereferentie de aanwijzer x om sla het nummer 42 in zijn pointee.
Voor deze truc, ik heb mijn Toverstaf van dereferentie.
>> -Uw Toverstaf van dereferentie?
Dat-- dat is geweldig.
>> -Dit is wat de code eruit ziet.
Ik zal gewoon het opzetten van het aantal, en de [POP]
>> He, kijk.
Daar gaat.
>> Dus het doen van een dereferentie op x volgt de pijl om toegang te krijgen tot de pointee.
In dit geval, een winkel 42 in.
Hey probeer het te gebruiken om het nummer op te slaan 13 van de andere pointer, y.
>> -OK.
Ik zal alleen gaan over hier naar y, en krijgt het nummer 13 set-up.
En dan neemt u de Wand van Dereferencing en gewoon [BUZZ]
>> Oh!
>> Oh, hey!
Dat werkte niet.
Zeggen, Binky, ik denk niet dat dereferentie y is een goed idee, want je weet,
het opzetten van de pointee is een afzonderlijke stap.
En ik denk niet dat we ooit gedaan heeft.
>> -goede Punt.
-Ja.
We toegewezen de aanwijzer y, maar we nooit zet deze om te wijzen op een pointee.
>> -zeer Oplettend.
Hey, je ziet er goed uit daar, Binky.
Kunt u het probleem te verhelpen, zodat y punten dezelfde pointee als x?
>> Tuurlijk.
Ik zal mijn Toverstaf gebruiken van Pointer Opdracht.
>> Is dat gaat worden een probleem als voorheen?
Nee.
Dit is niet van de pointees raken.
Het verandert slechts een pointer naar wijzen naar hetzelfde als het andere.
>> Oh, ik zie het.
Nu y punten naar dezelfde plaats als x.
Dus wacht.
Nu, wordt y vast.
Het heeft een pointee.
Dus je kunt proberen de Wand van Opnieuw dereferencing naar de 13 dan verzenden.
>> Eh, OK.
Hier gaat. [POP]
>> He, kijk eens aan.
Nu dereferencing werken op y.
En omdat de pointers delen die ene pointee, beiden zien de 13.
-Ja.
Delen, wat dan ook.
Dus gaan we nu plaats wisselen?
>> Oh, kijk.
We hebben geen tijd meer.
>> -But--
>> -Just Herinner me de wijzer drie regels.
Number One, de basisstructuur is dat je een pointer,
en het verwijst naar een pointee.
Maar de wijzer en pointee zijn gescheiden,
en de veel voorkomende fout is het opzetten van een pointer,
maar om te vergeten om het een pointee.
>> Number Two, pointer dereferentie vanaf de aanwijzer
en volgt de pijl boven om toegang te krijgen tot de pointee.
Zoals we allemaal weten, dit werkt alleen als er
een pointee, wat voor soort komt terug naar Regel nummer een.
>> Nummer drie, wijzer opdracht duurt een pointer
en verandert het om te wijzen op de Hetzelfde pointee als een andere aanwijzer.
Dus na de opdracht, de twee pointers
zal wijzen naar dezelfde pointee.
Soms, dat heet delen.
En dat is alles wat er is, echt.
Bye-bye nu.
[END VIDEO AFSPELEN]
DAVID J. MALAN: Dat is het voor CS50.
We zullen volgende week zien.