[Tónlist spila] DAVID J. MALAN: Allt í lagi. Þetta er CS50. Og þetta er upphafið að viku 5. Og eins og þú gætir hafa tekið eftir, er efni sem á er að fá smá meira flókið, litli þéttari. 

Og það er mjög auðvelt, sérstaklega ef þú hefur verið í vana um nokkurt skeið, að vera að reyna að scribble niður mest eitthvað sem við gerum, við erum að segja í bekknum. En átta sig á, það er ekki kannski kjörinn uppeldisfræðileg nálgun að læra af þessu tagi efni, og efni almennt. Og svo við erum stolt af því að tilkynna eigin Gheng viðkomandi CS50 er Gong hefur hafið undirbúning a Canonical setja seðla fyrir námskeiðið, von sem er sem, einn, þessir ekki aðeins að þjóna sem tilvísun og úrræði til að endurskoða efni og fara aftur í gegnum efni sem gæti haft slapp þér í fyrsta skipti í kring, en líka svo að höfuð geta verið meira upp en niður, þegar það kemur tími til að halda fyrirlestra, svo að þú gætir stunda meira hugsandi, eins og öfugt við fleiri scribbly. 

Með því að segja, hvað sem þú munt finna á vefsíða er slík skjöl og þessa. Og tilkynning, efst til vinstri, þar er ekki aðeins efnisyfirlit, en einnig tíma númer sem mun strax hoppa þér í viðeigandi hluta í the vídeó á netinu. Og hvað Chang hér hefur gert er, í meginatriðum, skjalfest hvað gerðist í þessu einkum fyrirlestur. Og margir af þeim fyrirlestrum eru nú þegar á netinu núna með þessa vefslóð. Og við munum halda áfram að senda afganginn þeirra í lok þessarar viku, svo að nýta sér þessi úrræði. 

Svo án frekari fjaðrafok, við byrjuðum að afhýða aftur lag sem hefur verið band í nokkurn tíma. Og hvað gerði við segja band reyndar er í síðustu viku? Svo bleikju stjörnu. Og bleikju stjörnu, vel, hvað gerði það í raun þýtt? Jæja, allan þennan tíma, ef við höfum verið að kalla á aðgerð, eins getString og geymslu svonefnd aftur gildi getString í a variable-- það heitir s tegund string-- við höfum verið að skrifa lína af kóða þar fyrir ofan. Og það er aðeins þegar ég sé minn rithönd mikil hér ég átta sig á hversu grimmilegur þetta er. 

Hins vegar skulum gera ráð fyrir því, á hægri hönd hlið er engu að síður sanngjarnt lýsing á því hvað er verið að fara á allt þetta tími með getString. getString, auðvitað, fær band. En hvað þýðir það í raun þýtt? Það þýðir að það fær klumpur af minni frá stýrikerfi því að hringja í aðgerð, sem heitir malloc. En meira um það síðar. Og þá populates það sem klumpur af minni með bókstöfunum sem notandinn hefur slegið inn, á eftir, að sjálfsögðu, núll staf eða sviga núll aftast. 

Á sama tíma, á vinstri hönd hlið af þessari sögu, allan þennan tíma, við höfum verið að lýsa breytu, eins og s. Og það breyta er það nú mun hefja starf bendi. Það er ekki kassi inni sem við að setja band, Daven, í sjálfu sér, heldur við sett í þeirri torginu kassi á the vinstri hvað nákvæmlega? Já? 

Áhorfendur: Heimilisfang þar sem það er staðsett í minni. 

DAVID J. MALAN: Einmitt. Veffang þar Daven er staðsett í minni. Og ekki þar sem allar Daven er, í sjálfu sér, en sérstaklega heimilisfangið af hverju? Já? 

Áhorfendur: Fyrsta persóna. 

DAVID J. MALAN: Fyrsti stafurinn í Daven, sem í þessu tilfelli, Ég lögðu var geðþótta og unrealistically 1, OX1, sem þýðir bara að sextánskur fjöldi 1. En það er líklega að fara til að vera miklu stærri tala að við gætum draga með 0x sem forskeyti, fulltrúi sextánskur staf. Og vegna þess að við þurfum ekki að vita hvar restin af persónum Daven eru, vegna þess hvað einföld hönnun ákvörðun sem var tekin fyrir mörgum árum? Já? 

Áhorfendur: Sviga 0. DAVID J. MALAN: Já, einmitt. The sviga 0 leyfir þér, að vísu í línuleg tími, til að fara yfir band, ganga frá vinstri til hægri, með fyrir lykkju, eða stund lykkja, eða eitthvað svoleiðis það, og ákveða, ó, hér er í lok þessa tiltekna band. Svo við bara heimilisfang í upphaf streng, við getum nálgast heild af það, vegna þess að alla þessa stund, band hefur bara verið stafir stjarna. 

Svo það er vissulega í lagi að halda áfram að nota að CS50 bókasafn og þetta abstrakt, svo að segja, en við munum byrja að sjá nákvæmlega hvað er verið að fara á undir öllu þessu sinni. Svo þú getur muna þetta dæmi of frá síðasta tíma, bera 0, sem ekki í raun að bera saman. En við byrjuðum á að leysa þetta. 

En eins og kannski a upprifjunar, gæti ég áhuga einhvern í bleikum fíl í dag, líka gert af Chang? Hvernig um þig í framan? [Inaudible]. Komdu upp. 

Og í millitíðinni, og þú kemur upp, við skulum íhuga fyrir aðeins augnablik hvað þetta númer var í raun að gera. Það er að lýsa yfir tvær breytur upp efst, s og t, og kallar getString. Þetta er ekki mjög notandi-vingjarnlegur program, vegna þess að það þýðir ekki að segja þér hvað ég á að gera. En við skulum bara gera ráð fyrir að við erum áherslu á safaríkur hluta. Og þá erum við að gera, ef s er jafnt jafngildir t, ætti það að segja printf, þú gafst það sama. Halló. Hvað er nafn þitt? 

Janelle: Janelle. DAVID J. MALAN: Janelle, Gaman að hitta þig. Svo áskorun þinn á hönd fyrir þetta fíl er að fyrst draga okkur mynd af því sem er að fulltrúa í þeim fyrstu tvo línur. Svo s og t gæti verið fulltrúa hvernig á skjánum? Og þú getur bara draga það með fingurinn á þessu stóra skjánum. 

Svo er tvo helminga thangad hver hlið þess jöfnu. Þannig að það er s á vinstri og þá getString hægri. Og þá er það ekki til vinstri, og þá getString hægri. Svo hvernig gætum við byrjum teikna mynd sem táknar hvað er að gerast hér í minni, myndir þú segja? Og láta mig láta þig útskýra hvað þú ert að gera eins og þú ferð. 

Janelle: OK. Jæja, fyrst það væri að biðja þú að fá inntak band. Og það myndi store-- ó, því miður. DAVID J. MALAN: OK. Gott. Og þetta er kallað það? Ó, OK. Halda áfram. Ég ætlaði ekki að trufla. Janelle: Því miður. Svo það væri inntak það inn heimilisfang of-- ekki viss. Ég get ekki nákvæmlega man númerið, en ég held að það var að byrja með 0. 

DAVID J. MALAN: Það er allt í lagi, vegna þess að ég gerði upp tölurnar, þannig að það er ekkert rétt svar. 

Janelle: Byrjar með 0 boga. 

DAVID J. MALAN: OK, þannig þáttur 0. Viss. 

Janelle: Og svo ef var eins og bara í tveggja letter-- 

DAVID J. MALAN: OK, aftur til þín. 

Janelle: Svo frumefni 0 og þá þáttur 1 eða eining 2. DAVID J. MALAN: Og hver stykki af myndin ertu að teikna núna? Símtalið til getString? Eða yfirlýsing um s? 

