[Muusika mängimine]
>> DAVID J. Humala: Olgu.
See on CS50.
Ja see on algus 5. nädalal.
Ja nagu te võib-olla märganud, mõned materjali
muutub veidi rohkem keeruline, vähe tihedam.
>> Ja see on väga lihtne, eriti kui olete olnud kombeks juba mõnda aega,
et ta püüab kritseldus alla kõige kõik, mida me teeme, me ütleme klassis.
Aga mõistma, et ei ole võib-olla ideaalne pedagoogiline lähenemine
õppimisele sellist materjali, ja materjali üldisemalt.
Ja nii on meil hea meel teatada, et CS50 enda Gheng
Gong on hakanud valmistama kanooniline kogum märkmed
jaoks muidugi lootuses mis on see üks neid
kasutata mitte üksnes viide ja ressursside
läbivaatamise materjal ja läheb tagasi läbi materjali, mis võib olla
põgenes sa esimest korda ümber, kuid ka nii, et teie juhid saavad olla
üles kui alla, kui see on aeg õpetada,
nii et võite alustada rohkem mõtlikult, nagu
mitte rohkem scribbly.
>> Olles seda öelnud, mida võite leida Kodulehel on selliste dokumentide nagu see.
Ja teate, üleval vasakul, seal mitte ainult sisukorra,
vaid ka aja koodid kohe hüpata sind
sobiva osa aastal video online.
Ja mis Chang siin teinud on sisuliselt dokumenteeritud
juhtus see eriti loeng.
Ja paljud loengud on juba praegu online selle URL.
Ja me jätkame postitada ülejäänu nende poolt käesoleva nädala lõpuks,
nii et ärge ära, et ressurss.
>> Nii et ilma pikema jututa, hakkasime koorida tagasi
kihti, mis on olnud string mõnda aega.
Ja mida me ütleme, string tegelikult on eelmisel nädalal?
Nii char star.
Ja char star, noh, mis Kas see tegelikult tähendab?
Noh, kõik see aeg, kui me oleme nõudnud funktsioon,
nagu getString ja ladustamine nn tulu
väärtus getString sisse variable-- seda nimetatakse
s tüüp string-- oleme olnud kirjalikult koodirida seal eespool.
Ja see on ainult siis, kui ma näen oma käekiri suurendatud siin
ma aru, kui julmad on.
>> Kuid oletame, et paremal servas
on sellegipoolest mõistlik kirjeldus selle kohta, mida on
kestnud see kõik aega getString.
getString muidugi saab string.
Aga mida see tegelikult tähendab?
See tähendab, et ta saab patakas mälu, operatsioonisüsteem
helistades funktsioon, nimetatakse malloc.
Aga rohkem sellest hiljem.
Ja siis populates et patakas mälu
tähtedega kasutaja trükitud, millele järgneb loomulikult
null iseloomu või längkriipsu null päris lõpus.
>> Vahepeal vasakul küljel see lugu, kõik see aeg,
me oleme kuulutab muutuja, nagu s.
Ja see muutuja on see, mida nüüd hakkab kutsudes pointer.
See ei ole kasti, mille sees paneme string, Daven iseenesest
vaid me paneme selle ruutu vasakul asuvasse kasti mida täpselt?
Jah?
>> Sihtrühm: aadress kus see asub mälus.
>> DAVID J. Humala: Täpselt.
Aadress, kus Daven asub mälu.
Ja mitte siis, kui kõik Daven asub, per se, vaid just aadress
mida?
Jah?
>> Sihtrühm: Esimene märk.
>> DAVID J. Humala: esimene märk aastal Daven, mis käesoleval juhul
Pakkusin oli omavoliliselt ja ebareaalselt 1 OX1,
mis tähendab lihtsalt kuueteistkümnendsüsteemis number 1.
Aga see on ilmselt läheb olla palju suurem arv
et me võiksime teha koos 0x eesliitena,
esindavad kuueteistkümnendsüsteemi iseloomu.
Ja kuna me ei pea teadma, kus ülejäänud tegelased Daven
on, sest mida lihtsa konstruktsiooniga otsus, mis tehti mitu aastat tagasi?
Jah?
>> Sihtrühm: Kurakaldkriips 0.
DAVID J. Humala: Jah, täpselt nii.
Kenoviiva 0 saab, ehkki lineaarset aega, et läbida string,
kõndida vasakult paremale, koos loop, või kui
loop, või midagi sellist et, ja määrata, oh, siin
on lõpuks selle konkreetse stringi.
Nii lihtsalt aadress alguses string,
suudame kogu , sest kõik see samas
string on just char star.
>> Nii et see on kindlasti trahvi kasutamist jätkata CS50 raamatukogu ja selle võtmiseks,
nii rääkida, kuid me algab täpselt näha
mis on kestnud all kogu aeg.
Nii et te mäletate seda näiteks Ka viimast korda, võrrelda 0,
mis tegelikult ei võrrelda.
Aga hakkasime seda lahendada.
>> Aga kui ehk täiendkoolitus, võib I huvita kedagi
roosa elevant täna Samuti valmistatakse Chang?
Kuidas sul ees? [Kuuldamatu].
Tule.
>> Ja vahepeal kui sa tulla, lähme
kaaluda hetkeks, mida see kood oli tegelikult teevad.
See kuulutab kahe muutuja üles top, s ja t, ja kutsudes getString.
See ei ole väga kasutajasõbralik programm, sest see ei ütle teile, mida teha.
Aga oletame, et me oleme keskendudes mahlane osa.
Ja siis me teeme, kui s võrdub võrdub t, see peaks ütlema printf,
tipitud sama asi.
Tere.
Mis su nimi on?
>> Janelle: Janelle.
DAVID J. Humala: Janelle, Meeldiv tutvuda.
Nii et teie väljakutse käsi selle elevandi
on kõigepealt teha meile pildi sellest, mis on olla esindatud kahe esimese
read.
Nii s ja t olla esindatud kuidas ekraanil?
Ja sa võid teha seda sõrme selle kinolinale.
>> Nii et seal on kaks poolt, et Mõlemal pool sellest võrrandist.
Nii et seal on s vasakul ja siis getString paremal.
Ja siis on t vasakul, ja siis getString paremal.
Niisiis, kuidas võiks hakkame joonistan selle
esindab, mis toimub siin mälu, mis te ütlete?
Ja lubage mul teile seletada mida sa teed, kui sa lähed.
>> Janelle: OK.
Noh, esiteks, oleks küsida teil saada sisend string.
Ja see oleks store-- oh, sorry.
DAVID J. Humala: OK.
Väga hea.
Ja seda nimetatakse, mis?
Oh, OK.
Lase edasi.
Ma ei tahtnud segada.
Janelle: Vabandust.
Seega oleks sisend see aadress of-- ei ole kindel.
Ma ei saa täpselt mäleta number, aga ma usun, et see oli alustades 0.
>> DAVID J. Humala: See on kõik õige, sest ma tegin numbrid üles
seega ei ole õige vastus.
>> Janelle: Alustades 0 kaar.
>> DAVID J. Humala: OK, nii element 0.
Muidugi.
>> Janelle: Ja siis, kui oli nagu lihtsalt kahe letter--
>> DAVID J. Humala: OK, tagasi.
>> Janelle: Nii element 0, ja siis element 1 või element 2.
DAVID J. Humala: Ja mis tükk picture sa joonistad kohe?
Kõne getString?
Või deklaratsiooni s?
>> Janelle: deklaratsioon s, ma usun.
Oh, getString, sest see põhjustaks saab sisestada igasse [? piirkonnas. ?]
>> DAVID J. Humala: Hea.
Täpselt.
Isegi kui see tegelikult tagastab massiivi, tagasikutsumine,
kui me tagasi string, saame indeksi sellesse string kasutades 01 ja 2.
Tehniliselt on need ilmselt esindatud üksikute aadressid,
aga see on hea.
>> Olgu, oletame, kui ma ei saa lihtsalt kiire edastab kus pooleli jäime
Viimane kord, kui üks keelpillidele g b e,
längkriipsu 0, seega esindavad Gabe sisend, kuidas võiks me esindame s nüüd?
Kui see on mälu, mis on tagastatud getString?
>> Janelle: Kas oleks esindab kaar?
>> DAVID J. Humala: kaarega?
Noh, ei.
Ütleme lihtsalt, piltlikult, Lubage mul minna
ning teeb ettepaneku, et kui see on s, see on tagastatav väärtus getString.
Ja olete juhtinud seda kui 0, 1, 2, mis on täiesti mõistlik, sest me
saavad indeks arvesse string, kui sellist.
Aga et see oleks kooskõlas Viimane kord, lubage mul minna
ja omavoliliselt ettepanek, et käesolev on aadress 1, on see aadress 2
see on aadress 3, ja nii edasi.
Ja nii, lihtsalt super selge, mis toimub
minna sid tulemusena, et esimene rida koodi, mis sa arvad?
>> Janelle: Aadress 1?
>> DAVID J. Humala: Täpselt.
Nii et lahendada 0x1.
Ja vahepeal, lubage mul minna ja dubleerida palju sellest, mida sa oled teinud
ja lisada oma t siin.
Kui ma kirjuta Gabe jälle teist korda
kui neile getString, kus, Loomulikult on Gabe lähe?
Noh, presumably--
>> Janelle: Nagu siin?
DAVID J. Humala: Jah.
Janelle: Või see on ka sama kasti?
DAVID J. Humala: Las ma ettepaneku, jah, täpselt, nii et need täiendavad kastide.
Aga mis peamine on see, et isegi kuigi ma olen koostanud neid üsna lähedal
koos-- 0x1, seda on 0x2-- tegelikkuses
see nüüd võib olla aadress 0x10, Näiteks ja 0x11 ja 0x12,
ja nii edasi.
Ja nii, kui see on nii, mis läheb lõpuks siin t?
>> Janelle: 0x10?
DAVID J. Humala: Täpselt.
Nii 0x10.
Ja nüüd, viimane küsimus.
Olete kaugelt pidid töötama raskeim elevant siiani.
Tänaseks, kui ma tõmba kood uuesti, kui ma seda teen, vastavalt kolm,
kui s võrdub võrdub t, mida ma olen tegelikult võrreldes seda oleme tõmmata?
>> Janelle: kaks aadressi?
DAVID J. Humala: Täpselt.
Nii et ma ütlen on s võrdne võrdne t?
Teisisõnu on 1 võrdne võrdne 10?
Ja muidugi Selge vastus on praegu, ei.
Ja nii on see programm on lõppkokkuvõttes trükkimineku mida, sa ütleksid?
>> Janelle: kas see oleks, tipitud sama asi?
>> DAVID J. Humala: Nii et kui s on 1 ja t on 10?
>> Janelle: Sa kirjutasid erinevaid asju.
>> DAVID J. Humala: Täpselt.
Tipitud erinevaid asju.
Olgu.
Nii et aplaus, Kui me võiksime siin.
[APPLAUSE]
See oli valus.
Ma tean.
Ilusti tehtud.
Nüüd vaatame, kui me ei saa tease peale mida fix oli.
Ja muidugi, kui me fikseeritud see-- mis ma nüüd esindan Green--
tegime paar lisaseadmeid siin.
Esiteks, nagu meelerahu vaadake, ma olen esimene kontrollimine
kui s võrdub null ja t võrdub null.
Ja lihtsalt olla selge, kui võiks s või t on null koodi nagu see on?
Kui võib s või t on null.
Jah?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Täpselt.
Kui string, et kasutaja tipitud on liiga pikk
sobituda mälu või mõned imelik nurgas juhul niimoodi,
getString, nagu me näeme, sõna otseses mõttes täna oma dokumendid,
ütleb, et ta naaseb null nagu eriline valvur väärtus,
või lihtsalt omamoodi eriline sümbol see tähendab, et midagi läks valesti.
Nii et me tahame kontrollida et, sest selgub,
et null on väga ohtlik väärtust.
>> Sageli, kui sa püüad teha midagi null kaasates funktsioon-- kulgeb see
sisendiks jaoks instance-- et funktsioon võib väga krahhi ja koos sellega
võtta ette kogu oma programmi.
Nii et see kolmas rida on praegu lihtsalt meelerahu kontrollida, vigade kontrolli, kui soovite.
See on hea harjumus nüüd meil sattuda igal ajal me
proovida kasutada väärtust, mis võiks potentsiaalselt olla null.
>> Nüüd, neljandas reas siin "Kui strcmp (s, t)," hästi,
mis see viidates?
Noh, me ütlesime, et see oli väga lühidalt nimega funktsiooni sõnede.
Ja tema eesmärk elus on võrrelda tema esimene argument selle vastu teine,
kuid mitte poolest aadressid nagu tegime tahtmatult hetk
tagasi punase koodi, kuid pigem võrrelda nende kahe
stringid inimlikult arusaadav kuidas võrrelda seda vastu,
selle vastu, selle vastu, ja siis peatada juhul kui üks
või mõlemad sõrmi tabab längkriipsu 0.
Nii et keegi aastat tagasi ellu strcmp rakendada meile funktsionaalsus
et me lootsime me oleks saanud lihtsalt võrrelda kahte lihtsat väärtused.
>> Nüüd ausalt öeldes, ma hoida joonistus kõik need mitmesuguseid numbreid.
Aga reaalsus on see, ma olen muutes need üles kogu aeg.
Ja las ma lihtsalt minna ja kirjuta need välja
muuta punkti, et aasta lõpus päeval ja liigub edasi,
me tõesti ei kavatse hooli mis käsitleb asjad on tegelikult
mällu.
Nii et ma ei kavatse teha neid liiki numbrid, et palju enam,
Ma olen lihtsalt abstraktne see ära vähe sõbralikum lihtsalt nooled.
>> Teisisõnu, kui s on osuti noh, olgem lihtsalt joonistada, sõna otseses mõttes,
noolena, nool enesest midagi muud,
ja ei muretse liiga palju lähemalt eritunnuste need aadressid
mis jällegi tegin ikkagi.
Aga me näeme neid aadresse, mõnikord, kui silumine koodi.
>> Nüüd vahepeal see programm siin fikseerib, muidugi,
et probleemi võrdlemisel need kaks stringi.
Aga me sattusime veel üks probleem.
See oli koopia programmeerida viimane kord,
kusjuures, ma üritasin ära lihtsalt esimene märk string.
Aga mis oli selle sümptomiks nägime viimast korda, kui
kasutaja tipitud väärtus, nagu Gabe väiketähtedega, S,
siis määrati s arvesse t, nagu kolmandale reale seal
ja siis ma proovisin ära t sulg 0?
Milline oli mõju muutes t sulg 0 here?
>> Sihtrühm: See muutis s.
>> DAVID J. Humala: Jah, Muutsin s, samuti.
Sest mis tegelikult toimub?
Noh, las ma vaatan, kas ma suudan puhastada kuni seda pilti, järgmiselt.
>> Kui s on jällegi sõna g, a, b, e, längkriipsu, 0 ja s
jätkame joonistus karbis siin, kuid mitte rohkem aadresse.
Olgem lõpetama asju.
Lihtsalt joonista pilt lihtsustada maailma.
>> Kui ma kuulutada t nööriga t, mis tekitab, et patakas mälu.
Square juhtub olema 32 bittide enamik arvuteid.
Tegelikult, kui sa oled kunagi kuulnud arvuti, millel 32-bitise arhitektuuri
tõesti fancy-räägivad, et lihtsalt tähendab, et ta kasutab 32-bit aadressid.
Ja kui tehnilist kõrvale, kui sa oled kunagi mõelnud,
miks vanemad arvutid, kui sa tegelikult proovisin supp neid palju RAM,
võiks ainult olla maksimaalselt neli gigabaiti operatiivmälu,
hästi, et sellepärast, sõna otseses mõttes, vana arvuti võib ainult
loendada 4 miljardit eurot, 4 miljardit baiti,
sest see oli kasutades 32-bitise numbrid aadressid.
>> Kuid igal juhul on käesolevas Näiteks lugu on palju lihtsam.
t on lihtsalt üks pointer, või tegelikult char star, aka string.
Ja kui ma tahan uuendada seda pilti nüüd, et teine ​​rida koodi,
pärast dot, dot, dot?
Kui ma teen string t võrdub t semikooloniga kuidas seda pilti muuta?
Jah?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Jah.
Täpselt.
Ma lihtsalt panna nool t kasti sama aadress,
Samal esimene kiri andis.
Või tehniliselt, kui see mees oli ikka 0x1,
see on nii, nagu mul oli 0x1 siin ja 0x1 siin.
Aga jälle, kes hoolib umbes aadressid?
See on lihtsalt mõte, et nüüd on oluline.
Nii et see on see, mis siin toimub.
Nii et loomulikult, kui sa t sulg 0, mis on massiiv indeks,
muidugi-- ja ausalt, tundub nagu seal massiivi siia,
kuid nüüd on see imelik asi.
Tea, et programmeerimise keel, C, pakub seda funktsiooni,
kusjuures, isegi kui t on pointer, või s on osuti,
saate endiselt kasutada, et tuttav, mugav nurksulg
märge, et minna esimest osa, või teine ​​element või mõni element
et selle osuti osutab et kuna eeldatavalt see
on, nagu antud juhul, osutavad mõned massiivi.
>> Niisiis, kuidas me seda parandada?
Ausalt, see on koht, kus ta sai vähe valdav esimesel pilgul.
Aga siin on uus ja parandatud versioon.
>> Nii et esimene, ma saan lahti CS50 raamatukogu
lihtsalt paljastada, et S on tõepoolest char star, vaid sünonüüm.
Ja t on ka char star.
Aga mis toimub aasta paremal pool seda joont
kus t on määratud väärtus?
>> Mis on malloc?
Mis see strlen?
Mis on sizeof (char)?
Miks kurat seda teeb line vaadata nii keeruline?
Mida see teeb kõrgel tasemel?
Mida see salvestamine t?
Jah?
Sihtrühm: See eraldamise teatud mälumahtu.
See on salvestada, ma arvan, kirjad [kuuldamatu].
>> DAVID J. Humala: Perfect.
Perfect.
See eraldades teatud mälumahtu
talletada, arvatavasti tulevikus tähed.
Ja eriti, malloc Seetõttu tagastamise?
>> Sihtrühm: Tulles [kuuldamatu]?
DAVID J. Humala: Täpselt.
Tulles aadress, et mälu mis on fancy viis öelda,
tagastab aadress Esimene bait, et mälu.
Kohustuseks on mind meeles kui palju mälu ma tegelikult
eraldatud või küsis malloc eest.
>> Nüüd, kui palju see on?
Noh, isegi kui seal on palju sulgudes siin
malloc võtab vaid ühe argumendi.
Ja ma täpsustades strlen s, et anda mulle nii palju baite kui on s,
kuid lisage esimene kommentaar.
Miks?
Jah?
>> Sihtrühm: Kenoviiva 0.
DAVID J. Humala: Täpselt.
Me peame tegema veidi majapidamine.
Nii, sest seal on längkriipsu 0, siis on parem meeles pidada.
Vastasel juhul me ei kavatse luua string et
ei ole see eriline terminaator.
>> Vahepeal lihtsalt super anal, mul sizeof (char)
igaks juhuks keegi jookseb minu kood on CS50 seade,
aga võib-olla mõne teise arvutiga kokku, kus tähemärki
on üks bait, kokkuleppeliselt, kuid kaks baiti, või midagi suuremat kui see.
See on lihtsalt super, super tõrksad vigu.
Kuigi tegelikult on see kõige tõenäolisemalt saab olema 1.
>> Nüüd, vahepeal ma minna ja kopeerida string, t sulg i võrdub t sulg s.
Ja ma alistuma eelmisel nädalal lähtekoodi näha, mis toimub.
Aga peamine Buffee ja Põhjus, miks ma panna koodi nüüd roheline
sellepärast, et kõige viimane rida, t sulg 0 võrdub toupper,
tagajärg on ära mis string?
t ja / või t?
See viimane rida koodi.
>> Just t, sest see, mis on juhtus seekord
kui ma veidi tagasi võtta, et viimane samm, mis juhtus, kui ma kutsun malloc,
Ma põhimõtteliselt saan patakas mälu mis on sama suur kui originaal,
sest see on aritmeetiline tegin.
Ma salvestamine t aadress Selle patakas mälu.
Kuigi see tundub kena ja ilus, kena ja tühi,
reaalsus on olemas, mida jagame hoiab helistades, prügi väärtused siin.
See patakas mälu võiks väga samuti on kasutatud enne,
paar sekundit, paar minutit tagasi.
Nii et võib täiesti olla numbrid või tähed seal, lihtsalt juhus.
Aga nad ei ole kehtiv, kuni ma ise asustada see patakas mälu
tegelike tähemärki, nagu ma teha, et vimka.
Olgu?
>> Nüüd, kliimaksi need kolm näidet
mis näiliselt purustatud viimane kord, Selle Vaheta näiteks seda funktsiooni
töötas selles mõttes, et vahetasid ja b.
Aga see ei tööta, mida muud mõtet?
Jah?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Täpselt.
Kui ma nimetan seda funktsiooni alates järgmise-- näiteks
alates funktsioon nagu peamine, kus Mul on muutuja x ja y, nagu ma
tegi eelmisel nädalal sama kood ja ma läbima x ja y
Vaheta ja seejärel helistada Swap-- see, Muidugi on õige versioon
on see, mida me parasjagu vaadake-- see ei tööta.
Mis on fix?
>> Noh, nii lihtsalt olla selge, lubage mul minna
ja-- anna mulle üks sekund siia ja vaata kui ma näitan sulle viimane, mis
on sisse-- vaatame, kas ma ei leia Selle tegelik fast-- OK, [kuuldamatu].
OK, seal ta on.
Nii ignoreerida käske ma kirjutades.
Ma tahan, et see alla laadida aadressil viimase hetke näide
alates viimane kord, mis on nüüdsest ei Vaheta.
>> Nii ei Swap on koht, kus jätsime maha viimase aja
kusjuures, ma vormindatud x 1 ja y 2.
Ma siis helistan Vaheta, möödaminnes 1 ja 2.
Ja siis see funktsioon töötanud mõnes mõttes,
kuid see ei olnud püsiv tagajärjeks on x ja y.
Seega on küsimus käepärast on, kuidas nüüd kas me tegelikult seda probleemi lahendada?
Mis on lahendus käepärast?
>> Noh, swap.c, mis on uus täna märgata paari erinevusi.
x ja y on sama.
Aga mis on selgelt erinevad umbes liin 25?
Mida uut on, kui sa mäletad mida ta nägi välja nagu hetk tagasi?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Jah.
Nii ampersandid on uus tükk süntaksi mitte ainult selle programmi,
vaid ka üldisemalt CS50.
Praeguseks ma ei usu, oleme näinud näiteid
või tegelikult rääkisid need mingil detail, välja arvatud võib-olla, preemptively
jaos, ampersand niimoodi.
Noh, selgub ampersand on üks viimase tükki uue süntaksi
me ei kavatse õppida.
Kõik see tähendab, aadress mõned muutuja.
Millisel aadressil see x elada?
Aga mis aadress see y elada?
Sest kui Põhiprobleemiks enne
oli see, et x ja y on möödutakse koopiad, mida me tõesti tahame teha
on pakkuda Swap koos nagu aare Kaart, mis viib kus x ja y on tegelikult
on RAM, nii et Swap on võimalik jälgida, et kaart
ja minna sinna, kus x ja y tähistab kohapeal ja muuta tegelikke väärtusi 1 ja 2
seal.
>> Nii Swap peab muutuma veidi liiga.
Ja esmapilgul võib see tunduda natuke sarnane char star.
Ja seda ta tõepoolest on.
Nii on viit, mis tüüpi andmeid, põhinevad esile osa?
Nii et see on int.
>> Nii et ei ole enam keskmine, see aadress int.
Ja samamoodi, b on nüüd olevat aadressi int.
Nii et kui ma nüüd helistada Swap Main, Ma ei kavatse anda Swap 1 ja 2.
Ma annan ta nagu Ox-midagi ja Ox-midagi,
kaks aadressi, mis viib Vaheta oma tegelikke asukohti
minu arvuti mällu.
>> Nii et nüüd, mu ülejäänud rakendamine on vaja muuta tad.
Mis on ilmselt erinev nüüd Nende kolm rida koodi?
Seal on need kuradi kõik tähed üle koht, eks ole?
Mis siis toimub?
Jah?
>> Sihtrühm: See on ilmselt [kuuldamatu].
>> DAVID J. Humala: Täpselt.
Nii selles context-- ja see ei olnud Parim disain otsus tõsi,
aastat tagasi.
Selles kontekstis, kus sa lihtsalt pead star,
ja sa ei pea andmete tüüp, nagu int, kohe vasakule,
selle asemel pead võrdusmärk, selgelt, Selles kontekstis, kui te ütlete, star,
see tähendab, et minna aadress, mis on in.
Jälgi aare kaart, nii rääkida.
>> Ja vahepeal kooskõlas 37, see tähendab, et sama asi.
Mine aadress ja panna mida seal?
Mis iganes on asukohta, b täpsustatud.
Teisisõnu, minge b.
Võta see raha.
Mine ja kohta, mis võrdub kirjutama, omistamisoperaatorile,
panna, et raha seal.
>> Samamoodi int temp on lihtsalt int.
Midagi peab muutuma umbes temp.
See on lihtsalt vaba klaasi Annenberg mõned piima või apelsinimahla.
Aga ma ei pea ütlema, minge b.
Mine selle sihtkoha ja pane väärtus temp seal.
Niisiis, mis toimub siis?
Kui ma tegelikult helistada Vahetusega seekord kui see esimene plaat siin on Main,
Teise salve on vahetatavad, kui Annan ampersand x ja ampersand y
Main Vaheta, lihtsalt olla kindel, mis see on freimi vastuvõtva?
Jah?
>> Sihtrühm: [kuuldamatu].
DAVID J. Humala: Täpselt.
Aadress x ja aadress y.
Ja sa ei mõtle neid nagu postiaadressid.
33 Oxford Street ja 35 Oxford Street ja te
soovite teisaldada kaks hoonet mis on nendes kohtades.
>> See on omamoodi naeruväärne idee, kuid see on kõik, mida me mõtleme aadress.
Kui maailmas ei leiad need kaks ints?
Kui maailmas sa saad leida need kaks hoonet?
Nii et kui lõpuks, pärast kogu seda aega ma lähevad tänapäeva lähtekood ja kompileerida
Vaheta ja run ./swap lõpetuseks Esimest korda me tegelikult näeme, et
minu väärtused on tõepoolest välja vahetasid edukalt.
Ja nüüd on meil ka võtta teadmiseks see, ütleme, GDB.
>> Nii et lubage mul minna samasse faili.
Lubage mul minna ja joosta GDB kohta ./swap.
Ja nüüd Vaheta, ma lähen edasi ja määrata murdepunkti Main.
Ja nüüd ma lähen käia ja käivitage programm.
Ja nüüd me näeme oma koodi peatatud sel line.
>> Kui ma minna ja print x, mida ma peaksin siin näha?
See on küsimus.
Ütle uuesti?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Nii juhuslikke numbreid, võibolla.
Võib-olla ma saan õnnelik, ja see on kena ja lihtne, nagu 0.
Aga võib-olla see on mingi suvaline number.
Sel juhul, mul vedas.
See lihtsalt juhtub olema 0.
Aga see on tõesti õnn, sest mitte enne, kui ma
kirjuta järgmine ja siis print x on, et koodirida, joon 19, hukatud.
>> Vahepeal, kui ma kirjuta järgmine kord, ja nüüd välja printida y, ma lähen, et näha 2.
Nüüd, kui ma järgmisena, see läheb natuke segane, sest nüüd,
printf läheb ilmuvad ekraan, nagu ta seda tegi. x on 1.
>> Teeme seda uuesti.
Ja nüüd, siin on koht, kus asjad huvitavad.
Enne kui ma kutsun Vaheta või isegi samm sinna, võtame veidi piiluda.
x on jällegi 1.
Y on loomulikult kiire sanity kontrollige, 2, seega ei ole raske seal.
Aga milline on ampersand x?
Vastus, see on selline funky otsin.
Aga int star sulgudes on lihtsalt GDP viis öelda, et see on aadress.
See ei ole int, see pointer int, või muidu tuntud aadress.
>> Mis see on hull asi?
Me ei ole kunagi näinud midagi päris nii enne.
Nii et see on aadress, minu arvuti mälu, kus x juhtub elama.
See Ox-midagi.
Ja see on, ausalt öeldes, miks Olen hakanud joonistus nooled
numbrite asemel, sest kes tõesti hoolib
et teie int on eriti aadress, mis on nii suur.
Aga bffff0c4, need on kõik tõepoolest kuueteistkümnendarvudega,
mis on 0 kuni f.
>> Nii et me ei hakka liiga pikk mis asjad need on.
Aga kui ma välja printida y, muidugi, ma näen 2.
Aga ampersand y, ma näen seda aadressi.
Ja teate, uudishimulik, kuidas kaugel on x ja y?
Võite ignoreerida enamik aadress.
Neli baiti.
Ja see on kooskõlas meie varem väita, et kui suur on int?
Neli baiti.
Seega tundub, et kõik on vooder üles kenasti, kui võiks loota, mälestuseks.
>> Nii et nüüd, lähme lihtsalt kiiresti edasi et lõpuks see lugu.
Lähme edasi ja kirjuta samm, sukelduda Swap funktsiooni.
Nüüd teate, kui ma tüüpi, see on identne aadress x.
Kui ma B-tüüpi, see on identne aadressile y.
Mida peaks ma näen, kui ma ütleme, minna aadressile?
Nii printida star.
Nii täht tähendab minna, selles kontekstis.
Ampersand tähendab mis aadress.
Nii täht tähendab 1.
Ja print star b annab mulle 2.
>> Ja las ma eeldada, et praegu et vähemalt kood, mis
lähtub täita nüüd saab põhjendatud läbi niimoodi.
Aga me vaadata seda mõtet enne pikk.
Nii et see versioon Swap Nüüd on õige ja võimaldab
meid, et vahetada selle konkreetse andmetüübi.
>> Nii tekib küsimusi siis Swap?
On star?
On aadress?
Ja te näete, koos probleem komplekt 4, omamoodi,
kuid probleem seatud 5, kindlasti, kuidas need asjad on kasulik ja saada palju rohkem
meeldiv, nagu neile tulemuse.
Üldse midagi?
Olgu.
Nii malloc on jällegi see funktsioon et lihtsalt eraldab mälu, mälu
eraldamisel.
Ja miks on see kasulik?
Noh, kõik see aeg, olete kasutanud malloc.
Kui arvate nüüd, kuidas getString teosed, arvatavasti on see
küsinud keegi patakas mälu, igal kasutajal tüüpi string
aastal, sest me kindlasti ei tea, kui CS50 personal
kui suur need stringid, et inimesed lähed Võib-olla.
>> Nii et olgem esimest korda hakata Tõmmake kuidas CS50 raamatukogu tööd,
teel paar näidet mis viib meid sinna.
Nii et kui ma avada gedit ja avada scanf 0,
me näeme järgmine kood.
Scanf 0, mis on kättesaadav veebilehel täna, on suhteliselt vähe rida koodi
siin, 14 kuni 20.
Ja vaatame, mis ta teeb.
See kinnitab, int, mida nimetatakse x.
See ütleb midagi, number palun.
Ja nüüd ta ütleb, scanf% i, ja x.
Nii et seal on hunnik uusi asju seal.
>> Aga scanf, saate objekti arvan AS vastupidine printf.
printf muidugi trükib ekraanile.
scanf omamoodi skaneerib alates kasutaja klaviatuur midagi ta on trükitud.
>> % I on nagu printf.
See tähendab, oodata kasutaja sisestada int.
Ja nüüd, miks sa arvad, et ma võiks kulgeb scanf ja x?
Kui eesmärk on elu scanf on midagi saada kasutaja,
Mis tähendus on kulgeb see, & x, nüüd?
Jah?
>> Sihtrühm: [kuuldamatu].
DAVID J. Humala: Täpselt.
Mida ma ka, inimese, kirjuta, minu panus läheb salvestatakse selles kohas.
See ei ole piisav, mäletan, et lihtsalt läbima x, sest me oleme näinud juba,
iga kord, kui te liigu lihtsalt toores muutuja, nagu int, mõne muu funktsiooni,
Muidugi, see võib muuta, et varieeruv, kuid mitte jäädavalt.
See ei saa olla mõju Main.
See võib muuta ainult oma kohaliku koopia.
Aga kui selle asemel, sa ei pea mulle tegelik keskmine,
aga sa annad mulle suunad et int, ma nüüd, olles scanf,
kindlasti, võin järeldada, et lahendada ja pane number seal
nii et teil on juurdepääs ka seda.
>> Nii et kui ma saan selle programmi, vaatame.
Tee scanf 0 dot kaldkriips, Scanf 0.
Ja kui ma nüüd kirjuta number nagu 50, aitäh 50.
Kui ma nüüd kirjuta number nagu miinus 1, negatiivse 1.
Nüüd kirjuta number nagu 1.5, hm.
Miks minu programm ignoreerib mind?
Noh, sest lihtsalt, ma ütlesin ta oodata int ainult.
Olgu.
Nii et see on üks versioon sellest.
Võtame asju pügala ja ettepaneku, et see ei ole hea.
Ja siin on väga lihtne näide kuidas saame alustada kirjalikult koodi
et teised inimesed saavad kasutada või kompromisse tehes halbu asju.
Nii rida 16, nii sarnased vaimus, et enne,
aga ma ei tuvastanud int seekord.
Ma kuulutatakse see char star, aka string.
>> Aga mida see tegelikult tähendab?
Nii et kui ma ei täpsusta address-- ja Ma kutsun seda omavoliliselt, puhver,
aga ma ei saanud seda nimetada s, et simple-- ja siis ma seda teen, mulle selgitada,
kui saaksid, põhinevad eelmise loogika, mida scanf teed joon 18,
kui pass% s ja puhver, mis on mõeldud?
Mis on scanf, kui soovite täpselt sama loogika nagu versioon 0,
üritan siin teha, kui kasutaja tipib midagi?
Jah?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Täpselt.
Scanf, loogika varem kavatseb võtta string
et inimese trükitud Kusagil, see on nüüd string,
see ei ole number, arvatavasti, kui ta cooperates--
ja see läheb püüdma panna, et stringi mälu olenemata aadress
puhver täpsustatakse.
Ja see on tore, sest puhver tõepoolest mõeldud aadress.
>> Kuid ma väidavad, et see programm on lollakas väga tõsiselt, sest milline väärtus on
puhver vaikimisi?
Mida ma vormindatud võtta?
Mis patakas mälu?
Ma ei ole, eks?
>> Nii et kuigi ma olen eraldatud char täht, mis on enam nn s,
see on selle asemel kutsutakse, buffer-- nii Joonistame muutuja nimi
nüüd buffer-- kui ma ei ole nimetatakse getString või malloc siin
mis tähendab tegelikult seda, et puhver on vaid mõned prügi väärtus.
>> Nüüd mida see tähendab?
See tähendab, et ma olen rääkinud scanf oodata string kasutaja.
Ja tead mis?
Mis iganes see asi on suunatud to-- ja Juhin küsimärk
kuid tegelikkuses see saab olema midagi OX1, 2, 3, õigus?
See on mingi võlts raha, et lihtsalt juhtub olema seal enne.
Nii teisisõnu, see on justkui puhver on lihtsalt
osutades midagi mälestuseks.
Ma ei tea, mida.
>> Nii et kui ma kirjuta Gabe nüüd, see läheb proovida panna g-a-b-e / 0 seal.
Aga kes teab, mis see on?
Ja minevikus tahes ajal oleme proovinud puudutada
mälu, mis ei kuulu meid, mis on juhtunud?
Või peaaegu iga kord.
Segmenteerimine süü, eks?
>> See nool, ma ei tea, kus see on juhtides. see on lihtsalt mingi suvaline väärtus.
Ja muidugi, kui sa tõlgendama juhuslik väärtus, aadress,
sa lähed minema Mõned juhuslikud kohtades.
Nii Gabe võib tõepoolest crash minu programm selles asjas.
>> Niisiis, mida me saame teha, et see on peaaegu sama halb?
Mõelge sellele kolmandale ja viimane näide scanf.
See versioon on parem siis mis mõttes?
Kui olete rahul Eelmise probleem, see on parem.
Miks?
>> Sihtrühm: [kuuldamatu].
DAVID J. Humala: Hea.
Nii et sel juhul on line 16 On parem, selles mõttes
et me oleme selgelt eraldades mõned mälu.
Me ei kasuta malloc, me kasutame nädal 2
lähenemine lihtsalt kuulutatakse massiivi.
Ja me oleme varem öelnud, et string on lihtsalt massiivi tähemärki
nii et see on täiesti õigustatud.
Aga see, muidugi, nagu sa tähele, fikseeritud suurusega 16.
>> Nii et see programm on täiesti ohutu, kui ma tüüpi
ühes märgijadadena kaks iseloomu stringid, 15 tähemärke.
Aga niipea, kui ma hakake kirjutama 16 17, 18, 1000 tähemärke,
Kus on see string läheb lõpuks?
See läheb lõpuks osaliselt siin.
Aga kes teab mida veel on piiridest
selle konkreetse massiivi?
>> See on nii, nagu ma olen kuulutas 16. kastid siin.
Nii et pigem joonistada kõik 16, paneme lihtsalt teeselda, et ma olen koostanud 16.
Aga kui ma siis proovige lugeda string see on palju pikem, nagu 50 tähemärki,
Ma hakkan panna a, b, c, d, x, y, z.
Ja see on ilmselt mõned teised mälu segmenti
et jällegi võib põhjustada minu programmi krahhi,
sest ma ei ole palunud midagi enamat kui lihtsalt 16 baiti.
>> Nii et keda see huvitab?
Noh, siin on CS50 raamatukogu.
Ja kõige tähtsam on see lihtsalt nagu juhendid üleval.
CS50 raamatukogu, kõik see aeg, on olnud seda joont line 52.
Me oleme näinud typedef või näed typedef
aastal pset 4, mis lihtsalt tekitab sünonüüm, mille char star võib olla rohkem
nimetatud lihtsalt stringi.
Seega on see üks paari Apupyörät
Me kasutasime salaja all kapuuts.
>> Vahepeal siin on funktsioon, getchar.
Nüüd paistab, et seal ei ole keha ta.
Ja tegelikult, kui ma hoida kerida, ma tegelikult ei
näe rakendused Nende funktsioonide.
Nagu meelerahu kontrolli, miks see nii on?
>> Sihtrühm: [kuuldamatu].
DAVID J. Humala: Jah.
Nii et see on päisefailis.
Ja header failid sisaldavad prototüübid, pluss mõned muud asjad, tundub,
nagu typedefs.
Aga CS50.c, mis me oleme kunagi andnud teile otse,
kuid on olnud CS50 seadme kõik Selle aja sügavale selle kaustad
märgata, et seal on terve hunnik funktsioone siin.
>> Tegelikult olgem keri.
Ignoreerime enamik neist nüüd.
Aga kerige getInt ja vaata, kuidas getInt toimib.
Nii et siin on getInt.
Ja kui sa kunagi hoolinud, kuidas saada int töötab, siin on selle dokumentatsioon.
Ja vahel asjad ta ütleb, on ta ütleb teile,
mis väärtustele ta saab tagasi.
See on sisuliselt negatiivne 2 miljardit positiivsele 2 miljardit, anda või võtta.
>> Ja selgub, kõik see aega, kuigi me pole kunagi
oli teil kontrollida seda, kui midagi läheb valesti,
Selgub, et kõik Selle aja getInt on
ole naasmist eriline pidev, mitte null,
pigem int_max, mis on lihtsalt programmeerija konventsioon.
See tähendab, et siin on eriline väärtus.
Veenduge, et vaadata seda, just kui midagi läheb valesti.
Kuid me pole kunagi vaevunud koos, et siiani
sest jällegi seda eesmärgiks on lihtsustada.
>> Aga kuidas getInt saada rakendatakse?
Noh, üks, see ei võta argumente.
Me teame seda.
Ta naaseb int.
Me teame seda.
Niisiis, kuidas see toimib all kapuuts?
>> Nii et ilmselt lõpmatu silmus, vähemalt välimuse üks.
Pange tähele, et me kasutame getString.
Nii et see on huvitav. getInt kutsub oma funktsiooni, getString.
Ja nüüd Miks see nii on?
Miks ma kaitsev Liini 165?
Mis võib juhtuda, kooskõlas 164, lihtsalt olla kindel?
See on sama vastus nagu enne.
Võib olla ainult mälu.
Midagi läheb valesti getString, me peame suutma hakkama.
Ja põhjus, miks ma tagasi ei tule null on et tehniliselt null on kursor.
getInt on tagasi int.
Nii et ma olen meelevaldselt otsustas sisuliselt,
et 2 miljardit, anda või võtta, läheb olema eriline väärtus, et ma ei saa kunagi
tegelikult saada kasutaja.
See on lihtsalt üks väärtus ma lähen raisata esindama veakood.
>> Nii et nüüd, kui asjad veidi fancy.
Ja see pole päris sama funktsioon nagu enne, kuid see on väga sarnane.
Nii teate, ma kinnitan, siin, kooskõlas 172, nii int n ja char c.
Ja siis ma kasutan seda funky liin, sscanf, mis tuleb välja
ei otsiks string klaviatuuri.
Ta seisab olemasoleva stringi kasutaja on juba trükitud.
Nii et ma juba kutsunud getString, mis tähendab, et mul stringi mälu.
sscanf on mida sa helistada liigendamine funktsioon.
Vaadeldakse string ma olen kirjutada, tähemärgi haaval,
ja ei midagi kasulikku.
See string salvestatakse liin.
Ja ma tean, et ainult minnes varundada siin ja öelda, oh, OK,
Ma kutsusin ta ei s seekord, kuid liin.
>> Ja nüüd on see natuke erinev.
Aga see tähendab tegelikult põhjustel me mõnevõrra laine oma käsi täna
et me kontrollime, et vaata kui kasutaja tipitud
ja int ja võibolla teise iseloomu.
Kui kasutaja tipitud int, see on kavatse olla salvestatud n, sest ma olen
kulgeb seda aadressi uus trikk oleme näinud täna.
Kui kasutaja ka trükitud aastal nagu 123x, et x
läheb lõpuks kirja iseloomu c.
>> Nüüd selgub, et sscanf ütleb mulle, arukalt,
kui palju muutujaid sscanf edukalt suudab täita.
Nii et see loogika, kui funktsioon Ma rakendamisel on getInt,
aga ma kontrollida, potentsiaalselt jaoks alla
kuni on sisestatud int järgneb midagi muud,
mida ma tahan sscanf on tagastatav väärtus tõesti olla?
Kui eesmärgiks on saada lihtsalt int kasutaja?
>> Nii et kui sscanf tagasi 2, siis mida see tähendab?
Kasutaja tipitud midagi sellist, sõna otseses mõttes,
123x, mis on lihtsalt jama.
See tõrge ning Ma tahan, et kontrollida seda.
>> Nii et kui kasutaja tipib seda, mida Selle loogika järgi, mis ei sscanf tagasi,
sa ütleksid?
Nii see läheb tagasi 2, sest 123 läheb minema siit,
ja x läheb lõpuks siin.
Aga ma ei taha, et x, et saada täis.
Tahan sscanf ainult õnnestub Täitmise esimene selle muutujad.
Ja nii see on, miks ma tahad sscanf tagasi 1.
>> Ja kui see on natuke üle pea hetkel, see on täiesti korras.
Aru küll, et üks väärtused getInt ja getString
on see, et me teeme Heck palju viga kontrollides niimoodi nii
, et seni, saad päris palju kirjuta midagi oma klaviatuuri,
ja me püüda seda.
Ja me kindlasti, personal, kindlasti ei
allikaks on viga teie programm, sest me oleme kaitsele
kontrollida kõigi loll asju, mida kasutaja võib teha,
näiteks sisestatud string, kui sa tõesti tahtsid int.
Nii nüüd-- me tuleme tagasi sellele enne long--
kuid kõik see aeg, getString ja getInt on
olnud all kapuuts, kasutades seda Põhiidee mälu aadressid.
>> Nii et nüüd, teeme asju natuke rohkem kasutajasõbralikumaks.
Nagu te võib-olla mäletate, alates Binky viimane aeg-- kui mu hiir cooperate-- nii
meil oli see kood, mis ausalt öeldes on üsna mõttetu.
See kood ei saavutata midagi kasulik, kuid see oli näiteks
et professor Parlante kasutatakse selleks, et esindada
mis toimub sisse programm, mis hõlmab mälu.
>> Nii et olgem jutustan selle lugu super lühidalt.
Need kaks esimest rida, on Inglise, ei mida, sa ütleksid?
Just põhjendatult inimese, kuid veidi tehnilisi tingimusi, võtab torkehaav.
Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: OK, sa oled, millega kehtestatakse aadressid oma x ja y muutujad.
Mitte päris, sest x ja y ei ole muutujaid traditsioonilises mõttes.
x ja y on aadressid või salvestab aadress.
Nii et proovime seda veel korra.
Ei ole halb algus, kuigi.
Jah?
>> Sihtrühm: [kuuldamatu].
DAVID J. Humala: Hea.
Ma arvan, et see on natuke puhtamaks.
Deklareerimine kaks suunanäitajaks, kaks täisarvu.
Ja me kutsudes neid x ja y.
Või kui me joonistaks seda pilti jällegi
meenutada lihtsalt, et kõik me teeme selle esimese rea
joonistab kasti niimoodi, mõned prügi väärtus see,
ja kutsus ta X ja siis teise kasti niimoodi,
mõned prügi väärtus ta, nimetades seda y.
Oleme kuulutanud kaks vihjeid, et lõppkokkuvõttes
salvestab aadress int.
Nii et kõik on seal.
>> Nii et kui Binky tegi seda, savi lihtsalt tundus see.
Ja Nick lihtsalt selline tõmmati nooled
sest kuigi nad ei juhtides ükskõik eriti, sest nad on lihtsalt
prügi väärtused.
Nad ei ole selgesõnaliselt vormindatud kusagil eelkõige.
>> Nüüd järgmine rida kood, mäletate, oli see.
Nii mõistlikult kasutajasõbralik, kuid mõnevõrra tehniline inglise keel,
mis see koodirida teed?
Jah?
>> Sihtrühm: [kuuldamatu].
>> DAVID J. Humala: Perfect.
See eraldamise patakas mälu, mis on suurus int.
Ja see on pool vastust.
Te vastasite õigus poolel väljendus.
Mis toimub vasakul pool võrdusmärki?
Jah?
Sihtrühm: ja annab see muutuja x?
>> DAVID J. Humala: ja annab see muutuja x.
Nii et sulgege, paremal pool eraldab piisavalt mälu, et salvestada int.
Aga malloc spetsiaalselt tagastab aadress
Selle patakas mälu, mida olete lihtsalt ettepaneku saab salvestatud x.
>> Mida Nick eelmisel korral koos Binky on Ta lohistas et osuti välja, savi,
juhtida praegu valge patakas mälu mis on võrdne suurus int.
Ja tõepoolest, see on mõeldud esindama neli baiti.
>> Nüüd, järgmine rida koodi tegin seda, star x saab 42.
Nii et 42 on lihtne kohta paremal küljel, elu mõte.
Vasakul pool, star x tähendab mida?
Ka see võib olla läinud-- see on OK.
OK.
>> Sihtrühm: Põhimõtteliselt, minna [kuuldamatu]
DAVID J. Humala: Hea.
Sihtrühm: [kuuldamatu].
DAVID J. Humala: Täpselt.
Vasakul pool tähendab minna x.
x on aadress.
See on nagu 33 Oxford Street, või OX1.
Ja täht x tähendab minna, et tegeleda ja panna mida seal?
42.
>> Nii et tõesti, see on täpselt see, mida Nick tegi.
Ta alustas poolt, sisuliselt vaimselt
osutab sõrmega x Pärast nool
valge kast paremal pool, ja paneb number 42 olemas.
Aga siis asjad sain veidi ohtlik, eks?
Binky on umbes kaotada oma peaga.
>> Star y võrdub 13, halb õnn, tähendab mida?
Nii täht y abil minna aadressile y.
Aga milline on aadressi y?
Olgu, see on prügi raha, eks?
Ma joonistasin seda küsimärk.
Nick tõmbas see keerduv nool.
Ja niipea, kui üritate teha star y, öeldes sinna minna,
kuid ei ole õigustatud aadress, see on mingi võlts asukoht,
Programm läheb krahhi.
Ja Binky pea läheb lennata ära siit, nagu ta seda tegi.
>> Nii et lõpuks on see programm oli lihtsalt korter läbi viga.
See oli vigane programm.
Ja seda tuleb parandada.
Ja ainus viis, tõesti, seda parandada oleks, näiteks, see liin,
mida me isegi ei saada, sest Programmi kukkus liiga kiiresti.
Aga kui me määrata see, mida mõju ei teinud y võrdub x on?
Noh, see sisuliselt juhib y juures mis iganes x väärtus on osutavad.
>> Nii Nicki lugu, või Binky lugu, nii
x ja y on vastakuti valge patakas mälu,
nii et lõpuks, kui sa ei täht y võrdub 13 uuesti,
sa lõpuks paneb 13 sobivas kohas.
Nii et kõik need liinid on täiesti õigustatud, välja arvatud see,
kui see juhtus enne, kui tegelikult määratud y mingi väärtus.
>> Nüüd õnneks sa ei ole on mõelda läbi kõik
Nende laadi küsimused ise.
Lubage mul minna ja avada kuni terminal window siin
ja avada, hetkeks, super lühike programm, mis
Samuti on omamoodi mõttetu.
See on inetu.
See ei saavuta midagi kasulikku.
Aga see ei näidata küsimuste mälu, nii et võtame pilk.
>> Main, super lihtne.
See ilmselt nõuab funktsiooni, f, ja siis tagastab 0.
See on omamoodi raske jama see üles.
Nii Main on päris hea siiani.
>> Nii et f on problemaatiline.
Ja lihtsalt ei pane palju vaeva nimetades seda
siin, et hoida keskenduda koodi.
f on kaks rida.
Ja vaatame, mis nüüd toimub.
Niisiis käsitleb ühest küljest siin-- ja las ma teen
Selle kooskõlas eelmise example-- kohta ühelt
vasakul pool on seda, mida inglise keeles?
See ongi
Sihtrühm: Loomine pointer.
DAVID J. Humala: Creating pointer int ja nimetades seda x.
Nii et see on loomise üks neist kastid Hoian kasutades puuteekraani.
Ja nüüd on parempoolne küljel malloc loomulikult
eraldab patakas mälu.
Ja lihtsalt olema selge, kuidas palju mälu on see ilmselt
jaotamisel, kui sa lihtsalt objekti ei matemaatikat siin?
>> Nii et see on 40 baiti.
Ja ma tean, et ainult sellepärast, et ma tean, int, on CS50 seade vähemalt
on neli baiti.
Nii 10 korda 4 on 40.
Nii et see salvestab x, aadress esimese 40-ints et
on eraldatud ruumi tagasi, tagasi, tagasi, edasi-tagasi.
>> Ja see on võti umbes malloc.
See ei võta vähe mälu siin, natuke siit, natuke siin.
See annab teile üks patakas mälu, lähestikku, alates operatsioonisüsteemi
süsteemis.
>> Nüüd kuidas see, x sulg 10 on 0?
Suvalised rida koodi.
See ei saavuta midagi kasulikku.
Aga see on huvitav, sest x sulg 10--?
Jah?
>> Sihtrühm: [kuuldamatu]?
>> DAVID J. Humala: x sulg 10 ei pea olema null.
Null detail ainult tuleb mängu koos stringid, lõpus stringi.
Aga hea mõte.
>> Kui suur on see massiiv, isegi kuigi ma olen eraldatud 40 baiti?
See on 0 kuni üheksa, eks?
See on 10 ints kokku.
40 baiti, kuid 10 ints, indekseeritud 0 kuni 0.
>> Nii et mis see on x sulg 10?
See on tegelikult mõned tundmatu prügi väärtus.
See on mälu, mis ei kuulu mulle.
Ma ei tohiks liigutav, et bait number 41, 42, 43, 44.
Ma lähen natuke liiga kaugele.
>> Ja tõepoolest, kui ma saan seda programmi, see võib väga hästi krahhi.
Aga mõnikord, meil veab.
Ja nii lihtsalt näidata seda-- ja ausalt öeldes,
sa ei tea kunagi, enne kui ei Kui-- olgem käivitada.
See tegelikult ei krahhi.
>> Aga kui ma seda muuta, et Näiteks olla nagu 1000,
teha seda tõesti tahtlik, vaatame
kas me saame seda krahhi seekord.
OK, see ei ole viga.
Kuidas 100000?
Olgem uusversioon, ja nüüd uuesti, see.
OK.
Puhh.
Olgu.
Nii et ilmselt jällegi need segmentides mälu, nii et rääkida,
on piisavalt suur, et saaksime veab ikka ja jälle.
Aga lõpuks, kui sa saad naeruväärne ja tõesti minna kaugele ekraanil
sa puudutage mälu tõesti, tegelikult ei kuulu teile.
>> Aga ausalt öeldes, need liiki vead lähevad
olla raskem ja raskem nuputada ise.
Aga õnneks, nagu programmeerijad, peame vahendid, mis võimaldavad meil seda teha meie jaoks.
Nii et see on võib-olla üks koledamas programmide
isegi koledam kui GDB väljund.
Aga see on alati line või kaks, mis on super kasulik.
>> Valgrind on programm, mis aitab sa ei siluda programmi, per se,
kuid ei leia mälu seotud probleeme, konkreetselt.
See automaatselt käivitada oma kood te ning otsida vähemalt kaks asja.
Üks, sa tegid midagi juhuslik nagu touch mälu
mis ei kuulu sulle?
See aitab teil leida need juhtumid.
>> Ja kaks, see aitab leiad midagi, mida nimetatakse
mälu lekked, mis meil on täiesti tähelepanuta, naiivselt,
mõnda aega ja õndsalt.
Aga selgub, kõik Selle aja kui
olete kutsutud getString sisse nii paljud meie programme,
sa palud operatsioonisüsteemi süsteemi mälu,
kuid teil on mälestus kunagi andes
tagasi, tehes UNALLOC või tasuta, nagu seda nimetatakse.
Ei, sest me pole kunagi palus sul seda teha.
>> Kuid kõik see aeg, programmide sa oled kirjalikult C
on lekib mälu paludes operatsioonisüsteemi
süsteemi rohkem mälu stringid ja tühi-tähi,
kuid mitte kunagi jagab seda tagasi.
Ja nüüd on see natuke ja järeleandmisi,
aga kui sa oled kunagi käivitada oma Mac või arvutis juba mõnda aega, avades
palju programme, võibolla programmide sulgemist,
ja isegi oma arvuti ei ole krahhi,
Läheb nii palju aeglasem nagu ta on tõesti
kasutades palju mälu või ressursse, kuigi,
kui sa ei ole isegi puudutamata klaviatuur,
mis võiks olema-- kuid ei always-- võiks olema, et programmid näed
on ise mälu lekkeid.
Ja nad hoiavad küsib OS rohkem ja rohkem mälu, kuid unustades selle kohta,
tegelikult ei kasuta, kuid Seega võttes mälu ära
muudest programmidest, et võiksite seda.
Nii et see on ühine selgitus.
Nüüd siin on koht, kus Valgrind on väljund on täiesti
jõle neile vähem ja mugavamaks samasugused.
Aga huvitav stuff on siin üleval.
Ta räägib mulle vale kirjutada ning suurus neli juhtub selles programmis,
eelkõige real 21 memory.c.
>> Kui ma lähen liinile 21, hm, seal tõesti on kehtetu kirjutada suuruse neli.
Miks size neli?
Noh, see number-- ja see võiks olla midagi-- on int.
Nii et see on neli baiti.
Nii et ma panen nelja baiti kui nad ei kuulu.
Seda Valgrind tegelikult mulle.
Peale selle on ka ütle mulle, kui me näeme,
kui sa jooksed seda tulevikus pset, kas ja kui olete lekkinud mälu, mis tõepoolest
Mul on, sest ma olen kutsutud malloc, kuid ma ei ole tegelikult
nimetatakse antud juhul, vaba, mida me lõpuks näha
on vastupidine malloc.
>> Nüüd ma arvan, et viimane näide.
Nii et see üks on natuke rohkem kauge, aga see on võib-olla
Suurim põhjus olema ettevaatlik, mäluga,
ja sel põhjusel, et paljud programmid ja / või veebiserverite, isegi kuni tänase päevani,
on üle võtnud pahad kusagil aasta Interneti kes on kuidagi
saates võlts pakette serverisse püüab ohustada teie kontosid,
või võtta oma andmed, või lihtsalt üldiselt üle võtta masin.
Buffer overflow, kui nimigi ütleb, vahendid
täis ei int, kuid puhvris.
Ja puhver on lihtsalt fancy viis öelda, et see on hunnik mälu.
>> Ja tõepoolest, ma helistasin string Enne puhvri asemel s.
Sest kui see puhver, nagu YouTube mõttes
või iga kord, kui vaatate video, te olete näinud sõna puhverdamine,
dot, dot, dot.
See on uskumatult tüütu.
Ja see tähendab lihtsalt et oma videopleier
üritab alla laadida palju baitide, palju baiti
alates video internetis.
Aga see on aeglane, seega üritab laadida kobar
täita puhver, konteiner, nii et sul on piisavalt baiti, et see saab siis
näidata teile video, Kõhklemata pidevalt.
Aga selgub, saate on puhvri sellele suur.
Aga proovida panna nii palju andmeid seda ja väga halbu asju võib juhtuda.
Nii näiteks, vaatame See viimane teaser näiteks.
See on teine ​​programm et esmapilgul
ei midagi super kasulik.
See sai Põhiülesanne mis nõuab, et funktsioon f.
Ja see funktsioon, f, siin on char massiiv nimega c, suurus 12.
Ja siis ta kasutab seda uus funktsioon nimega strncpy.
>> Selgub, et selle lihtsa, lihtne rida koodi, vaid kaks rida,
oleme teinud kogu oma programm, ja seega kogu mu arvuti,
ja minu konto ja minu raske sõita kaitsetud keegi
kes teab ja on piisavalt hea, et käivitada Selle programmi teatud käsurea
argument.
Teisisõnu, kui see paha poiss paneb sees argvargv [1] kirjutades
klaviatuuri väga spetsiaalselt formuleeritud string, mitte abc, 123, kuid sisuliselt
binaarne sümbolid on käivitatav kood, programm, mida ta kirjutas,
Selle lihtsa programmi, mis on esindaja tuhandeid programme
mis on samuti haavatavad, daresay, ta võib lõpuks kustutada kõik
failid minu kõvakettale saada vilgub kiirelt, nii et ta saab
käske oma, saatke kõik failid ise.
Kõik, mis ma teha saan, et ta või ta saab teha seda koodi.
>> Me pole päris lahendada veel.
Ja tegelikult, see läheb kaasata vähe pilt
nagu see, mis me varsti mõista kõik parem.
Aga täna, olgem lõpeb mis loodetavasti veidi rohkem
arusaadav XKCD nali, kuni jätkame järgmine kord.
Olgu.
Näeme kolmapäeval.
>> [Muusika mängimine]
>> SPEAKER: Ja nüüd, sügav mõtteid, mida Daven Farnham.
Mälu on nagu hüpped kuhi kuldne lehed pühapäeva pärastlõunal.
Tuul puhub, visklemine oma hair-- oh, ma igatsen päeva ta--
>> [Naer]