[Speel van musiek]
>> David J. Malan Alle regte.
Dit is CS50.
En dit is die begin van die week 5.
En as jy dalk opgemerk het, sommige van die materiaal
is om 'n bietjie meer kompleks, die klein digter.
>> En dit is baie maklik, veral as jy is in die gewoonte om vir 'n geruime tyd,
om te probeer om te krap af die meeste enigiets wat ons doen, sê ons in die klas.
Maar besef dat dit nie dalk die ideale opvoedkundige benadering
te leer om hierdie soort van materiaal, en materiaal meer algemeen.
En so het ons is bly om te kondig dat CS50 se eie Gheng
Gong het begin om voor te berei 'n kanoniese stel notas
vir die kursus, die hoop van die wat is dat een van hierdie
nie net dien as 'n verwysing en 'n hulpbron
vir die hersiening van materiaal en gaan terug deur die materiaal wat dalk
die eerste keer ontsnap jy rondom is, maar ook sodat julle hoofde kan wees meer
up as af, wanneer dit kom die tyd om lesings,
sodat jy kan betrek meer ingedagte, as
teenoor meer scribbly.
>> Met wat gesê het, wat jy sal vind op die webwerf is die dokumente wat hierdie.
En kennisgewing aan links bo, is daar nie net 'n tafel van die inhoud,
maar ook tyd kodes wat sal dadelik spring jy
aan die toepaslike deel in die video aanlyn.
En wat Chang hier gedoen is, in wese, gedokumenteer
wat gebeur het in hierdie bepaalde lesing.
En baie van die lesings is nou reeds aanlyn met hierdie URL.
En ons sal voortgaan om die res te plaas van dié wat deur die einde van hierdie week,
so neem nie voordeel van die hulpbron.
>> So, sonder verdere uitstel, ons begin om terug te skil
die laag is string vir 'n geruime tyd.
En wat het ons sê 'n string eintlik is verlede week?
So kar ster.
En kar ster, wel, wat het dit regtig beteken?
Wel, al hierdie tyd, as ons gevra 'n funksie,
soos getString, en berging die sogenaamde terugkeer
waarde van getString in 'n variable-- dit genoem
s tipe string-- het ons skryf die reël van die kode daar bo.
En dit is net wanneer ek sien my handskrif hier vergroot
besef ek net hoe afskuwelik dit is.
>> Maar laat ons aanvaar dat, op die regterkant
is nietemin 'n redelike uitbeelding van wat
is aan die gang al hierdie tyd saam met getString.
getString, natuurlik, kry 'n string.
Maar wat beteken dit werklik?
Dit beteken dat dit kry 'n deel van geheue van die bedryfstelsel
deur die roeping van 'n funksie, genaamd malloc.
Maar meer oor dit later.
En dan is dit vult wat deel van die geheue
met die letters van die gebruiker getik in, gevolg deur, natuurlik,
'n nul karakter, of agteroorskuinsstreep nul aan die einde.
>> Intussen, op die linkerkant van hierdie storie, al hierdie tyd,
ons het waarby 'n veranderlike, soos s.
En dat veranderlike is wat nou sal begin roep 'n wyser.
Dit is nie 'n boks binnekant van wat ons het die string, Daven, per se,
maar eerder ons in die vierkant boks aan die linkerkant wat presies?
Ja?
>> Publiek: Die adres van waar dit geleë is in die geheue.
>> David J. Malan Presies.
Die adres van waar Daven is geleë in die geheue.
En nie waar al Daven is geleë is, per se nie, maar spesifiek die adres
van wat?
Ja?
>> Publiek: Eerste karakter.
>> David J. Malan Die eerste karakter in Daven, wat in hierdie geval,
Ek het voorgestel was arbitrêr en onrealisties 1, OX1,
wat beteken net die heksadesimale getal 1.
Maar dit is waarskynlik gaan 'n veel groter getal te wees
sodat ons kan trek met 'n 0x as 'n voorvoegsel,
verteenwoordig 'n heksadesimaal karakter.
En omdat ons nie nodig om te weet waar die res van die karakters van Daven
is, as gevolg van wat eenvoudige ontwerp besluit wat baie jare gelede gemaak is?
Ja?
>> Publiek: Backslash 0.
David J. Malan Ja, presies.
Agteroorskuisstreep 0 kan jy, al is dit in lineêre tyd, die string te deurkruis,
loop van links na regs, met 'n lus vir, of 'n rukkie
lus, of iets soos dat en bepaal, o, hier
is die einde van hierdie spesifieke string.
So met net die adres die begin van 'n string,
ons kan die geheel van toegang nie, want dit alles terwyl,
'n string is nou net 'n kar ster.
>> So dit is beslis fyn om voort te gaan met behulp van die CS50 biblioteek en die onttrekking,
om so te praat, maar ons sal begin om te sien presies
wat is aan die gang onder die hele tyd.
So kan jy hierdie voorbeeld onthou, Ook uit die laaste keer, vergelyk 0,
wat nie eintlik vergelyk.
Maar ons het begin om dit te los.
>> Maar as miskien 'n opknappingskursusse, kan ek interesseer iemand
in 'n pienk olifant vandag, ook deur Chang?
Hoe gaan jy voor? [Onhoorbaar].
Kom op.
>> En in die tussentyd, as jy kom, laat ons
oorweeg vir 'n oomblik wat hierdie kode is eintlik.
Dit verklaar twee veranderlikes op top, s en t, en roep getString.
Dit is nie 'n baie gebruikers-vriendelike program, omdat dit nie vir jou sê wat om te doen.
Maar laat ons net aanvaar ons fokus op die sappige deel.
En dan moet ons doen, as s gelyk gelyk t, moet dit sê printf,
jy dieselfde ding getik.
Hello.
Wat is jou naam?
>> Janelle: Janelle.
David J. Malan Janelle, lekker om jou te ontmoet.
So jou uitdaging aan hand vir hierdie olifant
is om eers 'n prentjie van wat wat in die eerste twee verteenwoordig
lyne.
So s en t kan wees verteenwoordig hoe op die skerm?
En jy kan net trek dit met jou vinger op die groot skerm.
>> So is daar twee helftes te elke kant van die vergelyking.
So is daar 's aan die linkerkant, en dan getString aan die regterkant.
En dan is daar t aan die linkerkant, en dan getString aan die regterkant.
So, hoe kan ons begin teken 'n prentjie wat
verteenwoordig wat gaan aan hier in die geheue, sou jy sê?
En laat my laat jy verduidelik wat jy doen as jy gaan.
>> Janelle: OK.
Wel, die eerste, dit sou vra jy die insette string te kry.
En dit sou store-- O, jammer.
David J. Malan OK.
Goed.
En dit is genoem wat?
O, OK.
Voort te gaan.
Ek het nie bedoel om te onderbreek.
Janelle: Jammer.
So dit sou insette dit in die adres of-- nie seker nie.
Ek kan nie presies onthou die nommer, maar ek glo dit is wat begin met 0.
>> David J. Malan Dit is al wat reg is, want ek het die nommers op,
so daar is geen regte antwoord.
>> Janelle: Begin met die 0 boog.
>> David J. Malan OK, so element 0.
Seker nie.
>> Janelle: En dan as was soos net 'n twee-letter--
>> David J. Malan OK, terug na jou.
>> Janelle: So element 0, en dan element 1 of element 2.
David J. Malan En wat stuk die prentjie is jy teken nou?
Die oproep tot getString?
Of die verklaring van s?
>> Janelle: Die verklaring van s, ek glo nie.
O, die getString, want dit sou word in elke [ingevoer? gebied. ?]
>> David J. MALAN: Goed.
Presies.
Selfs al is dit effektief terugkeer 'n skikking, onthou,
wanneer ons terug 'n string, kan ons indeks in daardie string met behulp van 01 en 2.
Tegnies, dit is waarskynlik verteenwoordig deur individuele adresse,
maar dit is goed.
>> So dink nie, as ek kan net vinnig stuur aan waar ons opgehou het
laaste keer, as een van die snare was g 'n b e,
agteroorskuinsstreep 0, daardeur verteenwoordig Gabe se insette, hoe kan ons verteenwoordig is nou?
As dit is die geheue wat deur getString terug?
>> Janelle: Sou dit verteenwoordig deur 'n boog?
>> David J. Malan deur 'n boog?
Wel, nee.
Laat ons net sê, picturaal, laat my net voort te gaan
en stel voor dat, indien dit is, is hierdie is die terugkeer waarde van getString.
En jy het hierdie geteken as 0, 1, 2, wat is heel redelik, omdat ons
kan kruip in die tou, as sodanig.
Maar net om konsekwent te wees met laaste keer, laat my gaan voort
en arbitrêr stel voor dat hierdie is adres 1, is dit adres 2,
dit is posadres 3, en so meer.
En ja, net om super wees duidelik, wat gaan
om te gaan in s as 'n gevolg van daardie eerste lyn van kode, sou jy sê?
>> Janelle: Adres 1?
>> David J. Malan Presies.
So spreek 0x1.
En intussen, laat my voort te gaan en dupliseer baie van wat jy gedoen het
en voeg my eie t hier.
As ek om te tik in Gabe weer 'n tweede keer,
wanneer dit gevra word met getString, waar, natuurlik, is Gabe gaan om te gaan?
Wel, presumably--
>> Janelle: Soos hier aan?
David J. Malan Ja.
Janelle: Of dit is ook in dieselfde bokse?
David J. Malan Laat my stel, ja, presies, so in hierdie bykomende bokse.
Maar wat is die sleutel is nou dat, selfs al het ek hierdie redelik naby getrek
saam op 0x1, hierdie is 0x2-- in werklikheid,
hierdie dalk nou adres 0x10 wees, byvoorbeeld, en 0x11 en 0x12,
en so meer.
En so, as dit die geval is, wat gaan om te eindig hier in t?
>> Janelle: 0x10?
David J. Malan Presies.
So 0x10.
En so nou, laaste vraag.
Jy het, by verre, het die werk hardste vir 'n olifant tot dusver.
Deur die nou, as ek trek die kode weer, wanneer ek dit doen, in lyn drie,
As s gelyk gelyk t, wat ek eintlik vergelyk dat ons hier gevestig?
>> Janelle: Die twee adresse?
David J. Malan Presies.
So ek sê is S gelyk gelyk aan t?
Met ander woorde, is 1 gelyke gelyk aan 10?
En natuurlik, die ooglopende antwoord is nou, no.
En so is hierdie program uiteindelik gaan druk wat, sou jy sê?
>> Janelle: Sou dit, jy dieselfde ding getik?
>> David J. Malan So as s is 1 en t is 10?
>> Janelle: Jy getik verskillende dinge.
>> David J. Malan Presies.
Jy getik verskillende dinge.
Alle regte.
So 'n rondte van applous, As ons kon, hier.
[Applous]
Dit was pynlik.
Ek weet nie.
Mooi gedoen.
So nou, laat ons kyk of ons kan nie terg uitmekaar wat die fix was.
En natuurlik, wanneer ons vaste this-- wat ek sal nou verteenwoordig in green--
ons het 'n paar verbeterings hier.
Eerstens, net soos 'n gesonde verstand kyk, ek is die eerste kontrole
As s gelyk aan nul en t gelyk aan nul.
En net om duidelik te wees, wanneer mag s of t nul in die kode soos hierdie?
Wanneer kan s of t null.
Ja?
>> Publiek: [onhoorbaar].
>> David J. Malan Presies.
As die tou wat die gebruiker getik is te lank
te pas in die geheue, of 'n vreemde hoek geval soos dié,
getString, soos ons sal sien, letterlik vandag, in sy dokumentasie,
sê dit sal terugkeer null as 'n spesiale brandwag waarde,
of net soort van 'n spesiale simbool wat beteken dat iets verkeerd geloop het.
So ons wil om te kyk vir , want dit blyk
wat nul is 'n baie gevaarlike waarde.
>> Dikwels, as jy probeer om iets te doen het met null met 'n function-- om dit
as insette vir instance-- daardie funksie dalk baie sal crash en, daarmee saam,
haal jou hele program.
So hierdie derde lyn is nou net 'n gesonde verstand kyk, foutopsporing, as jy wil.
Dit is 'n goeie gewoonte want om ons te kry in 'n tyd wat ons
probeer om 'n waarde te gebruik wat kon potensieel wees null.
>> Nou, in die vierde reël hier, "As strcmp (s, t):" Wel,
wat is dit verwys na?
Wel, ons het gesê dit was 'n baie saaklik vernoem funksie string vergelyking.
En sy doel in die lewe is om te vergelyk sy eerste argument daarteen tweede,
maar nie in terme van hul adresse, soos ons gedoen het per ongeluk 'n oomblik
gelede met die rooi-kode, maar eerder die twee te vergelyk
snare in die menslik intuïtiewe manier deur dit te vergelyk, teen hierdie,
teen hierdie, teen hierdie, en dan stop as en wanneer 'n mens
of albei van my vingers tref 'n agteroorskuinsstreep 0.
So iemand jare gelede geïmplementeer strcmp te implementeer vir ons die funksie
dat ons hoop ons sou gekry het deur net vergelyk twee eenvoudige waardes.
>> Nou eerlik, ek hou tekening al hierdie verskillende nommers.
Maar die werklikheid is, ek het al die maak van hierdie die hele tyd.
En so laat my net voort te gaan en krap dit uit
'n punt te maak dat aan die einde van die dag en vorentoe te beweeg,
ons is regtig nie van plan om te gee oor wat fokus op dinge is eintlik
in die geheue.
So ek gaan nie hierdie te trek soorte getalle so baie nie,
Ek is net 'n abstrakte hierdie weg 'n bietjie meer vriendelik met net pyle.
>> Met ander woorde, as s is 'n wyser, Wel, laat ons teken dit net letterlik
as 'n wyser, 'n pyl van homself tot iets anders,
en nie bekommerd te veel meer oor die minutia van hierdie adresse
wat, weer, het ek tot in elk geval.
Maar ons sal die adresse sien, Soms, wanneer die opsporing van kode.
>> Nou intussen, hierdie program hier fixes, natuurlik,
dat die probleem deur dit te vergelyk hierdie twee stringe.
Maar ons het in 'n ander probleem.
Dit was uit die afskrif program verlede tyd
waardeur, het ek probeer om te kapitaliseer net die eerste karakter in 'n string.
Maar wat was die simptoom ons het die vorige keer toe
'n gebruiker getik in 'n waarde, soos Gabe in klein, vir s,
dan het ons toegeken is in t, as in die derde reël is daar,
en dan probeer ek te kapitaliseer t bracket 0?
Wat was die effek van veranderende t bracket 0 hier?
>> Publiek: Dit verander is.
>> David J. Malan Ja, Ek verander is, as well.
Want wat is werklik aan die gang?
Wel, laat ek sien of ek kan skoon hierdie foto, soos volg.
>> Indien s, weer, die woord g, a, b, e, in te voer, 0, en s
Ons sal voortgaan om tekening as 'n boks hier, maar nie meer adresse.
Kom ons hou op om dinge op.
Kom ons teken net 'n foto die wêreld te vereenvoudig.
>> Toe ek verklaar t met 'n tou t, wat skep wat deel van die geheue.
Square gebeur om te wees 32 stukkies in die meeste rekenaars.
In werklikheid, as jy al ooit gehoor van 'n rekenaar met 'n 32-bis argitektuur,
regtig fancy-praat, wat net beteken dit gebruik 32-bis adresse.
En as 'n tegniese eenkant, As jy al ooit gewonder
waarom ouer rekenaars, as jy eintlik probeer om sop hulle met baie van die geheue,
kon slegs 'n maksimum vier GB RAM,
Wel, dit is omdat, letterlik, jou ou rekenaar kon net
tel so hoog as 4 miljard, 4 miljard grepe,
want dit was die gebruik van 32-bit nommers vir adresse.
>> Maar in elk geval, in hierdie Byvoorbeeld, storie se baie makliker.
t is net nog 'n wyser, of regtig 'n kar ster, aka string.
En hoe wil ek hierdie foto te werk nou met die tweede lyn van kode,
na die dot, dot, dot?
Wanneer ek dit doen string t gelyk is kommapunt, hoe hierdie foto verander?
Ja?
>> Publiek: [onhoorbaar].
>> David J. Malan Ja.
Presies.
Ek het net 'n pyl uit die t boks na dieselfde adres,
dieselfde eerste letter in gegee het.
Of tegnies, as dit man is steeds op 0x1,
dit is asof ek moes 0x1 hier en 0x1 hier.
Maar weereens, wat omgee oor die adresse?
Dis net die idee wat nou saak maak.
So dit is wat hier gebeur.
So natuurlik, as jy nie t bracket 0, wat is opgestel notasie,
van course-- en eerlik, dit lyk soos daar is 'n verskeidenheid hier,
maar nou is daar hierdie vreemde ding.
Weet dat die programmeertaal C, bied hierdie funksie,
waardeur, selfs as t is 'n wyser, of is 'n muis,
jy kan nog steeds gebruik wat bekend is, gemaklik vierkante bracket
notasie om te gaan na die eerste element, of die tweede element, of enige element
dat wyser wys om gevolg, vermoedelik, dit
is, soos in hierdie geval, wys op 'n sekere skikking.
>> So hoe los ons dit?
Om eerlik te wees, dit is waar dit 'n bietjie oorweldigend op die eerste oogopslag.
Maar hier is 'n nuwe en verbeterde weergawe.
>> So die eerste, ek kry ontslae te raak van die CS50 biblioteek,
net bloot te stel wat is inderdaad 'n kar ster, net 'n sinoniem.
En t is ook 'n kar ster.
Maar wat gaan aan op die regterkant van die lyn
waar t 'n waarde toegeken?
>> Wat is malloc?
Wat is dit strlen?
Wat is sizeof (char)?
Hoekom die heck doen dit lyn kyk so kompleks?
Wat doen dit op 'n hoë vlak?
Wat is dit stoor in t?
Ja?
Publiek: Dit is die toekenning van 'n sekere bedrag van die geheue spasie.
Dit is te slaan, dink ek, letters [onhoorbaar].
>> David J. Malan Perfect.
Perfect.
Dit is die toekenning van 'n sekere hoeveelheid geheue ruimte
te slaan, vermoedelik, toekomstige letters.
En in die besonder, malloc dus terugkeer wat?
>> Publiek: Returning die [onhoorbaar]?
David J. Malan Presies.
Die terugkeer van die adres van die geheue, wat is 'n fancy manier om te sê,
gee die adres van die eerste byte van die geheue.
Die onus is op my om te onthou hoeveel geheue Ek het eintlik
toegewys of gevra malloc vir.
>> Nou hoeveel is dit?
Wel, selfs al is daar 'n baie hakies hier
malloc neem net 'n enkele argument.
En ek spesifiseer strlen van s, so gee my soveel grepe as daar in s,
maar voeg een.
Hoekom?
Ja?
>> Publiek: Die agteroorskuinsstreep 0.
David J. Malan Presies.
Ons het 'n bietjie huishouding te doen.
So, want daar is 'n agteroorskuinsstreep 0, ons wil 'n beter onthou dat.
Anders gaan ons 'n string te skep wat
beteken nie dat die spesiale Terminator.
>> Intussen, net om super wees anale, ek het sizeof (char),
net in geval iemand loop my kode nie op die CS50 toestel,
maar miskien 'n ander rekenaar heeltemal waar karakters
is een byte deur konvensie, maar twee grepe, of iets groter as dit.
Dit is net om te super wees, super sku vir foute.
Selfs al is, in werklikheid, is dit waarskynlik gaan 'n 1.
>> Nou, intussen, ek gaan voort en kopieer die string, t bracket i gelyk t bracket s.
En Ek sal stel om verlede week se bron-kode om te sien wat aangaan.
Maar die sleutel afhaal, en die Daarom het ek die kode nou in groen,
is omdat dit heel laaste lyn, t bracket 0 gelyk toupper,
het die effek van kapitaliseer wat string?
t en / of s?
Daardie laaste reël van die kode.
>> Net T, want wat is gebeur hierdie tyd,
As ek effens ongedaan wat laaste stap, wat s'n gebeur het, toe ek noem malloc,
Ek kry in wese 'n stuk van die geheue dit is dieselfde grootte as die oorspronklike,
want dit is die rekenkundige ek gedoen het.
Ek is die stoor in t die adres van daardie deel van die geheue.
Selfs al is dit lyk mooi en mooi, mooi en leeg,
Die werklikheid is daar is, wat ons sal hou die roeping, vullis waardes hier.
Dit stuk van die geheue dalk baie goed het voorheen gebruik is,
'n paar sekondes, 'n paar minute gelede.
So kan daar absoluut nommers of letters daar, net deur 'n ongeluk.
Maar hulle is nie geldig is, totdat ek myself vul hierdie stuk van die geheue
met die werklike karakters, soos ek doen wat vir lus daar.
Alle reg?
>> So nou, die klimaks van hierdie drie voorbeelde
wat is skynbaar die laaste keer gebreek, hierdie Swap Byvoorbeeld, hierdie funksie
gewerk het in die sin dat dit omgeruil a en b.
Maar dit het nie gewerk nie in watter ander sin?
Ja?
>> Publiek: [onhoorbaar].
>> David J. Malan Presies.
As ek hierdie funksie te roep van another-- byvoorbeeld
van 'n funksie soos hoof, waar Ek het 'n veranderlike, x en y, as ek
het verlede week, dieselfde kode, en ek slaag in x en y
te ruil, en dan Swap-- hierdie skakel, natuurlik, is die korrekte weergawe
is wat ons is oor te see-- dit nie gewerk het nie.
So, wat is die oplossing?
>> Wel, so net om te wees duidelik, laat my gaan voort
and-- gee my 'n tweede hier, en kyk As ek jou kan wys die laaste een, wat
sal wees in-- laat ons sien of ek kan vind hierdie vaste fast-- OK, [onhoorbaar].
OK, daar is dit.
So ignoreer die opdragte is ek net te tik.
Ek wil om dit te haal op die laaste minuut 'n voorbeeld
van verlede tyd, wat nou genoem word nie ruil.
>> So geen Swap is waar ons opgehou het om die laaste keer,
waardeur ek geïnisialiseer x 1 en y 2.
Ek het toe roep Swap, verby in 1 en 2.
En dan om hierdie funksie gewerk het in 'n sekere sin,
maar dit het geen permanente uitwerking op x en y.
So die vraag aan die hand is nie, hoe nou ons eintlik hierdie probleem op te los?
Wat is die oplossing aan die hand?
>> Wel, in swap.c, wat is 'n nuwe vandag, sien 'n paar verskille.
x en y is dieselfde.
Maar wat is duidelik anders oor lyn 25?
Wat is nuut daar, as jy onthou wat dit lyk soos 'n tweede gelede?
>> Publiek: [onhoorbaar].
>> David J. Malan Ja.
So die-karakters is 'n nuwe stuk van sintaksis nie net in hierdie program,
maar ook meer algemeen in CS50.
Tot op datum, ek dink nie ons het gesien dat enige voorbeelde
of eintlik gepraat oor hulle in enige detail, behalwe, miskien, preemptively
in artikel, 'n ampersand soos hierdie.
Wel, dit blyk ampersand is een van die laaste stukke van die nuwe sintaksis
ons gaan om te leer.
Al wat dit beteken, is die adres van sommige veranderlike.
Op watter adres het x leef?
Maar wat beteken adres y leef?
Want as die fundamentele probleem voor
is dat x en y is oorgedra afskrifte, wat ons regtig wil doen
word voorsien Swap met soos 'n skat kaart wat lei tot waar x en y eintlik
is in die geheue, sodat Swap kan die kaart volg
en gaan na waar x of y punte die plek en verander die werklike waardes 1 en 2
daar.
>> So Swap moet effens te verander.
En op die eerste oogopslag, dit mag lyk 'n bietjie soortgelyk aan kar ster.
En inderdaad is dit.
So 'n is 'n verwysing na watter tipe data, gebaseer op hierdie uitgelig gedeelte?
So dit is 'n int.
>> So 'n is nie meer 'n int, dit is die adres van 'n int.
En so, b is nou gaan die adres van 'n int te wees.
So as ek roep nou Swap van Main, Ek gaan nie Swap 1 en 2 te gee.
Ek gaan om dit te gee soos Bees-iets en Os-iets,
twee adresse wat sal lei Ruil vir hul werklike plekke
in my rekenaar se geheue.
>> So nou, my oorblywende implementering moet 'n bietjie te verander.
Wat is natuurlik nou anders in hierdie drie reëls van die kode?
Daar is hierdie damn sterre al oor die plek, alles reg?
So, wat gaan hier aan?
Ja?
>> Publiek: Dit is natuurlik [onhoorbaar].
>> David J. Malan Presies.
So in hierdie context-- en dit was nie die beste ontwerp besluit, weliswaar,
jaar gelede.
In hierdie konteks, waar jy moet net 'n ster,
en jy het nie 'n data tipe, soos int, onmiddellik aan die linkerkant,
plaas jy 'n gelyke teken, duidelik, in hierdie konteks, as jy sê sterre a,
dit beteken dat na die adres wat in 'n.
Volg die skat kaart, om so te praat.
>> En intussen, in lyn 37, dit beteken dieselfde ding.
Gaan na die adres a, en dit wat daar?
Wat ook al is by die plek wat b spesifiseer.
Met ander woorde, Gaan na B.
Kry daardie waarde.
Gaan na 'n, en volgens die gelyke teken, die opdrag operateur,
sit dit waarde daar.
>> Net so, int temp is net 'n int.
Niks moet verander oor temp.
Dit is net 'n ekstra glas uit Annenberg vir 'n paar melk of lemoensap.
Maar ek het nie nodig om te sê, gaan na b.
Gaan na die bestemming en het die waarde in temp daar.
So wat dan gebeur?
Toe ek dit noem Ruil hierdie tyd, indien hierdie eerste skinkbord hier verteenwoordig Main,
hierdie tweede skinkbord verteenwoordig ruil, wanneer Ek slaag ampersand x en y ampersand
Main te ruil, net om duidelik te wees, Wat is die stapel raam ontvang?
Ja?
>> Publiek: [onhoorbaar].
David J. Malan Presies.
Die adres van x en die adres van y.
En jy kan dink van hierdie soos posadresse.
33 Oxford Street en 35 Oxford Street, en jy
wil hê dat die twee geboue te beweeg wat op daardie plekke.
>> Dit is soort van 'n belaglike idee, maar dit is al wat ons bedoel met adres.
Waar in die wêreld kan jy daardie twee ints vind?
Waar in die wêreld kan jy vind die twee geboue?
So as uiteindelik, na al hierdie tyd het ek gaan in vandag se bron-kode en stel
Ruil en hardloop ./swap, uiteindelik, vir die eerste keer werklik sien ons dat
my waardes inderdaad suksesvol verruil.
En nou, ons kan selfs kennis van hierdie in, sê, gdb.
>> So laat my gaan in dieselfde lêer.
Laat my voort te gaan en uit te voer gdb van ./swap.
En nou, in ruil, ek gaan om te gaan voort en stel 'n breek punt in Main.
En nou is ek gaan om te gaan voor en hardloop die program.
En nou sien ons my kode gestop by die lyn.
>> As ek gaan voort en druk x, wat moet ek hier sien?
Dit is 'n vraag.
Sê weer?
>> Publiek: [onhoorbaar].
>> David J. Malan So ewekansige getalle, miskien.
Miskien kry ek gelukkig is, en dit is mooi en eenvoudig, soos 0.
Maar miskien is dit 'n ewekansige getal.
In hierdie geval, ek het gelukkig.
Dit gebeur net te wees 0.
Maar dit is inderdaad geluk, want nie totdat ek
tik die volgende en druk dan x het dat lyn van kode, lyn 19, uitgevoer is.
>> Intussen, as ek tik volgende keer, en nou druk y, ek gaan om te sien 2.
Nou, as ek tik die volgende, dit gaan 'n bietjie verwarrend, want nou,
die printf gaan op verskyn die skerm, soos dit gedoen het. x is 1.
>> Kom ons doen dit weer.
En nou, hier is waar dinge interessant.
Voordat ek noem Swap of selfs stap in dit, laat ons 'n bietjie loer.
x is, weer, 1.
Y is, natuurlik, vinnige gesonde verstand kyk, 2, so nie moeilik daar.
Maar wat is ampersand x?
Antwoord nie, dit is soort van funky soek.
Maar die int ster in hakies is net BBP se manier om te sê dit is 'n adres.
Dit is nie 'n int, dit is 'n verwysing na 'n int, of andersins bekend as 'n adres.
>> Wat is hierdie mal ding?
Ons het nog nooit so iets gesien hou dat voor.
So dit is die adres in my rekenaar se geheue van waar x gebeur om te lewe.
Dit is Os-iets.
En dit is, eerlik, waarom Ek het begin trek pyle,
in plaas van getalle, want wat regtig omgee
dat jou int is op 'n bepaalde adres wat daardie groot.
Maar bffff0c4, dit is al inderdaad hexadecimalen,
wat 0 tot f.
>> So ons gaan nie te woon lank oor wat die dinge is.
Maar as ek druk y, natuurlik, ek sien 2.
Maar ampersand y, ek sien dit adres.
En kennisgewing vir die vreemde, Hoe ver is x en y?
Jy kan ignoreer die meeste van die adres.
Vier grepe.
En dit is in ooreenstemming met ons vroeër beweer dat hoe groot is 'n int?
Vier grepe.
So dit lyk asof alles se voering mooi, as jy dalk hoop, in die geheue.
>> So nou, laat ons net vinnig vorentoe aan die einde van hierdie storie.
Kom ons gaan voort en tik stap, om te duik in die Swap funksie.
Nou sien, as ek tik 'n, is dit identies aan die adres van x.
As ek tik b, dit is identies na die adres van y.
So, wat moet ek kyk of ek en gesê: Gaan na die adres 'n?
So druk ster a.
So ster beteken daar gaan, in hierdie konteks.
Ampersand beteken wat is die adres van.
So ster 'n middel 1.
En druk ster b gee my 2.
>> En laat my aanvaar, vir die oomblik, dat ten minste die kode wat
opbrengs nou voer kan geredeneer deur in die manier.
Maar ons sal hierdie idee weer kort voor lank.
So hierdie weergawe van Swap is nou korrek en kan
ons hierdie spesifieke data tipe te ruil.
>> So enige vrae dan op Swap?
Op ster?
Op adres van?
En jy sal sien, met probleem stel 4, soort van,
maar die probleem stel 5, beslis, hoe hierdie dinge is nuttig en kry veel meer
gemaklik met hulle, as 'n gevolg.
Enigiets?
Alle regte.
So malloc is, weer, hierdie funksie dat net ken geheue, geheue
toekenning.
En hoekom is dit nuttig?
Wel, al hierdie tyd, jy het al met behulp malloc.
As jy nou hoe oorweeg getString werke, vermoedelik, dit is
is om iemand te vra vir 'n stuk van geheue, enige tyd die gebruiker 'n string
in, want ons het beslis weet nie, as CS50 personeel,
hoe groot die snare wat die mens gaan om te tik kan wees.
>> So laat, vir die eerste keer begin om te skil terug hoe die CS50 biblioteek werke,
deur middel van 'n paar voorbeelde wat ons daar sal lei.
So as ek oopmaak gedit en maak scanf 0,
ons gaan die volgende kode te sien.
Scanf 0, beskikbaar op die webwerf vir vandag, het relatief min reëls van die kode
hier, 14 tot 20.
En laat ons sien wat dit doen.
Dit verklaar 'n int, genoem x.
Dit sê iets soos, nommer asseblief.
En nou sê dit, scanf% i, en x.
So is daar 'n klomp van die nuwe dinge daar.
>> Maar scanf, kan jy soort van dink van die teenoorgestelde van printf.
printf, natuurlik, afdrukke na die skerm.
scanf soort van skanderings van die gebruiker se klawerbord iets wat hy of sy getik het.
>> % I is net soos printf.
Dit beteken verwag dat die gebruiker 'n int te tik.
En nou, waarom dink jy is ek kan aanstuur scanf & x?
As die doel in die lewe van scanf is iets van die gebruiker te kry,
Wat is die betekenis van om dit, en x, nou?
Ja?
>> Publiek: [onhoorbaar].
David J. Malan Presies.
Alles wat ek, die mens, tik, my insette gaan op die plek om gered te word.
Dit is nie voldoende nie, onthou, net slaag in x, want ons het reeds gesien het,
enige tyd wat jy slaag net 'n rou veranderlike, soos 'n int, aan 'n ander funksie,
seker nie, kan dit verander dat veranderlike, maar nie permanent.
Dit kan nie 'n effek op die Main.
Dit kan net sy eie plaaslike afskrif verander.
Maar as, in plaas, wat jy doen nie gee my die werklike int,
maar jy gee my die aanwysings na dat int, ek nou, synde scanf,
sekerlik, ek kan volg wat spreek en sit 'n aantal is daar
so jy het toegang tot dit so goed.
>> So toe ek hierdie program, laat ons sien.
Maak scanf 0 dot streep scanf 0.
En as ek tik nou 'n aantal soos 50, dankie vir die 50.
As ek tik nou 'n aantal soos negatiewe 1, vir die negatiewe 1.
Ek tik nou 'n aantal soos 1,5, hm.
Waarom het my program ignoreer my?
Wel, omdat net, ek het dit 'n int net verwag.
Alle regte.
So dit is 'n weergawe van hierdie.
Kom ons neem dinge op 'n kerf en stel voor dat dit is nie goed nie.
En hierin lê 'n baie eenvoudige voorbeeld hoe kan ons skryf kode begin
dat ander mense kan ontgin of kompromie doen slegte dinge.
So lyn 16, sodat soortgelyke in die gees voor,
maar ek is nie te verklaar dit int hierdie tyd.
Ek verklaar dat dit char ster, aka string.
>> Maar wat beteken dit werklik?
So as ek 'n address-- spesifiseer nie en Ek noem dit arbitrêr, buffer,
maar ek kon noem dit is, te simple-- wees en dan het ek dit doen, om my te verduidelik,
As jy kon, gebaseer op die vorige logika, wat scanf doen in lyn 18,
As pass% s en buffer, wat is 'n adres?
Wat is scanf, as jy aansoek doen om die presies dieselfde logika as weergawe 0,
gaan probeer om hier te doen, wanneer die gebruiker iets in?
Ja?
>> Publiek: [onhoorbaar].
>> David J. Malan Presies.
Scanf, deur die logika vroeër, gaan die string te neem
dat die menslike getikte in-- dit is nou 'n string,
dit is nie 'n getal, vermoedelik, indien hy of sy cooperates--
en dit gaan om te probeer om dit te sit string in die geheue op watter adres
buffer bepaal.
En dit is 'n groot, want buffer is inderdaad bedoel om 'n adres te wees nie.
>> Maar ek eis die program is karretjie in 'n baie ernstige manier, want watter waarde is
buffer by verstek?
Wat het ek in geïnisialiseer?
Wat deel van die geheue?
Ek het nie, reg?
>> So selfs al het ek 'n toegekende kar ster wat is nie langer genoem is,
dit is eerder genoem, buffer-- so Kom ons teken die veranderlike se naam
nou as buffer-- as ek nie genoem getString of malloc hier
wat effektief beteken dat buffer is net 'n paar vullis waarde.
>> Nou wat beteken dit?
Dit beteken dat ek gesê het scanf 'n string van die gebruiker om te verwag.
En weet jy wat?
Wat hierdie ding wys aan- en ek trek vraagteken,
maar in werklikheid, is dit gaan wees iets soos OX1, 2, 3, reg?
Dit is 'n paar valse waarde wat net gebeur daar voor.
So het 'n ander manier, is dit asof buffer is net
verwys na iets in die geheue.
Ek het geen idee wat.
>> So as ek tik in Gabe nou, gaan dit probeer g-'n-b-e / 0 te sit daar.
Maar wie weet wat dit is?
En in die verlede, 'n tyd het ons probeer om aan te raak
geheue wat nie pas nie ons het wat gebeur het?
Of byna elke keer.
Segmentering skuld, reg?
>> Hierdie pyl, ek het geen idee waar dit is wys. dit is net 'n paar random waarde.
En natuurlik, as jy interpreteer 'n ewekansige waarde as 'n adres,
jy gaan om te gaan na 'n paar random bestemming.
So Gabe mag wel ongeluk my program in hierdie geval hier.
>> So, wat kan ons doen dit is amper so erg?
Oorweeg die derde en finale voorbeeld van scanf.
Hierdie weergawe is beter in watter sin?
As jy gemaklik is met die vorige probleem, dit is beter.
Hoekom?
>> Publiek: [onhoorbaar].
David J. MALAN: Goed.
So hierdie geval van die lyn 16 is beter, in die sin
dat ons uitdruklik toekenning van 'n geheue.
Ons is nie die gebruik van malloc, ons gebruik die week 2
benadering van net verklaar 'n skikking.
En ons voor dat 'n string gesê het is net 'n verskeidenheid van die karakters,
so dit is heeltemal wettig is.
Maar dit is natuurlik as u daarop let, vaste grootte, 16.
>> So is hierdie program heeltemal veilig, as ek tik
in een karakter snare, twee karakter snare, 15 karakter snare.
Maar so gou as ek begin tik 16, 17, 18, 1000 karakterstringe,
waar is dat die snaar gaan eindig?
Dit gaan uiteindelik deels hier.
Maar dan wie wat anders weet buite die grense
van hierdie spesifieke verskeidenheid?
>> Dit is asof ek het verklaar 16 bokse hier.
So eerder as trek uit al 16, sal ons net voorgee dat ek getrek 16.
Maar as ek probeer dan 'n string te lees dit is veel meer soos 50 karakters,
Ek gaan om te begin om a, b, c, d, x, y, z.
En dit is vermoedelik 'n ander geheue segment
wat weer kan veroorsaak my program om te crash,
want ek het nie gevra vir niks meer as net 16 grepe.
>> So wat omgee?
Wel, hier is die CS50 biblioteek.
En die meeste van hierdie is net soos instruksies tot bo.
Die CS50 biblioteek, al hierdie tyd, het hierdie lyn in lyn 52.
Ons het typedef gesien het, of jy sal sien typedef
in pset 4, wat net skep 'n sinoniem waardeur kar ster meer kan wees
eenvoudig na verwys as string.
So, dit is een van die paar opleiding wiele
ons het in die geheim gebruik onder die kap.
>> Intussen, hier is die funksie, getChar.
Nou glo, is daar geen liggaam om dit te.
En in die feit, as ek hou blaai, ek doen nie eintlik
sien nie die implementering van hierdie funksies.
As 'n gesonde verstand tjek, hoekom is dit?
>> Publiek: [onhoorbaar].
David J. Malan Ja.
So, dit is die kop lêer.
En kop lêers bevat prototipes, plus 'n paar ander dinge, dit lyk,
soos typedefs.
Maar in CS50.c, wat ons het nooit openlik aan jou gegee het,
maar is in die CS50 toestel al hierdie tyd, diep binnekant van die dopgehou,
agterkom dat daar is 'n hele n klomp van die funksies hier.
>> In werklikheid, laat se rol af.
Kom ons ignoreer die meeste van hulle, vir nou.
Maar blaai af na getInt en sien hoe getInt werk.
So hier is getInt.
En as jy ooit regtig omgegee hoe kry int werk, hier is sy dokumentasie.
En onder die dinge wat sê dit is dit vir jou vertel
wat die omvang van die waardes wat dit kan terugkeer.
Dit is in wese negatief 2000000000 positiewe 2000000000, gee of neem.
>> En dit blyk dat al hierdie tyd, selfs al het ons nog nooit
het jy gaan vir dit, as iets verkeerd gaan,
dit blyk dat alle hierdie tyd, het getInt
is die terugkeer van 'n spesiale konstante, nie null,
maar eerder int_max, wat net 'n programmeerder se konvensie.
Dit beteken hier is 'n spesiale waarde.
Maak seker om te kyk vir hierdie, net in geval daar iets verkeerd gaan.
Maar ons het nog nooit gepla met dat tot op datum,
want weer, hierdie bedoel om te vereenvoudig.
>> Maar hoe getInt raak geïmplementeer?
Wel, een, dit neem geen argumente.
Ons weet dat.
Dit gee 'n int.
Ons weet dat.
So hoe werk dit onder die enjinkap?
>> So is daar blykbaar 'n oneindige lus, ten minste die voorkoms van die een.
Let daarop dat ons gebruik getString.
So dit is interessant. getInt noem ons eie funksie, getString.
En nou, waarom kan dit die geval wees?
Hoekom word ek verdedigende hier in lyn 165?
Wat kan gebeur in lyn 164, net om duidelik te wees?
Dit is dieselfde antwoord as voorheen.
Dalk net uit die geheue.
Iets verkeerd gaan met getString, ons het om in staat wees om dit te hanteer.
En die rede waarom ek nie terugkeer nie nul is wat tegnies nul is 'n wyser.
getInt het 'n int om terug te keer.
So ek het arbitrêr besluit, in wese,
dat 2 miljard gee of te neem, gaan 'n spesiale waarde te wees wat ek kan nooit
eintlik kry van die gebruiker.
Dis net die een waarde gaan ek mors 'n fout kode verteenwoordig.
>> So nou, dinge 'n bietjie fancy.
En dit is nie heeltemal dieselfde funksie soos voorheen, maar dit is baie soortgelyk.
So sien, verklaar ek hier, in lyn 172, beide 'n int N en 'n kar c.
En dan het ek gebruik om hierdie funky lyn, sscanf, wat dit blyk uit
nie 'n string van die klawerbord scan.
Dit staan ​​'n bestaande string wat die gebruiker het reeds getik in.
So ek het reeds getString, genoem wat beteken dat ek 'n string in die geheue.
sscanf is wat jy wil noem 'n ontleding funksie.
Dit lyk op die string Ek het getik in, karakter deur karakter,
en doen iets nuttig.
Dit string gestoor word in die lyn.
En ek weet dat slegs deur te gaan back-up hier en sê, O, OK,
Ek het dit nie s die tyd, maar lyn.
>> En nou is dit 'n bietjie anders.
Maar dit effektief beteken, vir die redes ons sal 'n bietjie ons hande waai vandag,
dat ons kontrole te sien of die gebruiker getik
en int en miskien 'n ander karakter.
As die gebruiker in 'n int getik, dit is gaan gestoor word in n, want ek is
verby hierdie toespraak het die nuwe truuk wat ons vandag gesien het.
As die gebruiker ook getik in soos 123x dat x
gaan aan die einde 'n brief in karakter c.
>> Nou is dit blyk dat sscanf sal vir my sê, intelligent,
hoeveel veranderlikes is sscanf suksesvol te kan vul.
So deur hierdie logika, as die funksie Ek is die uitvoering is getInt,
maar ek nagaan, potensieel, vir die gebruiker
in 'n int getik het gevolg deur iets anders,
wat wil ek sscanf se terugkeer waarde werklik te wees?
As die doel is om te kry net 'n int van die gebruiker?
>> So as sscanf opbrengste 2, wat beteken dit?
Die gebruiker getik iets soos, letterlik,
123x, wat net nonsens.
Dit is 'n fout toestand, en Ek wil om te kyk vir dit.
>> So as die gebruiker in, en deur hierdie logika, wat beteken sscanf terugkeer,
sou jy sê?
So dit gaan om terug te keer 2, want die 123 gaan om te gaan in hier,
en die x gaan eindig hier.
Maar ek wil nie die x gevul te kry.
Ek wil sscanf slegs daarin slaag om vul die eerste van sy veranderlikes.
En dit is hoekom ek wil sscanf om terug te keer 1.
>> En as dit 'n bietjie oor die kop vir die oomblik, dit is heeltemal fyn.
Besef egter dat een van die waardes van getInt en getString
is dat ons 'n heck van 'n doen baie foutkontroles soos hierdie so
dat, tot op datum, kan jy so bietjie tik enigiets sleutelbord,
en ons sal dit vang.
En ons het beslis die personeel, sal beslis nie
wees om die bron van 'n fout in jou program, want ons is defensief
keur vir al die dom dinge wat 'n gebruiker kan doen,
soos tik 'n string, wanneer jy regtig wou int.
So vir now-- ons sal kom terug na hierdie voor long--
Maar al hierdie tyd, getString en getInt het
is onder die enjinkap gebruik van hierdie basiese idee van adresse van die geheue.
>> So nou, laat ons dinge wat 'n bietjie meer gebruikersvriendelik.
As jy kan onthou, van Binky laaste time-- as my muis sal so cooperate--
ons het hierdie kode, wat eerlik, is redelik nonsens.
Hierdie kode bereik niks nuttig, maar dit was die voorbeeld
dat professor Parlante gebruik om voor te stel
wat aan die gang was in 'n program wat die geheue.
>> So laat ons vertel hierdie storie super kortliks.
Die eerste twee lyne, in Engels, wat sou jy sê nie?
Net in 'n redelike mens, maar effens tegniese terme, 'n steek.
Publiek: [onhoorbaar].
>> David J. Malan OK, jy stigting adresse vir jou x en y veranderlikes.
Nie heeltemal nie, omdat x en y is nie veranderlikes in die tradisionele sin.
x en y is adresse of sal slaan adres.
So laat ons probeer om hierdie keer meer.
Nie 'n slegte begin, al is.
Ja?
>> Publiek: [onhoorbaar].
David J. MALAN: Goed.
Ek dink dit is 'n bietjie skoner.
Verklaar twee wysers, twee heelgetalle.
En ons noem dit x en y.
Of as ons te trek dit as 'n foto, weer,
onthou eenvoudig dat alle ons doen met die eerste reël
is soos hierdie tekens van 'n boks, met 'n paar vullis waarde in dit,
en noem dit x, en dan 'n ander vak soos hierdie,
met 'n paar vullis waarde in dit, noem dit y.
Ons het verklaar twee wysers wat uiteindelik
sal die adres van 'n int stoor.
So dit is alles daar.
>> So wanneer Binky dit gedoen het, die klei net so gelyk.
En Nick net soort van toegedraai die pyle,
asof hulle nie op enige plek wys in die besonder, want hulle is net
vullis waardes.
Hulle is nie uitdruklik geïnisialiseer oral in die besonder.
>> Nou is die volgende lyn van kode, onthou, was dit.
So in 'n redelike gebruiker-vriendelike, maar ietwat tegniese Engels,
Wat is hierdie reël van die kode te doen?
Ja?
>> Publiek: [onhoorbaar].
>> David J. Malan Perfect.
Dit is die toekenning van die stuk van die geheue wat is die grootte van 'n int.
En dit is die helfte van die antwoord.
Jy antwoord die reg helfte van die uitdrukking.
Wat gebeur op die linkerkant van die gelyk teken?
Ja?
Publiek: en ken dit aan die veranderlike x?
>> David J. Malan en ken dit aan die veranderlike x.
So om herhaling, regs toewys genoeg geheue 'n int te stoor.
Maar malloc spesifiek gee die adres
van daardie deel van die geheue, wat jy het net voorgestelde kry gestoor in x.
>> So, wat Nick het die laaste keer met Binky is hy gesleep wat wyser uit die klei,
wys nou op 'n wit stuk van die geheue wat gelyk is aan die grootte van 'n int.
En inderdaad, dit is bedoel vier grepe te verteenwoordig.
>> Nou, die volgende lyn van die kode het dit gedoen, ster x kry 42.
So 42 is eenvoudig op die regs, betekenis van die lewe.
Linkerkant, ster x beteken wat?
Dat daar te kan hê gone-- dit is OK.
OK.
>> Publiek: Eintlik, gaan na die [onhoorbaar]
David J. MALAN: Goed.
Publiek: [onhoorbaar].
David J. Malan Presies.
Linkerkant beteken gaan na x.
x is adres.
Dit is soos 33 Oxford Street, of OX1.
En ster x beteken gaan na daardie spreek en dit wat daar?
42.
>> So ja, dit is presies wat Nick het.
Hy het begin met deur, wese, verstandelik
wys 'n vinger na x, na aanleiding van die pyl
om die wit blokkie op die regterkant kant, en om die nommer 42 is daar.
Maar toe het dinge 'n bietjie gevaarlik, reg?
Binky se oor sy kop te verloor.
>> Star y is gelyk aan 13, slegte geluk, beteken wat?
So ster y middel gaan na die adres in y.
Maar wat is die adres in y?
Alle reg, dit is vullis waarde, reg?
Ek het dit as 'n vraagteken.
Nick het dit as 'n krul pyl.
En so gou as wat jy probeer om te doen ster y, sê daar gaan,
maar daar is nie 'n wettige adres, dit is 'n paar valse plek,
die program gaan crash.
En Binky se kop gaan vlieg af hier, soos dit gedoen het.
>> So op die ou end, is hierdie program was net plat fout.
Dit was 'n karretjie program.
En dit nodig om te bepaal moet word.
En die enigste manier om werklik te los dit sou wees, byvoorbeeld, hierdie lyn,
wat ons het nie eens nie, want te gou die program neergestort het.
Maar as ons dit op te los, wat effek het om y gelyk x hê?
Wel, dit wys in wese y op watter waarde x wys op.
>> So in Nick se storie, of Binky se storie, beide
x en y is wat dui op die wit deel van die geheue,
sodat, uiteindelik, wanneer jy nie ster y is gelyk aan 13 weer
beland jy om 13 in die toepaslike plek.
So al hierdie lyne is perfek wettige, behalwe vir hierdie een,
toe dit gebeur het voordat jy eintlik wat y waarde.
>> Nou gelukkig, jy doen nie het om te redeneer deur al
van hierdie soort van probleme op jou eie.
Laat my gaan voort en maak 'n terminaal venster hier
en maak vir net 'n oomblik, 'n super kort program wat
ook is 'n soort van nutteloos.
Dit is lelik.
Dit maak nie bereik nie nuttig.
Maar dit beteken demonstreer kwessies geheue, so laat ons neem 'n blik.
>> Main, super eenvoudig.
Dit is dan blykbaar 'n funksie, f, en dan terug 0.
Dit is soort van moeilik om te gemors dit op.
So Main is redelik goed, so ver.
>> So f is problematies.
En net het nie veel sit moeite in die noem dit
Hier is die fokus op die kode te hou.
f het twee lyne.
En laat ons sien wat nou aangaan.
So aan die een kant here-- en laat my
hierdie ooreenstemming met die vorige example-- aan die een kant,
die linkerkant is doen wat, in Engels?
Dit is--
Publiek: Skep 'n wyser.
David J. Malan skep van 'n muis na 'n int en noem dit x.
Dit is dus die skep van een van die bokse Ek hou tekening op die touch screen.
En nou, op die regterkantste kant, malloc, natuurlik,
is die toekenning van 'n stuk van die geheue.
En net om duidelik te wees, hoe veel geheue is dit blykbaar
toekenning, as jy net soort doen die wiskunde hier?
>> So dit is 40 grepe.
En ek weet dat net omdat ek weet 'n int, op die CS50 toestel, ten minste,
is vier grepe.
So 10 keer 4 is 40.
So dit is 'n stoor x, die adres van die eerste uit 40 ints wat
is die ruimte terug toegeken is, terug, terug, terug.
>> En dit is wat die sleutel van malloc.
Dit maak nie 'n bietjie geheue neem hier, 'n bietjie hier, 'n bietjie hier.
Dit gee jou 'n stuk van die geheue, aansluitend, van die bedryfstelsel
stelsel.
>> Nou wat oor hierdie, x bracket 10 is gelyk aan 0?
Arbitrêre reël van die kode.
Dit maak nie bereik nie nuttig.
Maar dit is interessant, omdat x bracket 10--?
Ja?
>> Publiek: [onhoorbaar]?
>> David J. Malan x bracket 10 hoef nie nul wees.
Die nul detail kom slegs in die spel met snare, aan die einde van 'n string.
Maar 'n goeie gedagte.
>> Hoe groot is hierdie verskeidenheid, selfs al het ek nog toegeken 40 grepe?
Dit is deur middel van nege 0, reg?
Dit is 10 ints, totaal.
40 grepe, maar 10 ints, kruip 0 tot 0.
>> So wat is dit x bracket 10?
Dit is eintlik 'n paar onbekend vullis waarde.
Dit is die geheue wat nie aan my behoort.
Ek moet raak nie dat byte nommer 41, 42, 43, 44.
Ek is effens te ver.
>> En inderdaad, as ek hardloop hierdie program, is dit dalk baie goed crash.
Maar soms, sal ons gelukkig is.
En so net om te demonstreer this-- en eerlik,
jy weet nooit wat jy laat it-- nie se hardloop nie.
Dit het nie eintlik crash.
>> Maar as ek dit verander, vir Byvoorbeeld, om te wees soos 1000,
dit werklik doelbewuste, laat ons sien
As ons dit kan kry hierdie tyd te crash.
OK, het dit nie crash.
Hoe oor 100,000?
Kom ons remake dit, en nou tik dit.
OK.
Sjoe.
Alle regte.
So glo, weer, hierdie segmente van die geheue, so te sê,
is redelik groot, sodat ons kan kry gelukkig weer en weer.
Maar uiteindelik, wanneer jy belaglik en regtig ver uit op die skerm,
jy raak geheue wat regtig, regtig nie aan jou behoort.
>> Maar eerlik, hierdie vorme van foute gaan
te wees harder en harder om uit te vind op jou eie.
Maar gelukkig, as programmeerders, ons het gereedskap wat ons in staat stel om dit te doen vir ons.
So, dit is, miskien, 'n van die lelikste programme,
selfs leliker as gdb se uitset.
Maar dit is altyd 'n lyn of twee wat super nuttig.
>> Valgrind is 'n program wat help jy nie ontfout 'n program, per se,
maar vind geheue-verwante probleme, spesifiek.
Dit sal outomaties hardloop jou kode vir jy en kyk vir ten minste twee dinge.
Een, het jy iets doen toevallige soos touch geheue
wat nie aan jou behoort?
Dit sal jou help om daardie gevalle.
>> En twee, sal dit help jy iets genoem vind
geheue lekkasies, wat ons heeltemal geïgnoreer, naïef,
vir 'n geruime tyd en salig.
Maar dit blyk, al hierdie tyd, wanneer
jy getString ingeroep so baie van ons programme,
jy die bedryfstelsel is te vra stelsel vir die geheue,
maar jy het 'n herinnering ooit gee dit
terug, doen unalloc, of vry, soos dit genoem word.
Nee, want ons het nog nooit gevra om dit te doen.
>> Maar al hierdie tyd, die programme jy is skryf in C
is lek geheue, vra die bedryfstelsel
stelsel vir meer en meer geheue vir strykers en noem maar op,
maar nooit oorhandig dit terug.
En nou is dit 'n bietjie van 'n oorvereenvoudiging,
maar as jy al ooit loop jou Mac of jou rekenaar vir 'n geruime tyd, opening
baie van die programme, Miskien sluiting programme,
en selfs al is jou rekenaar het nie neergestort,
dit is om so veel stadiger, asof dit werklik
gebruik van 'n baie van die geheue of hulpbronne, selfs al is,
as jy nie eens raak die klawerbord,
wat kan be-- maar nie always-- kon wees dat die programme wat jy loop
hulself geheue lekkasies.
En hulle bly vra die bedryfstelsel vir meer en meer geheue, maar vergeet oor dit,
nie eintlik om dit te gebruik nie, maar dus neem geheue weg
uit ander programme wat dit dalk wil.
So dit is 'n algemene verduideliking.
Nou hier is waar Valgrind se produksie is heeltemal
gruwelike aan diegene wat minder en meer gemaklik gelyk.
Maar die interessante dinge is reg hier.
Dit is vir my 'n ongeldige skryf van grootte vier gebeur in hierdie program,
in die besonder, op lyn 21 van memory.c.
>> As ek gaan na reël 21, hm, is daar inderdaad is 'n ongeldige skryf van grootte vier.
Hoekom grootte vier?
Wel, hierdie number-- en dit kon anything-- wees, is 'n int.
Dus is dit vier grepe.
So ek is om vier grepe waar hulle nie hoort nie.
Dit is wat Valgrind is my eintlik vertel.
Verder sal dit ook sê vir my, soos ons sal sien,
as jy loop dit in 'n toekomstige pset, indien en wanneer jy die geheue, wat inderdaad het uitgelek
Ek het, want ek het genoem malloc, maar ek het nie eintlik
genoem word, in hierdie geval, gratis, wat ons sal uiteindelik sien
is die teenoorgestelde van malloc.
>> So nou, dink ek, 'n finale voorbeeld.
So hierdie een is 'n bietjie meer arcane, maar dit is dalk
Die grootste rede vir wees versigtig met die geheue,
en die rede dat baie programme en / of web bedieners, selfs tot vandag toe,
is oorgeneem deur die slegte ouens iewers op die internet wat een of ander manier
stuur valse pakkies na jou bediener probeer om jou rekeninge te onderhandel,
of neem jou data, of net algemeen oor te neem van 'n masjien.
Buffer oorloop, as die naam aandui, beteken
oorloop nie 'n int, maar 'n buffer.
En 'n buffer is net 'n fancy manier sê dit is 'n klomp van die geheue.
>> En inderdaad, ek het 'n string voor buffer, in plaas van s.
Want as dit is 'n buffer, soos in die YouTube sin,
of enige tyd wat jy 'n video is te kyk, Jy kan gesien het die woord buffer,
dot, dot, dot.
Dit is ongelooflik irriterende.
En dit net beteken dat jou video speler
probeer baie om af te laai grepe, baie van grepe
van 'n video van die internet.
Maar dit is stadig, so dit is probeer 'n klomp van hulle af te laai
'n buffer, 'n houer, sodat in te vul jy genoeg grepe wat dit kan dan
wys die video, sonder voortdurend pousering.
Maar dit blyk, jy kan 'n buffer na hierdie groot.
Maar probeer dit baie data in te sit dit, en baie slegte dinge kan gebeur.
So byvoorbeeld, laat ons kyk na Hierdie finale teaser van 'n voorbeeld.
Dit is 'n ander program wat met die eerste oogopslag,
doen niks super nuttig.
Dit het 'n Main funksie wat vra dat funksie, f.
En daardie funksie, f, hier, het 'n kar skikking, genaamd c, grootte 12.
En dan is dit die gebruik van hierdie nuwe funksie genoem strncpy.
>> Dit blyk dat, met hierdie eenvoudige, eenvoudige reël van die kode, net twee lyne,
ons het my hele program gemaak, en daarom, my hele rekenaar,
en my rekening, en my hard ry potensieel kwesbaar vir iemand
wie weet, en is goed genoeg om te hardloop hierdie program met 'n sekere opdrag lyn
argument.
Met ander woorde, as dit slegte ou sit binnekant van argvargv [1] deur te tik
op die klavier 'n baie spesiaal gemaak string, nie ABC, 123, maar in wese,
binêre simbole wat verteenwoordig uitvoerbare kode, 'n program wat hy of sy geskryf het,
Met hierdie eenvoudige program wat verteenwoordiger van duisende van die programme
wat soortgelyke kwesbare, daresay, hy of sy uiteindelik kan verwyder al
die lêers op my hardeskyf, 'n flikkerende vinnige, sodat hy of sy kan
tik opdragte op hul eie, e-pos al die lêers te myself.
Enigiets wat ek kan doen, het hy of sy kan doen met hierdie kode.
>> Ons sal nie heeltemal los dit nog nie.
En in die feit, dit gaan behels 'n bietjie prentjie
soos hierdie, wat ons binnekort sal kom om te verstaan ​​al hoe beter.
Maar vir vandag, laat eindig op Wat is, hopelik, 'n bietjie meer
verstaanbaar Kletskerk grap, totdat ons weer volgende keer.
Alle regte.
Sien julle op Woensdag.
>> [Speel van musiek]
>> Spreker: En nou, diep gedagtes, deur Daven Farnham.
Memory is soos spring in 'n hopie goue blare op 'n Sondagmiddag.
Wind waai, gooi jou hair-- O, ek mis die dae when--
>> [Gelag]