Janelle: Yfirlýsingin af s, tel ég. Ó, getString, því það myndi vera inputted í hverri [? svæði. ?] 

DAVID J. MALAN: Gott. Nákvæmlega. Jafnvel þó að þessi raun skilar fylki, muna, þegar við komum til baka streng, getum við Vísitala inn strengsins með 01 og 2. Tæknilega eru þetta líklega fulltrúa einstakra talna, en það er allt í lagi. 

Svo geri ráð fyrir, ef ég get bara hratt áfram þar sem við var horfið síðasta skipti, ef einn af strengir var g a b e Sviga 0, þannig hönd Gabe er inntak, hvernig gætum við tákna s núna? Ef þetta er minni sem er verið skilað með getString? 

Janelle: Væri fulltrúa af boga? 

DAVID J. MALAN: Með boga? Jæja, nei. Við skulum bara segja, pictorially, láta mig fara bara á undan og leggja það, ef þetta er s, þetta er skilagildi getString. Og hefur dregið þetta sem 0, 1, 2, þar sem er fullkomlega sanngjarnt, vegna þess að við geta vísitölu í streng, sem slík. En bara til að vera í samræmi við síðasta skipti, láttu mig fara á undan og geðþótta leggja til að þetta er netfang 1, þetta er netfang 2, þetta er netfang 3, og svo framvegis. Og svo, bara til að vera frábær ljóst, hvað er að gerast að fara í s vegna að Fyrsta lína af kóða, myndir þú segja? 

Janelle: Heimilisfang 1? 

DAVID J. MALAN: Einmitt. Svo takast 0x1. Og á meðan, láta mig fara á undan og afrit mikið af því sem þú hefur gert og bæta við eigin t minn hér. Ef ég væri að slá í Gabe aftur, í annað sinn, þegar beðið er með getString, þar sem, auðvitað, er Gabe að fara? Jæja, presumably-- 

Janelle: Eins hér? DAVID J. MALAN: Já. Janelle: Eða það er líka í sömu kassa? DAVID J. MALAN: Leyfðu mér að leggja til, já, einmitt, svo í þessum viðbótar kassa. En hvað er lykillinn núna er að, jafnvel þó að ég hef dregið þetta frekar nálægt together-- 0x1, þetta er 0x2-- í raun og veru, þetta nú gæti verið netfang 0x10, til dæmis, og 0x11 og 0x12, og svo framvegis. Og svo, ef það er málið, hvað er að fara að enda hér í T? 

Janelle: 0x10? DAVID J. MALAN: Einmitt. Svo 0x10. Og svo núna, lokaspurningin. Þú, eftir langt, þurfti að vinna að erfiðasta fyrir fíl svona langt. Með því að nú, ef ég draga upp kóðann aftur, þegar ég, í samræmi þremur, ef s er jafnt jafngildir t, hvað er ég í raun og veru Samanburður sem við höfum dregið hér? 

Janelle: tveir heimilisföng? DAVID J. MALAN: Einmitt. Þannig að ég ætla að segja er s jafnt jafnt T? Með öðrum orðum, er 1 jöfn jafnt og 10? Og að sjálfsögðu, augljóst svar er nú nr. Og svo er þetta forrit á endanum að fara að prenta hvað myndir þú segja? 

Janelle: Væri, þú gafst það sama? 

DAVID J. MALAN: Svo ef s er 1 og t er 10? 

Janelle: Þú gafst mismunandi hluti. 

DAVID J. MALAN: Einmitt. Þú slegið mismunandi hluti. Allt í lagi. Svo a umferð af lófaklapp, ef við gætum, hér. [Applause] Það var sársaukafullt. Ég veit. Fallega gert. Svo nú skulum við sjá hvort við getum ekki stríða í sundur hvað festa var. Og auðvitað, þegar við fast this-- sem ég ætla nú tákna í green-- við fengum nokkra aukahluti hér. Fyrst, rétt eins og Sanity athuga, ég er fyrst að athuga ef s er jafnt null og t jafngildir null. Og bara til að vera skýr, þegar gæti s eða t null í númerið eins og þetta? Hvenær might s eða t null. Já? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Einmitt. Ef strengurinn sem notandinn slegið í er alltof langur að passa inn í minni, eða sumir undarlegt horn tilfelli eins og þessi, getString, eins og við munum sjá, bókstaflega í dag, í skjölum sínum, segir það muni skila null sem sérstakt vörðr gildi, eða bara svona sérstakt tákn sem þýðir eitthvað fór úrskeiðis. Þannig að við viljum að athuga að vegna þess að það kemur í ljós að null er mjög hættulegt gildi. 

Oft, ef þú ert að reyna að gera eitthvað með null felur í sér function-- liggur það sem inntak, til instance-- að virka gæti mjög hrynur og með henni, taka niður allt kerfið þitt. Þannig að þetta þriðja lína er nú bara geðheilbrigði athuga, villa stöðva, ef þú vilt. Það er góð venja nú fyrir okkur að komast inn í hvaða tíma við reyna að nota gildi sem gæti hugsanlega verið null. 

Nú, á fjórða línu hér, "Ef strcmp (s, t)," vel, hvað er það að vísa til? Jæja, sagði við þetta var mjög succinctly nefndi virka fyrir streng samanburðar. Og tilgangur þess í lífinu er að bera saman Fyrsta rök hennar gegn henni annað, en ekki með tilliti til heimilisföngum þeirra, eins og við gerðum óviljandi stund síðan með rauðu númerinu, en frekar að bera þessa tvo strengir í að humanly leiðandi hátt með því að bera saman þessa, gegn þessu, gegn þessu, gegn þessu, og þá hætt ef og þegar einn eða bæði fingur minn hits sviga 0. Svo einhver ár síðan útfærð strcmp að hrinda í framkvæmd fyrir okkur virkni að við vonast að við myndum hafa fengið bara með því að bera saman tvær einfaldar gildi. 

Nú hreinskilnislega, halda ég teikningu öll þessi mismunandi númer. En raunin er, ég hef verið gera þetta upp allan tímann. Og svo látið mig fara bara á undan og scribble þetta út til að benda á að, í lok dagsins og áfram, Við erum í raun ekki að fara að hugsa um hvað fjallar það eru í raun og veru í minni. Þannig að ég ætla ekki að draga þetta konar tölum svo mikið lengur, Ég er bara ágrip þetta í burtu lítið meira vingjarnlegur með aðeins örvum. 

Með öðrum orðum, ef s er músina, vel, við skulum draga bara það, bókstaflega, sem bendill, ör sem vísar frá sér í eitthvað annað, og ekki hafa áhyggjur of mikið meira um að minutia þessara netfanga sem, aftur, ég gerði upp engu að síður. En við munum sjá þá heimilisföng, stundum, þegar kembiforrit kóða. 

Nú á meðan, þetta forrit upp hér fastur, að sjálfsögðu, þessi vandamál með því að bera þessir tveir strengir. En við lentum í annað vandamál. Þetta var frá eintak forrita síðasta sinn, þar, ég var að reyna að nýta bara fyrsta staf í streng. En hvað var einkenni sáum síðasta sinn þegar notandi slegið í gildi, eins og Gabe er með lágstöfum, til s, þá erum úthlutað s í t, eins og í þriðju línu þar, og þá er ég reyndi að nýta t krappi 0? Hvað var að áhrif breyta t krappi 0 hér? 

Áhorfendur: Það breytti s. 

DAVID J. MALAN: Já, Ég hef breytt s, eins vel. Vegna þess að það var í raun að fara á? Jæja, láttu mig sjá hvort ég er að þrífa upp þessa mynd, eins og hér segir. 

Ef s er, aftur, orðið g, A, B, E, sviga, 0, og s Við munum halda áfram að teikna og kassa hér, en ekki fleiri netföng. Við skulum hætta að gera hlutina upp. Við skulum teikna bara mynd til að einfalda heiminn. 

