>> [MUSIC PLAYING]
>> DAVID J. MALAN Rendben ez CS50 és ez a kezdete a hét öt.
Így ma, alatta a ülőpárnák, nem talál semmit.
De a fenti, meg kell találni ezek a kis jeléül elismerését
az összes munka, amit tesz a Game of tizenöt.
Egyszerűen távolítsa el a kis kör a alsó kezdeni játszik a
többi osztály.
>> Tehát emlékeztetnek arra, hogy, vagy tudja, hogy a probléma meg négy, amely kiment a hétvégén,
magában írásban egy másik játék.
De ezúttal az eljárás során egy tényleges grafikus felhasználói felület, nem
szöveges felület, mint a Game of tizenöt volt.
És a játék vár rád, ha már nem láttam ezt a következő,
úgy néz ki, egy kis valamit, mint ez.
Én megyek be a terminál ablak itt GDB.
És én megyek előre, és futtassa a személyzet megoldás, amely elérheti
futtatása után frissítést 50., mint rendesen.
>> De én, hogy azt egy kis titkos mód, egy kis húsvéti tojás,
úgynevezett Isten mód, a amivel Isten argv1.
És azt kell, hogy kövesse a saját irányban fut a saját
probléma meg könyvtárban.
Tehát most látod, a teljes verzió a játék a kitörés.
Valójában ez nem-hands üzemmódban.
Tehát ez valójában -
wowed bár lehet, hogy -
elég triviális végrehajtani Isten mód Breakout ellentétben Game tizenötök
amelyek közül néhány az lehet, hogy kezelni A hacker kiadás.
>> A Breakout elegendő Istenben mód, hogy egyszerűen csinálni, amit,
ösztönösen a lapát?
Csak arra, hogy egyenlő a bármilyen vízszintes pozíció a labdát.
És mindaddig, amíg ezt a lockstep a labda mozog ez a játék
soha, soha, soha hagyja ki a labdát és akkor nyerni minden alkalommal.
>> De ezen a héten a hacker kiadás van több, mint Isten mód.
Van egy sor más lehetőséggel.
Közülük lézerek.
Tehát, hogy ha igazán türelmetlen lehet kezdeni lelövésével a tégla
és még néhány más.
És azoknak, akik szeretnék kalibrálását normál versus hacker
kiadás, azt látom, hogy ezen a héten hacker kiadás szándékosan egy
kicsit megvalósítható, mondjuk, mint Isten mód volt Game of Tizenöt.
>> Tehát, ha keres egy szakaszon, és keres további móka
funkciók még merülés, ha az érdeklődés.
Most még gyakorlatilag, hadd rámutatni ki az egyik dolog is.
GDB, amit néhányan nem lehet még megérintette személyesen, ami finom.
De most tényleg az idő, hogy megszokja erre, és kényelmes az eszközzel
mert ez teszi az életeteket sokkal könnyebb, igazán.
>> Per Rob előadása GDB pár héttel ezelőtt, emlékszem
hogy a GDB debugger.
Ez egy eszköz, amely lehetővé teszi, hogy futtatni a programot, de futni, lépésről lépésre, a vonal
sorra, így körülnézni, így látja a dolgokat történik, így
hogy lehet kinyomtatni változók értékeit.
Röviden, ez ad sokkal több teljesítménye, mint printDef nem.
>> Most igaz, a felület elég misztikus.
Fekete-fehér szöveges felület a legtöbb esetben.
A parancsok kissé kemény emlékezni először.
De annak ellenére, hogy lehet, hogy elviszi fele egy óra, egy óra, hogy tegye, hogy előre
beruházás időt bele, hidd el.
Természetesen a félév végén meg fog menteni Ön egy nagyságrenddel nagyobb
idő, mint ezt.
>> Így a hét elején merülés be
, Mind a Breakout, tudja, hogy Megteheti ezt, amíg van
a forgalmazási kódot, vagy a saját kódját folyamatban a Pst4 könyvtárban.
Tudd, hogy futtatható gdb. / Kitörés.
>> Ez fog nyitni egy ablak, mint ez.
Hadd hozzak fel magamat Egy terminál ablak.
És akkor mit fogok menni előre és nem, ez nem csak futtatni.
Fogok először létre egy töréspontot emlékszem, amely lehetővé teszi, hogy szünet
végrehajtás egy adott helyen.
>> Csak, hogy a dolgok egyszerűen fogom megtörni a vonalon csak a gépelés
az első számú.
Hadd valóban újra ablak megnyitásához mert egyre
kicsit kicsi ott.
Szóval, amit én most megyek, hogy nem itt van ha nyit a terminál ablakban.
Gyere, itt is vagyunk.
>> Tehát most, ha visszamegyek a Dropbox, Pst4 és fuss gdb. / breakout be, észre
Fogok törni egy beállítása a töréspontot az egyesen.
És most megyek előre, és írja futni.
És ha mégis, észre sem sem történik.
>> Nincs pop up.
Nincs grafikus felhasználói felület még.
De ez érthető, mert én vagyok szó szerint sorban egy a programban.
És észre, hogy én már előre-, különösen most, hogy 62, mert minden
a cucc a tetején ez a fájl dolgok, mint a megjegyzések és állandók és
érdektelen dolog most.
>> Szóval most én vagyok benne a legfontosabb, úgy tűnik, sorban 62.
És ez még csak a forgalmazási kódot, visszahívás.
Ha kinyitom ezt fel megy, hasonlóan, az én dobozba könyvtárat Pst4,
a breakout.c.
És ha majd lapozzunk lefelé, és lefelé, és lefelé, és hadd menjen előre, és kapcsolja be
a sorszámok.
>> Mit fogok látni, ha görgessen vonal 62, pontosan a vonal
már megállt.
Tehát ez a sor itt, 62, a ahol mindjárt lesz.
Tehát most a GDB, ha megy előre, és írja be Most a következő, írja be fog
végre, hogy a vonal.
És íme, mi van a úgynevezett g ablak.
Ha ismeri, amit egy GWindow az, hogy nem kell aggódni.
A spec bemutatja, hogy azt, mint valamint számos walkthrough videók
ágyazott spec.
>> De most nézzük, hogy ez a kicsit érdekes.
Hadd mozog ez az ablak fölé az oldalán egy kicsit.
Engedjék meg, hogy az ablak egy kicsit nagyobb, így többet láthatunk.
>> És most hadd menjek előre és csinálni újra.
És vannak a téglák.
Ha azt írja a következő újra most már látom a labdát.
És ha azt írja a következő újra most már látom a lapát.
>> És szerencsére ez gedit nem igazán együttműködő by megmutatta
mindent, amit akarok.
De most ha én csinálni újra, következő megint, én csak
kijelentette néhány változó.
És tud nyomtatni bármely ezek a srácok ki.
Print tégla, nyomatok életét.
>> És most, ha én is ezt Ezután észre, hogy én leszek
belül, hogy a hurok.
De a kód fog végrehajtani pontosan azt, amit elvárnak.
Tehát amikor elütöttem ezt a funkciót, várjon A Click, meg fog tenni
szó szerint ezt.
Szóval úgy látszik, elvesztette az irányítást át a program.
>> GDB nem ad nekem egy parancsot.
De nem kell aggódni.
Menj a játék, kattintson valahol.
>> És íme, most folytatódik vonal 86.
Tehát még egyszer, ez felbecsülhetetlen értékű, végső soron, A hibakeresés problémákat.
Mert a szó szoros értelmében végig A kód, nyomtatott dolgokat, és sok,
sokkal több.
De most, az eszközök önmagukban kell neked elég messze.
>> Tehát mi, persze, hogy egy pillantást A grafika most hirtelen.
És most a világ lesz egy kis sokkal érdekesebb.
És tudod, talán néhány a videók online, hogy ezeket
rövidnadrág, hogy már nézni részeként a probléma készletek.
>> És már lelőtték, szándékosan, fehér hátteret.
És néhány közülük a tanítás Fellows rajz szöveget a
képernyő, ami eltakarja oldalán őket.
De persze, ez még nem minden, hogy az érdekes a valós világban.
Ez csak egy előadóterem és egy nagy fehér képernyő és a hátteret.
És a csodálatos produkciós csapat sort A tesz mindent meg szép
után az a tény a vágás ki vagy egymásra bármi
mi, vagy nem akar.
>> Most csak azért, hogy ösztönözze ezen a héten, és tényleg, ahol lehet menni, végül,
a számítástechnika.
Nem csak azután probléma meg négy.
De miután egy tanfolyam, vagy a teljes tananyag ez csodálatos, amit lehet
nem ezekben a napokban tekintetében grafikus, különösen.
>> Néhányan lehet, hogy látta ezt a folyik körül az interneten.
De azt gondoltam, megmutatom, csak egy pár percet, egy pillantást, amit
számítástechnika és milyen CGI, számítógépes grafika képes ezekben a napokban
egy ismerős dalt és talán filmet.
>> [ZENE - LANA DEL RAY, "Fiatal és szép]
>> SPEAKER 1: Csak egy kicsit elképesztő, talán, hogy milyen
mindenütt -
>> [Taps]
>> SPEAKER 1: Én csak le azt.
De ez tényleg elképesztő, azt hiszem, csak hogy mindenütt szoftver és a kód, és
eszközök, mint az valójában.
Szóval ez egy kis ízelítőt az irányt ahol lehet menni.
Ó, nincs több Appliance ma.
Nos, ez valóban tragikus időzítés mivel a lényeg én csak megpróbáltam.
>> Rendben, úgyhogy indítani Fusion újra.
Emlékeztessen később.
Rendben, és akkor már van egy e-mail, mint egy félre, ha nem kap a
észre, mint ezt.
Rendben, akkor emlékeztetni arra, hogy a múlt héten kezdtünk húzza vissza a
későbbi nevén string.
>> szöveg emlékeztet arra, adattípus, ami kijelentette, a CS50 könyvtárban.
És ez része a képzési kerekek hogy most kezd felszállni.
Ez egy hasznos fogalom korán.
De most ez lesz, hogy minél több érdekes és erősebb a
valóban látni, hogy a motorháztető alatt, egy string, amire, nem mondtunk?
>> Igen, ez egy úgynevezett char *.
És a * azt jelzi, hogy ott van valamilyen cím szó.
És amikor azt mondod char * csak azt jelenti, a változó, amelynek adattípusa a
mutató most.
Az a tény, hogy ott van a csillag ott csak azt jelenti, hogy nyilvánító
úgynevezett mutató.
És mutató fog látszólag tárolja a címét, a
Persze, a kar.
>> Most miért ennek értelme?
Nos, mi az a szöveg a motorháztető alatt?
Nos, egy ideje már mondott hogy a húr a motorháztető alatt van
csak h-e-l-l-o, például.
>> De már beszéltünk erről, mint hogy lényegében egy tömb.
És egy sor aztán meg egy kicsit több, mint ez, minden egyes ilyen
vesz fel egy falatot.
És akkor már azt mondta, hogy van valami különlegeset vissza, a
backslash 0, vagy null terminátor.
>> Tehát egész idő alatt, ez itt volt egy string.
De tényleg, a húr valójában egy címet.
És címét, mint látni fogjuk, gyakran előtaggal 0x megállapodás szerint.
Mit 0x jelöli?
Tudja valaki?
>> Tehát ez csak azt jelenti, hexadecimális.
Szóval lehet, hogy emlékszem, valóban, PST 1, azt hiszem, az egyik a warm-up
kérdés valóban kérdezték hexadecimális mellett
bináris és decimális.
És a motiváció az, hogy hexadecimális van 16
számjegy az Ön rendelkezésére.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ezt követi által a, b, c, d, e, f.
>> És ha számít minden fel, kapsz egy összesen 16.
Tehát ez ellentétben áll decimális, ahol már 10
számjegy, 0-kilenc.
Ez ellentétben bináris ahol csak 0 és 1.
>> De a végén a nap ha csak képviseli ugyanazt a számot, de a
némileg másképp.
És hexadecimális gyakori, mert, mint kiderül -, és majd meglátjuk a
később a kurzus - akkor is, ha kap a webes programozás keretében
HTML és színkódok, hexadecimális szép.
Mivel minden szám, kiderül, képviseli négy bit tökéletesen.
Tehát ez csak egyfajta vonalak szépen ahogy akkor végül látni.
Tehát ez lehet Ox123 vagy valami ilyen volt, amely 123 cím
valahol az én számítógép memóriájában.
>> Persze, bizonyos problémák merülnek fel mert ez a mögöttes
végrehajtását.
És emlékszem, hogy vettem egy stab végrehajtó funkció, mint ez -
összehasonlítani kötőjelet 0 pont c a múlt héten, hogy a még akkor is úgy nézett ki, mintha
van, akkor egyszerűen nem összehasonlítani Két sztring helyesen.
>> Már eldobott fő, és már dobott el a megjegyzéseket, csak koncentrálni, hogy
a kódot, ami érdekes itt.
És ez a piros, mert hibás.
Milyen okból?
>> Nos, a csúcson van, amikor kijelentette, egy string, mi folyik valójában
a motorháztető alatt?
Nos, hadd menjen át a képernyőn itt és rajzolni.
Szóval kijelentette, ismét karakterlánc s getString.
>> Szóval megyek előre, és most felhívni s, amit valójában.
Ez lesz a tér itt.
És fogok igényt , hogy 32 bites.
Legalábbis általában, legalábbis a CS50
készüléket sok számítógép.
Fogom nevezni s.
>> De most emlékeztetni arra, hogy nevű getString.
Tehát getString visszatér, persze, egy string.
Ha a felhasználó a h-e-l-l-o be a szöveg helló kap vissza.
És string, ahogy csak azt mondta, véget ér valahol a számítógép memóriájában
egy backslash 0 a végén.
Én felhívni a mint a tömb - vagy összefüggő blokk karakterek -
hogy valójában.
>> És most, mit getString valóban visszatér?
Mi getString már visszatér egész idő alatt?
Nos, mondjuk, a hét korábbi, tér vissza a string.
De technikailag, mit GetString vissza látszólag?
>> Közönség: Egy cím.
>> SPEAKER 1: Egy cím.
Konkrétan visszatér a címét az első falatot, bármi is legyen az.
Én csak tartsa a egy, kettő, három mert kényelmes.
>> Visszatér a címe az első karaktere.
És mi azt mondtuk, hogy a múlt héten ez elegendő.
Mert mindig kitalálni, hogy hol a végén a húr csak a
iterációt, talán, egy a hurok vagy a while ciklus, vagy valami hasonló
, hogy csak keres "backslash 0", speciális sentinel karaktert.
>> És akkor tudjuk, hogy a húr történetesen hosszúságú -
ebben az esetben -
öt.
Szóval technikailag mit csinál getString az visszatér Ox123 ebben az esetben.
És technikailag akkor mi történik, hogy tárolunk, belül s, Ox123.
Végén a nap, bár ez a az új koncepció, mutatók, ők
csak változókat.
De megtörténhet, hogy tárolják bitek együttesen képviselnek egy címet.
Szóval technikailag minden, amit kap tárolt s Ox123.
>> De mi, emberek -
beleértve a ma előre -
tényleg nem fog érdekelni, jellemzően, mi a tényleges cím
Néhány darab memória.
Ez csak az alacsony szinten részletezett lehet intellektuálisan érdekes.
Így fogom visszavonni ezt.
És ahelyett, hogy több magas szintű, csak azt mondom hogy amikor beszélünk mutatók
Megyek, hogy csak hogy több felhasználóbarát nyíl, hogy közvetíti a
Ugyanez a gondolat és kivonatok el a adatok, hogy mi a tényleges
szolgáló cím.
>> Most, ha visszamegyünk a kódot, amit történt a múlt héten, ha van karakterlánc t
egyenlő getString?
Hát, ha megint, írja a Hello most fogok kapni
egy darab memóriát.
h-e-l-l 0-o backslash.
>> Hanem azért, mert hívtam getString másodszor -
és tudom, hogy ez a nézi a forráskódja getString - még
bár ez véletlen, hogy helló volt beírt kétszer getString nem
megpróbálom optimalizálni , és okos.
Ez csak megy, hogy egy másik darab memória a számítógép, amely a
lesz egy másik címre.
Nézzük önkényesen mondjuk 456.
>> És akkor mi megy vissza?
Meg fog visszatérni 456 és tárolja a t.
Tehát mi is történik valójában, a bal oldali, hogy én még egy darab
memória, 32 bites általában.
És ott fog menni Ox456.
De ismétlem, én nem érdeklődnek a következő adott számok többé.
Én csak úgy elvontan rajzolni, mint a nyíl.
>> Szóval ez most egy új magyarázat.
De ez pontosan ugyanolyan gondolat, hogy ez történt egész idő alatt.
És így, akkor az oka, hogy ez az első változata összehasonlítás hibás volt
a múlt héten, hogy miért?
Ha ezt, ha s értéke egyenlő t mi igazán
a motorháztető alatt összehasonlítása?
>> Te összehasonlítva a címeket.
És csak ösztönösen, tisztán, Ox123 nem fog egyenlő Ox456.
Ezek a számok, a bitek csak más.
>> És így folyamatosan, a múlt héten azt mondta, beírt különböző dolog, még akkor is, ha a
szavai szó szerint ugyanaz.
Így erősít ez.
A laikus szempontból, hogy mi volt a fix?
>> Közönség: Használjon funkciót.
>> SPEAKER 1: a funkció.
Vagy csillagok egyértelműen szó, de egy függvényt, amit?
>> Közönség: összehasonlítása a szálakat.
>> SPEAKER 1: összehasonlítása a szálakat.
Tehát az alapvető probléma az volt hogy én csak figyelembe a
minőségű húrok által meghatározandó összehasonlítása a címüket.
És természetesen ez csak buta már egyszer érti, mi folyik itt
a motorháztető alatt.
Hogy valóban összehasonlítani húrok, hogy ha ők azonos az is, hogy az emberi
tartanám két karakterlánc egyenlő meg kell összehasonlítani őket karakter
karaktert a karakter.
>> Most tudtam volna ez nagyon unalmasan.
De ismerős, mi egy for ciklus.
És csak összehasonlítani s konzol i ellen t tartó i.
s konzol i + 1 ellenében t tartó i plusz 1, és így tovább, belül
valamiféle hurok.
És ha minden helyszínen két karakter, amely különböznek, vagy ha tudom, hogy ó, s
rövidebb vagy hosszabb, mint a t t Én rögtön azt mondják hamis,
ők nem ugyanaz.
>> De ha átjutni s és t, és mondja ugyanaz, ugyanaz, ugyanaz, ugyanaz, ugyanaz, vége
mindkét szót, azt mondhatom, Igaz, hogy egyenlő.
Nos, szerencsére, évekkel ezelőtt valaki azt írta, hogy kódot számunkra.
>> És nevezték StrComp string összehasonlítani.
És annak ellenére, hogy egy kis számláló intuitív, StrComp értéke 0, ha a
két húrok, s és t jelentése azonos.
De visszatér negatív értéket, ha s jöjjön elé t betűrendben vagy
pozitív értéket, ha azt kell jönni után t ABC.
>> Tehát, ha valaha is szeretne rendezni valamit, kiderül, hogy StrComp hasznos.
Mert nem csak azt mondja igen vagy nem, azonos-e vagy sem.
Ez ad egyfajta rendelés mint egy szótár erejét.
Tehát StrComp, s vessző t értéke egyenlő 0 azt jelenti, hogy a
húrok valóban egyenlő.
Mert aki írta ezt a funkciót évvel ezelőtt feltehetően használt for ciklus
vagy a while ciklus, vagy valami ilyesmi integrálni át a karakterek újra
és újra és újra.
>> De probléma merült fel két itt.
Ez copy0.c.
És a két piros mert hibás.
És mit csinálunk itt?
Nos, először is hívtam getString.
És én tárolt a visszatérési értéket s.
Szóval ez nagyjából ugyanaz, mint a ez a felső része a képnek.
>> De mi lesz azután?
Nos, hadd menjen előre, és megszabadulni egy csomó ezt.
Majd hátra az időben, ahol csak van s, ami most megfelel
vonalban ott.
>> Megnézem.
Ha s értéke egyenlő 0-ra.
Most egy gyors Mellékesen jegyzem meg, ha a Lehet getString vissza 0-ra?
Nincs elég memória.
Nem igaz?
>> Ez ritka, hogy ez fog történni, természetesen a számítógép, hogy a
Van több száz mega vagy még giga RAM.
De lehet, hogy elméletileg vissza 0, különösen, ha a
felhasználó nem működik együtt.
Van módon úgy tenni, mintha még nem bemenő semmit, és trükk
GetString a visszatérő 0 hatékonyan.
>> Ezért van, hogy ellenőrizze, hogy.
Mert ha valakinek kezdtek kap, már, szegmentálás hibák -
amely talán a forrás Néhány frusztráció -
ezek szinte mindig csak az eredmény A memóriával kapcsolatos hibát.
Valahogy elrontotta tekintetében a mutató, akkor is, ha nem vette észre
volt a mutató.
Szóval lehet, hogy hatására szegmentáció hibák már a heti egy használ
olyasmi, mint egy for ciklus, vagy egy ideig loop és egy sor megy túl messzire
korábbi határait néhány tömb Ön kijelentette, hogy két hét
különös.
>> Lehet, hogy ezt megtették, még a probléma az alábbi négy a Breakout.
Annak ellenére, hogy valószínűleg még nem látott minden csillag a forgalmazási kódot
Breakout, kiderül, hogy ezek GRect és GOval és más hasonló dolgok,
ezek valójában mutatók a motorháztető alatt.
>> De Stanford, mint mi, valami irha hogy részletesen legalábbis a könyvtárak
célokra, ugyanúgy, mint mi string és char *.
De GRect és GOval és az összes ilyen dolog, amit a srácok, vagy fogja használni
ezen a héten végső soron memória címeket.
Csak nem tudom, hogy.
>> Tehát nem meglepő akkor, talán, hogy lehet, hogy utat át néhány
szegmentációs hibák.
De ami igazán érdekes itt, ha azt követően, hogy ellenőrizze, hogy 0 mi
karakterlánc t kap s.
Nos, hadd kijelentem t.
Fogom felhívni, mint a tér, 32 bit, hívják t.
És akkor fogok csinálni lesz s.
>> Nos, mit jelent ez?
Nos, ez egy kicsit nehéz azt gondolni, róla képzelni bölcs.
De gondolkodjunk mi van az x?
Mi szó szerint benne ez a változó?
Az érték Ox123.
>> Tehát amikor azt mondom karakterlánc t kap s, hogy csak szó szerint azt jelenti, hogy a szám
s-ben, mely Ox123 és tedd Ox123.
Vagy képszerűen, ha valahogy elvont el, hogy a részlet azt a
hatására szó szerint ezt ezt is.
>> Tehát most, gondolom, vissza a múlt héten, amikor a haladtunk a kapitalista T.
nem T konzol 0-ra.
Nos, T tartó 0, annak ellenére, hogy a mutató, akkor kezelni, mintha
ez egy sor, egy négyzet konzol jelölést.
>> És hol van T konzol 0-ra?
Nos, ez a h.
És így, ha használja ezt a kódsort, két felső, ami az, hogy a C type.h
header fájlt, ez az, ahol ez nyilvánította.
Te ezt kihasználva H. De Persze, ez pontosan ugyanolyan h ez
belül s, hogy úgy mondjam.
És most már megváltozott, vagy aktiválásra az eredeti és a
úgynevezett példányt.
Mivel nem egy másolatot a módon, hogy egy ember szeretne, hogy legyen.
>> Tehát mi volt a fix itt, in copy1.c múlt héten?
Funkciók, így ténylegesen másolni a húr.
És alapvetően, mit kell tenni annak érdekében, hogy másolja a húr?
>> Nos, ebben a zöld verziót itt vagyok fog tenni, hogy viszonylag alacsony.
Vannak valójában függvények tudnak segíteni ebben.
De a legalapvetőbb az egyik, és a leginkább ismerős, legalábbis, hamarosan
ismerős számunkra a következő -
így az egyik az első sorban A kód a zöld van.
>> Csak átírtam s mint char *.
Nincs funkcionális különbség van.
Én csak eldobta a CS50 könyvtár és Hívom, hogy mi ez, egy char *.
>> Most pont, pont, pont, mert voltak Néhány hiba ellenőrzése, hogy ez nem
érdekes beszélni újra.
Tehát most t nyilvánítják.
Ez is egy char *.
Szóval rajzoltam egy kis négyzet a képernyőn, mint korábban.
>> De a jobb oldali, malloc, azt mondta a memória osztja.
Így osztja néhány darab a memóriát.
És hány bájt csinálni valójában szeretnék kiosztani, tűnik úgy?
>> Nos, a húr hossza s.
Tehát, ha ez helló ez lesz öt.
Azt fogja mondani, h-e-l-l-o.
Tehát öt bájt.
>> De aztán plusz 1, miért 1?
A 0 karakter.
Ha nem hagy teret a srác véletlenül olyan helyzetet teremt
ahol h a húr-e-l-l-o.
És akkor a következő alkalommal az getString hívott, és azt írja be, például,
David, D-a-v-i-d, a számítógép megy úgy gondolja, hogy s valójában
h-e-l-l-O-D-a-v-i-d, mert ott nincs szünet között ezeket a szavakat.
>> Tehát szükségünk van, hogy a szünet.
Tehát nem akarunk öt.
Azt akarjuk, hat bájt.
>> És bájt mondom.
De ez tényleg ideje mérete char.
Technikailag char szinte mindig egy byte.
>> De csak azért, hogy a kód hordozható, hogy úgy mondjam, úgy, hogy működik
különböző számítógépen is, ha esetleg némileg eltérő alatt a
motorháztető, fogok általánosságban mondjuk mérete char, hogy a
kódom mindig működik.
És nem kell újrafordítani, hogy csak mert frissíteni a számítógépet, vagy használjon
néhány más platform.
>> Szóval megvan 6-szor akkora, mint a karakter, ami történik, hogy 1.
Ez azt jelenti, malloc tudott adj hat bájt.
Mi ez valójában csinál?
Nos, hadd forgassa vissza az időben itt hogy hol tartunk a történetben.
>> Tehát, ha én megyek vissza, már kijelentette, a char * nevű t.
Már most hívott malloc hat bájt.
És most fogom felhívni a hat bájt, mint a tömb korábban.
De én tényleg nem tudom, mi ez ezen belül tömb.
>> Ha memóriát kiderül, hogy nem lehet megbízni, hogy van valami
ismert érték ott.
Lehetett volna használni valami mással, egy másik funkciója, más
kódsor, amit írt.
Szóval akkor általában hívni ezeket a szemetet értékeket, és felhívja őket, talán úgy, mint
kérdőjelek, csak azt jelzi, hogy Nem tudom, mi valójában ott van.
És ez nem nagy ügy, amíg mi elég okos, hogy felülírja az
szemetet értékeket számszerű és karakter, hogy mi érdekel.
>> Tehát ebben az esetben mit fogok csinálni?
Nos, a kódsor következő, már négy.
int kapok 0, n kapja a húr hossza s.
Tehát egy ismerős hurok.
I kisebb vagy egyenlő, mint N, amely általában meghaladja.
>> De ezúttal ez szándékos.
I + +, aztán egyszerűen nem t tartó i lesz s.
Mert a kép úgy néz ki, mint ez a Ebben a pillanatban, tárolt t az
címét, hogy a véletlen darab memória amelyek értéke ismeretlen.
De amint én t tartó 0, hogy hozza ide.
>> És mi végül egyre húzott ott?
Mi a végén üzembe h.
Mert ez az, amit ez a s konzol 0-ra.
Aztán ugyanezt e, és én, és én, és o.
>> n, miért megyek fel a egyenlő az n?
Mivel a 0 karaktert.
Szóval, csak hogy tisztázzuk, akkor, ha tényleg törli legyen az bármi szemetet
értékek majd ténylegesen felhívni az mit várok, hogy ez s konzol 1, 2,
3, 4, plusz ez záró új karaktert.
>> És most, ha folytatódik a múlt dot, pont, pont ebben a megfelelő verzió
és aktivált t tartó 0 lenne, a természetesen kihasználva csak ez
srác itt, amely fogalmilag végső soron a cél.
Szóval ez a mutató.
>> És ha már használja őket hetek most a húrok összefüggésben.
De a motorháztető alatt ők egy kicsit bonyolultabb.
De ha úgy gondolja róluk a képi formában azt javaslom, hogy ők
talán nem olyan ijesztő, mint azok talán először látszik első pillantásra,
különösen az ilyen új szintaxis.
Bármilyen kérdése a mutatók, vonósok, vagy a karakter?
Igen?
>> Közönség: Vissza tudsz menni A [nem hallható]?
>> SPEAKER 1: Persze.
>> Közönség: Hogy jön az utolsó vonal, akkor nem kell a * t vonal
és a * s a sorban?
Nem kell a hivatkozást az -
>> SPEAKER 1: Ah, egy nagyon jó kérdés.
Miért nem tudok egy * t, és a * s?
Mivel a rövid, a múlt héten, mint a mi csere funkció, azt mondtam, hogy amikor
van egy mutató az eszköz, amit ott, mint mi
fizikailag a színpadon, az volt, hogy valójában használja a csillag operátor.
>> Kiderült, hogy ez a szögletes zárójeles jelölés mit fogunk hívni szintaktikai
cukor, ami csak egy szexi módon mondván, hogy a rövidítéseket,
pontosan mit leírja.
De ez egy kicsit intuitív.
És azzal a veszéllyel jár, hogy ez a látszólag még bonyolultabb, mint amilyennek lennie kellene,
mi folyik itt a következő -
Ha azt mondom, * t azt jelenti, hogy menjen A cím tárolt t.
>> Tehát a szó szoros értelmében, ha t tárolja címét, hogy h
kezdetben, * t azt jelenti, megy itt.
Nos, mit t tartó 0 jelent?
Pontosan ugyanolyan dolog.
Csak egy kicsit több felhasználó barátságos írni.
>> De nem történt még.
Nem tudok csak mondani, * t * s lesz.
Mert mit csináljak akkor?
Én üzembe h, h, h, h, h az egész dolog.
Nem igaz?
>> Mivel a * t, hogy megy a címre t.
De bent egy hurok.
És milyen értéket vagyok megnő, Természetesen minden egyes ismétlés?
i.
>> De van egy lehetőség itt, ugye?
Annak ellenére, hogy ez olyan, mint hogy egyre egy kicsit kifinomultabb
mint a szögletes zárójeles jelölés már használják egy ideje -
hadd visszavonás a h változás van -
még akkor is, ha ez most már egy kicsit szakértő, az alapötlet, hogy * t
itt azt jelenti, és a * t csak megy a címre t.
>> De mi volt a cím t?
A szám tartjuk használ?
Mint Ox456, most hozd vissza csak a vita kedvéért.
Nos, ha azt akarjuk, hogy az e-ben t string, én csak azt szeretném, hogy menjen,
lényegében, 456.
>> Vagy inkább 457.
Csak kell hozzá egy.
De én meg tudom csinálni, nem?
Mivel t, bár tartok rajz most, mint a nyíl, ez csak egy
szám, Ox456.
És ha hozzá egyet, hogy vagy több Általában, ha hozzáteszem, hogy én, hogy én is
valójában, hogy pontosan hol akarok.
Tehát, ha én tényleg ezt -
és ez az, ami most az úgynevezett pointer aritmetika -
Én távolítsa el ezt a vonalat.
Ami, őszintén szólva, azt hiszem, tisztább és egy kicsit több felhasználóbarát olvasni.
De ez nem kevésbé igaz.
>> Ez a vonal a kód most a pointer aritmetika.
Ez azt mondja el, hogy a következő cím -
függetlenül a kezdete t, mely t és i, amely kezdetben
0, ami nagyszerű.
Mert ez azt jelenti, az elején t plusz 1, plusz 2, plusz 3, és így tovább.
És ugyanez foglalkozik s.
>> Így szintaktikai cukor ezt.
Hanem megértsétek, mi folyik valójában a motorháztető alatt, azt állítják,
valóban hasznos és önmagában.
Mert ez azt jelenti, most már nem sokkal több varázslat történik
a motorháztető alatt.
Ott nem lesz több rétegek, hogy mi is húzza vissza az Ön számára.
Ez kb.
És ez programozás.
Nagyon jó kérdés.
>> Rendben, ez az volt, hogy hibás programot utaltam korábban.
csere hibás volt.
Ha nem úgy tűnik, hogy működik.
Emlékezzünk vissza, hogy ugyanúgy, mint a tej és A narancslé - amit elkezdtem
ivás a mai demonstráció.
Tehát ahogy a narancslé és a a tej, akkor még van, hogy egy
ideiglenes változó, tmp, hogy tartsa a ideiglenesen, hogy mi lehet majd
változtassa meg az értéket, majd frissítse b.
>> De ezt a funkciót, akkor azt mondta, vagy a program, amelyben ez a funkció volt
írott tévedett, és hibás, miért?
Igen?
>> Közönség: [hangtalan].
>> SPEAKER 1: Pontosan, ha a hívás csere -
vagy általánosabban, ha hívás a legtöbb olyan funkciót -
ha az érvek, hogy a funkció primitív, hogy úgy mondjam, ints és karakter
és páros és úszik, a dolgok nem csillagok, akkor halad egy példányát
az érvelés.
Tehát, ha x és y: 1: 2, a megy , hogy 1 és b lesz 2..
De most más lesz darabokat bitek különböző darabokat
memória, amelyeket adott esetben tárolás azonos értékeket.
>> Tehát ez a kód szuper tökéletes A csere a és b.
Ez nem jó csere -
A múlt héten például -
x és y.
Mert megint ők a rossz hatálya alá.
>> Nos, hogyan is megy a rögzítés ez?
Meg kellett, hogy a funkció Egy kicsit csúnyább.
De ismétlem, hogy mi Ez csak azt jelenti.
>> És tényleg, hadd, a következetesség, változás egy dolog így azonos
amit csináltál.
Mint már említettem a múlt héten, ez nem számít, hol megy.
Sőt, általában akkor tegye a csillag jelenik meg a változó neve.
De azt hiszem, ez egy kicsit könnyebb hogy fontolja meg a * mellett
adattípus értelmezni, hogy ez a mutató egy int ebben az esetben.
>> Szóval, mit keresek én itt?
Azt mondom, nem adnak nekem egy int majd egy másik int,
hívja őket, a és b.
Add meg a címet egy int.
Add meg a címet egy másik int.
Hívja ezeket a címeket a és b.
>> És akkor a * jelölés le alatt, megy minden egyes ilyen címek
szükség szerint sem kap vagy állítsa az értékét.
De van egy kivétel.
Miért nincs a * mellett tmp?
Miért nem ezt, például?
Olyan, mintha kéne menni az összes , és javítsa az egészet.
Igen?
>> Közönség: [hangtalan].
>> SPEAKER 1: Még nincs bejelentve tmp egy string.
Tehát ez kijelenti, ebben az esetben, a tmp, hogy a címét egy int.
De ez nem elég, amit akarok, egy pár oka.
>> Közönség: Nem akarod cserélni őket.
>> SPEAKER 1: Pontosan, nem akarom, hogy a csere semmit tmp. tmp csak
hét-egy dolog.
Minden amit akarok egy változó tárolni néhány számot.
Én nem is érdekel címek ebben a pillanatban.
>> Csak kell 32 bites így tárolni egy int.
És azt szeretnénk, hogy azokban a 32 bit bármit, ami nem egy, hogy úgy mondjam, de
mi is egy, csak hogy pontosabb.
Mert ha egy olyan cím, * a jelent menj oda, és kap az 1-es érték.
Például a múlt heti példa vagy b esetében, hogy az értéke 2.
>> Szóval, mi is folyik itt?
Hadd hívjam a kép itt, amely csak ugratni mellett része a mai.
De ez továbbra is megjelenik jó ideje.
>> Ez, azt állítják, az, amit a számítógép memória néz ki, ha fut a
program minden program.
Ha fut a program, az egyik legfontosabb a számítógép RAM - így gondolom,
a téglalap, igazán, mint a számítógép RAM memória, az összes 101
milliárd bájt ebből, kétmilliárd bájt, minden két gigabájt belőle,
bármilyen mennyiség van az, hadd dolgozzon, mint egy téglalap.
És azt állítják, hogy ha fut a program mint a Microsoft Word vagy a Chrome
vagy ilyesmi, azok a részek, Microsoft vagy a Google írta -
azokban az esetekben, e programok -
töltődnek be a számítógép memóriájában ahol is végre több
gyorsan és táplálják be a CPU, amely az agy a számítógép.
>> És TAM ők tárolják a nagyon tetején a program, hogy úgy mondjam.
Más szóval, ha ez egy darab memória, ha duplán kattint a
Microsoft Word, a bitek jönnek le a merevlemezről.
Kapnak betöltött RAM.
És mi lök őket az egyik legfontosabb Ennek téglalap fogalmilag.
>> Nos, a többi a memória használják a különböző dolgokat.
A legtetején látod elindítani adatok és inicializálás adatokat.
Ennek oka, hogy a legtöbb, a konstans vagy globális változók
amelyek értékeket.
De még azokon máskor.
>> Akkor a halom, amely jövünk vissza.
De az alsó része, ami különösen illenek most.
Ez az úgynevezett stack.
Így, mint a legtöbb olyan D hall itt campus, akkor azokat tálcák
csak verem tetején egymásra, amely lehet ételt és miegymás.
A verem egy számítógépes rendszerben nagyon hasonló.
Kivéve míg a tálcát, ahogy használni Az étkező, persze, azt jelentette,
folytatni a dolgokat, tálcák vagy a keretek -
ahogy hívjuk őket - a számítógép memória gyűjtjük
változókat és értékeket.
>> Tehát valójában mi folyik a motorháztető alatt?
Nos, hadd fordítsa A képernyő itt.
És összpontosítsunk csak a alsó rész egy pillanatra.
Ha ez az alsó része az én számítógép memóriája kiderül, amikor
A funkciót fő - ami történik, őszintén szólva,
automatikusan számomra -
Kapok egy darab memória a alján a RAM úgy mondjam.
És ez az, ahol Main lokális változók menni.
Ez az, ahol argc és argv talán megy, és a változók
kijelentik belül fő.
A végén az alján az én számítógép RAM.
>> Most tegyük fel, hogy a fő meghív egy függvényt mint a csere, mint tette a múlt héten?
Nos, alapvetően hogy egy új tálca, a új keret, rá a darab memória.
És fogom leírni ezt tartozó csere funkciót.
>> Most mi van benne a csere?
Nos, az elmúlt heti program az, amit most láttam egy részletet,
belül csere a keret, illetve a csere tálca, amit változó?
Nos, a és b.
, Mert ezek voltak a helyi érveit, valamint egy harmadik, tmp.
Szóval tényleg, nem tudtam felhívni a egy kicsit tisztábban.
Hadd menjek előre, és vonja vissza a címkét.
És hadd állítják, hogy tudod, mit?
>> a valószínűleg lesz a vége itt.
B lesz a vége itt.
És tmp lesz a vége itt.
Most, a rendelés esetleg egy kicsit más.
De fogalmilag ez az ötlet.
>> És csak együtt, ez az, ami hívjuk swap ügylet keretében, vagy
ebédlőben tálcát.
És ugyanez foglalkozik fő.
De nem dolgozza át, hogy.
De ez az, ahol argc és argv és minden a lokális változók, mint x és y
lehet olyan is.
>> Tehát most úgy mi történik valójában ha hívja csere.
Amikor hívja csere, végrehajtás alatt álló kódot, mint a ezt, te halad, a
hibás változat, a és b másolatban az x és y.
Tehát, ha én most felhívni a a képernyőn -
van, hogy javul a -
így a történet, amit mesélt, hogy magamnak volt a hibás verziót, amikor
hívásváltás halad szó és b egészek, mi történik valójában?
>> Nos, mi történik valójában ez.
Hadd menjek előre, és visszavonás csak tisztázni itt egy kis helyet.
Tehát ez a számítógép memóriájában.
>> Tehát, ha van, például -
valójában csináljuk ezt így -
ha azt állítják, hogy ez az x, tároló Az 1-es érték, mint a múlt héten.
És ez y, az érték tárolására 2, mint a múlt héten.
És ez fontos, amikor hívom csere, ezáltal magam hozzáférést és
b és tmp, fogom állítani, hogy ez egy, és ez az 1.
>> Ez b.
Ez a 2 lehet.
Ezt hívják tmp.
>> És kezdetben, hogy van néhány szemét értéke amíg Igazából tárolja benne egy,
amely 1.
Aztán megy előre, és változás egy, hogy mit?
B értékét.
>> És így most már két itt.
És akkor azt mondtuk b lesz tmp.
Ismét, mint ahogy a józan ellenőrzi, a harmadik kódsor itt egyszerűen ez
egy, b kap tmp.
>> És végül, mit tegyek?
Megyek előre, és változtassa meg b, hogy bármilyen tmp értéke van, ami 1.
Én ne érintse tmp újra.
>> De most, a probléma az, amint csere visszatér, mert nem adják
vissza valamilyen érték, nincs visszatérés nyilatkozat kifejezetten benne.
Mi történik valójában?
Nos, lényegében mind a memória -
OK, úgy tűnik, a radír szeret csak egy ujjal egy időben -
éppen eltűnik.
>> Most a valóságban ez nem megy sehová.
De gondold azt, hogy Most, kérdőjelek.
Mert ez már nem ténylegesen használatban.
És semmi sem történik az értékek.
>> Tehát abban az esetben, a zöld változata ezt a kódot, amit inkább az, hogy
átment csere?
Így foglalkozik.
Így a címét, és x címének y.
Tehát, ha újra elmondani ezt a történetet egy utolsó idő, és én valóban rajzolni csere újra,
de a mutató, mivel ez egy, a hogy b, és mivel ez tmp, mi
ténylegesen tárolt a jelen zöld változata kódomat, ahol én vagyok elhaladó
a címeket?
>> Ez lesz a mutatót x.
Így tudtam rajzolni egy nyíl.
De nézzük ugyanazt a tetszőleges Például, mint korábban.
Tegyük fel, hogy ez a valami ilyesmit Ox123.
És ez lesz Ox127 mert ez négy bájt el, mert ez egy
int, így Ox127.
>> És ismét, elviszem néhány szabadságjogok a számokkal.
Ők sokkal kisebb, mint azt valóban, és más sorrendben.
De ez, hogy a kép most más.
>> De amikor ezt a zöld kódot és én int tmp kap * a.
* A jelenti, hogy a következő, hogy a foglalkozik, hogy van egy, és megy is,
amely 1.
És ez az, amit majd tegye a tmp könyvtárba.
Eközben a következő kódsor itt, a * b megkapja, mit jelent ez?
>> Nos, * a, így megy itt lesz * b, ami azt jelenti, ott.
És ez azt jelenti fel az értéket is.
Végül az utolsó sort csak annyit mondott, * b megkapja tmp.
>> Tehát azt mondja, b ott és írja felül az tmp, amely ebben az esetben megy
hogy ismét 1.
És ez az, amiért a zöld változata a kód működik, míg a piros
verzió soha.
Minden csak attól függ, hogy milyen a memória kezelése, és ahol ez
valóban helyezni a számítógép RAM.
És most, ez az egyik dolog, hogy a verem használják.
>> Kérdések az elrendezés?
A mutatók?
Vagy csere?
>> Rendben, malloc, visszahívás, volt valami ilyesmi.
Ez egy szuper egyszerű példát.
És ez volt az egyik, hogy Muci bemutatott minket, bár elég
gyorsan, a végén az osztály.
A fenébe, ott megint.
>> Így emlékeztetni arra, hogy ez volt a példa, hogy Muci be minket, bár
kissé gyorsan végén osztályban.
És itt használt malloc igazán a második alkalommal.
Mivel az első alkalom, hogy használják, hogy létrehozásához elegendő RAM, osztott ki elegendő RAM
tárolására a string.
>> Ezúttal Muci megtartotta egyszerű.
Tehát tárolni csak int, látszólag.
És ez teljesen rendben van.
Ez egy kicsit furcsa, őszintén szólva, a használja malloc kiosztani egy int.
De a lényeg az volt, Nick claymation tényleg csak elmondani a történetet, hogy mi
történik, vagy nem történik meg, ha Ön rosszul bánnak memória.
>> Tehát ebben az esetben, ez a program volt egy pár dolgot.
Az első esetben is, azt mondja a mutató az úgynevezett x egy int.
Ezután kijelenti mutató hívott y egy int.
Ezután üzletek x, mi?
Valaki most.
Milyen lesz tárolt x szerint A harmadik sorban a program?
>> Közönség: [hangtalan].
>> SPEAKER 1: Nos, nem egészen bájt, egy mondjuk.
Pontosabban most.
Milyen lesz tárolt x?
Egy cím, azt hiszem, hallottam.
>> Szóval mit malloc vissza?
malloc viselkedési lefoglal egy darab memóriát.
De hogyan érhetjük el azt?
Visszatér, mi?
A cím első byte A darab a memória.
>> Nos, ez rendkívül egyszerű.
Ez csak egy byte, ami azt jelenti, foglalkozni mi megy vissza a
címét az egészet.
Tehát tárolt x tehát a cím , hogy a darab a memória.
Közben mi történik ezután?
Tehát tulajdonképpen, menjünk előre, és felhívni a ki nagyon gyorsan.
>> Tehát, ha megy át a képernyőn, és itt játszunk ki ezt int * x és int * y
fog tenni, amit nekem?
Azt állítják, hogy ez csak fog tenni valami ilyesmi, és hívja meg x és
ez, és hívja meg y.
Eközben a harmadik sor kód fog kiosztani méretének int,
amely történetesen - sajnálom, ha azt mondanám, ilyet gondoltam egyet int -
négy bájt a tipikus számítógép.
Legalábbis a CS50 készülék.
>> Tehát ez lesz kiosztani , ki tudja?
Valahol itt.
És ez tárolják néhány cím Ox, ki tudja?
De mit fog kapni vissza az, hogy a cím.
De majd hívni ezt képszerűen mint csak egy nyíl, mint ezt.
>> Most a következő sorban * x 42 lesz.
Mit jelent a * x jelenti a laikus szempontból?
Csak ott.
Megy, hogy a címre.
Vagy más szóval, kövesse a nyílra, és tedd 42 oda.
De aztán valami rossz történt a Muci, nem igaz?
>> Emlékezzünk vissza, hogy öt vonal itt, * y lesz 13, sőt egy szerencsétlen szám,
mit csinált nekünk?
Nos, * y módon menni.
Nos, ez nem kapott értéke még, ugye?
A kód nem y, hogy inicializálni semmit.
Volt x inicializálása egy címre.
De y nyilvánították fel tetején.
De aztán egy pontosvessző, nincs értéke ban ténylegesen benne.
Így igaz, hívja ezt a egy szemetes értéket.
Ki tudja, mi van ott?
Ez a maradék bitek használtak néhány korábbi kódsort
a programom.
>> Tehát, ha azt mondom, ott, ez olyan, mint, Fogalmam sincs, ahol ez a nyíl
fogja végezni.
És ez, ha általában kap egy szegmentációs hiba.
Ha véletlenül dereference, így a beszélni, vagy látogasson el a címet, hogy ez nem
teljesen jogos cím rossz dolgok történnek.
>> És pontosan ez történt gondolkodni Muci.
Így emlékeztet arra, hogy a történet, hogy Nick mondja itt volt ugyanaz a gondolat, mint amit
Már készült azzal az illúzióval, kréta a táblán is.
X és Y nyilvánítják.
>> Aztán kiosztott méretének egy int és tárolni, hogy az x.
Ezután a következő sorban csináltunk * x.
Ez volt Nick varázspálca A dereferencing.
Hogy fel 42 a memóriában rámutatott x.
>> De ez az, ahol a dolgok ment rettenetesen rossz.
Nem igaz?
Megpróbáltuk dereference y.
De y volt néhány hamis érték, igaz?
>> Ez a nyíl a bal alsó sarok, nem
valójában mutat semmit.
Elég csinál, amit volt itt a fórumon.
Tehát rossz dolgok történnek, szegmentálás hiba, vagy Muci hiba, ebben az esetben.
>> De ha majd rögzíteni, hogy ennek révén x kap y hogyan működik a történet változás?
Nos, ha én x lesz y, ez gyakorlatilag ugyanaz, mint a mondás
Bármi is ez, valami Ox- lesz ugyanaz itt,
Ox-valamit.
Vagy képszerűen fogjuk felhívni egy nyíl.
>> Tehát itt a táblán Muci, a következő sor
kód, * y azt ott.
Hol van?
Ez azt jelenti, mint itt.
>> És amikor frissíteni, hogy kell 13 csak megy, és magában foglalja a
13. írás itt.
Így talán nem teljesen egyértelmű első pillantásra.
De ahhoz, hogy újra bedugni, és ugyanazt a zsargon hogy Muci használta itt, így
Az első két osztja a mutatók, x és y, de nem a pointees.
És pointees nem általánosan használt kifejezés.
De a mutató teljesen az.
De mi is rámutatott A a Muci nómenklatúra.
>> Ez a következő sorban, persze, oszt egy int pointee.
Tehát egy darab memória - ahogy húztam át a a jobb oldalon -, és állítsa
x egyenlő értelme.
Ez dereferences x tárolni 42 a memória ez mutatva.
És ez, természetesen, egy rossz dolog.
Mivel y nem mutat A semmit.
Ez rögzíti azt.
Tehát ez még mindig hibás program.
Csak azért, mert mi vagyunk fúj át a kódot sorról sorra, és azt mondja, hát igen,
hagyja ott lezuhan.
Ez egy rossz dolog.
Valószínű, hogy a program csak úgy megszakítás összesen ebben a sorban.
De ha úgy döntesz, hogy távolítsa el a lezuhant vonalat, és cserélje ki az utolsó két
vonalak ott hozzá -
a mutató feladat - y arra utalnak, hogy x pontként t.
És akkor dereference y egy nagyon biztonságos módon.
>> Szóval, ha ez hagy minket?
Nos, kiderült, hogy a motorháztető alatt A CS50 könyvtár pointerek
használják szerte.
És akkor valóban elkezd héja vissza, hogy a réteg nemsokára.
De kiderül is, egy kifejezés, néhányan lehet, hogy ismeri,
különösen kényelmes, valójában, hogy egy nagyon népszerű
honlapon, vagy a verem túlcsordulás, ezekben a napokban.
>> De ez tényleg nagyon technikai értelemben.
Azt már tudjuk, hogy mi a verem.
Ez olyan, mint egy halom tálcák belsejében egy étkező.
>> Vagy azon belül a számítógép memória egyébként annak a kereteket
által használt funkcióit.
Nos, kiderült, hogy azért, mert az, hogy nagyon egyszerű végrehajtása
memória és a kereteket az úgynevezett verem, akkor valóban átveszi az irányítást
a számítógépes rendszer viszonylag könnyen.
Lehet feltörni a rendszert, ha az emberek mint mi, nem írtam a kódot
különösen jól.
>> Ha az emberek, mint mi használ darabokat memória vagy tömböket használnak -
még gyakrabban -
de néha elfelejti, hogy ellenőrizze a határait a tömb, mint ahogy azt
hogy magát néha, és iterált túl messze túl a végén egy tömb.
A legjobb esetben, a programban Lehet, hogy csak összeomlik.
Szegmentációs hibát, kedves A kínos.
Nem jó, de ez nem feltétlenül egy igen rossz dolog.
>> De ha a program valójában a valós felhasználók számítógépein, ha fut
a honlapon, hogy a tényleges random emberek az interneten az ütő, és lehetővé
emberek indukál rossz dolgok a kód általában nem jó dolog, mert
ez azt jelenti, a lehetőséget, hogy irányítást a számítógép.
És ez fog keresni egy kicsit rejtélyes.
De azt gondoltam, megijeszteni Ez utóbbi példa itt.
>> Íme egy példa a kódot.
És van egy jó Wikipedia cikket, hogy sétál
ezt részletesebben.
Van fő alján hívás foo, átadva argv 1.
És ez még csak, így futtassa a programot, és adja át
egy tetszőleges bemenet.
>> És akkor ize bejelenteni felső A fogadáshoz string, vagy több
pontosan, a char *.
Ezután kijelenti, egy sor karakter.
Nevezzük a puffer, általában A 12-es méretű.
Így 12 karakter elfér benne , hogy a tömb neve c.
>> És akkor használja ezt az új funkció, , ami új, de nem nehéz
érthető, memória másolás.
A másolat a memóriát, bár, ami A változó múlt n, amit a
felhasználó beírt argv be az 1. c.
Hány bájt?
A string hossza bar.
>> Más szóval, ha a felhasználó típusok h-e-l-l-o Adja meg a karakterlánc hosszát
Hello öt.
Tehát öt olyan byte fog kapni másolni a tömb nevezett C, ami
az a 12-es méretű.
De amit a felhasználó beír egy sokkal hosszabb szót, ami 13 karakter vagy 14
karakterek vagy 100 karakter, vagy több?
>> Hová fognak menni?
Nos, hogy a keret, hogy a tálca Az ebédlőben stack,
fognak menni.
És ez csak fog kezdeni felülírja Más dolog, hogy ez már
azon a stack, túláradó a köteget, hogy úgy mondjam.
>> Tehát képszerűen, gondolom ezt így.
Ez csak egy színes változata A képen már rajz.
Az alsó, mondjuk, a legfontosabb.
És a tetején, amit látsz jelenleg a keret, színkóddal most egy
nevű függvényt ize.
De ami itt még érdekesebb a ize, hogy itt van a keretben.
Szóval ez készült, mint én nem, de a világoskék.
És most ez az, ahol c tartó 0. megy.
És ez az, ahol c konzol 11 lesz a végén.
>> Más szóval, ez történik, hogy képviseli, mint egy négyzet.
De ha csak folyamatosan plopping bytes le - vagy karakter - ők lesz a vége
akár a 0 helyen egészen 11 mert 0 indexelt.
>> De hol van a 13. karakter majd a végén?
Hol van a 14?
Hol van a 50. karakter majd a végén?
>> Ez lesz, hogy folyamatosan megy le.
Mert bár már felhívta a kép a verem felnövő, a
címek, kiderül, megy kis címek, kis
mutatók, a nagy címeket.
Így csak megy fel és fel.
>> Tehát, ha a felhasználó által hello, ez nagyszerű.
Nem bug, nem probléma, mindenki biztonságban van.
De ha a felhasználó beír mit fogunk hívás kontradiktórius kód képviselt
általában mint a, támadás, támadás, támadás, támadás, mi történik?
>> Nos, ha minden a bemeneti, hogy a felhasználó beírt nem csak egy baráti
vagy támadó karakterlánc.
Ez valójában egy karaktersor hogy ha össze azt,
ez valójában kódot.
Lehet, hogy kód, amely törli az összes fájlokat a merevlemezen, vagy küld spam
vagy valami ilyesmi.
Figyeljük meg, hogy mi a legfontosabb az, hogy ha a rossz fickó szerencsés, hogy
felülírja a piros darab memória -
amit nem felhívni a kép, de a Wikipedia kép itt található -
az úgynevezett visszatérési címet.
>> Amikor az élelmiszer visszatér, amikor csere visszatér, hogyan működik a számítógép tudja, hogy megy
itt az ide?
Vagy a tech szegmensben fölött, hogy nem is tudom, hogy menjen a csere
kód - a 0 és 1-es alkotó csere -
vissza a főoldalra?
Van egy úgynevezett visszatérési cím tárolt ugyanazon verem keret, a
ugyanaz cafeteria tálcát.
>> Tehát, ha a rossz srác okos ahhoz, hogy fel támadó kódot, támadó kódot, támadás
kódot, és kap elég szerencsés -
gyakran a tárgyalás és a hiba - a felülírja a vörös-mail címet,
A cím és az értesítés a csúcsra.
Figyelmeztetés 0835C080.
Meg van írva hátra fel tetején ok akkor talán újra.
Ez az a szám.
>> Tehát, ha a rossz fickó szerencsés vagy elég okos ahhoz, hogy felülírja a piros
szalag memória a címét kódot, hogy ő is valahogy
fecskendeznek a számítógép, tudod akinek kód lesz vissza
amint foo történik végrehajtása?
>> A rosszfiú kódot.
Szóval ez a támadó kódot, AAA, megint, talán spam, lehet, hogy törölje az összes fájlt
a merevlemezen.
De ez az, amit igazán a verem túlcsordulás van, vagy egy puffertúlcsordulási vagy
puffer túlcsordulás támadás.
>> És ez hihetetlenül, hihetetlenül gyakori a mai napig programokkal írt
C, C + +, és még néhány más nyelveken.
Ezen ijesztő figyelmét, fogjuk végén egy vicc.
>> [Nevetés]
>> Viszlát szerdán.
A következő CS50 -
Szóval minden a lemezen lámpák ma, de várj, zsírmentes tej, fél a telefon
könyv, a narancslé hogy ittam ma.
USB-kábel, a kulcs.
>> [MUSIC PLAYING]