[Zenelejátszás]
>> David J. MALAN: Rendben.
Ez CS50.
És ez a hét elején 5.
És lehet, hogy észrevette, néhány az anyag
kezd egy kicsit komplex, a kis sűrűbb.
>> És ez nagyon egyszerű, különösen, ha voltál a szokás egy ideig,
hogy megpróbálja irkál le leginkább bármit teszünk, mondunk az osztályban.
De észre, hogy ez talán nem az ideális pedagógiai megközelítés
a tanulás az ilyen anyag és anyagi általában.
És örülünk, hogy be, hogy CS50 saját Gheng
Gong megkezdte a felkészülést a kanonikus sor jegyzetek
a tanfolyam, a remény, amely szerint, egy, ezeket
nem csak arra szolgálnak, mint egy referencia-és erőforrás
felülvizsgálatára anyagi és megy vissza az anyagot, amely esetleg
szökött meg az első körben, de azért is, hogy a feje is több
felfelé, mint lefelé, amikor eljön az ideje, az előadás,
így lehet, hogy vegyenek részt több elgondolkozva, mint
szemben több Scribbly.
>> Ezzel azt mondta, amit talál A weboldal olyan dokumentumokat, mint ez.
És értesítés, a bal felső sarokban, ott van nem csupán a tartalomjegyzék,
hanem idő kódok azonnal ugrik meg
a megfelelő rész a video on-line.
És mi Chang itt tett van, lényegében, dokumentált
ami ebben a különleges előadás.
És sok előadások már online most ezzel URL.
És mi továbbra is tegye a maradék Ezen a végén ezen a héten,
így nem kihasználni, hogy az erőforrás.
>> Tehát minden további nélkül, elkezdtük húzza vissza
a réteg, amely már karakterlánc egy ideig.
És mit mondunk a húr valójában a múlt héten?
Így char csillag.
És char csillag, nos, mi nem is jelent valójában?
Nos, ebben az időben, ha mi már hívogat a funkció,
mint getString és tárolás az úgynevezett visszatérés
értéke getString egy változó-- hívják
s típus string-- voltunk írásban a sort, ott fent.
És ez csak akkor, ha látom kézírás nagyított itt
nem tudom, hogy milyen kegyetlen is ez.
>> Azonban tegyük fel, hogy, a jobb oldali
az, hogy ennek ellenére az ésszerű ábrázolása, hogy mi a
folyik mindez idő getString.
getString természetesen kap egy húr.
De mit is jelent valójában?
Ez azt jelenti, hogy lesz egy darab memóriát az operációs rendszer
meghívásával funkció, az úgynevezett malloc.
De erről bővebben később.
És akkor feltölti hogy darab memória
A levelek a felhasználó beírt, majd, természetesen,
a null karakter, vagy backslash nulla a legvégén.
>> Eközben a bal oldali ezt a történetet, minden ebben az időben,
mi már nyilvánító változó, mint s.
És hogy a változó, amit most indul hívás a mutató.
Ez nem egy doboz belsejében, amely tesszük a húr, Daven, önmagában,
hanem teszünk hogy a tér dobozt a bal oldalon, hogy pontosan mit?
Igen?
>> Közönség: címe ahol ez található a memóriában.
>> David J. MALAN: Pontosan.
A cím, ahol Daven található a memóriában.
És nem ott, ahol az összes Daven található, önmagában, de konkrétan a cím
mi?
Igen?
>> Közönség: Az első karakter.
>> David J. MALAN: Az első karakter a Daven, ami, ebben az esetben,
Általam javasolt önkényesen és irreálisan 1 OX1,
ami éppen azt jelenti, hogy hexadecimális szám 1.
De ez valószínűleg hogy egy sokkal nagyobb szám
hogy talán rajzolni a 0x előtag,
ami hexadecimális karakter.
És mivel nem kell tudni, hogy hol a többi karaktereiből Daven
vannak, mert mi egyszerű tervezés döntés, amit sok évvel ezelőtt?
Igen?
>> Közönség: Backslash 0.
David J. MALAN: Igen, pontosan.
A backslash 0. lehetővé teszi, hogy, bár lineáris idő, hogy áthalad a húr,
séta balról jobbra, egy for ciklus, vagy egy ideig
hurok, vagy valami hasonló hogy, és meghatározza, ó, itt
a vége az adott húr.
Tehát csak az a cím, a kezdete egy húr,
tudjuk elérni a teljes egészében , mert mind ez ideig,
egy sor nemrég volt char csillag.
>> Szóval biztosan jó, hogy továbbra is használja A CS50 könyvtár és ezt absztrakció,
hogy úgy mondjam, de majd kezd, hogy pontosan
mi folyik alatt az egész idő alatt.
Szóval lehet felidézni ezt a példát, is, a múlt idő, hasonlítsa össze 0,
amely valójában nem összehasonlítani.
De elkezdtünk megoldani ezt.
>> De mint talán egy üdítő, Lehet, hogy én érdekelhet valakit
egy rózsaszín elefánt ma, szintén Chang?
Mi lenne, ha előtte? [Nem hallható].
Gyere fel.
>> És addig, ahogy jön, hadd
úgy egy pillanatra, milyen ez a kód valójában csinál.
Ez nyilvánította két változót fel top, s és t, és felszólította getString.
Ez nem egy nagyon felhasználóbarát program, mert nem mondja meg, mit kell tennie.
De nézzük csak feltételezni vagyunk összpontosítva a szaftos rész.
És akkor mi, ha s egyenlő egyenlő t, meg kell mondani printf,
beírt ugyanezt.
Helló.
Mi a neve?
>> JANELLE: Janelle.
David J. MALAN: Janelle, Örülök, hogy találkoztunk.
Így a kihívás kézzel az elefánt
hogy először készítsen nekünk egy képet, amit az képviselt az az első két
vonalak.
Tehát s és t lehet képviselte, hogy a képernyőn?
És ha csak rajzolni a az ujját a nagy képernyőn.
>> Szóval van két fél, hogy mindkét oldalán az egyenlet.
Szóval van ok a bal oldalon, és akkor getString a jobb oldalon.
És akkor ott van t a bal oldalon, majd getString a jobb oldalon.
Szóval, hogyan lehet, hogy elkezdjük rajz egy képet, amely
képviseli, mi folyik itt Itt a memóriában, mit mondana?
És hadd legyen magyarázza mit csinálsz, ahogy megy.
>> JANELLE: OK.
Nos, először is, akkor kérni teszi, hogy a bemeneti karakterlánc.
És ez store-- Ó, bocsánat.
David J. MALAN: OK.
Jó.
És ez az úgynevezett mi?
Oh, OK.
Folytasd.
Nem akartam félbeszakítani.
JANELLE: Sajnálom.
Így lenne bemenet be A cím of-- nem biztos.
Nem emlékszem pontosan, a szám, de azt hiszem, volt 0-tól indul.
>> David J. MALAN: Rendben van, mert tettem a számok felfelé,
így nincs helyes válasz.
>> JANELLE: Kezdve a 0. ív.
>> David J. MALAN: OK, tehát elem 0-ra.
Persze.
>> JANELLE: És ha volt mint csak egy két letter--
>> David J. MALAN: OK, vissza hozzád.
>> JANELLE Szóval elem 0, és majd elem 1 vagy 2 elem.
David J. MALAN: És melyik darab A kép rajzolsz most?
A hívás getString?
Vagy a nyilatkozat s?
>> JANELLE: A nyilatkozat s, azt hiszem.
Ó, a getString, mert akkor kell bevinni minden [? terület. ?]
>> David J. MALAN: Jó.
Pontosan.
Annak ellenére, hogy ezt hatékonyan vissza egy tömb, visszahívás,
ha visszaértünk a húr, tudjuk index abba a húr a 01-es és 2.
Technikailag, ezek valószínűleg képviseli az egyes címek,
de ez rendben van.
>> Tehát tegyük fel, ha tudok csak gyors továbbítják, ahol abbahagytuk
utoljára, ha az egyik a húrok volt g ​​a b e,
backslash 0, így ami Gabe bemenet, hogyan lehet, hogy az általunk képviselt s most?
Ha ez a memória, ami visszakerült a getString?
>> JANELLE: lenne képviseli egy ív?
>> David J. MALAN: egy ív?
Nos, nem.
Mondjuk, képileg, hadd menjen előre
és javasolja, hogy ha ez s, ez a visszatérési érték getString.
És akkor már húzott ezt a 0, 1, 2, ami teljesen indokolt, hiszen
képes index a húr, mint olyan.
De csak azért, hogy összhangban legyen utoljára, hadd menjen előre
és önkényesen javasolja, hogy ez a a cím 1., ez a cím a 2.
ez Cím 3, és így tovább.
És így, csak a szuper világos, hogy mi folyik itt
menni s ennek eredményeként, hogy a első sorban a kód, mit mondana?
>> JANELLE: 1. cím?
>> David J. MALAN: Pontosan.
Így kezelni 0x1.
És közben, hadd menjen előre, és kettős sok, amit tettél
és adjunk a saját t itt.
Ha én, hogy írja be Gabe ismét, másodszor,
amikor megkérdezi a getString, ahol, persze, Gabe fog menni?
Nos, presumably--
>> JANELLE: Mint itt?
David J. MALAN: Igen.
JANELLE: Vagy az is ugyanabban a dobozok?
David J. MALAN: Hadd javasol, igen, pontosan, így ezek a további dobozok.
De ami legfontosabb most az, hogy még bár már készült ilyen csinos közel
together-- 0x1, ezt A 0x2-- a valóságban,
ez most lehet, cím 0x10, például, és 0x11, és 0x12,
és így tovább.
És így, ha ez a helyzet, mi fog végül itt t?
>> JANELLE: 0x10?
David J. MALAN: Pontosan.
Így 0x10.
És most, a végső kérdés.
Ön, messze kellett dolgozni a legnehezebb egy elefánt eddig.
Mára, ha húzza fel a kódot újra, amikor én, sorban három,
ha s értéke egyenlő t, mi vagyok én valójában összehasonlítjuk, hogy már készült itt?
>> JANELLE: A két címet?
David J. MALAN: Pontosan.
Szóval azt mondom, s azonos azonos t?
Más szavakkal, az 1 egyenlő egyenlő 10?
És természetesen, a nyilvánvaló válasz most nem.
És ez a program végül a nyomdába mit mondanál?
>> JANELLE: lenne, beírt ugyanaz a dolog?
>> David J. MALAN: Tehát, ha s értéke 1 és 10 t?
>> JANELLE: beírt különböző dolog.
>> David J. MALAN: Pontosan.
Beírt különböző dolog.
Rendben.
Így a tapsot, ha tudnánk, itt.
[Taps]
Ez fájdalmas.
Tudom.
Szép munka.
Tehát most lássuk, ha nem tudjuk kötekedik kívül mi a fix volt.
És természetesen, ha fix Ez-- amelyet én most képviselt green--
tettünk egy pár fejlesztések itt.
Először is, mint ahogy a józan ész nézd, én vagyok az első ellenőrzés
ha s értéke nulla és t értéke null.
És csak hogy tisztázzuk, ha esetleg s vagy t semmis a kód, mint ez?
Amikor lehet, s vagy t lehet null.
Igen?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Pontosan.
Ha a húr, hogy a felhasználó beírt ez így túl hosszú
hogy illeszkedjen a memóriába, vagy valamilyen furcsa sarok hasonló esetben, hogy a
getString, mint látni fogjuk, a szó szoros értelmében Ma, a dokumentáció,
azt mondja, hogy vissza fog térni NULL speciális őrszem érték,
vagy csak egyfajta speciális szimbólum azt jelenti, hogy valami baj.
Ezért szeretnénk, hogy ellenőrizze a hogy azért, mert kiderül
hogy null egy nagyon veszélyes értéket.
>> Gyakran előfordul, hogy ha megpróbál tenni valamit a null járó function-- halad
a bemenet, az instance-- ezt a funkciót Lehet nagyon összeomlik, és ezzel együtt,
vegye le az egész programot.
Szóval ez a harmadik sorban most csak a józan eszét ellenőrizze, hibaellenőrzés, ha úgy tetszik.
Ez egy jó szokás most számunkra, hogy a bármikor is
próbáld meg használni egy értéket, amely lehet, esetleg, lehet null.
>> Most, a negyedik sorban itt, "Ha strcmp (s, t):" Nos,
mi ez a szó?
Nos, azt mondta, ez egy nagyon tömören nevű függvény karakterlánc összehasonlítás.
És a célja az életben, hogy összehasonlítsa Az első érv ellene második,
nem pedig a saját címét, mint mi akaratlanul egy pillanatra
ezelőtt a vörös kód, de inkább összehasonlítani a két
húrok az emberileg intuitív módon összevetni, ellen,
ellen, ez ellen, és majd megállás, ha és amikor az egyik
vagy mindkét ujjaim üt egy backslash 0.
Tehát valaki évvel ezelőtt végrehajtott strcmp végrehajtása nekünk a funkcionalitás
hogy azt reméltük, mi ütött volna mindössze összehasonlítjuk a két egyszerű értékeket.
>> Most őszintén, én is rajz mindezen különböző számokat.
De a valóság az, hogy én már hogy ezeket az egész idő alatt.
És hadd menjen előre és irkál ki ezeket
, hogy egy pontot, hogy a végén A nap és halad előre,
mi nem igazán fog törődni mit szól a dolgok valójában
a memóriában.
Így nem fogok felhívni ezeket féle számok annyira már,
Én csak egy elvont ezt el a kicsit több barát csak nyilak.
>> Más szavakkal, ha s értéke egy mutató, Nos, nézzük csak felhívni rá, a szó szoros értelmében,
mint a mutató, a mutató nyíl magából valami mást,
és ne aggódj túl sokat többet a minutia ezen címek
ami megint tettem fel egyébként.
De látni fogjuk azokat a címeket, Néha, amikor hibakeresés kód.
>> Most közben, ez a program itt javítások, persze,
ezt a problémát összehasonlításával a két húrok.
De összefutottunk egy másik probléma.
Ez volt a másolat programozza utoljára,
amelynek, próbáltam kihasználni csak az első karakter egy húr.
De mi volt a tünet láttuk utoljára, amikor
a felhasználó beírt egy értéket, mint Gabe kisbetűvel, az s,
akkor hozzá s a t, mint a harmadik sorban van,
aztán megpróbáltam hasznosítani t tartó 0-ra?
Mi volt a hatása változó t tartó 0. itt?
>> Közönség: Megváltoztatta s.
>> David J. MALAN: Igen, Megváltoztattam s is.
Mert mi folyik itt?
Nos, lássuk, ha tudom tiszta ezt a képet fel, az alábbiak szerint.
>> Ha s, ismét, a szó g, a, b, e, fordított perjel, 0, s és
mi továbbra rajzot doboz itt, de nem több címet.
Álljunk teszi a dolgokat.
Nézzük csak felhívni a kép egyszerűsítése a világ.
>> Mikor Kijelentem t zsinórral t, amely létrehozza az darab memória.
Tér történetesen 32 bit legtöbb számítógép.
Sőt, ha valaha is hallottam, hogy egy számítógép, amelyek 32 bites architektúra,
igazán fancy-beszél, hogy csak azt jelenti, hogy használ 32 bites címek.
És a technikai félre, Ha valaha is kíváncsi
miért régebbi számítógépeken, ha valóban megpróbálta leves őket a sok RAM,
csak a maximális négy gigabájt RAM-mal,
Hát ez azért van, mert a szó szoros értelmében, a régi számítógép is csak
számítanak olyan magas, mint 4 milliárd, 4 milliárd bájt,
mert a 32-bites számok címét.
>> De minden esetben, az e Például a történet sokkal egyszerűbb.
t is csak egy mutató, vagy tényleg egy char csillag, aka húr.
És hogyan szeretné frissíteni ezt a képet Most, hogy a második sorban a kód,
után a pont, pont, pont?
Amikor én húr t értéke s pontosvessző, hogyan ezt a képet megváltoztatni?
Igen?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Igen.
Pontosan.
Most tettem egy nyilat a t doboz ugyanarra a címre,
az első betűje az adott.
Vagy technikailag, ha ez a fickó még mindig a 0x1,
olyan, mintha én is 0x1 itt és 0x1 itt.
De a lényeg, kit érdekel a címek?
Csak a gondolat, hogy most már számít.
Szóval, ez az, ami itt történik.
Szóval persze, ha nem t tartó 0, amely tömb jelölés,
A course-- és őszintén szólva, úgy néz ki, mint van egy sor ide,
de most itt van ez a furcsa dolog.
Tudd, hogy a programozási nyelv, C, kínál ez a szolgáltatás,
miáltal, akkor is, ha t jelentése egy mutatót, s vagy egy mutató,
akkor is használni, hogy a megszokott, kényelmes szögletes zárójel
jelölés menni az első elem, vagy a második elem, vagy bármely elemét
hogy ez a mutató mutat hogy mivel feltehetően az
van, mint a jelen esetben, mutatott néhány sor.
>> Szóval hogyan lehet orvosolni?
Őszintén szólva, ez az, ahol van egy kicsit nyomasztó első pillantásra.
De itt van egy új és továbbfejlesztett változata.
>> Tehát először, kapok megszabadulni a CS50 könyvtár,
csak azért, hogy ki, hogy s valóban a char csillag, csak egy szinonima.
És t is char csillag.
De mi folyik a jobb oldalán, hogy a vonal
ahol t van rendelve egy érték?
>> Mi az a malloc?
Mi ez strlen?
Mi az a sizeof (char)?
Mi a fenéért nem ezt vonal néz annyira bonyolult?
Mit keres egy magas szinten?
Mi is a tároló t?
Igen?
Közönség: Ez elosztása a bizonyos mennyiségű memóriát.
Ez tárolni, azt hiszem, levelek [nem hallható].
>> David J. MALAN: Tökéletes.
Tökéletes.
Ez elosztása egy bizonyos memória méretének
tárolására, feltehetően jövő leveleket.
És különösen a malloc Ezért vissza mi?
>> Közönség: Visszatérve a [nem hallható]?
David J. MALAN: Pontosan.
Visszatérve a címét, hogy a memória, amely divatos módja mondván,
vissza a címét első byte-ja, hogy az emlékezet.
A bizonyítás terhe is, hogy emlékezzek mennyi memória Igazából
kiosztott vagy kért malloc számára.
>> Most mennyi az?
Nos, annak ellenére, hogy ott van sok zárójel itt,
malloc mindössze egyetlen érv.
És én meghatározva strlen s, így adja nekem annyi bájt, mint ahány az s,
de hozzá egy.
Miért?
Igen?
>> Közönség: A backslash 0.
David J. MALAN: Pontosan.
Van, hogy egy kis takarítás.
Tehát azért, mert van egy backslash 0, akkor jobb lenne elfelejteni.
Ellenkező esetben, megyünk hogy hozzon létre egy string, amely
nem rendelkezik a különleges terminátor.
>> Közben, csak a szuper anális, van sizeof (char)
csak abban az esetben, ha valaki fut a kód nem a CS50 készülék,
de talán egy másik számítógépen összesen ahol karakter
van egy byte, megállapodás szerint, de két byte, vagy valami nagyobb.
Csak, hogy szuper, szuper idegenkedik a hibákat.
Annak ellenére, hogy a valóságban, ez valószínűleg lesz 1.
>> Most, közben, megyek előre, és másolja át a húr, t tartó i értéke t tartó s.
És én elhalasztja a múlt heti forráskód, hogy mi folyik itt.
De a legfontosabb elvihető, és a Ezért tettem a kódot már zöld,
az az oka, hogy az utolsó sor, t tartó 0értéke toupper,
az a hatása, kapitalizálódó amely húr?
t és / vagy az S?
Az utolsó sor kódot.
>> Csak T, azért, mert mi történt ebben az időben,
ha kissé visszavonni az utolsó lépés, mi történt akkor, amikor hívom malloc,
Én alapvetően kap egy darab memória hogy az azonos méretű, mint az eredeti,
mert ez az aritmetikai tettem.
Én tárolás t a cím Az, hogy a darab a memória.
Annak ellenére, hogy ez jól néz ki és szép, szép és tiszta,
A valóság az, hogy van, mit fogunk folyamatosan hív, szemét értékek itt.
Hogy darab memória talán igen jól használták korábban,
Néhány másodperc, néhány perccel ezelőtt.
Így nem lehetett teljesen, hogy számok vagy betűk vannak, csak véletlenül.
De nem érvényes, amíg nem magamat népességnövekedés ez darab memória
a tényleges karakter, mint én tenni, hogy a hurok ott.
Minden rendben?
>> Így most, a csúcspontja ez a három példa
amelyeket látszólag törött utoljára, ez Swap példa, ez a funkció
dolgozott abban az értelemben, hogy cserélték és b.
De ez nem működik, mi más értelme?
Igen?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Pontosan.
Ha én ezt a funkciót a másik-- például,
Egy funkció, mint a fő, ahol Nekem van egy változó, x és y, ahogy én
volt a múlt héten, ugyanazt a kódot, és én át az x és y
a Swap, majd hívja Swap-- ezt, persze, ez a helyes verzió
az, amit mindjárt csak-- nem működött.
Tehát mi a fix?
>> Nos, így csak a biztonság tiszta, hadd menjen előre
és-- adj egy második ide, és nézze meg ha meg tudom mutatni, hogy az utolsó, ami
lesz in-- lássuk, ha találok ez igazi fast-- OK, [nem hallható].
OK, ez van.
Így figyelmen kívül hagyja a parancsot Csak gépelés.
Azt akarom, hogy letölteni Az utolsó pillanatban egy példa
a múlt idő, ami most hívott nem Swap.
>> Tehát nem Swap ahol abbahagytuk legutóbb,
amelynek én inicializált x 1 és y 2.
Aztán hívásváltás, átadva az 1. és 2..
És akkor ez a funkció dolgozott bizonyos értelemben,
de nem volt állandó hatása az x és y.
Tehát a kérdés kéznél van, hogyan most tudjuk valójában oldja meg a problémát?
Mi a megoldás kéznél?
>> Nos, swap.c, ami új ma, észre egy pár különbség.
x és y jelentése azonos.
De mi is pontosan más a vonal 25?
Mi újság van, ha emlékszel úgy nézett ki, mint egy perce?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Igen.
Tehát a jellel is jelölhetünk egy új darab A szintaxis nem csak ebben a programban,
de általában véve is a CS50.
A mai napig, nem hiszem, láttunk olyan példákat
vagy tényleg beszélt róluk minden részlet, kivéve talán, megelőző jellegű
szakasz, egy jel, mint ez.
Nos, kiderült, hogy jel egy az utolsó darab új szintaxis
fogunk tanulni.
Minden azt jelenti, a címe néhány változó.
A mi cím jelent x él?
De mit jelent cím y él?
Mert ha a alapvető probléma előtt
az volt, hogy x és y éreztetik másolatban, amit igazán akarok
A nyújtanak Swap és mint egy kincs térkép, amely vezet, ahol x és y a ténylegesen
vannak a RAM-ban, hogy a Swap követheti azt a térképet
és menj bárhova x vagy y jelzi a helyet és módosítsa a tényleges értékek az 1. és 2.
ott.
>> Tehát Swap változtatni kell kicsit is.
És első pillantásra, ez lehet úgy tűnik, egy kicsit hasonlít a char csillag.
És valóban az is.
Tehát egy olyan mutató, hogy milyen típusú adatot, ennek alapján a kiemelt rész?
Szóval ez egy int.
>> Így már nem int, ez a címe egy int.
És hasonlóképpen, b most megy hogy a cím egy int.
Tehát, amikor én már hívásváltás a Main, Nem fogok adni Swap 1. és 2..
Fogom adni, mint a Ox-valamit, és Ox-valamit,
két címet fog vezetni Swap a tényleges helyek
az én számítógép memóriájában.
>> Így most, a fennmaradó végrehajtás meg kell változtatni a srác.
Mi ez nyilvánvalóan más most E három sornyi kódot?
Vannak ezek a rohadt csillag minden át a helyét, minden rendben?
Szóval, mi folyik itt?
Igen?
>> Közönség: Ez nyilvánvalóan [nem hallható].
>> David J. MALAN: Pontosan.
Tehát ebben context-- és ez nem volt a legjobb tervezési döntés, igaz,
évvel ezelőtt.
Ebben az összefüggésben, amikor a csak van egy csillag,
és nincs olyan adattípus, mint int, azonnal balra,
helyette van egy egyenlőségjelet, világosan, ebben az összefüggésben, amikor azt mondod csillag,
azt jelenti, hogy megy a cím, ez egy.
Kövesse a kincses térképet, hogy úgy mondjam.
>> És közben, sorban 37, azt jelenti, hogy ugyanaz a dolog.
Menj a cím egy, és tedd, hogy mi van?
Bármi is van a hely, amely b meghatározza.
Más szóval, megy a b.
Kap ez az érték.
Ugrás egy, és egy az egyenlő alá, az értékadó operátor,
tedd érték oda.
>> Hasonlóképpen, int temp csak egy int.
Nincs szükség változtatni a temp.
Ez csak egy tartalék üveg Annenberg egyes tej vagy narancslé.
De nem kell, hogy mondjam, menjen a b.
Megy, hogy a cél és tegye az érték temp ott.
Szóval, mi történik akkor?
Amikor tényleg hívásváltás ebben az időben, ha a Az első tálca itt jelent Main,
ez a második tálca jelent Swap, amikor Én át jel x és y jel
A Fő a Swap, csak hogy tisztázzuk, mi ez a stack frame befogadó?
Igen?
>> KÖZÖNSÉG: [nem hallható].
David J. MALAN: Pontosan.
A cím az x és az y címét.
És azt lehet gondolni ezeket mint a postai címek.
33 Oxford Street és a 35 Oxford Street, és
szeretné, hogy a két épület amelyek ezeken a helyeken.
>> Ez egyfajta nevetséges ötlet, de ez minden, amit értünk címet.
Ahol a világon megtalálni a két ints?
Ahol a világon van található a két épület?
Tehát, ha végül, ennyi idő után én megy a mai forráskódját, és fordítsuk
Swap és fuss ./swap, végül a először időnk valóban látni, hogy a
Saját értékek valóban cserélték sikeresen.
És most, mi is, hogy Jegyezze fel ezt a, mondjuk, gdb.
>> Hadd menjek be ugyanazt a fájlt.
Hadd menjek előre, és fuss gdb a ./swap.
És most, a Swap, én megyek előre, és állítsa be a töréspontot Main.
És most én megyek előre, és futtassa a programot.
És most látom a kód megállt a vonal.
>> Ha megyek előre és a nyomtatási x, mit látok itt?
Ez egy kérdés.
Mondd még egyszer?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: So véletlen számok, talán.
Talán szerencséd lesz, és ez szép és egyszerű, mint a 0-ra.
De lehet, hogy valami véletlen számot.
Ebben az esetben, szerencsém volt.
Ez csak előfordul, hogy az értéke 0.
De ez tényleg szerencse, mert nem, amíg én
típus mellett, majd nyomtatott x van az a kódsor, a 19, kivégezték.
>> Közben, ha jól írja a következő megint, és Most nyomtassa ki y, megyek a 2.
Ha most írja a következő, ez lesz a kap egy kicsit zavaró, mert most,
a printf fog megjelenni a képernyőn, ahogy azt tette. x 1 lehet.
>> Csináljuk újra.
És most, itt, ahol dolgok érdekessé válni.
Mielőtt hívásváltás vagy akár lépés bele, vessünk egy röpke pillantást.
x értéke, ismét 1.
Y jelentése, természetesen, gyors józanság ellenőrizze, 2, így nem nehéz ott.
De mi a jel x?
Válasz, ez a fajta funky keres.
De az int csillag zárójelben csak GDP szóval ez egy cím.
Ez nem egy int, hogy a mutató egy int, vagy más néven egy címet.
>> Mi ez az őrült dolog?
Még sosem látott valamit nagyon tetszett, hogy mielőtt.
Tehát ez a cím az én számítógép emléke ahol x történik élni.
Ez Ox-valami.
És ez, őszintén szólva, miért Elkezdtem rajz nyilak,
számok helyett, mert aki igazán érdekel
hogy az int van egy bizonyos cím, hogy ez olyan nagy.
De bffff0c4, ezek mind valóban hexadecimális számjegy,
amely 0 és f.
>> Így nem fogunk lakni is hosszú, amit ezek a dolgok.
De ha kinyomtatni y, persze, lásd 2.
De jel y, látom ezt a címet.
, És vegyük észre, hogy a kíváncsi, milyen messze van az x és y?
Akkor figyelmen kívül hagyja a legtöbb cím.
Négy bájt.
És ez összhangban van a korábban azt állítják, hogy mekkora egy int?
Négy bájt.
Tehát úgy néz ki, minden rendben sorakozó szépen, ahogy lehet, remélem, a memóriában.
>> Tehát most, most csak gyorsan előre A végén ez a történet.
Menjünk előre, és írja be lépés, hogy belevetik magukat a Swap funkciót.
Figyeljük, ha írja, hogy megegyezik az x címét.
Ha a B típusú, ez azonos címére y.
Szóval, mit kell látni, ha azt mondják, menj a cím a?
Így nyomtatni csillag.
Tehát csillag azt jelenti, hogy ott, ebben az összefüggésben.
Jel azt jelenti, mi a címe.
Tehát csillag eszköz 1.
És print csillag b ad nekem 2.
>> És hadd feltételezik, ebben a pillanatban, hogy legalább a kódot, hogy a
halad, hogy végre most már lehet indokolt át ilyen módon.
De majd újra ezt az ötletet hamarosan.
Tehát ez a verzió Swap most már a helyes, és lehetővé teszi
bennünket, hogy a csere az adott típusú adatokat.
>> Tehát bármilyen kérdése van, akkor a csere?
A csillag?
A címe?
És meglátod, a probléma készlet 4, fajta,
de probléma set 5, biztosan, hogy ezek a dolgok hasznosak, és hogy sokkal több
kényelmes velük, ennek eredményeként.
Egyáltalán valamit?
Rendben.
Tehát malloc, ismét ez a funkció hogy csak memóriát, a memória
elosztása.
És miért van ez hasznos?
Nos, ebben az időben, Ön már használja malloc.
Ha Ön szerint most, hogy getString munkák, feltehetően, ez
azt kérdezi valaki egy darab memória, bármikor a felhasználó beír egy húr
az, mert biztosan nem tudja, mivel CS50 személyzet,
milyen nagy azok vonósok, hogy az emberek lesz típusú lehet.
>> Szóval, az első alkalommal, elkezd húzza vissza, hogy a CS50 könyvtár működik,
útján egy pár példát amely elvezet minket oda.
Tehát, ha én nyit gedit és nyissa meg a scanf 0,
fogunk látni a következő kódot.
Scanf 0, elérhető a honlapon Ma már viszonylag kevés sornyi kód
itt 14-től 20-.
És nézzük meg, mit csinál.
Kijelenti, int, az úgynevezett x.
Azt mondja valami ilyesmi, szám kérem.
És most azt mondja, scanf% i, és x.
Tehát van egy csomó új dolgot is.
>> De scanf, akkor milyen gondol a mint az ellentéte printf.
printf természetesen nyomatok a képernyőre.
scanf fajta ellenőrzi a felhasználó billentyűzet valami ő már gépelt.
>> % I olyan, mint printf.
Ez azt jelenti, várják a felhasználó adja meg az int.
És most, miért gondolod, hogy Lehet, hogy halad scanf-x?
Ha a cél az életben scanf az, hogy valamit a felhasználó,
mit jelent a halad, és x, most?
Igen?
>> KÖZÖNSÉG: [nem hallható].
David J. MALAN: Pontosan.
Bármit, az ember, írja be, a bemenet meg fog menteni az adott helyen.
Ez nem elég, emlékszem, hogy csak át az x, mert láttuk már,
minden alkalommal, amikor át csak a nyers változó, mint egy int, hogy valami más funkciót,
Persze, hogy lehet változtatni, hogy változó, de nem véglegesen.
Ez nincs hatással a Main.
Ez csak akkor változtathatja meg a saját példányát.
De ha ahelyett, te nem add nekem a tényleges int,
de te adj irányban, hogy hogy int, most, hogy scanf,
biztosan tudom követni, hogy kezelésére és hozzádni egy számot oda
így férhetnek hozzá is.
>> Tehát, amikor elindul a program, lássuk.
Tedd scanf 0 pont perjel, scanf 0.
És ha én most írjon be egy számot mint 50, köszönhetően a 50.
Ha most írjon be egy számot, mint a 1 negatív, a negatív 1.
Most írjon be egy számot, mint a 1.5, hm.
Miért nem sikerült a program figyelmen kívül hagyni engem?
Nos, azért, mert egyszerűen azt mondtam akkor számíthat egy int csak.
Rendben.
Tehát ez az egyik változata ez.
Nézzük a dolgokat egy fokkal, és javasolja, hogy ez nem jó.
És itt van egy nagyon egyszerű példa hogy hogyan tudunk kezdeni kód írása
hogy más emberek tudják használni vagy kompromisszumot csinál rossz dolgokat.
Tehát vonal 16, így hasonló a szellem előtt,
de én nem nyilvánította int ezúttal.
Én nyilvánította char csillag, aka húr.
>> De mit is jelent valójában?
Tehát, ha nem ad meg address-- és Hívom, hogy önkényesen, puffer,
de nem tudtam nevezni s, hogy simple-- és akkor én ezt, magyarázza meg nekem,
ha lehet, amely az előző logika, mi a scanf csinál sor 18.
ha át% s és puffer, amely egy cím?
Mi az a scanf, ha alkalmazza a pontosan ugyanaz a logika, mint 0-s verzió,
majd próbálja meg itt, ha a felhasználó beírja valamit?
Igen?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Pontosan.
Scanf, a logika korábban, fog tartani a húr
hogy az emberi gépelt in-- ez most egy string,
ez nem több, feltehetően, ha ő cooperates--
és ez meg fog próbálni, hogy az húr a memóriában bármilyen címen
puffer határozza meg.
És ez jó, mert puffer valóban azt jelentette, hogy egy címet.
>> De azt állítják, ez a program hibás a nagyon komoly módon, mert mi az érték
puffer alapértelmezés szerint?
Mit inicializált bele?
Mi darab memória?
Én nem, nem igaz?
>> Tehát annak ellenére, hogy én már kiosztott a char csillag ez már nem hívják s,
ez inkább hívják, buffer-- így Rajzoljunk a változó nevét
Most, buffer-- ha én nem hívott getString vagy malloc itt,
hogy ténylegesen azt jelenti, hogy puffer csak néhány szemét érték.
>> Most, ez mit jelent?
Ez azt jelenti, hogy én mondtam scanf várnak a húr a felhasználó.
És tudod mit?
Akármi is ez a dolog mutat hogy-- és rajzolok kérdőjel,
de a valóságban, ez lesz valami ilyesmit OX1, 2, 3, igaz?
Ez valami hamis érték, hogy csak előfordul, hogy ott korábban.
Tehát másképpen fogalmazva, ez mintha puffer csak
rámutatva, hogy valami a memóriában.
Fogalmam sincs, mit.
>> Tehát, ha én írja Gabe most ez lesz hogy megpróbálja, hogy g-a-b-e / 0-hoz.
De ki tudja, mi az?
És a múltban, bármilyen alkalom, hogy megpróbálta megérinteni
memória, amely nem tartozik nekünk, mi történt?
, Vagy majdnem minden alkalommal.
Szegmentációs hiba, ugye?
>> Ez a nyíl, fogalmam sincs, hol van mutató. ez csak egy véletlen érték.
És persze, ha értelmezni Egy véletlen értéket, mint egy cím,
fogsz menni néhány véletlenszerű helyre.
Szóval Gabe talán valóban összeomlás a program ebben az esetben itt.
>> Szóval, mit tehetünk, hogy ez majdnem olyan rossz?
Tekintsük ezt a harmadik és utolsó példa a scanf.
Ez a verzió jobb, milyen értelemben?
Ha kényelmes a korábbi probléma, ez jobb.
Miért?
>> KÖZÖNSÉG: [nem hallható].
David J. MALAN: Jó.
Tehát ebben az esetben a 16. sorban jobb, abban az értelemben,
hogy mi kifejezetten kiosztása memóriát.
Mi nem a malloc, mi az a 2. hét
megközelítése csak nyilvánító tömb.
És már mondtam, hogy a húr csak egy sor karaktert,
így ez teljesen jogos.
De, természetesen, mint vegye figyelembe, rögzített méretű, 16.
>> Tehát ez a program teljesen biztonságos, ha azt írja
egy karakterláncot, két karakter vonósok, 15 karakterláncokat.
De amint elkezdek gépelni 16, 17, 18, 1000 karaktersorozatok,
Hol van az a húr lesz a vége?
Ez lesz a végén részben itt.
De akkor ki tudja, mi még túl van a határain
E különleges tömb?
>> Olyan, mintha én már kijelentette, 16 doboz itt.
Tehát ahelyett, hogy dolgozzon ki mind a 16, akkor csak úgy tenni, mintha én rajzoltam 16.
De ha majd próbálja olvasni a húr ez sokkal hosszabb, mint 50 karakter,
Fogom kezdeni üzembe a, b, c, d, x, y, z.
És ez feltehetően más memória szegmens
hogy ismét okozhat a program összeomlik,
mert én nem kértem semmi több, mint 16 bájt.
>> Szóval, kit érdekel?
Nos, itt a CS50 könyvtár.
És a legtöbb ez csak mint utasítás up tetején.
A CS50 könyvtár, ebben az időben, volt ebben a sorban a 52. sor.
Láttuk typedef, vagy látni fogja typedef
A Pset 4, amely csak létrehoz egy szinonima amelynek char csillag lehet több
egyszerűen csak, mint húr.
Tehát ez az egyik kevés képzés kerekek
általunk használt titokban a motorháztető alatt.
>> Közben itt a funkció getchar.
Most úgy tűnik, nincs test hozzá.
És valóban, ha folyamatosan görgetés, én valójában nem
lát megvalósítások ezeket a funkciókat.
Mint józanság ellenőrzés, miért van ez?
>> KÖZÖNSÉG: [nem hallható].
David J. MALAN: Igen.
Tehát ez a header file.
És header fájlok tartalmazzák prototípusok, valamint néhány más dolog, úgy tűnik,
mint typedefs.
De CS50.c, amit már soha nem adott meg nyíltan,
de már a CS50 készülék minden Ebben az időben, mélyen annak mappák
észre, hogy van egy egész csomó funkciók itt.
>> Sőt, most lapozzunk lefelé.
Nézzük figyelmen kívül hagyja a legtöbb, most.
De lépjünk le a getInt és hogyan getInt működik.
Tehát itt van getInt.
És ha valaha is igazán érdekelte, hogy hogyan kap int dolgozik, itt van a dokumentáció.
És azok között a dolgok azt mondja, az azt mondja,
mi az értéktartományok tud visszatérni.
Ez lényegében negatív 2 milliárd pozitív 2 milliárd ide vagy oda.
>> És kiderül, mindez idő, annak ellenére, hogy még soha nem
már akkor ellenőrizze azt, ha valami balul sül el,
kiderül, hogy az összes ebben az időben, van getInt
óta visszatérő különleges állandó, nem null,
INT_MAX hanem, ami Csak egy programozó egyezmény.
Ez azt jelenti, itt van egy speciális érték.
Győződjön meg róla, hogy ellenőrizze ezt, csak ha valami balul sül el.
De soha nem zavarta és hogy a mai napig,
mert megint, ez célja, hogy egyszerűsítse.
>> De hogyan getInt kap végre?
Nos, az egyik, hogy úgy nem érvek.
Tudjuk, hogy.
Ad vissza int.
Tudjuk, hogy.
Szóval, hogyan működik ez a motorháztető alatt?
>> Szóval van látszólag végtelen hurok, legalább egy a megjelenése.
Figyeljük meg, hogy mi a getString.
Szóval ez érdekes. getInt kéri a saját funkciója, getString.
És most miért is ez a helyzet?
Miért, hogy védekező Itt sorban 165?
Mi történhet a vonal 164, csak hogy tiszta?
Ez ugyanaz a válasz, mint korábban.
Talán csak a memória.
Valami hiba getString, megvan, hogy képes legyen kezelni.
És az ok, amiért nem tér vissza null van hogy technikailag, null egy mutató.
getInt vissza kell térnie egy int.
Szóval önkényesen úgy döntött, lényegében,
hogy 2 milliárd ide vagy oda, nem megy hogy egy speciális érték, amit soha nem
valójában kap a felhasználó.
Ez csak az egyik érték megyek a hulladék képviseli hibakódot.
>> Így most, a dolgok egy kicsit divatos.
És ez nem egészen ugyanazt a funkciót mint korábban, de nagyon hasonló.
Szóval észre, kijelentem itt, összhangban 172, mind az int n, és a char c.
És akkor én ezt a funky vonalat, sscanf, ami kiderül
nem vizsgálja a húr a billentyűzetről.
Ez áll egy meglévő karakterlánc, A felhasználó már beírt.
Szóval már hívott getString, amely azt jelenti, hogy van egy sor a memóriában.
sscanf, amit jobb lenne, ha hívja elemzési funkció.
Úgy néz ki, a húr én már beírt, karakterenként,
, és nem valami hasznos.
Hogy a húr van tárolva a sorban.
És tudom, hogy csak megy mentést itt, és azt mondja, jaj, OK,
Hívtam, hogy nem s ebben az időben, de a vonal.
>> És most ez egy kicsit más.
De ez gyakorlatilag azt jelenti, az okok akkor némileg hullám kezünket a mai,
hogy mi ellenőrizzük, hogy a felhasználó beírt
és int és talán egy másik karaktert.
Ha a felhasználó beírt egy int, hogy fogják tárolni n, mert én vagyok
halad ez a cím, a új trükk láttunk ma.
Ha a felhasználó is beírt A mint 123x, hogy x
lesz a végén a levél a c karaktert.
>> Most kiderül, hogy sscanf megmondja nekem, intelligens,
hány változók sscanf sikeresen képes betölteni.
Tehát ez a logika, ha a funkció Én végrehajtása van getInt,
de én nézem, potenciálisan, a felhasználó
hogy beírt egy int majd valami más,
mit akarok sscanf a visszatérési érték igazán lenni?
Ha a cél az, hogy csak egy int a felhasználó?
>> Tehát, ha sscanf visszatér 2, ez mit jelent?
A felhasználó beírt valami ilyesmit, a szó szoros értelmében,
123x, ami csak ostobaság.
Ez egy hiba állapot, és Azt akarom, hogy ellenőrizze, hogy a.
>> Tehát, ha a felhasználó beírja ezt, a Ezt a logikát követve, mit sscanf vissza,
mit mondana?
Tehát megy vissza 2, mert 123 fog menni itt,
és az x lesz a vége fel itt.
De én nem akarom, hogy a x kap tölteni.
Azt akarom, hogy sscanf csak sikeres kitöltése az első a maga változó.
És ez az, amiért szeretné sscanf vissza 1.
>> És ha ez egy kicsit a fej felett a pillanatban, hogy ez teljesen rendben van.
Észre azonban, hogy az egyik értékei getInt és getString
az, hogy csinálunk egy fene Sok hibaellenőrzés, mint ez így
, hogy a mai napig, akkor elég sok írjon semmit a billentyűzeten,
és mi elkapni.
És természetesen, a személyzet, biztosan nem
forrása lehet a hiba a programot, mert vagyunk védekezésben
ellenőrzése minden a hülye dolog, hogy a felhasználó tehet,
mint a gépelés a húr, amikor igazán akart int.
Így now-- jövünk vissza mielőtt long--
de ebben az időben, getString és getInt van
volt a motorháztető alatt ezzel alapvető gondolata címét memória.
>> Tehát most, tegyük a dolgokat kicsit felhasználóbarát.
Mint bizonyára emlékeznek rá, a Muci utolsó time-- ha a egér cooperate-- így
volt ezt a kódot, amely őszintén szólva, meglehetősen értelmetlen.
Ez a kód ér semmit hasznos, de ez volt a példa
professzor Parlante használni annak érdekében, hogy képviselje
mi folyik a program, amelybe a memória.
>> Szóval elmesélni ezt történet szuper röviden.
Az első két sor, a Angol, amit, mit mondana?
Csak ésszerűen emberi, de kissé technikai feltételek, hogy a stab.
KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: OK, te létrehozásáról címeket a x és y változókat.
Nem egészen, mert az x és y értéke nem változó a hagyományos értelemben.
x és y értéke címek vagy tárolja cím.
Így próbáljuk meg még egyszer.
Nem rossz kezdet, bár.
Igen?
>> KÖZÖNSÉG: [nem hallható].
David J. MALAN: Jó.
Azt hiszem, ez egy kicsit tisztább.
Deklarálása két mutató, két egész szám.
És mi hívja őket x és y.
Vagy ha volt, hogy dolgozzon ez a kép, újra,
emlékszem egészen egyszerűen az, hogy az összes csinálunk az az első sor
A rajz egy doboz, mint ez, néhány szemét érték benne,
és amelyben ez az X, majd a egy dobozt, mint ez,
némi szemét érték benne, amelyben az y.
Már bejelentett két mutatók, hogy végül
tárolja a címét egy int.
Szóval ez mind ott van.
>> Tehát amikor Muci tette ezt, az agyag éppen így nézett ki.
És Nick csak ilyen bebugyolálva a nyilakat,
mintha ők nem mutat sehova különösen, mert ők csak a
szemetet értékeket.
Ők kifejezetten nem inicializált bárhol, különösen.
>> Most a következő sor kód, emlékszem, volt ez.
Így meglehetősen felhasználóbarát, de némileg műszaki angol,
mi ezt a kódsort csinál?
Igen?
>> KÖZÖNSÉG: [nem hallható].
>> David J. MALAN: Tökéletes.
Ez elosztása a darab a memória, ami akkora, mint egy int.
És ez a fele a válasz.
A válasz a helyes fele a kifejezés.
Mi történik a bal oldali az egyenlőségjel?
Igen?
Közönség: és hozzárendeli azt, hogy a változó x?
>> David J. MALAN: és hozzárendeli azt, hogy a változó x.
Tehát bedugni, jobboldalán lefoglalt elegendő memóriát egy int.
De malloc kifejezetten vissza a cím
Az, hogy a darab a memória, ami neked van csak javasolt lesz tárolva x.
>> Szóval mit Nick múltkor a Muci is ő húzta az mutató ki, az agyag,
hogy pont most a fehér darab memória , amely egyenlő a mérete egy int.
És valóban, ez azt jelentette, tartalmazza a négy bájt.
>> Most, a következő kódsor tette ezt, csillag x kap 42.
Így 42 egyszerű a jobb oldalán, az élet értelmét.
Bal oldali, csillag x mit jelent?
Ez is lehet, hogy gone-- rendben van.
OK.
>> Közönség: Alapvetően, megy a [nem hallható]
David J. MALAN: Jó.
KÖZÖNSÉG: [nem hallható].
David J. MALAN: Pontosan.
Bal oldali jelenti menni x.
x cím.
Ez olyan, mint 33 Oxford Street, vagy OX1.
És csillag x azt jelenti, megy, hogy a foglalkozik, és tedd, hogy mi van?
42..
>> Tehát valóban, pontosan ezt Nick tette.
Úgy kezdődött az, lényegében, szellemileg
rámutatva az ujját x, követve a nyíl
A fehér dobozt a jobb oldali oldalon, és üzembe a szám 42 van.
De aztán a dolgok a kicsit veszélyes, igaz?
Muci hamarosan elveszíti a fejét.
>> Csillag y értéke 13, balszerencse, mit jelent?
Tehát csillag y eszköz megy a címre y.
De mi is a cím y?
Rendben, ez szemét érték, nem?
Rajzoltam, mint egy kérdőjel.
Nick kihúzta a összegömbölyödve nyíl.
És amint megpróbál do csillag y, mondván: ott,
de nincs törvényes cím, ez valami hamis hely,
A program le fog zuhanni.
És Muci feje megy hogy elrepül itt, ahogy azt tette.
>> Így a végén, ez a program csak lapos ki hiba.
Ez egy hibás programot.
És azt kellett rögzíteni.
És az egyetlen módja, tényleg, hogy rögzítse lenne, például, ezt a sort,
amit nem is kap, mert A program lefagyott túl hamar.
De ha volt, hogy erősít ez, amit hatás nem csinál y egyenlő x van?
Nos, ez lényegében mutat Y bármi x érték mutat.
>> Tehát Nick történetét, vagy Muci történetét, mind a
x és y is mutatva a fehér darab memória,
úgy, hogy végül, ha Nem csillag y értéke 13 újra,
a végén üzembe 13. a megfelelő helyre.
Ezért az összes ilyen vonal tökéletesen jogos, kivéve ezt,
amikor ez történt, mielőtt valójában kijelölt y valamilyen érték.
>> Most szerencsére, akkor nem kell érvelni az összes
Az ilyen jellegű kérdéseket a saját.
Hadd menjek előre, és nyissa meg egy terminál ablak itt
és nyissa fel, csak egy pillanatra, egy szuper rövid program
szintén egyfajta értelmetlen.
Ez csúnya.
Nem éri el semmi hasznosat.
De ez nem bizonyítják kérdések memória, így vessünk egy pillantást.
>> Main, szuper egyszerű.
Ez látszólag meghív egy függvényt, f, majd visszatér 0-ra.
Ez elég nehéz, hogy rendetlenség ezt fel.
Tehát fő elég jó, eddig.
>> Tehát f problematikus.
És nem tesz sokat erőfeszítést elnevezte
itt, hogy tartsa a hangsúly a kódot.
f két sort.
És nézzük meg, mi is most folyik.
Tehát egyrészt itt-- és engedjék meg, hogy
ez összhangban van az előző example-- egyrészt,
a bal oldali mit csinál, angolul?
Ez-
Közönség: létrehozása mutató.
David J. MALAN: Creating a mutató egy int és felszólította, hogy x.
Szóval ez létre egy olyan doboz Folyton rajz az érintőképernyőn.
És most, a jobb oldali oldalon, malloc, persze,
A kiosztása egy darab memória.
És csak hogy tisztázzuk, hogyan mennyi memória van nyilvánvalóan
elosztása, ha csak a fajta nem a matek itt?
>> Tehát ez a 40 bájt.
És tudom, hogy csak azért, mert tudom, hogy egy int, a CS50 készülék, legalábbis,
négy bájt.
Tehát 10-szer 4 40.
Szóval ez tárolja egy x, a cím Az első a 40 ints hogy
nem különített tér vissza, vissza, vissza, a vissza.
>> És ez az, ami kulcs a malloc.
Ez nem egy kis memória itt, egy kicsit itt, egy kicsit itt.
Ez ad egy darab memória, összefüggően, a működési
rendszer.
>> Most mi a helyzet ezzel, x konzol 10 értéke 0-ra?
Önkényes kódsort.
Nem éri el semmi hasznosat.
De ez érdekes, mert x konzol 10--?
Igen?
>> KÖZÖNSÉG: [nem hallható]?
>> David J. MALAN: x konzol 10 nem kell null.
A null részlet csak akkor jön szóba a vonósok, a végén a húr.
De egy jó gondolat.
>> Mekkora ez a tömb, még bár már elkülönített 40 bájt?
Ez 0 és kilenc, igaz?
Ez 10 ints, összesen.
40 bájt, de 10 ints, indexelve 0-tól 0-ra.
>> Tehát mi az, hogy x konzol 10?
Ez tulajdonképpen egy kis ismeretlen szemét érték.
Ez a memória, ami nem az enyém.
Én nem megható, hogy a byte szám 41, 42, 43, 44.
Megyek kicsit túl messzire.
>> És valóban, ha én vezetem ezt a programot, lehet, hogy nagyon jól lezuhan.
De néha, szerencsénk lesz.
És csak azért, hogy bizonyítani Ez-- és őszintén szólva,
soha nem lehet tudni, mielőtt ne it-- fussunk ezt.
Ez valójában nem lezuhan.
>> De ha ezen változtatni, a Például, hogy legyen, mint a 1000,
hogy ez valóban szándékos, lássuk
Ha tudnánk, hogy összeomlik az időben.
OK, nem lezuhan.
Hogyan 100000?
Nézzük remake, és most futtassa újra azt.
OK.
Pfuj.
Rendben.
Tehát úgy tűnik, ismét, ezek szegmensei memória, hogy úgy mondjam,
ésszerűen nagy, így mi is szerencséd lesz újra és újra.
De végül, ha egyszer kap nevetséges és tényleg messze ki a képernyőn,
megérinti memória, ami igazán, tényleg nem a tiéd.
>> De őszintén szólva, ezek a típusú hibák mennek
hogy nehezebb és nehezebb , hogy kitaláljuk, a saját.
De szerencsére, ahogy a programozók, mi eszközök, amelyek lehetővé teszik, hogy ezt nekünk.
Szóval ez talán egy A legrondább programok
még rondább, mint a gdb kimenetét.
De mindig van egy vonal, vagy két, amelyek szuper hasznos.
>> Valgrind egy olyan program, amely segít Ön nem debug program önmagában
de megtalálja a memóriával kapcsolatos problémák, konkrétan.
Ez automatikusan futtatni a kódot Ön és keresse meg a legalább két dolgot.
Egy, tettél valamit véletlen, mint a Touch memória
hogy nem a tiéd?
Ez segít megtalálni azokat az eseteket.
>> És két, az segít Találtál valamit hívott
memóriavesztés, ami van teljesen figyelmen kívül hagyják, naivan,
egy ideje, és szerencsére.
De kiderült, minden Ebben az időben, amikor
már hívott getString a oly sok program,
kérsz a működési rendszer memória,
de van valami emlék A valaha így ez
vissza, ezzel UNALLOC, vagy szabad, ahogy hívják.
Nem, mert még sosem kérte, hogy erre.
>> De egész idő alatt, a programok Ön már írt C
már szivárog a memória, kérve a működési
rendszer egyre több memória vonósok és miegymás,
de soha nem adják vissza.
És most ez egy kicsit A leegyszerűsítés,
de ha valaha is fut a Mac vagy a számítógép jó ideje, nyitás
rengeteg program, talán a programok zárása
és annak ellenére, hogy a számítógép nem lezuhant,
ez egyre annyira lassabb, mintha ez tényleg
segítségével sok memóriát vagy források, jóllehet,
ha nem is érjen a billentyűzethez,
amelyek be-- de nem always-- tudott az, hogy a programok futsz
magukat memóriavesztés.
És folyamatosan azt kérdezi, az operációs rendszer egyre több memóriát, de megfeledkezve róla,
valójában nem használja, de ezért vesz memória el
Más programok is megteheti.
Szóval ez egy gyakori magyarázat.
Most itt van, ahol Valgrind a kimenet teljesen
kegyetlen, hogy a kevésbé és kényelmesebb egyaránt.
De az érdekes cucc jobb itt.
Ez azt mondja nekem egy érvénytelen írása méret négy történik ebben a programban,
különösen a 21-es vonal a memory.c.
>> Ha elmegyek a 21. sort, hm, ott valóban Érvénytelen írási mérete négy.
Miért méret négy?
Nos, ez number-- és lehet bármit egy int.
Szóval négy bájt.
Szóval üzembe négy bájt , ahol nem tartoznak.
Ez az, amit Valgrind valójában mondani.
Sőt, azt is mondd meg, mint látni fogjuk,
ahogy fut ez a jövőben Pset, és ha igen, ha már kiszivárgott memória, amely valóban
Én, mert én hívtam malloc, de valójában nem
nevezett, ebben az esetben, a szabad, amely majd végül látni
az ellentéte malloc.
>> Tehát most, azt hiszem, egy utolsó példa.
Szóval ez egy kicsit misztikus, de talán
a legnagyobb oka, hogy legyen óvatos a memória,
és az oka, hogy sok program és / vagy web szerver, mind a mai napig,
átveszi a rossz fiúk valahol az interneten, akik valahogy
küld hamis csomagokat a kiszolgáló próbál kompromisszumot a számlák,
vagy hogy az adatokat, vagy csak általában több mint egy gép.
Puffer túlcsordulás, mint a neve is sugallja, eszközök
tele nem int, hanem a puffer.
És a puffer csak egy divatos mondván, hogy ez egy rakás memória.
>> És valóban, hívtam egy húr puffer előtt, ahelyett, hogy s.
Mert ha ez a puffer, mint a YouTube értelemben
vagy minden alkalommal, amikor nézed a videót, lehet, hogy láttam a szó puffer,
pont, pont, pont.
Hihetetlenül idegesítő.
És ez csak azt jelenti, , hogy a videó lejátszó
próbál letölteni sok bájt, sok bájt
egy videó az interneten.
De ez lassú, így próbál letölteni egy csomó közülük
hogy töltse ki a puffert, egy tartály, úgy, hogy van-e elég bytes, hogy aztán
megmutatja a videót, szünet nélkül folyamatosan.
De kiderült, akkor egy puffer ekkora.
De próbálja meg ezt a sok adat , és nagyon rossz dolgok történnek.
Így például, nézzük meg ez utolsó teaser egy példa.
Ez egy másik program hogy első pillantásra,
nem csinál semmit szuper hasznos.
Van rajta egy Fő funkció hogy kéri ezt a funkciót, f.
, És a funkció, f, itt, van a char tömb, az úgynevezett C-12-es betűmérettel.
És akkor ez ezzel új funkció az úgynevezett strncpy.
>> Kiderül, hogy ezzel az egyszerű, egyszerű kódsor, csak két sort,
tettünk az egész programot, és ezért, az egész számítógép,
és az én felhasználói fiókot, és az én kemény meghajtó potenciálisan veszélyeztetett senkinek
aki tudja, és elég jó futni ez a program egy bizonyos parancssori
érv.
Más szóval, ha ez a rossz fiú helyezi belsejében argvargv [1] paranccsal
A billentyűzet nagyon különlegesen kialakított húr, nem abc, 123, de lényegében,
bináris jelek képviselő futtatható kód, egy programot, hogy ő írta,
ezzel az egyszerű programmal, amely képviselője több ezer programok
hogy hasonlóan érzékeny, mondhatnám, ő is végül törli az összes
A fájlokat a merevlemezre, hogy egy villogó prompt, hogy ő is
parancsokat a saját, e-mailben az összes fájlt magamnak.
Bármi, amit tehetek, hogy vagy ő lehet csinálni ezt a kódot.
>> Nem fogjuk teljesen megoldani ezt még.
És valóban, ez lesz a bevonni egy kis kép
mint ez, amit hamarosan jön megérteni annál jobb.
De a mai, hadd véget mi van, remélhetőleg, egy kissé
érthető XKCD vicc, amíg újra legközelebb.
Rendben.
Találkozunk szerdán.
>> [Zenelejátszás]
>> Előadó: És most, mély gondolatok, a Daven Farnham.
Memória olyan, mint beugrott egy halom arany levelek a vasárnap délután.
Szél fúj, dobálta a hair-- ó, hiányzik a nap when--
>> [Nevetés]