Þegar ég lýsi t með band t, sem skapar þessi klumpur af minni. Square gerist að vera 32 bitar á flestum tölvum. Í staðreynd, ef þú hefur einhvern tíma heyrt um að tölva með 32-bita arkitektúr, mjög fínt-tala, sem bara þýðir það notar 32-bita vistföng. Og eins og a tæknilegur hliðar, ef þú hefur alltaf furða hvers vegna eldri tölvur, ef þú í raun og veru reyndi að súpa þá upp með fullt af RAM, gæti bara fengið allt af fjórum gígabæta vinnsluminni, vel það er vegna þess, bókstaflega, gamla tölvan þín gæti aðeins telja eins hátt og 4 milljarðar, 4 milljarða bytes, vegna þess að það var með 32-bita tölur fyrir heimilisföng. 

En í öllum tilvikum, í þessari td saga er mun einfaldari. t er bara annar bendi, eða raun char stjörnu, aka band. Og hvernig ég vil að uppfæra þessa mynd nú með því að annarri línu af kóða, eftir punktinum, punktur, punktur? Þegar ég band T jafngildir s semíkommu, hvernig virkar þessi mynd breyst? Já? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Já. Nákvæmlega. Ég setti bara ör sem T kassi á sama heimilisfang, sama fyrsta stafinn í gaf. Eða tæknilega, ef þetta strákur var samt á 0x1, það er eins og ég hafði 0x1 hér og 0x1 hér. En aftur, sem er ekki sama um heimilisföng? Það er bara hugmynd sem nú skiptir máli. Svo er þetta það sem er að gerast hér. Svo auðvitað, ef þú gerir t krappi 0, sem er array tákn, af course-- og hreinskilnislega, það lítur eins og það er óákveðinn greinir í ensku fylking hérna, en nú er það þetta furðulegur hlutur. Vita að forritunarmál, C, býður þér þennan möguleika, þar sem, jafnvel ef t er músina, eða s er músina, þú getur samt notað það þekki, þægilegt veldi krappi ritháttur til að fara í fyrsta þættinum, eða annar þáttur, eða hvaða þáttur að það bendi snúi að því, væntanlega, það er, eins og í þessu tilfelli, benda á einhvern fylkisins. 

Svo hvernig gera við lagað þetta? Frankly, þetta er þar sem það fékk lítill yfirþyrmandi í fyrstu sýn. En hér er ný og endurbætt útgáfa. 

Svo fyrst ég er að fá losna við CS50 bókasafn, bara til að fletta ofan að er er örugglega a char stjörnu, bara samheiti. Og t er einnig bleikju stjörnu. En hvað er að gerast á Hægra megin þeirrar línu þar sem t er úthlutað gildi? 

Hvað er malloc? Hvað það er strlen? Hvað er sizeof (char)? Hvers vegna Heck er þetta lína líta svo flókið? Hvað er það að gera á háu stigi? Hvað er það að geyma í T? Já? Áhorfendur: Það er að úthluta a tiltekið magn af minni. Það er til að geyma, ég held, bréf [inaudible]. 

DAVID J. MALAN: Perfect. Fullkominn. Það er að úthluta ákveðnu magn af plássi minni að geyma væntanlega framtíð bréf. Og einkum malloc Því aftur hvað? 

Áhorfendur: Reglulegur á [inaudible]? DAVID J. MALAN: Einmitt. Reglulegur veffang sem minni, sem er fínt leið til að segja, skilar veffang sem Fyrsta bæti þeim minni. Hvílir á mér að muna hversu mikið minni ég reyndar úthlutað eða bað malloc fyrir. 

Nú hversu mikið er það? Jæja, jafnvel þó að það er a einhver fjöldi af svigum hér, malloc tekur bara einn rök. Og ég er að skilgreina strlen af ​​s, svo gefa mig eins og margir bæti og það eru í s, en eina. Hvers vegna? Já? 

Áhorfendur: The sviga 0. DAVID J. MALAN: Einmitt. Við verðum að gera smá tiltekt og þrif. Svo vegna þess að það er sviga 0, viljum við betur eftir það. Annars erum við að fara til að búa til band sem virkar ekki að sérstaka Terminator. 

Á sama tíma, bara til að vera frábær endaþarms, ég sizeof (char), bara ef einhver rekur mínu númer ekki á CS50 tæki, en kannski öðruvísi tölvu samtals þar stafir eru eitt bæti, eftir venju, en tveir bæti, eða eitthvað stærra en það. Það er bara að vera frábær, frábær averse til villur. Jafnvel þó í raun og veru, það er líklegast að fara til vera a 1. 

Nú, á meðan ég fer á undan og afrita band, t krappi ég jafngildir T krappi s. Og ég mun fresta að síðustu viku Kóðinn til að sjá hvað er að gerast. En lykillinn takeaway og ástæða þess að ég setti kóðann nú í grænu, er vegna þess að þessi mjög síðustu línu, T krappi 0 er toupper, hefur þau áhrif að Hagnast sem band? t og / eða s? Það síðasta lína af kóða. 

Bara t, því það er gerðist þetta sinn, ef ég losa aðeins að síðasta skrefið, það sem hefur gerst er þegar ég kalla malloc, Ég fæ í raun klumpur af minni sem er í sömu stærð og upprunalega, því það er stærðfræði sem ég gerði. Ég geyma í t heimilisfang þess klumpur af minni. Jafnvel þó að þessi lítur vel og falleg, gott og auður, Staðreyndin er að það er, það sem við munum halda starf, sorp gildi hér. Það klumpur af minni gæti mjög vel hafa verið notuð áður, nokkrar sekúndur, nokkrum mínútum. Þannig að það gæti alveg verið tölur eða bréf þar, bara með því að slys. En þeir eru ekki í gildi, fyrr en ég sjálfur byggja þessa klumpur af minni með raunverulegum stafir, eins og ég gera í því fyrir lykkju þar. Allt í lagi? 

Svo nú, hápunktur af þessir þrír dæmi sem voru að því er virðist brotinn síðasta sinn, þetta skipti dæmi, þessi aðgerð unnið í þeim skilningi að það skiptust a og b. En það virkaði ekki í hvaða öðrum skilningi? Já? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Einmitt. Ef ég væri að kalla þessa aðgerð frá another-- til dæmis, frá fall eins helsta, þar Ég er með breytu, x og y, sem ég gerði í síðustu viku, sama númer, og ég fara í x og y að skipta, og þá kalla Swap-- þetta, að sjálfsögðu, er rétt útgáfa er það sem við erum að fara að see-- það virkaði ekki. Svo er það sem festa? 

Jæja, svo bara að vera ljóst, láta mig fara á undan and-- gefa mér einn annar hérna, og sjá ef ég get sýnt þér það síðasta, sem verður in-- skulum sjá hvort ég get fundið þetta raunverulegt fast-- lagi, [inaudible]. OK, það er það. Svo hunsa skipanir sem ég ætla bara að slá. Ég vil það að sækja á á síðustu stundu dæmi frá síðasta tíma, sem er nú kallað engin skipti. 

Svo er engin Víxla þar sem við var horfið síðast, þar, frumstillt ég x að 1 og y í 2. Ég kalla þá Skipta, liggur í 1 og 2. Og þá er þetta virka unnið í einhverjum skilningi, en það hafði engin varanleg áhrif á x og y. Svo spurningin hendi er, hvernig nú lögum við í raun þetta vandamál? Hver er lausnin á hönd? 

