[Musik spiller]
>> David J. MALAN: Okay.
Dette er CS50.
Og dette er starten på ugen 5.
Og som du måske har bemærket, noget af det materiale
er at få en lidt mere komplekset, lidt tættere.
>> Og det er meget let, især hvis du har haft for vane i nogen tid,
at være at forsøge at skrible ned det meste noget, vi gør, vi siger i klassen.
Men indse, det er måske ikke den ideelle pædagogisk tilgang
at lære denne form for materiale, og materiale mere generelt.
Og så vi er glade for at meddele, at CS50 egen Gheng
Gong er begyndt at forberede en kanonisk sæt af noter
for kurset, håbet om hvilket er, at man disse
ikke blot tjene som en reference og en ressource
for at gennemgå materiale og går tilbage gennem materiale, der kan have
undslap dig første gang omkring, men også for at jeres hoveder kan være mere
op end ned, når det drejer sig tid til at belære,
så du kan engagere mere eftertænksomt, som
modsætning til mere scribbly.
>> Med det sagt, hvad du finder på hjemmesiden er sådanne dokumenter som dette.
Og varsel, øverst til venstre, der er ikke kun en indholdsfortegnelse,
men også tid koder, vil straks hoppe dig
til den relevante del i video online.
Og hvad Chang her har gjort er væsentlige, dokumenterede
hvad der skete i denne særlig forelæsning.
Og mange af forelæsningerne er allerede er online nu med denne webadresse.
Og vi vil fortsætte med at skrive resten af dem, der ved udgangen af ​​denne uge,
så drage fordel af denne ressource.
>> Så uden videre, vi begyndte at skrælle
det lag, der har været streng i nogen tid.
Og hvad gjorde vi sige en streng faktisk er i sidste uge?
Så char stjerne.
Og char stjerne, godt, hvad gjorde det egentlig?
Nå, al denne tid, hvis vi har krævet en funktion,
Ligesom getString og opbevaring den såkaldte afkast
værdi getString i en variable-- det hedder
S Type string-- vi har skrevet den linje kode deroppe ovenfor.
Og det er kun, når jeg ser min håndskrift forstørret her
gør jeg indse, hvor grusomme dette er.
>> Men lad os antage, på højre side
er ikke desto mindre en rimelig skildring af, hvad der er
stået på alt dette tid med getString.
getString naturligvis bliver en streng.
Men hvad betyder det egentlig?
Det betyder, at det får en luns af hukommelse fra operativsystemet
ved at kalde en funktion, kaldet malloc.
Men mere om det senere.
Og så er det udfylder at bid af hukommelse
med bogstaverne brugeren har indtastet efterfulgt af naturligvis
en null-tegn, eller backslash nul til allersidst.
>> I mellemtiden, på venstre side af denne historie, al denne tid,
vi har erklæret en variabel, ligesom sek.
Og denne variabel er, hvad der nu vil begynde at kalde en pegepind.
Det er ikke en kasse inde i hvilke vi sætter strengen, Daven, per se,
men vi sætter i kvadratet boksen til venstre, hvad der præcist?
Ja?
>> PUBLIKUM: Adressen på hvor det er placeret i hukommelsen.
>> David J. MALAN: Præcis.
Den adresse, hvor Daven er placeret i hukommelsen.
Og ikke hvor alle Daven ligger, per se, men specifikt adresse
af hvad?
Ja?
>> Publikum: Første karakter.
>> David J. MALAN: Det første tegn i Daven, som i dette tilfælde,
Jeg foreslog var vilkårligt og urealistisk 1 OX1,
som netop betyder hexadecimale tal 1.
Men det er nok at gå at være en langt større tal
at vi måske drage med en 0x som et præfiks,
repræsenterer en hexadecimal karakter.
Og fordi vi ikke brug for at vide, hvor resten af ​​tegnene i Daven
er, på grund af det enkle design beslutning, der blev lavet for mange år siden?
Ja?
>> Publikum: Backslash 0.
David J. MALAN: Ja, præcis.
Backslash 0 har du mulighed, omend i lineær tid, til at krydse streng,
gå fra venstre mod højre, med en for-løkke, eller et stykke
løkke, eller noget lignende det, og bestemme, åh, her
er i slutningen af ​​denne streng.
Så med blot den adresse begyndelsen af ​​en streng,
Vi kan få adgang til i sin helhed det, fordi alt dette samtidig,
en streng har netop været en char stjerne.
>> Så det er sikkert fint at fortsætte med at bruge det CS50 bibliotek og denne abstraktion,
så at sige, men vi vil begynde at se præcis
hvad der er foregået på under hele dette tidspunkt.
Så du måske husker dette eksempel, også fra sidste gang, sammenligne 0,
som faktisk ikke sammenligne.
Men vi begyndte at løse dette.
>> Men som måske en genopfriskningskursus, kan jeg friste nogen
i en lyserød elefant dag, også lavet af Chang?
Hvad med dig foran? [Uhørligt].
Kom op.
>> Og i mellemtiden, som du kommer op, lad os
overveje for bare et øjeblik, hvad denne kode blev faktisk gør.
Det er at erklære to variabler op top, s og t, og kalder getString.
Dette er ikke et meget brugervenligt program, fordi det ikke fortælle dig, hvad du skal gøre.
Men lad os bare antage, at vi er fokus på den saftige side.
Og så gør vi, hvis S er lig lig t, bør det sige printf,
du har skrevet det samme.
Hej.
Hvad er dit navn?
>> Janelle: Janelle.
David J. MALAN: Janelle, rart at møde dig.
Så din udfordring på hånd for denne elefant
er først at tegne et billede af, hvad der er være repræsenteret i de første to
linjer.
Så s og t kan være repræsenterede hvordan på skærmen?
Og du kan bare trække det med fingeren på denne storskærm.
>> Så der er to halvdele til hver side af ligningen.
Så der er s til venstre, og derefter getString til højre.
Og så er der t til venstre, og derefter getString til højre.
Så hvordan kan vi begynde tegne et billede, der
repræsenterer, hvad der foregår her i hukommelsen, ville du sige?
Og lad mig fortælle dig forklare hvad du laver, når du går.
>> Janelle: OK.
Nå, først, det ville være at spørge dig at få input streng.
Og det ville store-- åh, undskyld.
David J. MALAN: OK.
Godt.
Og dette kaldes hvad?
Åh, OK.
Keep going.
Jeg ville ikke afbryde.
Janelle: Undskyld.
Så det ville input det ind adressen af-- ikke sikker.
Jeg kan ikke ligefrem huske nummeret, men jeg tror, ​​det var begyndt med 0.
>> David J. MALAN: Det er i orden, fordi jeg gjorde tallene op,
så der er ingen rigtige svar.
>> Janelle: Fra og med 0 bue.
>> David J. MALAN: OK, så elementet 0.
Selvfølgelig.
>> Janelle: Og hvis var ligesom blot en to-letter--
>> David J. MALAN: OK, tilbage til dig.
>> Janelle: Så element 0, og derefter elementet 1 eller elementet 2.
David J. MALAN: Og hvilke stykke billedet tegner du lige nu?
Opfordringen til getString?
Eller erklæringen om s?
>> Janelle: Erklæringen af S, tror jeg.
Åh, getString, fordi det ville indlæses i hver [? område. ?]
>> David J. MALAN: Godt.
Præcis.
Selvom dette effektivt returnerer et array, tilbagekaldelse,
når vi kommer tilbage en streng, kan vi indekset i denne streng ved hjælp af 01 og 2.
Teknisk disse er formentlig repræsenteret af enkelte adresser,
men det er fint.
>> Så formoder, hvis jeg kan bare hurtigt sende til hvor vi slap
sidste gang, hvis en af strengene var g a b e,
backslash 0, og derved repræsenterer Gabes input, hvordan kan vi repræsenterer s nu?
Hvis dette er den hukommelse, der er blevet returneret af getString?
>> Janelle: Ville det være repræsenteret af en bue?
>> David J. MALAN: Efter en bue?
Nå, nej.
Lad os bare sige, billedligt, lad mig bare gå videre
og foreslår, at hvis dette er s, dette er returværdien af ​​getString.
Og du har tegnet dette være 0, 1, 2, som er helt rimeligt, fordi vi
kan indekset i strengen, som sådan.
Men bare for at være i overensstemmelse med sidste gang, lad mig gå videre
og vilkårligt foreslår, at dette er adressen 1, dette er adressen 2,
dette er adresse 3, og så videre.
Og så, bare for at være super klart, hvad der sker
at gå i s som følge af denne første linje kode, ville du sige?
>> Janelle: adresse 1?
>> David J. MALAN: Præcis.
Så fat 0x1.
Og i mellemtiden, lad mig gå videre og duplikere meget af hvad du har gjort
og tilføje min egen T her.
Hvis jeg skulle skrive i gabe igen, en anden gang,
når du bliver bedt med getString, hvor er naturligvis gabe kommer til at gå?
Nå, presumably--
>> Janelle: Ligesom på her?
David J. MALAN: Ja.
Janelle: Eller det er også i de samme kasser?
David J. MALAN: Lad mig foreslå, ja, præcis, så i disse ekstra bokse.
Men hvad er afgørende nu, er, at selv selvom jeg har tegnet disse temmelig tæt
together-- 0x1 dette er 0x2-- i virkeligheden,
det nu kunne være adresse 0x10, for eksempel, og 0x11 og 0x12,
og så videre.
Og så, hvis det er tilfældet, hvad der kommer til at ende her i t?
>> Janelle: 0x10?
David J. MALAN: Præcis.
Så 0x10.
Og så nu, sidste spørgsmål.
Du har, langt, måtte arbejde den sværeste for en elefant hidtil.
Ved nu, hvis jeg trækker op koden igen, når jeg gør det, på linje tre,
hvis s er lig lig t, hvad er jeg faktisk sammenligne, at vi har tegnet her?
>> Janelle: De to adresser?
David J. MALAN: Præcis.
Så jeg siger er S lig lig til t?
Med andre ord er en lige lig med 10?
Og selvfølgelig, indlysende svar er nu, nej.
Og så dette program er i sidste ende kommer til at udskrive hvad ville du sige?
>> Janelle: Ville det være, du har skrevet det samme?
>> David J. MALAN: Så hvis s er 1 og t er 10?
>> Janelle: Du har skrevet forskellige ting.
>> David J. MALAN: Præcis.
Du har skrevet forskellige ting.
Okay.
Så en runde af bifald, hvis vi kunne, her.
[Applaus]
Det var smertefuldt.
Jeg kender.
Pænt gjort.
Så lad os nu se om vi ikke kan drille hinanden hvad rettelsen var.
Og selvfølgelig, når vi fast denne-- som jeg vil nu repræsentere i green--
Vi gjorde et par forbedringer her.
Først, ligesom en fornuft kontrollere, jeg først kontrollere
hvis s er lig nul og t er lig med nul.
Og bare for at være klar, når måske s eller t være null i kode som denne?
Hvornår kan s eller t være null.
Ja?
>> Publikum: [uhørligt].
>> David J. MALAN: Præcis.
Hvis strengen at brugeren indtastet, er alt for lang
at passe ind i hukommelsen, eller nogle underlige hjørne tilfælde som det,
getString, som vi skal se, bogstaveligt i dag, i dokumentationen,
siger, at det vil vende tilbage null som en særlig sentinel værdi,
eller bare slags et særligt symbol der betyder noget gik galt.
Så vi ønsker at kontrollere for det, fordi det viser sig
at nul er en meget farlig værdi.
>> Ofte hvis du forsøger at gøre noget med null involverer en function-- passerer det
som input til instance-- denne funktion kan meget vil gå ned, og med det,
tage hele dit program ned.
Så denne tredje linje nu er blot en tilregnelighed kontrollere, fejlkontrol, hvis du vil.
Det er en god vane nu for os at komme ind i nogen tid, vi
forsøger at bruge en værdi, kunne potentielt være null.
>> Nu, i fjerde linje her, "Hvis strcmp (s, t)," godt,
hvad er det at henvise til?
Godt, vi sagde det var en meget kortfattet opkaldt funktion for streng sammenligning.
Og dens formål i livet er at sammenligne det første argument mod det andet,
men ikke i form af deres adresser, som vi gjorde utilsigtet et øjeblik
siden med det røde kode, men snarere at sammenligne disse to
strenge i menneskeligt intuitivt måde ved at sammenligne dette mod dette,
imod dette, imod dette, og derefter stoppe, hvis og når man
eller begge af mine fingre rammer en omvendt skråstreg 0.
Så nogen år siden gennemført strcmp at gennemføre til os funktionaliteten
at vi håbede, vi ville have fået ved blot at sammenligne to enkle værdier.
>> Nu ærligt, jeg holder tegning alle disse forskellige tal.
Men virkeligheden er, jeg har været gøre disse op hele tiden.
Og så lad mig bare gå videre og skrible disse ud
at et punkt, som i slutningen af dagen og bevæger sig fremad,
vi er ikke rigtig kommer til at bekymre sig om hvad behandler ting er faktisk
i hukommelsen.
Så jeg har ikke tænkt mig at trække disse typer af tal, så meget mere,
Jeg er bare en abstrakt dette væk en lidt mere venligt med kun pile.
>> Med andre ord, hvis s er en pointer, godt, lad os bare trække det, bogstaveligt talt,
som en pegepind, en pil, der peger fra sig selv til noget andet,
og ikke bekymre dig for meget mere om minutia af disse adresser
som igen, jeg gjorde op alligevel.
Men vi vil se disse adresser, Nogle gange, når debugging kode.
>> Nu mellemtiden, dette program her rettelser, selvfølgelig,
ved at sammenligne dette problem disse to strenge.
Men vi løb ind i et andet problem.
Dette var fra kopien programmere sidste gang,
hvorved jeg forsøgte at kapitalisere bare det første tegn i en streng.
Men hvad var det symptom vi så sidste gang, da
en bruger har indtastet en værdi, ligesom gabe med små bogstaver, for s,
så vi tildelt s mod t, som i den tredje linje der,
og derefter forsøgte jeg at kapitalisere t beslag 0?
Hvad var effekten af skiftende t beslag 0 her?
>> PUBLIKUM: Det ændrede sek.
>> David J. MALAN: Ja, Jeg skiftede s, så godt.
Fordi hvad der virkelig foregår?
Nå, lad mig se om jeg kan rense op dette billede, som følger.
>> Hvis s er igen ordet g a, b, e, backslash, 0 og s
vi vil fortsætte med at tegne som en kasse her, men ikke mere adresser.
Lad os holde op med at gøre tingene op.
Lad os bare tegne et billede at forenkle verden.
>> Når jeg erklærer t med snor t, der skaber denne bid af hukommelse.
Square sker for at være 32 bits i de fleste computere.
I virkeligheden, hvis du nogensinde har hørt om en computer med en 32-bit arkitektur,
virkelig fancy-tale, der bare betyder, at det anvender 32-bit adresser.
Og som en teknisk side, Hvis du nogensinde har spekuleret
hvorfor ældre computere, hvis du rent faktisk forsøgte at suppe dem op med masser af RAM,
kunne kun have en maksimal af fire gigabyte RAM,
godt det er fordi, bogstaveligt talt, din gamle computer kunne kun
tæller så høj som 4 milliard, 4 milliarder byte,
fordi det var ved hjælp af 32-bit numre for adresser.
>> Men i hvert fald i dette eksempel fortællingens meget enklere.
t er bare en anden pointer, eller virkelig en char stjerne, alias streng.
Og hvordan gør jeg ønsker at opdatere dette billede nu med denne anden linje kode,
efter prik, prik, prik?
Når jeg gør streng t er lig med s semikolon, hvordan dette billede ændre sig?
Ja?
>> Publikum: [uhørligt].
>> David J. MALAN: Ja.
Præcis.
Jeg har lige sat en pil fra t boksen til samme adresse,
det samme første bogstav i gav.
Eller teknisk, hvis dette fyr var stadig på 0x1,
det er som om jeg havde 0x1 her og 0x1 her.
Men igen, hvem bekymrer sig om adresserne?
Det er bare tanken om, at nu betyder noget.
Så dette er hvad der sker her.
Så selvfølgelig, hvis du gør t beslag 0, hvilket er matrix notation
af course-- og helt ærligt, det ser som om der er en bred vifte herovre,
men nu er der denne underlige ting.
Vid, at programmeringssprog, C, tilbyder dig denne funktion,
hvorved, selv hvis t er en markøren, eller s er en pointer,
du kan stadig bruge det velkendte, komfortabel firkantet beslag
notation for at gå til det første element, eller det andet element eller en del
at denne pointer peger til, fordi formentlig det
er, som i denne sag, peger på nogle array.
>> Så hvordan kan vi løse dette?
Helt ærligt, det er, hvor det fik en lidt overvældende ved første øjekast.
Men her er en ny og forbedret udgave.
>> Så først, jeg får slippe af med CS50 biblioteket
blot at afsløre, at s er faktisk en char stjerne, bare et synonym.
Og t er også en char stjerne.
Men hvad der foregår på højre side af denne linje
hvor t er tildelt en værdi?
>> Hvad er malloc?
Hvad er det strlen?
Hvad er sizeof (char)?
Hvorfor dælen gør dette linie ser så kompliceret?
Hvad laver den på et højt niveau?
Hvad er det lagring i t?
Ja?
PUBLIKUM: Det er at tildele en bestemt mængde hukommelse plads.
Det er til at gemme, jeg gætte, breve [uhørligt].
>> David J. MALAN: Perfect.
Perfekt.
Det er tildeling af en bestemt mængde hukommelse
at gemme formentlig fremtidige bogstaver.
Og i særdeleshed, malloc Derfor vender hvad?
>> Publikum: Returnering af [uhørligt]?
David J. MALAN: Præcis.
Returnering adressen på hukommelse, som er en fancy måde at sige,
returnerer adressen på den første byte i denne hukommelse.
Det er op til mig at huske hvor meget hukommelse jeg faktisk
tildelt eller bedt malloc om.
>> Nu hvor meget er det?
Nå, selv om der er en masse af parenteser her,
malloc tager bare et enkelt argument.
Og jeg angive strlen af ​​s, så giv mig så mange bytes, som der er i s,
men tilføje en.
Hvorfor?
Ja?
>> PUBLIKUM: Skråstregen 0.
David J. MALAN: Præcis.
Vi er nødt til at gøre lidt rengøring.
Så fordi der er en omvendt skråstreg 0, ville vi bedre huske.
Ellers vil vi at skabe en streng,
ikke har denne særlige terminator.
>> I mellemtiden, bare for at være super anal, jeg har sizeof (char)
bare i tilfælde nogen kører min kode ikke på CS50 apparat,
men måske en anden computer i alt, hvor tegn
er en byte, efter sædvane, men to byte, eller noget større end det.
Det er bare at være super, Super utilbøjelig til fejl.
Selv om det i virkeligheden er det mest sandsynligt vil være en 1.
>> Nu, i mellemtiden, jeg gå videre og kopiere streng, t beslag jeg lig t beslag filtre.
Og jeg vil udsætte til sidste uges kildekoden for at se, hvad der foregår.
Men det vigtigste takeaway, og Grunden til at jeg sætter koden nu i grøn,
skyldes, at meget sidste linje, t beslag 0 er lig toupper,
har den virkning kapitalisere som snor?
t og / eller s?
Det sidste linje kode.
>> Bare t, fordi det er skete denne gang,
hvis jeg lidt fortryde det sidste skridt, hvad der er sket, er, når jeg kalder malloc,
Jeg hovedsagelig får en luns af hukommelse det er den samme størrelse som originalen,
fordi det er den aritmetiske jeg gjorde.
Jeg lagring i t adressen denne bid af hukommelse.
Selvom dette ser nice og smuk, pæn og blank,
virkeligheden er der er, hvad vi vil holde ringer, skrald værdier her.
Denne luns af hukommelsen, kan meget godt have været brugt før,
et par sekunder, et par minutter siden.
Så der kunne absolut være tal eller bogstaver der, bare ved et uheld.
Men de er ikke gyldige, indtil jeg selv befolke denne luns af hukommelse
med de faktiske tegn, som jeg gøre i denne for-løkke der.
Okay?
>> Så nu, klimaks disse tre eksempler
der tilsyneladende var brudt sidste gang, denne Swap eksempel denne funktion
arbejdede i den forstand, at det byttet a og b.
Men det virkede ikke i hvad andre mening?
Ja?
>> Publikum: [uhørligt].
>> David J. MALAN: Præcis.
Hvis jeg skulle kalde denne funktion fra another-- for eksempel
fra en funktion som vigtigste, hvor Jeg har en variabel, x og y, som jeg
gjorde i sidste uge, samme kode, og jeg går i x og y
til Skift, og derefter kalde Swap-- dette, selvfølgelig er den korrekte version
er, hvad vi er ved at see-- det virkede ikke.
Så hvad er den fix?
>> Nå, så bare for at være klar, lad mig gå videre
og-- giver mig et øjeblik her, og se hvis jeg kan vise dig den sidste, som
vil være in-- lad os se om jeg kan finde denne virkelige fast-- OK, [uhørligt].
OK, der er det.
Så ignorere de kommandoer jeg bare skrive.
Jeg vil have det til at hente på sidste øjeblik et eksempel
fra sidste gang, som kaldes nu ingen Swap.
>> Så ingen Swap er hvor vi slap sidste gang,
hvorved jeg initialiseret x 1 og y til 2.
Jeg derefter kalde Swap, der passerer i 1 og 2.
Og så er denne funktion arbejdet i en vis forstand,
men det havde ikke noget fast effekt på x og y.
Så Spørgsmålet er, hvordan nu vi faktisk løse dette problem?
Hvad er løsningen lige ved hånden?
>> Tja, i swap.c, der er nyt i dag, bemærke et par forskelle.
x og y er de samme.
Men hvad er klart anderledes ved linje 25?
Hvad er nyt der, hvis du kan huske hvad det lignede et sekund siden?
>> Publikum: [uhørligt].
>> David J. MALAN: Ja.
Så ampersands er et nyt stykke af syntaks ikke kun i dette program,
men også mere generelt i CS50.
Til dato, tror jeg ikke vi har set nogen eksempler
eller virkelig talte om dem i enhver detalje, bortset, måske, forebyggende
i snit et og-tegn som denne.
Tja, det viser sig-tegn er en af de sidste stykker af ny syntaks
vi kommer til at lære.
Alt det betyder, er den adresse nogle variabel.
På hvilken adresse betyder x leve?
Men hvad adresse betyder y leve?
For hvis grundlæggende problem før
var, at x og y blev videregivet som kopier, hvad vi virkelig ønsker at gøre
er give Swap med som en skat kort, der fører til hvor x og y faktisk
er RAM, således at Swap kan følge dette kort
og gå til hvor X eller Y, markerer stedet og ændre de aktuelle værdier 1 og 2.
der.
>> Så Swap nødt til at ændre sig en smule også.
Og ved første øjekast, kan dette virke lidt ligner char stjerne.
Og det er faktisk.
Så et er en pegepind til hvilken type data, baseret på denne fremhævede del?
Så det er en int.
>> Så et er ikke længere en int, Det er adressen på en int.
Og på samme måde, b er nu går at være adressen på en int.
Så når jeg nu kalder Swap fra Main, Jeg har ikke tænkt mig at give Swap 1 og 2.
Jeg har tænkt mig at give det ligesom Ox-noget og Ox-noget,
to adresser, der vil føre Swap til deres faktiske steder
i min computers hukommelse.
>> Så nu, min resterende implementering behov for at ændre en smule.
Hvad er selvfølgelig anderledes nu i disse tre linjer kode?
Der er i disse forbandede stjerner alle over stedet, okay?
Så hvad sker der her?
Ja?
>> PUBLIKUM: Det er naturligvis [uhørligt].
>> David J. MALAN: Præcis.
Så i denne context-- og dette var ikke det bedste design beslutning, ganske vist,
år siden.
I denne sammenhæng, hvor du bare have en stjerne,
og du ikke har en datatype, ligesom int, umiddelbart til venstre,
i stedet har du et lighedstegn, tydeligt, i denne sammenhæng, når du siger stjerne en,
det betyder at gå til adresse, der er i en.
Følg skattekort, så at sige.
>> Og i mellemtiden, på linje 37, det betyder det samme.
Gå til adressen a, og lægge, hvad der?
Uanset hvad er på placering, b angiver.
Med andre ord, gå til b.
Få det værdi.
Gå til en, og pr lige underskrive opgaven operatør,
sætte denne værdi der.
>> Tilsvarende int temp er bare en int.
Intet behov for at ændre om temp.
Det er bare et ekstra glas fra Annenberg for nogle mælk eller appelsinjuice.
Men jeg behøver at sige, gå til B.
Gå til denne destination og sætte værdien i temp der.
Så hvad sker der så?
Da jeg faktisk kalde Swap denne gang, hvis denne første bakke her repræsenterer Main,
denne anden bakke repræsenterer Swap, når Jeg passerer Ampersand x og tegnet y
fra Main til Swap, bare for at være klar, hvad er dette stakramme modtager?
Ja?
>> Publikum: [uhørligt].
David J. MALAN: Præcis.
Adressen af ​​x og adressen af ​​y.
Og du kan tænke på disse ligesom postadresser.
33 Oxford Street og 35 Oxford Street, og du
ønsker at flytte de to bygninger der er på disse steder.
>> Det er en slags en latterlig idé, men det er alt, vi mener med adresse.
Hvor i verden kan du finde disse to int'er?
Hvor i verden kan du finde disse to bygninger?
Så hvis endelig, efter al denne tid, jeg gå ind i nutidens kildekode og kompilere
Swap og køre ./swap endelig til første gang vi faktisk se, at
mine værdier har faktisk blevet byttet med succes.
Og nu kan vi selv tage dette til efterretning i f.eks gdb.
>> Så lad mig gå ind i den samme fil.
Lad mig gå videre og køre gdb af ./swap.
Og nu, i bytte, jeg har tænkt mig at gå fremad og sætte en pause punkt i Main.
Og nu jeg har tænkt mig at gå videre og køre programmet.
Og nu ser vi min kode pause på denne linje.
>> Hvis jeg går videre og udskrive x, hvad skal jeg se her?
Det er et spørgsmål.
Sig det igen?
>> Publikum: [uhørligt].
>> David J. MALAN: So tilfældige tal, måske.
Måske får jeg heldig, og det er nice og enkel, ligesom 0.
Men måske er det nogle tilfældige tal.
I dette tilfælde, jeg fik heldig.
Det sker bare at være 0.
Men det er faktisk held, fordi ikke før jeg
skrive næste og derefter udskrive x har at linje kode, linje 19, er blevet henrettet.
>> I mellemtiden, hvis jeg skriver næste gang, og nu udskrive y, jeg har tænkt mig at se 2.
Nu, hvis jeg skriver næste, går det til få en lidt forvirrende, for nu,
printf vil blive vist på skærmen, som den gjorde. x er 1.
>> Lad os gøre det igen.
Og nu, her er hvor tingene bliver interessante.
Før jeg kalder Swap eller endda skridt ind i det, lad os tage et lille kig.
x er igen 1.
Y er naturligvis hurtig fornuft kontrollere, 2, så ikke svært der.
Men hvad er tegnet x?
Svar, det er slags funky ud.
Men int stjerne i parentes er lige BNP måde at sige dette er en adresse.
Det er ikke en int, det er en pointer til en int, eller på anden måde kendt som en adresse.
>> Hvad er denne vanvittige ting?
Vi har aldrig set noget helt som før.
Så dette er adressen på min computer mindet om hvor x sker til at leve.
Det er Ox-noget.
Og det er helt ærligt, hvorfor Jeg er begyndt at tegne pile,
i stedet for tal, fordi der virkelig bekymrer
at din int er på et bestemt adresse, der er så store.
Men bffff0c4, disse er alle faktisk hexadecimale cifre,
der er 0 til f.
>> Så vi kommer ikke til at dvæle for længe på hvad disse ting er.
Men hvis jeg udskrive y, selvfølgelig, jeg se 2.
Men ampersand y, ser jeg denne adresse.
Og varsel, for de nysgerrige, hvor langt fra hinanden er x og y?
Du kan ignorere de fleste af adressen.
Fire byte.
Og det er i overensstemmelse med vores tidligere hævder, at hvor stor er en int?
Fire byte.
Så det ser ud som alt er foring op pænt, som du måske håbe, i hukommelsen.
>> Så nu, lad os bare hurtigt fremad til slutningen af ​​denne historie.
Lad os gå videre og skrive skridt, at dykke ned i swap-funktionen.
Bemærk nu, hvis jeg skriver en, det er identisk med adressen på x.
Hvis jeg skriver B, det er identisk til adressen af ​​y.
Så hvad skal jeg se, om jeg sige, gå til den adresse, en?
Så udskrive stjerne en.
Så stjerne betyder derned, i denne sammenhæng.
Ampersand betyder hvad er adressen.
Så stjerne et middel 1.
Og print stjernede b giver mig 2.
>> Og lad mig antage, for øjeblikket, at mindst den kode,
fortsætter med at udføre nu kan være begrundet igennem på den måde.
Men vi vil revidere denne idé inden længe.
Så denne version af swap er nu korrekt og tillader
os at bytte denne datatype.
>> Så nogen spørgsmål så på Swap?
På stjerne?
På adressen på?
Og du vil se, med Problemet sæt 4, en slags,
men problemet sæt 5, afgjort, hvordan disse tingene er nyttige og få meget mere
komfortable med dem, som et resultat.
Noget overhovedet?
Okay.
Så malloc er, igen, denne funktion der bare allokerer hukommelse, hukommelse
tildeling.
Og hvorfor er det nyttigt?
Nå, alt dette tidspunkt, du har brugt malloc.
Hvis du mener nu, hvordan getString værker, formentlig, det er
har spurgt nogen for en luns af hukommelse, når som helst brugeren skriver en streng
i, fordi vi helt sikkert vidste ikke, da CS50 personale,
hvor stor disse strenge, at mennesker kommer til at skrive kunne være.
>> Så lad os, for første gang, begynder at Riv hvordan CS50 bibliotekets værker,
ved hjælp af et par eksempler som vil føre os derhen.
Så hvis jeg åbner op gedit og åbne op scanf 0,
vi kommer til at se følgende kode.
Scanf 0, tilgængelig på hjemmesiden for i dag, har relativt få linjer kode
her, 14 til 20.
Og lad os se, hvad det gør.
Det erklærer en int, kaldet x.
Det siger noget lignende, tal venligst.
Og nu siger scanf% i, og x.
Så der er en masse nye ting der.
>> Men scanf, kan du slags tænke af som det modsatte af printf.
printf naturligvis udskriver til skærmen.
scanf slags scanninger fra brugerens tastatur noget, han eller hun har skrevet.
>> % I er ligesom printf.
Dette betyder, forventer brugeren at indtaste en int.
Og nu, hvorfor tror du, jeg kunne passere scanf & x?
Hvis formålet med livet i scanf er at få noget fra brugeren,
hvad er betydningen af passerer det, og x, nu?
Ja?
>> Publikum: [uhørligt].
David J. MALAN: Præcis.
Uanset hvad jeg, de menneskelige, skrive i, mit input vil blive gemt på det sted.
Det er ikke nok, husker, at bare passere i x, fordi vi har set allerede,
enhver tid du passerer bare en rå variabel, ligesom en int til en anden funktion,
sikker, kan det ændre det variabel, men ikke permanent.
Det kan ikke have en effekt på Main.
Det kan kun ændre sin egen lokale kopi.
Men hvis man i stedet, det gør du ikke giv mig den egentlige int,
men du giver mig retninger til at int, jeg nu, bliver scanf,
sikkert, kan jeg følge at adresse og sætte et nummer der
så du har adgang til det så godt.
>> Så når jeg køre dette program, lad os se.
Gør scanf 0 dot skråstreg, scanf 0.
Og hvis jeg nu skrive et nummer ligesom 50, tak for 50.
Hvis jeg nu skrive et tal som negativ 1, for den negative 1.
Jeg vil nu skrive et tal som 1,5, hm.
Hvorfor har mit program ignorere mig?
Tja, fordi blot, jeg fortalte det forventer kun en int.
Okay.
Så det er en version af dette.
Lad os tage tingene op et hak og foreslår, at dette ikke er godt.
Og heri ligger et meget simpelt eksempel af, hvordan vi kan begynde at skrive kode
at andre mennesker kan udnytte eller kompromis ved at gøre dårlige ting.
Så linie 16, så ens i ånden til før,
men jeg er ikke erklære det int denne gang.
Jeg erklære det char stjerne, alias streng.
>> Men hvad betyder det egentlig?
Så hvis jeg ikke angiver en address-- og Jeg kalder det vilkårligt, buffer,
men jeg kunne kalde det s, at være simple-- og så vil jeg gøre det, forklare mig,
hvis du kunne, baseret på den tidligere logik, hvad scanf gør i linje 18,
hvis pass% s og puffer, der er en adresse?
Hvad er scanf, hvis du anvender nøjagtig samme logik som versionen 0,
vil forsøge at gøre her, når brugeren skriver noget i?
Ja?
>> Publikum: [uhørligt].
>> David J. MALAN: Præcis.
Scanf ved logikken tidligere, vil tage strengen
at den menneskelige maskinskrevne in-- det er nu en streng,
det er ikke et tal, formentlig, hvis han eller hun cooperates--
og det kommer til at forsøge at sætte det snor i hukommelsen på uanset adresse
buffer angiver.
Og det er fantastisk, fordi buffer er faktisk beregnet til at være en adresse.
>> Men jeg hævder dette program er buggy i en meget alvorlig måde, fordi det værdi er
buffer som standard?
Hvad har jeg initialiseret ind?
Hvilken luns af hukommelse?
Jeg har ikke, vel?
>> Så selvom jeg har afsat en char stjerne, der er ikke længere kaldes s,
det i stedet hedder, buffer-- så lad os trække variablens navn
nu som buffer-- hvis jeg ikke har kaldet getString eller malloc her,
der effektivt betyder, at buffer er blot nogle skrald værdi.
>> Nu, hvad betyder det?
Det betyder, at jeg har fortalt scanf at forvente en streng fra brugeren.
Og ved du hvad?
Uanset denne ting peger at-- og jeg trækker spørgsmålstegn,
men i virkeligheden, går det at være noget lignende OX1, 2, 3, right?
Det er nogle falske værdi, der bare sker for at være der fra før.
Så sagt på en anden måde, det er som om bufferen er lige
peger på noget i hukommelsen.
Jeg aner ikke hvad.
>> Så hvis jeg skriver i Gabe nu, går det at forsøge at sætte g-a-b-e / 0 der.
Men hvem ved, hvad det er?
Og i fortiden, enhver gang vi har prøvet at røre
hukommelse, der ikke hører for os, hvad der er sket?
Eller næsten hver gang.
Segmenteringsfejl, right?
>> Denne pil, jeg har ingen idé om, hvor det er peger. det er bare nogle tilfældige værdi.
Og selvfølgelig, hvis du fortolker en tilfældig værdi som en adresse,
du kommer til at gå til nogle tilfældige destination.
Så gabe måske faktisk nedbrud mit program i dette tilfælde her.
>> Så hvad kan vi gøre, det er næsten lige så slemt?
Overvej dette tredje og sidste eksempel på scanf.
Denne version er bedre i hvilken forstand?
Hvis du er fortrolig med tidligere problem, det er bedre.
Hvorfor?
>> Publikum: [uhørligt].
David J. MALAN: Godt.
Så dette tilfælde linie 16 er bedre i den forstand,
at vi er udtrykkeligt afsætte en del hukommelse.
Vi bruger ikke malloc, vi bruger den uge 2
tilgang af blot erklære et array.
Og vi har sagt før, at en streng er blot et array af tegn,
så det er helt legitimt.
Men det er naturligvis, som du bemærke, fast størrelse, 16.
>> Så er dette program helt sikkert, hvis jeg skriver
i én tegnstrenge, to tegn strygere, 15 tegnstrenge.
Men så snart jeg begynder at skrive 16, 17, 18, 1000 tegnstrenge
hvor denne streng vil ende?
Det kommer til at ende op delvis her.
Men hvem ved hvad er ud over grænserne
særlig dette array?
>> Det er som om jeg har erklæret 16 kasser her.
Så i stedet for at trække ud alt 16, vil vi bare lade som om jeg har tegnet 16.
Men hvis jeg så forsøger at læse en streng der er meget længere, ligesom 50 tegn,
Jeg har tænkt mig at begynde at sætte a, b, c, d, x, y, z.
Og det er formentlig anden lagersegment
der igen kan forårsage mit program til at gå ned,
fordi jeg ikke har bedt om noget mere end blot 16 bytes.
>> Så hvem bekymrer sig?
Nå, her er den CS50 biblioteket.
Og de fleste af dette er blot ligesom vejledningen op øverst.
Den CS50 bibliotek, al denne tid, har haft denne linje på linje 52.
Vi har set typedef eller vil du se typedef
i pset 4, som blot skaber en synonym hvorved char stjerne kan være mere
simpelthen benævnt streng.
Så dette er en af ​​de få støttehjul
vi har brugt hemmeligt under motorhjelmen.
>> I mellemtiden, her er den funktion, getchar.
Nu åbenbart er der ingen krop til det.
Og i virkeligheden, hvis jeg holder rulning, det gør jeg faktisk ikke
se nogen implementeringer af disse funktioner.
Som tilregnelighed check, hvorfor er der?
>> Publikum: [uhørligt].
David J. MALAN: Ja.
Så dette er header fil.
Og header filer indeholder prototyper, plus nogle andre ting, synes det,
Ligesom typedefs.
Men i CS50.c, som vi har aldrig givet dig direkte,
men har været i CS50 apparatet alle denne gang, dybt inde i sine mapper,
bemærke, at der er en hel bundt af funktioner i her.
>> Faktisk, lad os rulle ned.
Lad os ignorere de fleste af dem, for nu.
Men rul ned til getInt og se, hvordan getInt fungerer.
Så her er getInt.
Og hvis du nogensinde virkelig plejet hvordan får int virker, her er dens dokumentation.
Og blandt de ting det siger, er det fortæller dig
hvad de værdier, det kan vende tilbage.
Det er overvejende negativt 2 mia til positiv 2 milliarder, give eller tage.
>> Og det viser sig, alt dette gang, selvom vi har aldrig
du havde tjekke for det, hvis noget går galt,
det viser sig, at alle denne gang, getInt har
været tilbage en særlig konstant, ikke null,
men int_max, som er bare en programmør konvention.
Det betyder her er en særlig værdi.
Sørg for at tjekke for dette, bare hvis noget går galt.
Men vi har aldrig gidet med, at det hidtil
fordi igen, denne menes at forenkle.
>> Men hvordan getInt bliver gennemført?
Tja, en, det tager ingen argumenter.
Vi ved, at.
Den returnerer en int.
Vi ved, at.
Så hvordan fungerer det under kølerhjelmen?
>> Så der er tilsyneladende et uendeligt løkke mindst udseendet af en.
Bemærk, at vi bruger getString.
Så det er interessant. getInt kalder vores egen funktion, getString.
Og nu, hvorfor kan dette være tilfældet?
Hvorfor bliver jeg defensiv her på linje 165?
Hvad kan der ske i overensstemmelse 164, bare for at være klar?
Det er det samme svar som før.
Måske bare være ud af hukommelsen.
Noget går galt med getString, vi er nødt til at kunne håndtere det.
Og grunden til at jeg ikke vender tilbage null er at teknisk, null er en pointer.
getInt har til at returnere en int.
Så jeg har vilkårligt besluttede det væsentlige,
at 2 milliarder, give eller tage, går at være en særlig værdi, som jeg kan aldrig
faktisk komme fra brugeren.
Det er bare den ene værdi, jeg har tænkt mig at spilde at repræsentere en fejlkode.
>> Så nu, tingene bliver lidt fancy.
Og det er ikke helt den samme funktion som før, men det er meget ens.
Så bemærker, erklærer jeg her, på linje 172 både en int n og en char c.
Og så bruger jeg denne funky linje, sscanf, som det viser sig
scanner ikke en streng fra tastaturet.
Det står en eksisterende streng, brugeren har allerede indtastet.
Så jeg har allerede ringet getString, som betyder, at jeg har en streng i hukommelsen.
sscanf er, hvad du ville kalde en parsing funktion.
Det ser på strengen, jeg har indtastet, tegn for tegn,
og gør noget nyttigt.
Denne streng er lagret i linje.
Og jeg ved, at kun ved at gå sikkerhedskopiere her og sige, åh, OK,
Jeg kaldte det ikke er denne gang, men linje.
>> Og nu er det lidt anderledes.
Men det betyder i realiteten, af grunde vi vil noget vinke vores hænder på i dag,
at vi tjekker til se, om brugeren har indtastet
og int og måske en anden karakter.
Hvis brugeren har indtastet i en int, er det skal oplagres i n, fordi jeg
passerer denne efter adresse, det nyt trick, vi har set i dag.
Hvis brugeren også indtastet i lignende 123x, at x
kommer til at ende med et brev karakter C.
>> Nu viser det sig, at sscanf vil fortælle mig, intelligent,
hvor mange variabler blev sscanf der er i stand til at udfylde.
Så ved denne logik, hvis funktionen Jeg gennemførelse er getInt,
men jeg tjekker, potentielt for brugeren
at have skrevet i en int efterfulgt af noget andet,
hvad vil jeg sscanf s returværdi virkelig være?
Hvis formålet er at få bare en int fra brugeren?
>> Så hvis sscanf afkast 2, hvad betyder det?
Brugeren har indtastet i noget lignende, bogstaveligt talt,
123x, hvilket er lige noget vrøvl.
Det er en fejl, og Jeg vil se efter det.
>> Så hvis brugeren skriver dette i, ved denne logik, hvad betyder sscanf vende tilbage,
ville du sige?
Så det kommer til at vende tilbage 2, fordi 123 kommer til at gå i her,
og x kommer til at ende op i her.
Men jeg ønsker ikke, at x for at få fyldt.
Jeg ønsker at sscanf kun lykkes fylde den første af sine variabler.
Og så det er derfor jeg ønsker sscanf at returnere 1.
>> Og hvis det er en smule over hovedet for øjeblikket, det er helt fint.
Indse dog, at en af ​​de værdier af getInt og getString
er, at vi laver en pokkers af en masser af fejlkontrol ligesom dette så
at der til dato, kan du temmelig meget skrive noget på dit tastatur,
og vi vil fange den.
Og vi bestemt, personale, vil helt sikkert ikke
være kilde til en fejl i dit program, fordi vi er de defensive
kontrol for alle de dumme ting, som en bruger kan gøre,
ligesom at skrive en snor, når du virkelig ønskede int.
Så for nu-- vi vil komme tilbage til dette før long--
men al denne tid, getString og getInt har
været under hætten ved hjælp af denne grundlæggende idé om adresser på hukommelse.
>> Så nu, lad os gøre tingene lidt mere brugervenligt.
Som du måske husker, fra Binky sidste time-- hvis min mus vil samarbejde-- så
vi havde denne kode, som helt ærligt, er temmelig meningsløst.
Denne kode opnår intet nyttige, men det var eksempel
at professor Parlante anvendes til at repræsentere
hvad der foregik i en program med hukommelse.
>> Så lad os genfortælle dette historie super kort.
Disse første to linjer, i Engelsk, gør hvad, ville du sige?
Bare i rimeligt menneske, men lidt tekniske termer, tage et stik.
Publikum: [uhørligt].
>> David J. MALAN: OK, du er oprettelse adresser til din variablerne x og y.
Ikke helt, fordi x og y er ikke variabler i traditionel forstand.
x og y er adresser eller gemmer adresse.
Så lad os prøve en gang til.
Ikke en dårlig start, selv om.
Ja?
>> Publikum: [uhørligt].
David J. MALAN: Godt.
Jeg tror, ​​det er en lidt renere.
Erklære to pegepinde, to heltal.
Og vi kalder dem x og y.
Eller hvis vi skulle tegne dette som et billede, igen,
husker ganske enkelt, at alle vi gør med den første linje
trækker en boks som denne, med nogle skrald værdi i det,
og kalder det x, og derefter anden boks som denne,
med nogle skrald værdi i det, kalder det y.
Vi har erklæret to pejlemærker, som i sidste ende
vil gemme adressen på en int.
Så det hele er der.
>> Så når Binky gjorde dette, det ler bare lignede dette.
Og Nick lige slags indhylles pilene,
som om de ikke er peger overalt især fordi de er bare
skrald værdier.
De er ikke eksplicit initialiseret overalt i særdeleshed.
>> Nu næste linje kode, husker, var dette.
Så i rimelig brugervenlig, men noget teknisk engelsk,
hvad er denne linje kode gør?
Ja?
>> Publikum: [uhørligt].
>> David J. MALAN: Perfect.
Det er fordelingen af ​​den luns af hukommelse, der er på størrelse med en int.
Og det er halvdelen svaret.
Du svarede ret halvdelen af ​​udtrykket.
Hvad der sker på venstre side af lighedstegnet?
Ja?
Publikum: Og tildeler den til variablen x?
>> David J. MALAN: og erhververe den til variablen x.
Så for at opsummere, højre side allokerer nok hukommelse til at gemme en int.
Men malloc specifikt returnerer adresse
af denne luns af hukommelse, som du har netop foreslået bliver gemt i x.
>> Så hvad Nick gjorde sidste gang med Binky er han trak at pointer ud, leret,
at pege nu på en hvid luns af hukommelse der er lig med størrelsen af ​​en int.
Og ja, der er beregnet at repræsentere fire byte.
>> Nu næste linje kode gjorde dette, stjerne x får 42.
Så 42 er ligetil på højre side, meningen med livet.
Venstre side, stjerne x betyder hvad?
Det også kan have gone-- det er OK.
OK.
>> PUBLIKUM: Dybest set, gå til [uhørligt]
David J. MALAN: Godt.
Publikum: [uhørligt].
David J. MALAN: Præcis.
Venstre side betyder gå til x.
x er adresse.
Det er ligesom 33 Oxford Street, eller OX1.
Og stjerne x betyder at gå til det adresse og sætte det der?
42.
>> Så ja, det er præcis, hvad Nick gjorde.
Han startede med ved, væsentlige, mentalt
peger en finger på x, efter pilen
til den hvide boks på højre hånd side, og sætte nummer 42 der.
Men så ting fik en lidt farligt, right?
Binky er ved at miste sit hoved.
>> Stjerne y lig 13, uheld, betyder hvad?
Så stjerne y midler gå til adressen i y.
Men hvad er adressen på y?
Okay, det er skrald værdi, right?
Jeg tegnede det som et spørgsmålstegn.
Nick trak det som en krøllet pil op.
Og så snart du forsøger at gøre stjerne y, siger derned,
men der er ikke et legitimt adresse, det er nogle falske placering,
programmet kommer til at gå ned.
Og Binky hoved går at flyve fra her, som det gjorde.
>> Så i sidste ende, dette program var bare flade ud fejl.
Det var et fejlbehæftet program.
Og det skulle fastsættes.
Og den eneste måde, virkelig, at ordne det ville være, for eksempel, denne linje,
som vi ikke engang komme til, fordi programmet styrtede for tidligt.
Men hvis vi skulle løse dette, hvad virkning har at gøre y lige x have?
Tja, i det væsentlige peger y på uanset værdi x peger på.
>> Så i Nicks historie, eller Binky historie, både
x og y pegede på hvid klump hukommelse,
så endelig, når man gør stjerne y lig 13 igen,
du ender med at sætte 13 i det rigtige sted.
Så alle disse linjer er perfekt legitimt, bortset fra denne ene,
når det er sket, før du faktisk tildelt å vis værdi.
>> Nu heldigvis, behøver du ikke nødt til at ræsonnere gennem alle
af disse former for problemer på egen hånd.
Lad mig gå videre og åbne op en terminal vindue her
og åbne op, for et øjeblik, en super kort program,
også er en slags meningsløst.
Det er grimt.
Det betyder ikke opnå noget nyttigt.
Men det betyder demonstrere spørgsmål hukommelse, så lad os tage et kig.
>> Main, super enkel.
Det opfordrer tilsyneladende en funktion, f, og derefter returnerer 0.
Det er lidt svært at rod dette op.
Så Main er temmelig godt, så langt.
>> Så f er problematisk.
Og bare ikke sætte meget kræfter ind på at navngive den
her, for at holde fokus på koden.
f har to linjer.
Og lad os se, hvad der nu sker.
Så på den ene side her-- og lad mig gøre
dette er i overensstemmelse med den tidligere example-- på den ene side,
venstre side er gør hvad, på engelsk?
Det er--
PUBLIKUM: Oprettelse af en pegepind.
David J. MALAN: Oprettelse af en pegepind til en int og kalder det x.
Så det er at skabe en af ​​disse bokse Jeg bliver ved med at trække på den berøringsfølsomme skærm.
Og nu, på højre hånd side allokere naturligvis
afsætter en luns af hukommelse.
Og bare for at være klar, hvordan meget hukommelse er det tilsyneladende
fordeling, hvis du bare slags gøre det math her?
>> Så det er 40 byte.
Og jeg ved, at kun fordi jeg kender en int på CS50 apparatet mindst
er fire byte.
Så 10 gange 4 er 40.
Så dette er lagring en x, adressen af den første ud af 40 int'er der
har fået tildelt plads tilbage, til tilbage, til at bakke, til ryggen.
>> Og det er, hvad der er nøglen om malloc.
Det behøver ikke tage en lille hukommelse her, lidt her, lidt her.
Det giver dig en luns af hukommelse, tilstødende, fra operativsystemet
systemet.
>> Nu hvad dette, x konsollen 10 er lig med 0?
Vilkårlig linje kode.
Det betyder ikke opnå noget nyttigt.
Men det er interessant, da x beslag 10--?
Ja?
>> Publikum: [uhørligt]?
>> David J. MALAN: x beslag 10 behøver ikke at være nul.
Null detalje kun kommer i spil med strenge, ved slutningen af ​​en streng.
Men en god tanke.
>> Hvor stort er dette array, selv selvom jeg har afsat 40 bytes?
Det er 0 gennem ni, right?
Det er 10 ints, alt.
40 bytes, men 10 int'er, indekseret 0 gennem 0.
>> Så hvad er det x beslag 10?
Det er faktisk nogle ukendt skrald værdi.
Det er hukommelse, der ikke tilhører mig.
Jeg skal ikke røre det byte nummer 41, 42, 43, 44.
Jeg har tænkt mig lidt for langt.
>> Og ja, hvis jeg køre denne programmet, kan det meget vel gå ned.
Men nogle gange, får vi heldige.
Og så bare for at demonstrere denne-- og helt ærligt,
du aldrig vide, før du gør det-- lad os køre dette.
Det gjorde faktisk ikke ned.
>> Men hvis jeg ændre det, for Eksempelvis at være som 1000,
at gøre dette virkelig bevidst, lad os se
hvis vi kan få det til at gå ned denne gang.
OK, det ikke ned.
Hvordan omkring 100.000?
Lad os lave den, og nu kør det.
OK.
Pyha.
Okay.
Så tilsyneladende igen, disse segmenter af hukommelse, så at sige,
er rimelig store, så vi kan få heldige igen og igen.
Men til sidst, når du får latterligt og virkelig gå langt ud på skærmen,
du rører hukommelse, der virkelig, virkelig ikke tilhører dig.
>> Men helt ærligt, disse typer af fejl går
at blive sværere og sværere at finde ud af på egen hånd.
Men heldigvis, som programmører, vi har værktøjer, der giver os mulighed for at gøre dette for os.
Så dette er måske en af de grimmeste programmer
endnu grimmere end gdb output.
Men det altid har en linje eller to, der er super nyttige.
>> Valgrind er et program, der hjælper ikke debug et program i sig selv,
men find hukommelsesrelateret problemer, specifikt.
Det vil automatisk køre din kode til dig og se efter mindst to ting.
En, gjorde du noget utilsigtet føles som hukommelse
der ikke tilhører dig?
Det vil hjælpe dig med at finde disse sager.
>> Og to, vil det hjælpe du finder noget, der hedder
memory leaks, som vi har fuldstændig ignoreret, naivt,
i nogen tid og saligt.
Men det viser sig, alle dette tidspunkt, når
du har kaldt getString i så mange af vores programmer,
du spørger operativsystemet for hukommelse,
men du har nogen erindring om nogensinde at give det
tilbage, laver UFORDELT eller fri, som det hedder.
Nej, fordi vi har aldrig bedt dig om at gøre det.
>> Men alt dette tid, programmerne du har skrevet i C
har været utæt hukommelse, beder operativsystemet
system til mere og mere hukommelse for strygere og whatnot,
men aldrig at aflevere det tilbage.
Og nu er det en smule af en forsimpling,
men hvis du nogensinde har kørt din Mac eller din pc i temmelig lang tid, åbning
masser af programmer, måske lukke programmer,
og selvom din Computeren har ikke styrtede ned,
det er at få så meget langsommere, som om det er virkelig
ved hjælp af en masse hukommelse eller midler, selv om
hvis du ikke er selv røre ved tastaturet,
at kunne være-- men ikke always-- kunne være, at de programmer, du kører
har selv memory leaks.
Og de holde beder OS om mere og mere hukommelse, men glemmer det,
faktisk ikke bruge det, men derfor tage hukommelse væk
fra andre programmer, der måtte ønske det.
Så det er en fælles forklaring.
Nu her er hvor Valgrind s udgang fuldstændig
grusomme til de mindre og mere komfortabel ens.
Men det interessante ting er lige heroppe.
Det fortæller mig en ugyldig skrive af størrelse fire sker i dette program,
især på linje 21 i memory.c.
>> Hvis jeg går til linje 21, hm, der faktisk er et ugyldigt skrive størrelse fire.
Hvorfor størrelse fire?
Nå, dette number-- og det kunne være noget, vi kan, er en int.
Så det er fire byte.
Så jeg sætte fire bytes hvor de ikke hører til.
Det er, hvad Valgrind er faktisk fortæller mig.
Desuden vil det også fortælle mig, som vi skal se,
som du kører dette i en fremtidig pset, hvis og når du har lækket hukommelse, hvilket faktisk
Jeg har, fordi jeg har kaldt malloc, men jeg har faktisk ikke
kaldes, i dette tilfælde, fri som vi vil til sidst se
er det modsatte af malloc.
>> Så nu, tror jeg, et sidste eksempel.
Så denne ene er lidt mere mystisk, men det er måske
den største grund til være forsigtig med hukommelse,
og årsagen til, at mange programmer og / eller web-servere, selv til denne dag,
bliver overtaget af skurkene sted på internettet, der er en eller anden måde
sende falske pakker til din server forsøger at kompromittere dine konti,
eller tage dine data, eller bare generelt overtage en maskine.
Bufferoverløb, som navnet antyder, betyder
overfyldte ikke en int, men en buffer.
Og en buffer er bare en fancy måde at sige det er en masse hukommelse.
>> Og ja, jeg kaldte en streng før puffer i stedet for filtre.
For hvis det er en buffer, ligesom i YouTube forstand,
eller hver gang du ser en video, Du har måske set ordet bufferkapacitet,
prik, prik, prik.
Det er utroligt irriterende.
Og det betyder bare at din video afspiller
forsøger at hente masser byte, masser af bytes
fra en video fra internettet.
Men det er langsom, så det forsøger at downloade en masse af dem
at fylde en buffer, en beholder, således at du har nok bytes, at det derefter kan
vise dig videoen, uden at holde pause konstant.
Men det viser sig, du kan har en buffer til denne store.
Men prøv at sætte så meget data det, og meget dårlige ting kan ske.
Så for eksempel, lad os se på denne sidste teaser af et eksempel.
Dette er et andet program at, ved første øjekast,
ikke gør noget super nyttigt.
Det har fået en Hovedfunktion der kalder denne funktion, f.
Og denne funktion, f, op her, har en char array, kaldet C, i størrelse 12.
Og så er det ved hjælp af denne ny funktion kaldet strncpy.
>> Det viser sig, at der med denne simple, enkel linje kode, blot to linjer,
vi har gjort hele mit program, og derfor hele min computer,
og min brugerkonto, og min hårdt køre potentielt sårbare over for nogen
der kender og er god nok til at køre dette program med en vis kommandolinje
argument.
Med andre ord, hvis denne dårlige fyr lægger inde i argvargv [1] ved at skrive
på tastaturet et meget særligt udformet streng, ikke ABC, 123, men i det væsentlige,
binære symboler, der repræsenterer eksekverbare kode, et program, som han eller hun skrev,
med dette enkle program, der er repræsentant for tusindvis af programmer
der er ligeledes sårbare, daresay, han eller hun kan i sidste ende slette alle
filerne på min harddisk, få en blinkende prompt, så han eller hun kan
skrive kommandoer på egen hånd, e-mail alle filer til mig selv.
Alt, hvad jeg kan gøre, han eller hun kan gøre med denne kode.
>> Vi vil ikke helt løse dette endnu.
Og i virkeligheden, går det til involvere et lille billede
som dette, som vi vil snart komme at forstå alle de bedre.
Men i dag, lad os slutte på hvad er forhåbentlig en lidt mere
forståeligt XKCD vittighed, indtil vi genoptager næste gang.
Okay.
Se dig på onsdag.
>> [Musik spiller]
>> SPEAKER: Og nu, dyb tanker, ved Daven Farnham.
Hukommelse er som at hoppe ind i en bunke af gyldne blade på en søndag eftermiddag.
Vinden, smide din hair-- Åh, jeg savner de dage when--
>> [Latter]