Jæja, í swap.c, sem er ný í dag, taka a par af mismunandi. x og y eru þeir sömu. En hvað er greinilega öðruvísi línu 25? Hvað er nýtt þar, ef þú manst það leit út fyrir annað síðan? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Já. Svo -merkið eru ný stykki af setningafræði, ekki aðeins í þessari áætlun, en einnig almennt í CS50. Hingað, ég held ekki Við höfum séð einhverjar dæmi eða bara talað um þá í hvaða smáatriði, önnur en kannski preemptively í kafla, merkið eins og þetta. Jæja, það kemur í ljós ampersand er einn af síðustu stykki af nýjum setningafræði við erum að fara að læra. Allt það þýðir að heimilisfang sumir breytu. Á hvaða netfang er x lifa? En hvað netfang er Y lifa? Vegna þess að ef grundvallaratriði vandamál áður var að x og y var berist sem afrit, hvað við viljum í raun að gera er veita Skipta með eins fjársjóði Kort sem leiðir til þar sem x og y í raun eru í vinnsluminni, þannig að Víxla má fylgja þessi kort og fara til hvar X eða Y markar blettur og breyta raunverulegum gildum 1 og 2 þar. 

Svo Víxla þarf að breyta örlítið líka. Og við fyrstu sýn gæti þetta virðast svolítið svipað bleikju stjörnu. Og reyndar er það. Svo er bendi á hvaða tegund af gögnum, byggt á þessum völdu hluta? Svo er það int. 

Svo er ekki lengur int það er veffang heiltala. Og sömuleiðis, b er nú að fara til að vera heimilisfang heiltala. Svo þegar ég kalla nú Víxla frá Main, Ég ætla ekki að fara að gefa Swap 1 og 2. Ég ætla að gefa henni eins og Ox-eitthvað og Ox-eitthvað, tveir vistföng sem mun leiða Víxla raunverulegum stöðum sínum í minni tölvunnar minnar. 

Svo nú, eftir framkvæmd mín þarf að breyta tad. Hvað er augljóslega öðruvísi núna í þessum þremur línum af kóða? Það er þessi fjandinn stjörnur allt the staður, allt í lagi? Svo hvað er að gerast hér? Já? 

Áhorfendur: Það er augljóslega [inaudible]. 

DAVID J. MALAN: Einmitt. Þannig að í þessu context-- og þetta var ekki besta hönnun ákvörðun, að vísu, árum síðan. Í þessu samhengi, þar sem þú ert bara stjarna, og þú þarft ekki að hafa gögn tegund, eins int, strax til vinstri, í stað þess að hafa jafnan tákn, greinilega, í þessu samhengi, þegar þú segir star a, það þýðir að fara á netfang sem er í a. Fylgdu fjársjóð kort, svo að segja. 

Og á meðan, í samræmi 37, það þýðir það sama. Fara til the heimilisfang a, og setja það þarna? Hvað er að staðsetning sem b um. Í öðrum orðum, fara að b. Fá þessi gildi. Fara til a og á jafnan undirrita, úthlutun rekstraraðila, setja þessi gildi þar. 

Á sama hátt, int afleysingamanneskja er bara int. Ekkert þarf að breyta um hitastig. Það er bara til vara gler úr Annenberg fyrir sumir mjólk eða appelsínusafa. En ég þarf að segja, fara í b. Fara til áfangastaðar og setja gildi í afleysingamanneskja þar. Svo hvað er að gerast þá? Þegar ég kalla reyndar Víxla þessum tíma, ef þetta fyrsta bakki hér táknar Main, þessi seinni bakki táknar Skipta, þegar Ég fara merkið x og merkið y frá Main til Víxla, bara til að vera skýr, hvað er þetta stafla ramma móttöku? Já? 

Áhorfendur: [inaudible]. DAVID J. MALAN: Einmitt. Veffang x og heimilisfang y. Og er hægt að hugsa um þetta eins póstföng. 33 Oxford Street og 35 Oxford Street, og þú vilja til að færa tvær byggingar sem eru á þeim stöðum. 

Það er tegund af fáránlega hugmynd, en það er allt er átt við með heimilisfang. Hvar í heiminum getur þú finnur þessa tvo ints? Hvar í heiminum getur þú finna þá tveimur byggingum? Svo ef að lokum, eftir allan þennan tíma sem ég fara í dag kóða og safna saman Víxla og hlaupa ./swap, að lokum, til að fyrsta skipti sjáum við í raun og veru að Gildin mín hafa örugglega verið skipst með góðum árangri. Og nú getum við jafnvel tekið mið af þessu í, segjum, gdb. 

Svo láta mig fara í sömu skrá. Leyfðu mér að fara á undan og keyra gdb á ./swap. Og nú, í Víxla, ég ætla að fara undan og setja brjóta lið í Main. Og nú er ég að fara að fara undan og hlaupa the program. Og nú sjáum við númerið mitt bið á þeirri línu. 

Ef ég fer á undan og prenta x, hvað ætti ég að sjá hér? Það er spurning. Segja aftur? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Svo slembitölur, kannski. Kannski fæ ég heppinn, og það er gott og einfalt, eins og 0. En kannski er það sumir af handahófi númer. Í þessu tilfelli, ég var heppinn. Það gerist bara að vera 0. En það er örugglega heppni, því ekki fyrr en ég slá næsta og þá hefur prenta x að lína af kóða, lína 19, verið keyrð. 

Á sama tíma, ef ég tegund næst aftur, og nú prenta út y, ég ætla að sjá 2. Nú, ef ég tegund næst, er það að fara að fá smá ruglingslegt, því að nú, sem printf er að fara að birtast á skjár, eins og það gerði. x er 1. 

Við skulum gera þetta aftur. Og nú, hér er þar það fá áhugavert. Áður en ég kalla á Víxla eða jafnvel skref inn í það, við skulum taka smá gægjast. x er, aftur, 1. Y er, að sjálfsögðu, fljót geðheilbrigði athuga, 2, svo ekki erfitt þar. En hvað er ampersand x? Svarið, það er góður af angurvær útlit. En int stjörnu í sviga er bara leið landsframleiðslu er að segja þetta er heimilisfang. Það er ekki int, er það bendi til að int, eða annars þekkt sem heimilisfang. 

Hvað er þetta brjálaður hlutur? Við höfum aldrei séð eitthvað alveg eins og áður. Svo er þetta netfang í tölvu er mín minni þar sem x gerist að lifa. Það er Ox-eitthvað. Og þetta er, hreinskilnislega, hvers vegna Ég hef byrjað að teikna örvarnar, í stað þess að tölum, því hver raunverulega annt að int er á tiltekin netfang sem er það stór. En bffff0c4, eru þetta allt Reyndar sextánskur tölustafir, sem eru 0 í f. 

Þannig að við erum ekki að fara að búa of lengi um hvað þessir hlutir eru. En ef ég prenta út y, auðvitað, ég sjá 2. En ampersand Y, ég sé þetta netfang. Og tilkynning, fyrir forvitinn, hversu langt í sundur eru x og y? Þú getur hunsa mest af heimilisfang. Fjórir bæti. Og það er í samræmi við okkar fyrr halda því hversu stór er int? Fjórir bæti. Svo það lítur út eins og fóður allt er upp fallega, eins og þú might vona í minni. 

Svo nú, við skulum bara hratt áfram til loka þessa sögu. Við skulum fara á undan og sláðu skref, að kafa í Víxla virka. Nú taka, ef ég tegund a, það er eins á heimilisfang x. Ef ég gerð B, það er eins á heimilisfang y. Svo hvað ætti ég að sjá hvort ég segja, að fara á heimilisfang í? Svo prenta stjörnu a. Svo stjörnu þýðir að fara þarna, í þessu samhengi. Ampersand þýðir hvað er heimilisfang. Svo star leið 1. Og prenta stjörnu b gefur mér 2. 

Og láta mig gera ráð fyrir, í bili, að minnsta kosti kóðinn sem ágóði að framkvæma nú hægt að rökstudd með þeim hætti. En við munum skoðunar hugmynd áður en langur. Svo þessi útgáfa af Víxla er nú rétt og gerir okkur að skipta þessari tilteknu gögn tegund. 

Svo einhverjar spurningar þá á Víxla? Á stjarna? Á heimilisfang? Og þú munt sjá, með Heimadæmi 4, svoleiðis, en vandamálið sett 5, örugglega, hvernig þessir það eru gagnlegar og fá miklu meira vel með þeim, eins og a afleiðing. Nokkuð á öllum? Allt í lagi. Svo malloc er, aftur, þessi aðgerð sem bara úthlutar minni, minni úthlutun. Og hvers vegna er þetta að gagni? Jæja, allt að þessu sinni, þú hefur verið að nota malloc. Ef þú telur nú hvernig getString verk, væntanlega, það er verið að biðja einhvern um klumpur af minni, hvenær notandi ýtir band í, vegna þess að við svo sannarlega vissi ekki, eins CS50 starfsfólk, hversu stór þau strengi sem menn eru að fara að slá gæti haft. 

Svo skulum, í fyrsta skipti, byrja að hýði aftur hvernig CS50 bókasafn verk, með því að a par af dæmum sem mun leiða okkur þangað. Þannig að ef ég opna gedit og opna scanf 0, við erum að fara að sjá eftirfarandi kóða. Scanf 0, birtar á heimasíðu fyrir í dag, hefur tiltölulega nokkrar línur af kóða hér, 14 til 20. Og við skulum sjá hvað það er að gera. Það segir int, sem heitir x. Það segir eitthvað eins og, tala vinsamlegast. Og nú segir hann, scanf% i, & x. Svo er það fullt af nýju efni þarna. 

En scanf geturðu konar hugsa um sem andstæðu printf. printf, auðvitað, prentar á skjánum. scanf konar skannar frá notanda er hljómborð eitthvað sem hann eða hún hefur slegið. 

% I er bara eins og printf. Þetta þýðir von á því notanda að slá við int. Og nú, af hverju heldurðu að ég gæti verið brottför scanf & X? Ef tilgangur í lífi scanf er að fá eitthvað frá notanda, hvað er merking liggur það, og x, nú? Já? 

Áhorfendur: [inaudible]. DAVID J. MALAN: Einmitt. Hvað sem ég, manna, slá inn, inntak mína er að fara að vera vistað á þeim stað. Það er ekki nóg, muna, að bara fara í x, vegna þess að við höfum séð nú þegar, hvenær þú fara bara hrár breytu, eins og int, að einhverju öðru virka, viss, getur það breytt því breytu, en ekki varanlega. Það er ekki hægt að hafa áhrif á Main. Það getur aðeins breytt sínu eigin staðbundna eintak. En ef, í stað, þú ert ekki gefa mér í raun int, en þú gefur mér leiðbeiningar til sem int, ég nú, að vera scanf, vafalaust, get ég fylgt því heimilisfang og setja númerið þar svo þú hefur aðgang að henni eins og heilbrigður. 

Svo þegar ég keyra þetta forrit, við skulum sjá. Gera scanf 0 punktur rista, scanf 0. Og ef ég tegund núna númer eins 50, takk fyrir 50. Ef ég slá nú fjölda eins neikvæð 1, fyrir neikvæðum 1. Ég slá nú tala eins og 1,5, HM. Af hverju gerði forritið mitt hunsa mig? Jæja, vegna þess að einfaldlega, sagði ég það að búast við int aðeins. Allt í lagi. Svo er það ein útgáfa af þessu. Við skulum taka það upp hak og lagt til að þetta er ekki gott. Og hér liggur mjög einfalt dæmi um hvernig við getum byrjað að skrifa kóðann að annað fólk getur nýta eða málamiðlun með því að gera slæma hluti. Svo lína 16, svo líkur í anda og áður en ég ætla ekki að lýsa því int þetta sinn. Ég lýsa það bleikju stjörnu, aka streng. 

En hvað þýðir það í raun þýtt? Þannig að ef ég ekki tilgreina ekki í address-- og Ég kalla það geðþótta, dúa, en ég gat hringt það er, að vera simple-- og þá er ég að gera þetta, útskýra fyrir mér, ef þú gætir, byggt á fyrri rökfræði, hvað er scanf gera í samræmi 18, ef umferð% s og buffer, sem er heimilisfangið? Hvað er scanf, ef þú sækir um það nákvæmlega sama rökfræði og útgáfu 0, að fara að reyna að gera hér, þegar sem gerðir notandi eitthvað í? Já? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Einmitt. Scanf, með rökfræði fyrr, er að fara að taka strenginn að mönnum slegin in-- það er nú strengur, það er ekki tala, væntanlega, ef hann eða hún cooperates-- og það er að fara að reyna að setja þessi band í minni á hvaða heimilisfang biðminni tilgreinir. Og þetta er frábært, því buffer er örugglega ætlað að vera netfang. 

En ég kröfu þetta forrit er þrjótur í a mjög alvarlegt hátt, vegna þess að það gildi TAG sjálfgefið? Hvað hef ég frumstilla í? Hvað klumpur af minni? Ég hef ekki, ekki satt? 

Svo jafnvel þó að ég hef úthlutað á bleikju stjörnu sem er ekki lengur kallað s, það er í stað sem heitir, buffer-- svo skulum draga nafn breytu nú sem buffer-- ef ég hef ekki kallað getString eða malloc hér, sem í raun þýðir að TAG er bara sorp gildi. 

Nú hvað þýðir það? Það þýðir að ég hef sagt scanf að búast streng frá notanda. Og þú veist hvað? Hvað þessi hlutur er að benda to-- og ég teikna spurningamerki, en í raun og veru, það er að fara að vera eitthvað eins OX1, 2, 3, ekki satt? Það er einhver svikinn gildi sem bara gerist að vera þar frá áður. Svo setja annan hátt, það er eins og biðminni er bara benda á eitthvað í minni. Ég hef ekki hugmynd um hvað. 

Svo ef ég tegund í GABE nú, það er að fara til að reyna að setja G-A-B-E / 0 þar. En hver veit hvað það er? Og í fortíðinni, allir skipti sem við höfum reynt að snerta minni sem ekki tilheyra okkur, hvað hefur gerst? Eða næstum hvert skipti. Skiptingu kenna, ekki satt? 

Þessi ör, ég hef ekki hugmynd um hvar það er benda. það er bara einhver hending. Og auðvitað, ef þú túlka handahófi gildi sem heimilisfang, þú ert að fara að fara til some random áfangastað. Svo gæti Gabe örugglega hrun áætlun mín í þessu tilfelli hér. 

Og hvað getum við gert það er næstum eins slæmt? Hugleiddu þetta þriðja og Endanleg dæmi um scanf. Þessi útgáfa er betri í hvaða skilningi? Ef þú ert ánægð með fyrri vandamál, þetta er betra. Hvers vegna? 

Áhorfendur: [inaudible]. DAVID J. MALAN: Gott. Þannig að þetta mál á línu 16 er betra, í þeim skilningi að við erum sérstaklega úthlutun minnis. Við erum ekki að nota malloc, við erum að nota í viku 2 nálgun bara lýsa fylki. Og við höfum sagt áður að strengur er bara fylki af stöfum, þannig að þetta er algerlega lögmætur. En það er auðvitað, eins og þú huga, fast stærð 16. 

Svo er þetta forrit algerlega öruggt, ef ég tegund í einu táknstrengja, tveir eðli strengir, 15 táknstrengja. En um leið og ég byrja að skrifa 16, 17, 18, 1000 táknstrengja, hvar er þessi strengur að fara að enda? Það er að fara að enda upp að hluta hér. En þá hver veit hvað annað er út fyrir mörk að þessari sérstöku array? 

Það er eins og ég hef lýst 16 kassa hér. Svo frekar en að draga úr öllum 16, við munum bara láta sem ég hef dregið 16. En ef ég reyni þá að lesa streng það er miklu lengur, eins og 50 stafi, Ég ætla að byrja að setja a, b, c, d, x, y, z. Og þetta er væntanlega einhver annar minni hluti sem, aftur, gæti valdið áætlun mín að hrun, vegna þess að ég hef ekki beðið um eitthvað meira en bara 16 bæti. 

Svo sem ekki sama? Jæja, hér er CS50 bókasafn. Og flest af þessu er bara eins leiðbeiningar upp ofan. The CS50 bókasafn, allan þennan tíma, hefur haft þessa línu í línu 52. Við höfum séð typedef, eða þú munt sjá typedef í pset 4, sem bara skapar samheiti þar bleikju stjarna geta verið meira einfaldlega vísað til sem band. Svo er þetta eitt af Nokkrum hjól þjálfun við höfum notað leynilega undir hetta. 

Á sama tíma, hér er hlutverk, getchar. Nú virðist, það er engin líkami til þess. Og í raun, ef ég halda rolla, ég í raun ekki sjá allir gerð þessar aðgerðir. Sem geðheilsu stöðva, hvers vegna er það? 

Áhorfendur: [inaudible]. DAVID J. MALAN: Já. Svo er þetta haus skrá. Og haus skrár innihalda frumútgáfur, auk sumir annar efni, virðist það, eins typedefs. En í CS50.c, sem við höfum aldrei gefið þér beinlínis, en hefur verið í CS50 tæki allt í þetta sinn, djúpt inni möppur þess, tekið eftir því að það er allt fullt af störfum hérna. 

Í raun, við skulum fletta niður. Skulum hunsa flestir, fyrir nú. En fletta niður til getInt og sjá hvernig getInt virkar. Svo hér er getInt. Og ef þú alltaf raunverulega aðgát hvernig fá int virkar, hér er gögn þess. Og meðal þess það segir er það segir þér hvað svið gildum getur það aftur. Það er í raun neikvæð 2 milljarða að jákvæðri 2 ma.kr., gefa eða taka. 

Og það kemur í ljós, allt þetta tíma, jafnvel þó að við höfum aldrei hafði þú athugað fyrir það, ef eitthvað fer úrskeiðis, það kemur í ljós að allir í þetta sinn, getInt hefur verið aftur sérstakt fasti, ekki null, heldur int_max, sem er samningur réttlátur a forritari. Það þýðir hér er sérstakt gildi. Gakktu úr skugga um að athuga þetta, bara ef eitthvað fer úrskeiðis. En við höfum aldrei nenna með því að hingað til, því aftur, þetta er ætlað að einfalda. 

En hvernig er getInt fá hrint í framkvæmd? Jæja, einn, það tekur engin rök. Við vitum það. Það skilar int. Við vitum það. Svo hvernig virkar það undir hetta? 

Þannig að það er greinilega óendanlega lykkja, að minnsta kosti útliti einu. Takið eftir að við erum að nota getString. Svo er það áhugavert. getInt kallar eiga virka okkar, getString. Og nú hvers vegna gæti þetta verið raunin? Hvers vegna er ég að vera í vörn hér í línu 165? Hvað gæti gerst í línu 164, bara til að vera skýr? Það er sama svar og áður. Gæti bara verið út af minni. Eitthvað fer úrskeiðis við getString, við verðum að vera fær um að sinna því. Og ástæða þess að ég skila ekki null er að tæknilega, null er bendillinn. getInt þarf að skila int. Svo ég hef geðþótta ákvað, í meginatriðum, að 2 milljörðum, gefa eða taka, er að fara að vera sérstakt gildi sem ég get aldrei reyndar fá frá notandanum. Það er bara eitt gildi sem ég ætla að eyða til að tákna villu kóða. 

Svo nú, það fá smá ímynda. Og það er ekki alveg sama aðgerð eins og áður, en það er mjög svipað. Svo taka, ég lýsi hér, í samræmi 172, bæði int n og char c. Og þá er ég að nota þetta angurvær línu, sscanf, sem það kemur í ljós ekki skanna a band frá lyklaborðinu. Það stendur núverandi streng sem notandinn hefur þegar slegið inn. Svo ég kallaði þegar getString, sem þýðir að ég hafa a band í minni. sscanf er það sem þú vilt hringja í þáttun virka. Það lítur á band sem ég hef slegið inn, stafinn með staf, og gerir eitthvað gagnlegt. Það band er geymt í línu. Og ég veit að aðeins með því að fara aftur upp hér og segja, ó, allt í lagi, Ég kallaði það ekki s að þessu sinni, en lína. 

Og nú er þetta svolítið öðruvísi. En þetta í raun þýðir, af ástæðum Við munum nokkuð veifa höndum okkar á í dag, að við erum að athuga að sjá ef notandinn slegið inn og int og kannski annað eðli. Ef notandinn slegið í int, það er að fara að vera geymd í n, því ég er liggur þetta með tölu, Ný bragð sem við höfum séð í dag. Ef notandinn slegið einnig í eins 123x, að x er að fara að enda upp bréf í eðli c. 

Nú kemur í ljós að sscanf mun segja mér, greindur, hversu margir breytur var sscanf tókst fær um að fylla. Svo með þessum reglum, ef virka Ég framkvæmd er getInt, en ég ætla að haka, hugsanlega, fyrir notandann að hafa slegið í int eftir eitthvað annað, hvað vil ég sscanf er skilagildi sannarlega að vera? Ef tilgangurinn er að fá bara int frá notanda? 

Svo ef sscanf ávöxtun 2, hvað þýðir það? Notandinn slegið í eitthvað eins og, bókstaflega, 123x, sem er bara bull. Það er óákveðinn greinir í ensku villa ástand og Ég vil athuga það. 

Svo ef notandinn slær þetta í, með því að þetta rökfræði, hvað gerir sscanf aftur, myndir þú segja? Svo það er að fara að skila 2, vegna þess að að 123 er að fara að fara í hér, og x er að fara að enda hérna. En ég vil ekki að x til að fá fyllt. Ég vil sscanf aðeins að ná árangri í fylla fyrsta breytur hennar. Og svo er það þess vegna sem ég vilt sscanf að skila 1. 

Og ef þetta er dálítið yfir höfuð fyrir stundu, það er algerlega allt í lagi. Átta sig þó, að einn af gildi getInt og getString er að við erum að gera Heck af a einhver villa stöðva svona svo að hingað til, getur þú nokkurn veginn slá eitthvað á lyklaborðið, og við munum grípa það. Og við vissulega að starfsfólk, mun örugglega ekki vera uppspretta villu í þinn program, vegna þess að við erum í vörn stöðva fyrir alla heimskur hlutir sem notandi gæti gert, eins og að slá á streng, þegar þú vildir virkilega int. Svo fyrir now-- við munum koma aftur til þetta áður long-- en allan þennan tíma, getString og getInt hafa verið undir hetta með þetta Grunnhugmyndin um heimilisföng minni. 

Svo nú skulum við gera hlutina lítið meira notendavænt. Eins og þú getur muna, frá Binky síðasta time-- ef mús minn mun cooperate-- svo við höfðum þennan kóða, sem hreinskilnislega, er nokkuð nonsensical. Þessi kóði nær ekkert gagnlegur, en það var dæmi sem prófessor Parlante notuð í því skyni að tákna hvað var að gerast í a program þar minni. 

Svo skulum endursegja þetta Sagan frábær í stutta stund. Þessar fyrstu tvær línur, í Enska, hvað, myndir þú segja? Bara í sæmilega manna, en örlítið tæknileg hugtök, taka a stunga. Áhorfendur: [inaudible]. 

DAVID J. MALAN: OK, þú ert að koma heimilisföng fyrir x og y breytur. Ekki alveg, vegna þess að x og y eru ekki breytur í hefðbundnum skilningi. x og y eru viðtakandi eða mun geyma tölu. Svo skulum reyna þetta einu sinni enn. Ekki slæm byrjun, þó. Já? 

Áhorfendur: [inaudible]. DAVID J. MALAN: Gott. Ég held að það sé lítið hreinni. Lýsa tveimur ábendingum, tvær heiltölur. Og við erum að kalla þá x og y. Eða ef við vorum að teikna þetta sem mynd, aftur, muna einfaldlega að allir við erum að gera með því að fyrstu línu er að teikna kassa eins og þetta, með nokkrum sorp gildi í það, og kalla það x, og þá annar kassi eins og þetta, með nokkrum sorp gildi í það, kalla það y. Við höfum lýst tvö ábendingum að á endanum mun geyma veffang heiltala. Svo er það allt þarna. 

Svo þegar Binky gerði þetta, leir horfði bara svona. Og Nick bara svona pakkað upp örvarnar, eins og þeir eru ekki að benda hvar einkum vegna þess að þeir eru bara sorp gildi. Þeir eru ekki beinlínis frumstilla hvar sem er í lagi. 

Nú er næsta lína af númer, muna, var þetta. Svo í sæmilega notendavænt, en nokkuð tæknilega enska, hvað er þetta lína af kóða gera? Já? 

Áhorfendur: [inaudible]. 

DAVID J. MALAN: Perfect. Það er að skipta á klumpur af því minni sem er á stærð við int. Og það er hálf svarið. Þú svarar rétt helmingur af tjáningu. Hvað er að gerast á Vinstra megin á jafnaðarmerki? Já? Áhorfendur: Og viðtakendur það til breytu x? 

DAVID J. MALAN: Og viðtakendur það til breytu x. Svo að ágrip, hægri hönd hlið úthlutar nóg minni til að geyma við int. En malloc sérstaklega skilar tölu þess klumpur af minni, sem þú hefur bara lagt fær geymd í x. 

Svo hvað Nick gerði síðast með Binky er Hann dró að bendillinn út, leirinn, að benda nú á hvítum klumpur af minni sem er jöfn á stærð heiltala. Og reyndar, það er ætlað til að tákna fjögur bæti. 

Nú er næsta lína af kóða gerði þetta, stjörnu x fær 42. Svo er 42 einfalt á Hægra megin, merking lífsins. Vinstri hlið, stjarna x þýðir hvað? Að of might hafa gone-- það er allt í lagi. OK. 

Áhorfendur: Í grundvallaratriðum, fara á [inaudible] DAVID J. MALAN: Gott. Áhorfendur: [inaudible]. DAVID J. MALAN: Einmitt. Vinstri hlið þýðir að fara til x. x er heimilisfang. Það er eins og 33 Oxford Street, eða OX1. Og stjörnu x þýðir að fara á það heimilisfang og setja það þarna? 42. 

Svo reyndar, það er einmitt það sem Nick gerði. Hann byrjaði með eftir, meginatriðum, andlega benda fingri á x, eftir sem örin að hvítur kassi á hægri hönd hlið, og setja númerið 42 þar. En þá það fékk að lítið hættulegt, ekki satt? Binky er um það bil að missa höfuðið. 

Stjörnu Y jafngildir 13, óheppni, þýðir hvað? Svo star y þýðir að fara á heimilisfang í y. En hvað er heimilisfangið í y? Allt í lagi, það er sorp gildi, ekki satt? Ég dró það eins spurningarmerki. Nick dró það sem hrokkinblaða upp örina. Og um leið og þú reynir að gera stjörnu y, segja að fara þangað, en það er ekki lögmætur heimilisfang, það er sumir svikinn staðsetning, forritið er að fara að hrun. Og höfuð Binky er að fara að fljúga burt hér, eins og það gerði. 

Svo í lok, þetta forrit var bara flatt út galli. Það var þrjótur program. Og það þarf að vera fastur. Og eina leiðin, í raun, til að laga það væri til dæmis þessi lína, sem við vissum ekki einu sinni fá að, vegna þess að forritið hrundi of fljótt. En ef við vorum að laga þetta, hvað áhrif hefur að gera y jöfnum x hafa? Jæja, það bendir í raun y á hvað gildi x er að benda á. 

Svo í sögu Nick er, eða saga Binky, bæði x og y voru að benda á hvíta klumpur af minni, svo að lokum, þegar þú gera stjörnu Y jafngildir 13 aftur, þú endar að setja 13 í viðeigandi staðsetningu. Svo allar þessar línur eru fullkomlega lögmæt, nema þetta eina, þegar það gerðist áður en þú reyndar úthlutað Y sumir gildi. 

Nú sem betur fer, þú þarft ekki hafa að ástæða gegnum allt þessar tegundir af málefnum á eigin spýtur. Leyfðu mér að fara á undan og opna upp á umferðamiðstöð gluggi hér og opna, fyrir aðeins augnablik, frábær stutt forrit sem Einnig er tegund af tilgangslaust. Það er ljótt. Það þýðir ekki að ná neitt gagnlegt. En það þýðir að sýna málefni minni, þannig að við skulum taka a líta. 

Main, frábær einfalt. Það kallar greinilega aðgerð, F, og þá skilar 0. Það er góður af erfitt að skipta þessu upp. Svo er Main nokkuð góð, svo langt. 

Svo er f erfið. Og bara ekki setja mikið átak í nafngiftir það hér, til að halda fókus í kóða. F hefur tvær línur. Og við skulum sjá hvað er nú í gangi. Svo annars vegar here-- og láta mig gera þetta í samræmi við fyrri example-- annars vegar, vinstri-hönd hlið er að gera það sem, á ensku? Það is-- Áhorfendur: Að búa til músina. DAVID J. MALAN: Að búa til bendi heiltala og kalla það x. Svo það er að búa til einn af þeim reitum Ég að halda áfram að teikna á snertiskjá. Og nú, á hægri hönd hlið, malloc, að sjálfsögðu, er að úthluta klumpur af minni. Og bara til að vera skýr, hvernig mikið minni er það greinilega úthlutun, ef þú bara konar gera stærðfræði hér? 

Svo er það 40 bæti. Og ég veit að aðeins vegna þess að ég veit að int, á CS50 tæki, að minnsta kosti, er fjögur bæti. Svo 10 sinnum 4 er 40. Þannig að þetta er sögufrægur er x, á heimilisfang í fyrsta af 40 ints sem hefur verið úthlutað rúm aftur, til baka, til baka, til baka. 

Og það er það sem er lykillinn um malloc. Það þýðir ekki að taka smá minni hér, smá hér, svolítið hérna. Það gefur þér eitt klumpur af minni, contiguously, frá rekstri kerfi. 

Hvað um þetta núna, x krappi 10 jafngildir 0? Handahófskennt lína af kóða. Það þýðir ekki að ná neitt gagnlegt. En það er áhugavert, því x krappi 10--? Já? 

Áhorfendur: [inaudible]? 

DAVID J. MALAN: x krappi 10 er ekki að vera núll. Núll smáatriði kemur aðeins inn í leik með strengi, í lok streng. En góð hugsun. 

Hversu stór er þessi fylking, jafnvel þó að ég hef úthlutað 40 bæti? Það er 0 í níu, ekki satt? Það er 10 ints alls. 40 bytes, en 10 ints, verðtryggð 0 með 0. 

Svo er það að x krappi 10? Það er í raun einhvers óþekkt sorp gildi. Það er minni sem ekki tilheyra mér. Ég ætti ekki að vera að snerta það bæti númer 41, 42, 43, 44. Ég ætla aðeins of langt. 

Og reyndar, ef ég keyra þetta program, það gæti mjög vel hrun. En stundum fáum við heppnir. Og svo bara til að sýna fram á this-- og hreinskilnislega, þú veist aldrei fyrir þér gera it-- skulum hlaupa þetta. Það var í raun ekki hrun. 

En ef ég breyti þessu, fyrir dæmi, að vera eins og 1000, til að gera þetta virkilega vísvitandi, við skulum sjá ef við getum fengið það til að hrun í þetta sinn. OK, það var ekki hrun. Hvað um 100.000? Skulum endurgerð það, og nú endursýning það. OK. Phew. Allt í lagi. Svo virðist, og aftur, þær hluti af minni, svo að segja, eru nokkuð stór, þannig að við getum heppinn aftur og aftur. En að lokum, þegar þú færð fáránlegt og í raun farið langt út á skjánum, þú snerta minni sem raunverulega, raun ekki tilheyra þér. 

En hreinskilnislega, þetta konar galla eru að fara að vera erfiðara og erfiðara að reikna út á eigin spýtur. En sem betur fer, eins og forritari, höfum við verkfæri sem gera okkur kleift að gera þetta fyrir okkur. Þannig að þetta er kannski ein af ugliest forritum, jafnvel ljótari en framleiðsla gdb er. En það hefur alltaf línu eða tvær sem eru frábær gagnlegt. 

Valgrind er forrit sem hjálpar ekki kemba a program, í sjálfu sér, en finna minni-tengdum vandamál, sérstaklega. Það mun sjálfkrafa birtast kóða fyrir þú og líta að minnsta kosti tvennt. Einn, gerðirðu eitthvað slysni eins snerta minni sem ekki tilheyrir þér? Það mun hjálpa þér að finna þau tilfelli. 

Og tveir, mun það hjálpa þú finnur eitthvað sem heitir minni lekur, sem við höfum alveg hunsað, naively, um nokkurt skeið og í sátt og samlyndi. En það kemur í ljós, allir í þetta sinn, þegar þú hefur kallað getString í svo margir programs okkar, þú ert að spyrja rekstri kerfi fyrir minni, en þú hefur einhverjar recollection á alltaf að gefa það aftur, gera unalloc, eða frjáls, eins og það er kallað. Nei, vegna þess að við höfum aldrei spurði þig að gera það. 

En allan þennan tíma, að áætlanir þú hefur verið að skrifa í C hafa verið að leka minni, spyrja rekstri kerfi fyrir fleiri og fleiri minni fyrir strengi og whatnot, en aldrei fötlun það aftur. Og nú er þetta dálítið á einföldun, en ef þú hefur einhvern tíma að keyra Mac eða tölvan fyrir alveg sumir tími, opnun hellingur af forritum, kannski loka forritum, og jafnvel þó að þinn tölva hefur ekki hrunið, það er að fá svo mikið hægari, eins og það er í raun nota mikið af minni eða auðlindir, jafnvel þó ef þú ert ekki einu sinni snerta lyklaborðið, sem gæti be-- en ekki always-- gat vera að áætlanir sem þú ert að keyra hafa sig minni lekur. Og þeir halda að spyrja OS fyrir fleiri og meira minni, en gleyma um það, ekki í raun að nota það, en því að taka minni í burtu úr öðrum forritum sem gætu viljað það. Svo er að útskýringin. Nú er hér þar Valgrind er framleiðsla er alveg grimmilegur til þeirra minna og eins öruggari. En áhugavert efni er allt hér. Það er að segja mér ógilt skrifa um stærð fjögur gerist í þessari áætlun, einkum á línu 21 af memory.c. 

Ef ég fer að stilla 21, HM, það örugglega er ógild skrifa stærðar fjórum. Hvers vegna stærð fjögur? Jæja, þetta number-- og það gæti verið anything-- er int. Svo er það fjórum bæti. Þannig að ég ætla að setja fjögur bæti þar sem þeir tilheyra ekki. Það er það sem Valgrind er í raun að segja mér. Ennfremur mun það einnig segðu mér, eins og við munum sjá, sem þú keyrir þetta í framtíðinni pset, ef og þegar þú hefur lekið minni, sem reyndar Ég hef, því ég hef kallað malloc, en ég hef í raun ekki kallað, í þessu tilfelli, frjáls, sem við munum að lokum sjá er andstæða malloc. 

Svo nú, held ég, endanlega dæmi. Svo þetta er svolítið meira Bogagöng, en það er kannski stærsta ástæðan til vera varkár með minni, og ástæðan fyrir því að margir programs og / eða vefur framreiðslumaður, jafnvel til þessa dags, eru teknar yfir af slæmur krakkar einhverstaðar á internetinu sem eru á einhvern hátt senda svikinn pakka til þinn framreiðslumaður reyna að málamiðlun reikningum þínum, eða taka gögnin þín, eða bara almennt taka yfir vél. Buffer flæða, sem nafnið gefur til kynna, leið barmafullur ekki við int, en biðminni. Og biðminni er bara fínt leið að segja að það er fullt af minni. 

Og reyndar, ég kallaði band áður en stuðpúða, í stað þess að s. Vegna þess að ef það er buffer, eins og í YouTube skilningi, eða þegar þú ert að horfa á vídeó, þú gætir hafa séð orðið höggdeyfir, punktur, punktur, punktur. Það er ótrúlega pirrandi. Og það bara þýðir að vídeó leikmaður er að reyna að sækja fullt bæti, hellingur af bæti úr myndbandi af internetinu. En það er hægt, svo það er að reyna til að sækja fullt af þeim til þess að fylla buffer, ílát, þannig að þú átt nóg bæti sem það getur síðan sýna þér myndband, án stansa stöðugt. En það kemur í ljós, getur þú hafa biðminni við þessu stóra. En að reyna að setja þetta mikið af gögnum í það, og mjög slæmur hlutur getur gerst. Svo til dæmis, við skulum líta á þetta endanlega beitu af dæmi. Þetta er annað forrit að við fyrstu sýn, gerir ekki neitt frábær gagnlegt. Það er got a Main virka sem kallar á að virka, f. Og virka, f, upp hér hefur a char array, sem heitir c, stærð 12.. Og þá er það að nota þetta nýtt hlutverk sem kallast strncpy. 

Það kemur í ljós, að með þessari einföldu, einföld lína af kóða, bara tvær línur, við höfum gert mitt öllu kerfinu, og því allt tölvan mín, og notandi reikningur minn, og erfitt minn aka hugsanlega viðkvæm að einhver hver veit og er nógu gott til að keyra þetta forrit með ákveðnum stjórn lína rök. Með öðrum orðum, ef þetta slæmur strákur setur inni argvargv [1] með því að slá á lyklaborðinu mjög sérstaklega gerðri band, ekki abc 123, en í raun, tvöfaldur tákn sem tákna executable númer, forrit sem hann eða hún skrifaði, með þessari einföldu forriti sem er fulltrúi þúsundum forritum sem eru álíka viðkvæmt, eflaust, hann eða hún getur að lokum að eyða öllum skrár á harða diskinum mínum, fá blikkandi hvetja þannig að hann eða hún getur slá skipanir á eigin spýtur, email allar skrár til mín. Nokkuð sem ég get gert, hann eða hún getur gert með þessum kóða. 

Við munum ekki alveg að leysa þetta enn. Og í raun, það er að fara að fela í sér litla mynd eins og þetta, sem við munum brátt koma að skilja allt betur. En í dag, við skulum enda á hvað er, vonandi, örlítið meira skiljanlegt XKCD brandari, þar til við að halda áfram næst. Allt í lagi. Sjáumst á miðvikudag. 

[Tónlist spila] 

Ræðumaður: Og nú, djúpt hugsanir, eftir Daven Farnham. Minni er eins stökk í haug af gullna lauf á sunnudagseftirmiðdegi. Vindur blása, kasta þínum hair-- ó, sakna ég þá daga when-- 

[Hlátur]