>> [Zenelejátszási]
>> [Videó lejátszás]
>> -Ő Hazudott.
>> -Miről?
>> -Nem Tudom.
>> -Szóval Mit tudunk?
>> -Ez A 09:15, Ray Santoya volt az ATM.
-Igen.
Tehát a kérdés az, hogy mi csinált a 09:16?
>> -Shooting A 9 milliméteres valamit.
Talán látta a mesterlövész.
>> -vagy Volt vele dolgozni.
>> Várj.
Menjünk vissza egy.
>> -Mit látsz?
>> -Bring Az arcát, teljes képernyőn.
>> -His Szemüveget.
>> -Van Egy reflexió.
>> -Ez A Nuevitas baseball-csapat.
Ez a logó.
>> -És Ő beszél Aki visel, hogy kabát.
>> [Lejátszás vége]
>> DAVID MALAN: Rendben.
Ez CS50, és ez egy kicsit Az [hallhatatlan], amellyel te
belekóstoltak a problémát az alábbi négy.
Ma elkezdünk nézni egy kicsit Mélyen meg ezeket a dolgokat nevezett mutató,
amely annak ellenére, hogy egy szép misztikus téma,
kiderül, hogy ez lesz hogy az eszköz, ami által
elkezdődhet és összeszerelés sokkal kifinomultabb programokat.
De megcsináltuk a múlt szerdán útján néhány claymation első.
Szóval ez, sokan emlékeznek, Muci és szoktunk rá
hogy vessen egy pillantást a programot, hogy Nem igazán semmi érdekes,
de ez nem válik egy kevés probléma.
Így kezdődik ma, miért nem sétálunk gyorsan át néhány ilyen lépéseket,
próbáld eltávozni az emberi feltételek Pontosan mi folyik itt
és hogy ez miért rossz, majd lépni és valóban kezdjék építeni valamit
ezzel a technikával?
Szóval ezek voltak az első két sort ebben a programban
és a laikus szempontból, hogy mi a következő két sort csinál?
Valaki, aki meglehetősen kényelmes A mi nyilvánította a képernyőn?
Mi ez a két sor csinál?
Ez még nem minden, hogy eltér a héten az egyik,
de van néhány új speciális szimbólum.
Igen?
Vissza ott.
>> Közönség: deklarálása mutatók?
DAVID MALAN: Mondd még egyszer?
Közönség: deklarálása mutatók?
DAVID MALAN: deklarálása mutatók és nézzük finomítani egy kicsit.
Közönség: [hallható] címet x és y majd.
DAVID MALAN: És akkor foglalkozzon.
Tehát konkrétan mit csinálunk A mi nyilvánító két változó.
Ezek a változók, bár folynak hogy int típusú csillag, amely
Pontosabban azt jelenti, fognak tárolni
A címe int, illetve, X és Y.
Most vannak-e olyan értékek?
Vannak-e olyan konkrét címeket ezekben két változó ebben az időpontban?
Nem.
Ez csak az úgynevezett szemetet értékeket.
Ha éppen nem rendelhet változó, bármi is volt a RAM-ban
korábban fog tölteni nullákkal és az is, mind a két változó.
De még nem tudjuk, mik ezek, és ez az,
lesz kulcsa, hogy miért Muci elvesztette a fejét a múlt héten.
>> Szóval ez volt a claymation megtestesülése ennek a
ahol éppen most két változó, kis kör alakú darab agyagot,
hogy képes tárolni változók, de mivel A bebugyolálva nyilak azt sugallják,
ők valójában nem mutat hogy bárhol ismert.
Így aztán volt ezen a vonalon, és ez a új volt a múlt héten, a malloc memória
elosztása, ami csak egy divatos módon megmondani az operációs rendszer, a Linux
vagy Mac OS és Windows, Hé, adj egy kis memóriát,
és csak annyit kell mondani az operációs rendszer
az, ami, ha megkéri azt a memóriát.
Ez nem fog törődni, hogy mit fogsz csinálni vele,
de nem kell mondani az operációs rendszer, amit útján malloc.
Igen?
>> Közönség: Mennyi?
DAVID MALAN: Mennyi?
Mennyit byte, és így, ez megint, egy kitalált példa, csak azt mondja,
adj akkora, mint egy int.
Most, akkora, mint egy int négy bájt vagy 32 bit.
Tehát ez csak egy módja mondván, hé, operációs rendszer,
adj négy bájt memóriát hogy tudom használni a rendelkezésemre,
és konkrétan mit jelent malloc visszatérés tekintetében
E darab négy bájt?
Közönség: Cím?
DAVID MALAN: A címet.
A címe, hogy darab négy bájt.
Pontosan.
És így ez az, ami végső soron tárolt x és ez az, amiért nem igazán
érdekel, mi a számát cím, függetlenül attól, hogy OX1 vagy OX2
vagy valamilyen rejtélyes hexadecimális címet.
Mi csak érdekel képileg hogy ez a változó x ma
rámutatva, hogy darabja a memóriát.
Tehát a nyíl mutatja a mutatót, vagy Közelebbről, egy memória címét.
De ismétlem, nem tipikusan érdekel mik azok tényleges címek.
Most, ebben a sorban az mi laikus szempontból?
Csillagok x egyre 42 pontosvessző.
Mit is jelent ez?
Akarsz menni?
Ne vakarja a nyakát.
>> Közönség: A címe az x a 42.
>> DAVID MALAN: A címe az x 42.
Nem egészen.
Olyan közel, de nem egészen, mert ott van a csillag, ami előtaggal ez x.
Tehát meg kell dobnia egy kicsit.
Igen?
>> Közönség: Az az érték, a pointer x mutat 42.
DAVID MALAN: OK.
Az érték, amit a mutató x rámutatva, hogy, mondjuk, legyen 42,
vagy másképpen fogalmazva, a csillag x mondja, menj bármilyen címet
van x, függetlenül attól, hogy 1 Oxford Utca vagy 33 Oxford Street
vagy OX1 vagy ox33, bármi hogy a numerikus cím,
csillagos x a dereferencing x.
Így megy arra a címre, és aztán a szám 42 van.
Tehát ez lenne egyenértékű módon ezt mondja.
Szóval ez minden rendben, majd mi lenne a kép
az alábbiak szerint, ha felvettünk A 42 darab, hogy négy
byte jobb oldali, de Ez a vonal, ahol a dolgok elromlott
és Muci feje bukkant le ezen a ponton,
mert rossz dolgok történnek, amikor Ön dereference szemetet értékek
vagy hivatkozás feloldási érvénytelen mutatók, és azt mondom érvénytelen
mert ezen a ponton a történet, mi van belül y?
Mi az értéke y alapú az elmúlt pár lépésre?
Igen?
Az mi?
>> Közönség: Egy cím.
DAVID MALAN: Egy cím.
Meg kell egy címet de én inicializált ez?
Szóval még nem.
Tehát mi tudjuk, hogy ott?
Ez csak néhány szemetet értéket.
Ez lehet bármilyen címet nulláról 2 milliárd ha van két giga RAM,
vagy nulla, hogy 4 milliárd, ha már Van négy gigabájt RAM-mal.
Ez valami szemetet értéket, de a probléma
hogy az operációs rendszer, ha nem adott Önnek
hogy darab memória kifejezetten hogy akarsz menni,
ez általában fog okozni, hogy mit láttunk egy szegmentációs hiba.
Tehát valójában, valakinek, aki küszködött problémákkal munkaidőn
vagy problémákat, hogy a több általában megpróbálja kitalálni,
szegmens hiba, hogy általában azt jelenti,
te megható egy szegmense memória, hogy nem kell.
Te megható memória az operációs rendszer nem
megengedett, hogy megérintse, hogy ez megy túl messzire a tömb
vagy most kezdődik, hogy ez azért van, mert megható
memória, hogy csak némi szemetet értéket.
>> Ennek során csillagos x itt fajta definiált működést.
Soha ne csináld, mert esélye van, a program csak fog zuhanni,
mert azt mondod, menj erre a címre
és fogalmam sincs, hol ezt a címet valójában.
Tehát az operációs rendszer valószínűleg fog zuhanni a programot
Ennek eredményeként, és valóban, ez mi történt ott, hogy Muci.
Így végül, Muci rögzített ezt a problémát ezzel.
Annak érdekében, hogy a program maga hibás volt.
De ha valami haladjanak előre és végre ez a vonal helyett,
y értéke x csak azt jelenti, amit cím egy x is betette y.
>> És így képileg, most már képviselik ezt a két nyíl
Az x és y mutatóeszköz hogy ugyanazon a helyen.
Szóval szemantikailag, x egyenlő hogy Y mert e két
tárolja ugyanazon címét, ergo mutatva 42,
és most, amikor azt mondod csillagos y, megy a címet y,
ez egy érdekes mellékhatása.
Tehát az a cím y az ugyanaz, mint a címet x.
Tehát ha azt mondod megy a címet y és módosítsa az értéket 13,
aki mást az érintettek?
X, D pont, hogy úgy mondjam, kell érintettek.
>> És valóban, hogyan Nick felhívta kép A claymation volt, hogy pontosan.
Annak ellenére, hogy követjük a mutatót y, mi végül ugyanazon a helyen,
és így ha voltunk nyomtatni out X vagy Y a pointee,
akkor mi lenne látni az értéke 13.
Most azt mondom, hogy pointee összhangban van a videó.
A programozók, hogy én tudás, sosem
azt a szót pointee, azt, ami hegyes
a, de a következetesség A videó, rájönnek
ez minden, ami volt, jelentette be, hogy a helyzet.
Szóval minden kérdésre claymation vagy mutatókat vagy malloc csak még?
Nem?
Minden rendben.
>> Tehát minden további ado, vessünk egy pillantást
A ahol ez ténylegesen óta használják egy ideje.
Szóval ezt már CS50 könyvtár Ez van mindezen funkciókat.
Már használt GetInt sokat, getString, Valószínűleg GetLongLong korábban
az én PSET egy vagy úgy, de mi ténylegesen folyik itt?
Nos, vessünk egy gyors pillantást a motorháztető alatt egy program, amely
inspirál miért adunk a CS50 könyvtár, sőt, mint a múlt héten,
kezdtük, hogy ezeket képzés kerekek le.
Szóval ez most rendezve A halál utáni, hogy mi
már folyik belsejében CS50 könyvtár,
még akkor is, most kezdenek mozogni előle a legtöbb program.
>> Tehát ez a program neve scanf 0.
Ez szuper rövid.
Csak van ezeket a sorokat, de bevezet olyan függvény scanf
hogy mi történt valójában látni Egy pillanatra belsejében a CS50 könyvtár,
bár egy kicsit más formában.
Szóval ez a program on-line 16 kijelenti változó x.
Szóval adj négy bájtot int.
Ez már mondtam felhasználó, számú kérjük, majd
ez egy érdekes vonal ténylegesen összeköti a múlt héten
és ez.
Scanf, majd észre, hogy vesz egy formátumstringek, mint a printf,
% i: az int, majd tart egy második érv, amely úgy néz ki, egy kicsit
funky.
Ez jelet x, és felidézni, mi csak láttam egyszer a múlt héten.
Mit jelet x képviseli?
Mit jelet tenni a C?
Igen?
>> Közönség: Az címét.
DAVID MALAN: Az címét.
Szóval ez az ellenkezője A csillag üzemeltető,
míg a csillag üzemeltető azt mondja, menj Erre a címre, a jelet üzemeltető
mondja, kitalálni a címe ez a változó,
és így ez a kulcs, mert scanf célja az életben
hogy átvizsgálja a felhasználó közreműködött a billentyűzet,
attól függően, hogy bármit ő típusok, majd olvasd el, hogy felhasználói input
egy változó, de láttam az elmúlt két hétben
hogy ez a swap hogy megpróbálta könnyedén végrehajtani
Csak törve.
Emlékezzünk vissza, hogy a swap, ha csak kijelentette, A és B, ints,
mi nem sikerült cserélni a két változó belső swap
Csakúgy, mint a tej és a HL, de amint swap-vissza,
mi volt az eredmény tekintetében hogy x és y, az eredeti értékek?
Semmi.
Igen.
Semmi sem történt abban az időben, mert csereügyletek változtatni csak a helyi másolatot,
ami azt, valamennyi Ebben az időben, amikor mi már
lett átadva érvek a funkciók vagyunk
csak múló példányban ezeket az érveket.
Meg lehet csinálni, hogy amit akarsz velük,
de ők fognak nincs hatással az eredeti értékeket.
Tehát ez problémás, ha szeretnénk, hogy a funkció, mint a scanf
az életben, amelynek célja, hogy átvizsgálja A felhasználó által megadott a billentyűzetről
majd töltse ki az üres, így a beszélni, hogy van, hogy egy változó, mint az X
érték, mert ha én lennék hogy csak át x scanf,
ha figyelembe vesszük a logikája utolsó héten, scanf tehet, amit akar
egy példányát x, de nem tudta tartósan megváltoztatni x hacsak nem ad
scanf egy kincses térképet, hogy úgy mondjam, ahol x jelzi a helyet, ahol
átadjuk az x címét, hogy scanf lehet menni, és valójában a változás
az x értékét.
És így valóban minden hogy ez a program nem
ha én scanf 0, az én forrás 5m könyvtár, hogy scanf 0,
dot perjel scanf, száma Kérjük 50., köszönöm a 50.
>> Szóval ez nem olyan érdekes, de mi történik valójában
az, hogy amint hívom scanf itt, az x értékét
alatt folyamatosan változott.
Most úgy tűnik, ez szép és jó, és valójában ez
Úgy tűnik, mintha nem igazán kell A CS50 könyvtár már egyáltalán.
Például Fussunk ezt még egyszer itt.
Hadd nyissa meg újra a második.
Próbáljuk számos kérjük és ahelyett, hogy 50, mint korábban,
mondjuk, nem.
OK, ez egy kicsit furcsa.
OKÉ.
És csak valami ostobaságot itt.
Tehát úgy tűnik, nem kezelni hibás helyzeteket.
Tehát meg kell minimálisan kezdete hozzá néhány hibajavítási
meggyőződni arról, hogy a felhasználó rendelkezik beírtam a tényleges szám, mint 50,
mert látszólag gépelés szavak nem érzékeli problémának,
de valószínűleg kell.
>> Nézzük meg ezt a verziót most, hogy kísérletem újraimplementálni getString.
Ha scanf van mindez funkcionalitást beépítve,
Miért is lett belekóstoltak ezekkel képzés kerekek, mint getString?
Nos, itt van talán a saját egyszerű változata getString
ahol egy héttel ezelőtt azt mondta volna, adj egy húr, és hívják buffer.
Ma megyek kezdődik csak mondván char csillag, amely visszahívás,
ez csak egyet jelent.
Úgy néz ki, rémisztőbb, de ez pontosan ugyanaz a dolog.
Szóval adj egy változó nevű puffer hogy fog tárolni egy string,
mondja a felhasználó húr kérjük, majd, mint korábban,
próbáljuk kölcsönkérni ezt a leckét scanf % s ez alkalommal majd át a puffer.
Most, gyors józanság csekket.
Miért nem mondja jelet puffer ebben az időben?
Következtethetett az előző példában.
Közönség: Char csillag egy mutatót.
DAVID MALAN: Pontosan, mert ebben az időben, char
csillag már egy mutató, cím, definíció szerint az, hogy a csillag ott.
És ha scanf elvárja egy címet, elegendő csak át a puffer.
Nem kell mondani, és jelet puffer.
A kíváncsiak, amit lehetett ilyesmire.
Ez volna mást jelent.
Ez ad egy mutatót hogy egy mutató, ami valójában
Érvényes dolog C, de Most pedig nézzük, hogy ez egyszerű
és tartsa a történet következetes.
Én csak átutazóban a puffer és ez helyes.
A probléma azonban az, ez az.
Hadd menjek előre, és futtatni ezt programot, miután úgy fordítják le.
Tedd scanf 1.
A fenébe is, én fordító által fogása hibámat.
Adj nekem egy percet.
Csengés.
Mondjuk scanf-1.c.
OKÉ.
Ott vagyunk.
Kell nekem.
CS50 ID a különböző konfigurációs beállítások
hogy védenek meg magát.
Kellett, hogy tiltsa le azokat a futó csengés kézzel ebben az időben.
Tehát húr kérjük.
Megyek előre, és írja menni A kedvenc hello world.
OK, null.
Ez nem az, amit beírtam.
Tehát ez azt jelzi, hogy valami baj van.
Hadd menjen előre, és írja egy nagyon hosszú sora.
Köszönöm a semmis és nem tudom, ha én leszek képes összeomlik ez.
Próbáljuk egy kicsit másolatot paszta és hátha ez segít.
Csak illessze be egy csomó ezt.
Ez mindenképpen egy nagyobb húr, mint máskor.
Nézzük csak igazán megírni.
Nem.
Basszus.
A parancs nem található.
Szóval ez nem függ össze.
Azért, mert én beillesztett néhány rossz karakter,
de ez kiderül, nem fog működni.
>> Próbáljuk ezt még egyszer, mert ez több móka, ha valóban összeomlik ez.
Nézzük írja ezt, és most én vagyok szeretne másolni egy nagyon hosszú karakterlánc
és most lássuk, ha összeomlását okozhatja ezt a dolgot.
Figyeljük meg kihagytam terek és Új vonalak pontosvessző
és az összes funky karakter.
Belép.
És most a hálózat csak, hogy lassú.
Tartottam lenyomva a Command-V túl hosszú, világos.
Basszus!
A parancs nem található.
>> OKÉ.
Nos, a lényeg az, Ennek ellenére a következő.
Tehát mi történik valójában ezzel a nyilatkozattal
char csillagos puffer on line 16?
Szóval mit kapok ha kijelentem, egy mutatót?
Minden kapok egy négy bájtos érték úgynevezett puffer, de mi van benne belőle
abban a pillanatban?
Ez csak néhány szemetet értéket.
Mert minden alkalommal, amikor, hogy egy változót C, ez csak néhány szemetet értéket,
és még csak most kezdünk megbotlani ez a valóság.
Most, amikor elmondom scanf, menj erre a címre
és tedd, amit a felhasználó által.
Ha a felhasználó által helló világban, nos, hová tegyem meg?
Puffer egy szemetet értéket.
>> Szóval ez olyan, mint egy nyíl ami mutatva ki tudja, hol.
Talán ez mutatva Itt az emlékezetemben.
És így amikor a felhasználó típus hello world,
A program megpróbálja tenni a karakterlánc hello world backslash 0
abban a darab memória.
De nagy valószínűséggel, de Nyilvánvalóan nem 100% -os valószínűséggel
A számítógép fog majd lezuhan A programot, mert ez nem
emlék számára lehetővé kell tenni, hogy megérintse.
Tehát röviden, ez a program hibás Pontosan ez az oka.
Én alapvetően nem mit csinál?
Milyen lépéseket kell kihagytam, mint kihagytuk a Muci első példája?
Igen?
>> Közönség: Memóriakiosztási?
>> DAVID MALAN: Memóriakiosztási.
Én valójában nem kiosztott minden memória, hogy a húr.
Így tudjuk javítani ezt a pár módon.
Az egyik, tudjuk, hogy ez egyszerű és valóban, most már
elkezdenek látni összemosódásának A sorok között, amit
Egy tömb, amit egy string, amit egy char csillag, mit egy sor karakter
van.
Itt egy másik példa bevonásával húrok és értesítés
amit tettem on-line 16, ahelyett, hogy
hogy az átmeneti lesz egy char csillag, a mutató egy darab memória,
Megyek nagyon proaktívan ad magamnak egy puffer 16 karakter,
és valóban, ha ismeri a kifejezést pufferelés,
Valószínűleg a világ a videók, ha egy videó pufferelés, puffer,
bomlástermékeket.
Nos, mi a kapcsolat itt?
Nos, Inside YouTube és belsejét videó lejátszók
általában egy tömb ami nagyobb, mint 16.
Lehet, hogy egy sor mérete egy megabájtos, talán 10 megabájt,
és ebbe a tömb nem a böngésző letölt egy csomó bájt,
egy csomó megabájt videó, és a videó lejátszó,
YouTube vagy akárki, kezdődik olvasás a byte-tömb,
és minden alkalommal, amikor megjelenik a szó pufferelés, puffer,
ez azt jelenti, a játékosnak ütött a vége, hogy a tömb.
A hálózat olyan lassú, hogy ez nem történt újratöltötte a tömb több bájt
és így kiestél bitek megjelenítéséhez a felhasználónak.
>> Tehát puffer egy találó kifejezés itt, hogy ez csak egy tömb, egy darab memóriát.
És ez javítani fogja mert kiderül,
hogy tudod kezelni tömbök, mintha ezek címek, jóllehet puffer
csak egy szimbólum, ez egy karakterek sorozata, buffer,
ez hasznos a számomra, a programozó, akkor át a nevét körül
mintha ez a mutató, mintha
volt a címe egy darab A memória 16 karakter.
Szóval ez azt mondani, tudom át A scanf pontosan ez a szó
és így most, ha én ezt a programot, hogy scanf 2, pont perjel scanf 2,
és írja be a hello world, Adja meg, hogy time--
>> Hmm, mi történt?
Karakterlánc kérjük.
Mit csináltam rosszul?
Hello world, puffer.
Helló Világ.
Ah, tudom, mit csinál.
OKÉ.
Szóval ez olvasás fel amíg az első helyet.
Úgyhogy csalnak egy pillanatra, és azt mondják, én csak azt akartam, hogy írja valami
Nagyon hosszú, mint ez egy hosszú mondat ez egy, kettő, három, négy, öt,
hat, hét, nyolc, kilenc, 10, 11, 12, 13, 14, 15, 16.
OKÉ.
Ez valóban egy hosszú mondat.
Szóval ez a mondat hosszabb 16 karakter
és így amikor elütöttem Enter, mi fog történni?
Nos, ebben az esetben a történet, én kijelentette, puffer
hogy ténylegesen a tömb 16 karakter kész.
Tehát egy, két, három, négy, öt, hat, hét, nyolc, kilenc, 10, 11, 12, 13, 14,
15, 16.
Tehát 16 karakter, és most, amikor én olvasott valami ilyesmi ez egy hosszú
mondatban, hogy mi fog történni a hogy fogok olvasni, ez egy hosszú
S-E-N-t-e-N-C-E, mondat.
>> Tehát ez szándékosan egy rossz dolog, hogy én
íráshoz túl határait én tömb,
határain túl én puffer.
Nem tudtam, hogy szerencsés és a program folyamatosan a futás és nem érdekel,
de általában elmondható, hogy ez valóban összeomlik a programom,
és ez a hiba az én kódolta a pillanatban lépek
határain túl Az, hogy a tömb, mert én
Nem tudom, ha ez szükségszerűen fog zuhanni
vagy ha én csak megyek, hogy szerencsés.
Szóval ez azért problémás, mert a ebben az esetben, úgy tűnik, hogy a munka
és nézzük kísérteni a sorsot itt, annak ellenére, Az IDE tűnik elviselni egy kicsit
of--
>> Ott vagyunk.
Végre.
Tehát én vagyok az egyetlen, amelyik képes látni.
Szóval most volt egy nagyon szórakoztató gépelés ki egy nagyon hosszú tényleges kifejezésre
hogy minden bizonnyal meghaladta 16 byte, mert
gépelt ebben az őrült hosszú többsoros kifejezést, majd észre, hogy mi történt.
A program megpróbálta azt kinyomtatni majd kapott egy szegmentációs hiba
és szegmentációs hiba az, amikor ilyesmi történik
és az operációs rendszer azt mondja Nem, nem érintheti meg, hogy az emlékezet.
Mi fog ölni A program összesen.
>> Szóval ez úgy tűnik problémásnak.
Már javult a program, amelynek értelmében legalább van némi memóriát,
de ez úgy tűnik, hogy esetükben A funkció getString hogy kapok
húrjait véges hosszúságú 16.
Tehát ha azt szeretnénk, hogy támogassák tovább mondatokat, mint 16 karakter,
mit csinálsz?
Nos, akkor növelheti a mérete puffer 32
vagy azt, hogy úgy tűnik, olyan rövid.
Miért nem csak, hogy ez 1000, de álljon vissza.
Mi a válasz ösztönösen a Csak elkerülve ezzel a problémával azáltal, hogy
én puffer nagyobb, mint 1000 karakter?
A végrehajtási getString így.
Mi a jó vagy rossz itt?
Igen?
Közönség: Ha kötődnek egy csomó A tér és nem használja,
akkor nem adják ki ismételten, hogy a tér.
DAVID MALAN: Abszolút.
Ez pazarló, mivel ha nem valóban szükség van 900 e bájt
és mégis kérsz 1000 Összesen egyébként,
te csak fogyaszt több memóriát a felhasználó számítógépén, mint meg kell,
és miután az összes, néhány akkor már találkozott
az életben, hogy ha éppen futó rengeteg program
és ők eszik fel sok memória, ez valóban befolyásolja a teljesítményt
és a felhasználói élményt a számítógépen.
Szóval ez a fajta lusta megoldás, az biztos, és fordítva,
ez nem csak pazarló, mi a probléma továbbra is, még akkor is, ha tehetem puffer
1000?
Igen?
>> Közönség: A karakterlánc hossza 1001.
DAVID MALAN: Pontosan.
Ha a string hossza 1001, Ön pontosan ugyanazt a hibát,
és érvem, én Csak akkor teszi 2000-
de nem tudom, előre, hogy mekkora legyen,
és mégis, én le kell fordítanod a programot előtt hagyta ember használja, és töltse le
azt.
Szóval ez pontosan az a fajta dolog, hogy a CS50 könyvtár próbálkozás
hogy segítsen bennünket, és mi csak pillantásra néhány, a mögöttes végrehajtása
itt, de ez CS50 dot C. Ez a az a fájl, ami már a CS50 IDE
Mindezen hetekben, hogy van már használja.
Ez előre összeállított és akkor már használ ez automatikusan
természeténél rendelkező dash L CS50 zászló csengés,
de ha nézd végig az összes ezeket a funkciókat, itt getString,
és csak, hogy ha egy íze, mi folyik itt,
vessünk egy gyors pillantást a viszonylagos összetettségét.
Ez nem egy nagyon hosszú funkciót, de nem tettük
meg kell gondolni minden nehéz erről hogyan megy a szerzés szálakat.
>> Tehát itt az én puffer és én látszólag inicializálás null.
Ez, természetesen, a ugyanaz, mint a char csillag,
de én úgy határozott, végrehajtása CS50 könyvtár
hogy ha megyünk teljesen dinamikus,
Nem tudom előre, hogy mekkora egy húr a felhasználók fognak akarnak.
Így fogok kezdeni csak egy üres stringet
és fogok felépíteni annyi memória, ahogy kell, hogy illeszkedjen a felhasználó húr
és ha nincs elég, én fogom kérni
Az operációs rendszer több memóriát.
Megyek mozgatni a húr egy nagyobb darab memória
és megyek, hogy kiadja, vagy szabad a kellően nagy darab memória
és mi csak megy Ehhez iteratív.
>> Tehát egy gyors pillantást, Itt csak egy változó
amellyel fogom nyomon követni A kapacitása én puffer.
Hány byte tudok illik?
Itt egy változó n és amely fogom tartani
követni, hogy hány bájt ténylegesen a puffer vagy a felhasználó által beírt.
Ha nem láttam ilyet, akkor meghatározhatja, hogy egy változó, mint egy int
aláíratlan, amely mint a neve is sugallja, azt jelenti, hogy nem negatív, és miért lenne
Én soha akarom zavarni, meghatározva hogy egy int nem csak egy int,
de ez egy unsigned int?
Ez egy nem-negatív int.
Mit jelent az [hallhatatlan] jelent?
>> Közönség: Ez leírja mennyiségben memóriával rendelkezik, amely lehet [hallhatatlan].
>> DAVID MALAN: Igen.
Tehát, ha azt mondom, előjel nélküli, ez valójában így egy kis extra memória
és úgy tűnik, egyfajta buta, de ha Van egy kis plusz memóriát, hogy
azt jelenti, hogy kétszer annyi értékeket is képviseli,
mert ez lehet egy 0 vagy egy 1.
Emiatt alapértelmezés szerint int nagyjából negatív 2 milliárd egészen
akár pozitív 2 milliárd.
Ezek nagy tartományok, de ez még mindig egyfajta pazarló
ha csak érdekel méretű, ami csak ösztönösen
kell lennie, nem-negatív, vagy pozitív vagy 0, illetve akkor,
miért pazarolja 2 milliárd lehetséges értékei negatív számok
ha te soha nem fog használni őket?
Tehát azzal, aláíratlan, most én is int között 0 és mintegy 4 milliárd.
>> Tehát itt csak egy int C okokból nem fogunk bejutni csak most
hogy miért ez egy int helyett Egy karakteres, de itt van
a lényeg, hogy mi folyik itt tovább, és néhányan közületek
Lehet, hogy használ, például a fgetc funkció még PSET négy
vagy azt követően, majd meglátjuk, hogy ismét problémát meg öt,
fgetc szép, mert ahogy a neve fajta, fajta arcanely sugallja,
ez egy függvényt, amely kap egy karaktert, és így,
mi alapvetően eltérő arról, hogy mit csinálunk a getString
a mi nem használjuk scanf ugyanúgy.
Mi csak kúszik végig lépésről-lépésre mint amit a felhasználó beírt,
mert mi mindig hozzá egy char, és így mindig biztonságosan
nézd meg egy karaktert egy időben, és A mágikus kezd itt történni.
Megyek lépjünk le a a közepén ez a funkció
csak azért, hogy röviden bemutassuk ezt a funkciót.
Hasonlóan van egy malloc függvény, van
A realloc függvény, ahol realloc Lehetővé teszi átcsoportosítása egy darab memória
és hogy ez nagyobb, vagy kisebb.
Tehát hosszú történet rövid és hullám kezem a mai,
tudom, hogy mit getString csinál, az ez a fajta
A varázslatosan növekvő vagy csökken a puffer, mint a felhasználói
típus ő karakterlánc.
>> Tehát, ha a felhasználó beír egy rövid karakterlánc, ezt a kódot
egyszerre csak annyi memória, hogy illeszkedjen a húr.
Ha a felhasználó tartja gépelési mint én újra és újra
és újra, nos, ha a puffer kezdetben ez a nagy
és a program felismeri, hogy várj egy percet, én vagyok a hely,
ez lesz a kettős a méret a puffer
majd kétszer a puffer mérete és a kód, hogy nem a duplázás,
Ha megnézzük, hogy itt, ez Csak az okos egysoros.
Lehet, hogy nem látta ezt a szintaxist előtt, de ha azt mondod csillagos egyenlő,
ez ugyanaz, mint a mondván kapacitás alkalommal 2.
Tehát így csak megduplázva a kapacitás a puffer
majd elmondja realloc adni arról, hogy sokkal több memóriát.
>> Most, mint egy félre, ott más funkciók itt
hogy nem fogunk nézni bele a részletekbe Más, mint megmutatni a GetInt,
használjuk getString a GetInt.
Megnézzük, hogy ez nem null, amely visszahívás,
a különös érték azt jelenti, valami elromlott.
Elfogyott a memória.
Jobb ellenőrizze, hogy.
És térjünk vissza egy őrszem értéket.
De majd elhalasztja a megjegyzéseket, hogy Ezért aztán használja ezt unokatestvére scanf
nevű sscanf és kiderül, hogy sscanf, vagy string scanf,
Lehetővé teszi, hogy egy pillantást a sor, hogy A felhasználó begépelte, és segítségével
elemezni lényegében és mire vagyok keresnek itt van Én mondom sscanf,
elemzik, amit a felhasználó beírt és győződjön meg róla% i,
van egy egész szám, és nem fogunk bejutni ma pontosan, hogy miért van még
egy% c ide, de ez dióhéjban lehetővé számunkra, hogy érzékeli, ha a felhasználó begépelt
valami hamis szám után.
Tehát az oka, hogy GetInt és getString megmondja, hogy újra, újra, újra
azért van, mert az összes hogy a kód is írtam,
ez a fajta nézi a felhasználó által megadott ügyelve arra, hogy teljesen numerikus
vagy ez egy tényleges úszó pont értéke vagy hasonló,
attól függően, hogy milyen értéket működik, amit használ.
>> Hűha.
OKÉ.
Hogy volt egy falatot de a lényeg itt
hogy az ok volt azok Segédkerekekkel
azért van, mert a legalacsonyabb szinten, ott is csak annyi dolog, hogy
elromolhat, hogy szerettünk volna a megelőző jellegű kezelni
ezek a dolgok minden bizonnyal a legkorábbi héttel az osztály,
de most PSET négy és öt PSET és túl fogja látni, hogy ez inkább hozzátok
te, hanem te sokkal alkalmasabb megoldásának ilyen jellegű problémák
magad.
Bármilyen kérdésre getString vagy GetInt?
Igen?
>> Közönség: Miért megduplázódik a kapacitás a puffer
ahelyett, hogy csak növekvő ez a pontos összeget?
>> DAVID MALAN: Jó kérdés.
Miért lenne dupla kapacitás a puffer szemben
hogy csak növeli, hogy néhány állandó érték?
Ez egy tervezési döntés volt.
Mi csak úgy döntött, hogy mert hajlamos egy kicsit drága időt bölcs kérni
az operációs rendszer a memória, mi nem
akarnak a végén kapok a helyzet a nagy húrok
hogy mi volt kérve Az OS újra és újra
és újra és újra gyors egymásutánban a memória.
Szóval csak úgy döntött, valamivel önkényesen de reméljük ésszerűen,
hogy, tudod mit, hadd próbálja túltenni magunkat
és csak tartani duplájára úgy, hogy minimalizáljuk a mennyiségű alkalommal
meg kell hívni malloc vagy realloc, de összesen ítélet
hívja hiányában tudva a felhasználók mit érdemes írja be.
Mindkét módon lehetne vitatható.
Vitathatatlanul jó.
>> Szóval vessünk egy pillantást egy pár Más mellékhatások memória,
dolgok rosszra és eszközök, amelyek segítségével
Használja elkapni az ilyen jellegű hibákat.
Kiderült, mindannyian, noha check50 nem mondta meg annyira,
Készítettem hibás kód, mivel a héten az egyik,
még ha minden check50 tesztek telt el, és akkor is, ha te és a TF
szuper benne, hogy A kód működik rendeltetésszerűen.
A kód már hibás, vagy hibás, hogy mindannyian,
használják a CS50 könyvtár, már szivárog a memória.
Már azt kérdezi az operációs rendszer a memória a legtöbb programok
írtál, de akkor már sosem adta vissza.
Már úgynevezett getString és GetInt és GetFloat,
de getString, akkor már Soha nem nevezett unGetString vagy adjon
Húrt vagy hasonló, de láttunk hogy getString nem foglalható memória
útján malloc vagy ennek funkciót realloc, ami csak
nagyon hasonló szellemben, és mégis, mi már
kérve az operációs rendszer memória és a memória, újra és újra
de soha nem adja vissza.
>> Most, mint egy félre, kiderül, hogy amikor egy program leáll, mind a memória
automatikusan felszabadul.
Szóval ez nem volt egy hatalmas üzlet.
Ez nem fog megtörni a IDE vagy lelassítani a dolgokat,
de amikor programokat csinálni Általában szivárog a memória
és ők fut sokáig.
Ha valaha is láttam a kis hülye strandlabda Mac OS vagy a homokóra
Windows ahol ez a fajta lassítása vagy a gondolkodás vagy a gondolkodás
vagy csak tényleg elindul hogy lassú a csúszás,
ez nagy valószínűséggel lehet Az eredmény egy memóriavesztés.
A programozó, aki írta A szoftver, amit használ
kérje az operációs rendszer memória néhány percenként, óránként.
De ha fut a szoftver, akkor is, ha ez
minimalizálni a számítógép órákig vagy napokig,
lehet, hogy kérdezed egyre több memória és soha nem használja
és így a kód lehet, vagy programok lehet, hogy szivárog a memória,
és ha szivárogni kezd a memória, ott kevesebb memória más programok,
és a hatás az, hogy lassú mindent le.
>> Nos, ez messze az egyik A legkegyetlenebb programok
akkor lehetőség futtatni CS50 amennyiben
mivel a kimenete még ezoterikus, mint csengés vagy a tenni vagy bármely parancs
vonal programok általunk futtatott előtt, de Szerencsére ágyazott kimenete
van néhány szuper hasznos tanács, amely hasznos lesz akár PSET négy
vagy biztosan PSET öt.
Tehát valgrind egy olyan eszköz, hogy lehet használni, hogy nézd
A memóriavesztés a programban.
Ez viszonylag egyszerű futni.
Futtatja valgrind majd, sőt bár ez egy kicsit bőbeszédű,
dash dash szivárgás ellenőrzés megegyezik a teljes, majd pont
perjel és a program nevét.
Tehát valgrind majd futtatni a programot és a legvégén a program
futás előtt kilép és ad egy másik gyors,
ez lesz elemezni a programot, miközben ez már fut
és megmondja, ugye szivárog memóriát és ami még jobb,
Megérintette memória nem a tiéd?
Ez nem lehet elkapni mindent, de ez Elég jó fogása a legtöbb dolog.
>> Tehát itt egy példa az én üzemelés ez a program, amelynek távon valgrind,
A program neve memória, és megyek
hogy kiemelje a vonalak, amelyek végül érdekes számunkra.
Szóval van még zavaró hogy már törölték a diát.
De nézzük meg, mi ez a program képes megmondani nekünk.
Ez képes mondja a dolgokat mint érvénytelen írása 4-es méretű.
Más szóval, ha megérinti a memória, konkrétan 4 byte memóriát
hogy nem kellett volna, valgrind lehet mondani, hogy.
Érvénytelen írása 4-es méretű.
Ön megérintette négy bájt hogy nem kellett volna.
Hol csináltad ezt?
Ez a szépség.
Memória pont c 21-es vonal az, ahol elrontottam, és ez az, amiért ez hasznos.
Hasonlóan GDB, ez segíthet pont akkor a tényleges hiba.
>> Nos, ez az ember egy kicsit többet bőbeszédű, ha nem zavaró.
40 bájt 1 háztömbnyire határozottan elveszett veszteség rekord 1 1.
Az mit jelent?
Nos, ez csak azt jelenti, amit kértél 40 bájt és soha nem adta vissza.
Hívtál malloc vagy hívott GetString és az operációs rendszer
kaptál 40 bájt, de soha nem felszabadult, vagy megjelent, hogy az emlékezet,
és az igazat megvallva, még sosem mutatják Ön hogyan adja vissza a memória.
Kiderült, hogy van egy szuper egyszerű függvény úgynevezett szabad.
Egy paramétert, a dolog akarsz felszabadítani, vagy adja vissza,
de 40 bájt, úgy tűnik, ebben a programban
szűnt meg sorban 20 memória pont c.
>> Nézzük ezt a programot.
Ez szuper haszontalan.
Ez csak azt mutatja az adott hiba.
Szóval vessünk egy pillantást.
Itt a fő és legfontosabb, értesítés, hívások függvényét f, majd visszatér.
Szóval nem olyan érdekes.
Mit f csinálni?
Figyeljük meg én nem zavarta a prototípus.
Azt akartam, hogy a kódot a lehető legkisebb legyen.
Így tettem f feletti fő- és ez rendben van, természetesen,
A rövid programok, mint ez.
Tehát f nem tér vissza semmit, és nem nem vesz semmit, de ez nem erre a célra.
Kijelenti, ugyanúgy, mint A Muci például
egy mutatót nevű x, hogy folyik tárolni a címét egy int.
Szóval ez a bal oldali.
Angol, mi a jobb oldalon csinál?
Bárki?
Mit csinál ez nekünk?
Igen?
>> Közönség: [hallható] szor akkora, mint egy int
ami 10-szer, hogy a [nem hallható]
DAVID MALAN: Jó és hadd foglaljam össze.
Tehát kiosztani elég hely a 10 egészek vagy 10, mi a mérete egy int,
ez négy bájt, ezért 10-szer 4 40, így a jobb oldalon, hogy én már
kiemelendő, hogy nekem 40 bájt és tárolja a címe az első bájt
be x.
És most végül, és itt, ahol ez a program hibás, mi
baj vonalon 21 alapján, hogy a logika?
Mi a baj a 21-es vonal?
Igen?
Közönség: Nem lehet indexként x [hallhatatlan].
DAVID MALAN: Igen.
Nem kellene indexként x ilyesmi.
Szóval nyelvtanilag, az rendben van.
Mi a szép az, mint ahogy lehet kezelni a tömb neve
mintha ez egy mutatót, hasonlóan tud kezelni egy mutatót, mintha ez
tömb, és így tudok szintaktikailag mondjuk x konzol valamit, x konzol i,
de a 10 problematikus.
Miért?
>> Közönség: Mert ez nem befelé.
>> DAVID MALAN: Nem belül, hogy a darab a memóriát.
Mi a legnagyobb értéket kellene szándékozik azokban szögletes zárójelben?
9, 0-tól 9.
Mivel a nulla indexelés.
Tehát 0-tól 9 jó lenne.
Konzol 10 nem jó, és de idézni azonban, minden alkalommal
Úgy tűnik, hogy megpróbálja CS50 IDE baleset beírja a hamis értékek,
ez nem mindig együtt, sőt, gyakran
szerencséd lesz, csak azért, mert a operációs rendszer nem
észre, hogy alig észrevehetően át néhány darab memória,
mert tartózkodott belül technikailag a szegmensben, de erről bővebben
egy operációs rendszerek osztály, és így valami ilyesmi
nagyon könnyen lehet nem derül fény.
Készítsünk programot, sosem fog zuhanni következetesen de talán egyszer egy kicsit.
>> És így próbáljuk valgrind Erre, és itt
ahol mi kap elárasztják által a kimeneti pillanatra.
Tehát, hogy a memória valgrind szivárgás ellenőrzés egyenlő full dot perjel memória.
És itt miért Ígérem ez elborít.
Itt van, amit valgrind, itt van, amit egy programozó, néhány évvel ago-
döntöttem, hogy lenne egy jó ötlet A kimeneti kinézni.
Szóval van értelme ennek.
Tehát egészen a bal oldali oldalán ok nélkül
folyamat azonosítója a program mi csak futni, az egyedi azonosítót
A program már csak futott.
Mi hagyni, hogy honnan A dia, de
van néhány hasznos információt itt.
>> Nézzük felfelé a csúcsra.
Itt, ahol elkezdtük.
Tehát ez nem olyan sok kimenet.
Itt van, hogy az érvénytelen írási A 4-es méretű on-line 21.
Nos, mi volt 21-es vonal?
21. sor pontosan ezt, és van értelme
hogy én vagyok az érvényesen írásban 4 byte, mert én vagyok
próbál tenni ezt az egész, ami lehet bármi,
ez most történik, hogy nulla, de próbálom
tedd olyan helyre hogy nem tartozik rám.
Sőt, itt lent, 40 bájt egy blokkok biztosan elveszett a rekord 1.
Ennek oka, hogy amikor hívom malloc Itt igazából nem szabad a memóriát.
>> Szóval hogyan lehet ezen javítani?
Hadd menjen előre, és egy kicsit biztonságosabb és nem 9, és hagyod, ide szabadon x.
Ez az új funkció a mai.
Ha most ismételni, hogy a memória dot perjel, Fussunk valgrind rá újra,
maximalizálására ablakban, és nyomja meg az Entert.
Most, hogy ez jó.
Temetik el a jó hírt minden ennek az értéknek.
Minden halom blokkok szabadok voltak.
Majd gyere vissza, amit a kupac van, de nincs szivárgás lehetséges.
Szóval ez is csak egy eszköze a szerszámkészlet
amellyel elkezdhetjük keresd a hibákat, mint ezt.
>> De lássuk, mi Több lehet baj itt.
Nézzük átmenet most valóban egy probléma megoldására.
Mint félre, ha ez enyhíti a kicsit zavart, vagy feszültség,
ez most vicces.
Igen.
Ez elég jó.
Mivel pointerek címek és
általában a konvenció írt hexadecimális.
Ha, ha, ez vicces most.
Akárhogy is, úgyhogy most ténylegesen megoldani a problémát.
Ez már szuper, szuper alacsony szintű eddig,
és mi valójában nem hasznos dolgokat ezekkel az alacsony szintű részleteket.
>> Szóval mi vezetett néhány hét ezelőtt fogalma egy tömbben.
Egy sor szép volt, mert nehéz, hogy tisztítsák meg a kódot
mert ha azt akartuk, hogy levelet Program több diák
vagy több név és házak alvás és főiskolák és minden adott,
tudnánk tárolni mindent többet tisztán belső tömb.
De javaslom, egyetlen hátránya Egy tömb eddig.
Akkor is, ha nem ért magad a programban, csak ösztönösen,
mi az a rossz dolog Körülbelül egy tömböt, talán?
Hallom, néhány zúg.
Közönség: Nehéz A méret megváltoztatásához.
DAVID MALAN: Nehéz A méret megváltoztatásához.
Nem tudod megváltoztatni a méretét egy tömb, sőt, önmagában
C. Társíthatja másik tömb, mozgatni mindent a régit
az új, és most van egy kis szabad hely,
de ez nem olyan, mint egy nyelv, mint a Java vagy Python
vagy tetszőleges számú egyéb nyelv, amellyel néhányan
ismerős lehet, ahol csak tartani hozzá dolgokat
orrvérzésig, hogy a végén egy tömb.
Ha van egy sor méret 6, azaz a mérete,
és annyira tetszik az ötlet korábban amelynek puffer egy bizonyos méretet,
meg kell kitalálni ki a kapun milyen méretű akarsz, hogy legyen?
Ha hiszem, túl nagy, te kiesik hely.
Ha hiszem, túl kicsi, akkor nem tudja tárolni az adatokat, legalább
nélkül, sokkal több munkát.
>> Így ma, hála a mutatók, tudjuk kezdeni összefűzni a saját egyéni
adatszerkezetek, és Sőt, itt van valami,
hogy néz ki egy kicsit rejtélyes első pillantásra,
de ez mit fogunk hívni kapcsolódik listát, és a neve egyfajta összefoglalót
azt.
Ez egy listát a számok, vagy Ebben az esetben, egy listát a számok,
de lehet, hogy egy listát a semmit, de ez kapcsolódik egymáshoz útján nyilak,
és csak akkor gondolom milyen technikával
fogunk tudni hogy az összefűzés,
Valahogy úgy, mint a pattogatott kukorica egy szál, Egy láncolt listák téglalapok itt?
A számok?
Mi a mögöttes nyelvi elemmel?
>> Közönség: Egy mutató.
>> DAVID MALAN: Egy mutató.
Tehát minden ilyen nyilak itt jelent egy mutató, vagy csak egy címet.
Más szóval, ha azt akarom, tárolni egy listát a számok,
Nem tudom csak tárolni, ha akarom a képesség, hogy növekszik és összezsugorodik
én adatstruktúra egy tömbben.
Szóval kell egy kis több finomsággal,
de észrevettem, hogy ez a Képet fajta sugallja
hogy ha épp most van kis téma összekötő mindent együtt,
Valószínűleg nem is olyan nehéz, hogy legyen hely A két ilyen téglalap
vagy két ilyen csomópontok, kezdjük nevezve őket, tedd egy új csomópontot,
majd néhány új téma, csak árok a három csomópont össze,
az első, az utolsó, és az egyik, hogy az imént beillesztett középre.
>> És valóban láncolt lista, eltérően egy tömb, dinamikus.
Fejlődik, és tőle telhetőt zsugorodik, te pedig nem
Tudnunk kell, vagy érdekel, előre, hogy mennyi adatot leszel tárolására,
de kiderült, hogy van, hogy egy kicsit óvatos, hogyan valósítható ez.
Tehát először nézzük meg, hogyan kívánjuk megvalósítani Egy ilyen kis téglalap.
Ez könnyen megvalósítható egy int.
Csak azt mondom int n, majd az kapsz 4 bájt int,
de hogyan jutok int, nevezzük n, majd egy mutatót, nevezzük következő.
Nevezhetnénk ezeket a dolgokat, amit csak akarunk
de szükségem van egy egyéni adatok szerkezetét.
Igen?
>> Közönség: Ampersand [hallható].
>> DAVID MALAN: Szóval jelet fogjuk használni, hogy kap a címét egy csomópont potenciálisan.
De szükségünk van egy másik jellemzője C érdekében
hogy nekem a képesség, hogy Az egyéni téglalap, ezt a szokást
változó, ha úgy tetszik, a memóriában.
Közönség: A struktúra.
DAVID MALAN: A struktúra.
Emlékezzünk a múlt héten, mi vezetett struct, ez a viszonylag egyszerű kulcsszó
amely lehetővé teszi számunkra, hogy a dolgok, mint ez.
C nem jött adat szerkezet az úgynevezett hallgatói.
Jön az int és float és char és Ilyen, de ez nem jön hallgató,
de mi is létrehozhatunk egy diák adatok típusát, egy diák struktúrát, ezzel a szintaxis
itt.
És látni fogod ezt újra és újra.
Szóval ne aggódj megjegyzi a kulcsszavakat,
de a kulcsszót, amely fontos csak az a tény, hogy azt mondtuk struct
és akkor mi nevezte hallgatói és belső A tanuló egy név és egy házat
vagy egy kollégiumi vagy hasonlók.
>> És így most ma, hadd javasolni ezt.
Adtam egy pár szót, de ha azt akarom, végrehajtani ezt a téglalapot, ami
Van is egy int és pointer, tudod mit, én vagyok
lesz arra, hogy egy struct nevű csomópontot.
Én is, belül is, azt fogja mondani hogy egy csomópont, a téglalap, van egy int
és mi fogjuk hívni n és van egy következő mutatót.
És ez egy kicsit bőbeszédű, de ha belegondolunk,
A nyilak, amelyek a képen Egy perce van, hogy milyen adatokat típus?
Amennyiben minden egyes ilyen nyilak mutat hogy milyen típusú adatot szerkezete?
Ez nem mutat, csak egy int önmagában.
Ez rámutatva, hogy a egész téglalap alakú dolog
és hogy téglalap alakú dolog, azt mondta, az úgynevezett csomópontot.
És így ilyen van, hogy rekurzív határozza meg ezt, mint
hogy egy csomópont, azt mondjuk, tartalmazni fog egy int hívott n
és egy mutató az úgynevezett jövő és a típusú adatstruktúra, amelyre
hogy mutató láthatóan lesz struct csomópont.
>> Tehát ez idegesítően bőbeszédű és igaz, hogy pedáns,
Az ok, hogy miért nem Csak mondom ezt, ami őszintén szólva
úgy néz ki, sokkal olvashatóbb, azért van, mert emlékeztetnek arra, hogy C Read
dolgok fentről lefelé, balról jobbra.
Ez nem csak megkapjuk a pontosvessző hogy a kulcsszó csomópont valóban létezik.
Tehát, ha azt akarjuk, hogy ez a fajta ciklikus hivatkozási belsejében az adatok
szerkezete, meg kell tennünk ezt, ahol mondjuk struct csomópont tetején, amely
ad nekünk egy hosszabb módon írja le ezt a dolog, akkor belülről azt mondjuk struct csomópont,
majd a legutolsó sort azt mondjuk, rendben, C, mellesleg,
csak hívja ezt az egész átkozott dolog, amit egy csomópont, és megáll
a kulcsszó struct összesen.
Szóval ez csak egyfajta szintaktikai trükk, hogy végső soron lehetővé teszi számunkra, hozzon létre
valamit, ami úgy néz ki, mint ez.
>> Tehát, ha azt feltételezzük, most már tudjuk végrehajtja ezt a dolgot C,
hogyan is ténylegesen kezdeni áthaladó ez?
Nos, sőt, minden, amit meg kell tennie, hogy ismételget balról jobbra, és csak
fajta helyezze csomópontok vagy törölni csomópontokat vagy keressen a dolgokat, ahol azt akarjuk,
de ehhez, menjünk előre, és a a dolgok egy kicsit valóságosabb, mert ez
már szuper alacsony szintű eddig.
Bárki szó szeretnék lenni az első?
OKÉ.
Gyere fel.
Mi a neved?
>> David: David.
DAVID MALAN: David.
Örvendek.
Nekem is.
Minden rendben.
És szükségünk van egy 9-es szám.
Nem olyan jó, mint az első, talán.
OK, 9-es szám.
A 17-es szám, kérem.
Térjünk vissza egy kicsit távolabb.
22-es számú, kérjük, és Mit szólnál hátrébb
ha látom semmilyen kezek az összes fény, vagy nincs.
Valaki éppen önként ott.
Szeretné, hogy jöjjön fel?
Az alkar erőszakkal megy fel.
OK, 17.
22.
26 jön le.
Bárki mást szeretne forcefully-- Gyere fel.
Tényleges önkéntes.
>> Szóval nagyon gyorsan, ha ti is rendezni
magatokat akárcsak a csomópontok a képernyőn.
Köszönöm.
És akkor lesz 26.
Rendben, gyors bemutatkozás.
Szóval én Dávid és te is?
David: David.
DAVID MALAN: És te?
Jake: Jake.
Sue: Sue.
ALEX: Alex.
Raphael: Raphael.
Taylor: Taylor.
DAVID MALAN: Taylor.
Kitűnő.
Tehát ezek a mi önkéntesek ma és megy előre
és shift egy kicsit, hogy így, és csak megy előre, és tartsa
tartja a számokat, mint te vagy a első jele, és bal kézzel,
megy előre, és csak végrehajtja Ezek a nyilak, csak
úgy, hogy a bal kéz szó mutatva, amit meg kell mutatni
a, és adj magadnak egy kis szobába úgy, hogy akkor vizuálisan látni a karod ténylegesen
mutatva, és akkor csak pont fajta a földre rendben van.
>> Tehát itt van egy csatolt lista egy, két, három, négy, öt csomópontok kezdetben,
és vegyük észre itt van ez a különleges mutatót az elején, aki
kulcsot, mert van, hogy nyomon követhesse A teljes hosszúságú lista valahogy.
Ezek a srácok, bár ők maradt jobbra, háttal a memóriában,
ezek valójában bárhol lehet a számítógép memóriájában.
Szóval ezek a srácok lehet állva bárhol a színpadon
és ez jó, amíg ők valóban mutatott egy másik,
de a dolgokat tiszta és egyszerű, akkor
Csak felhívni őket balról jobbra, mint ez, de ott lehet masszív rések
között azokat a csomópontokat.
>> Most, ha azt akarom, hogy valóban szúrhatunk új érték, menjünk előre, és erre.
Van egy lehetőség most hogy válasszon egy másik csomópont.
Mondja el, kezdjük el a mallocing 55.
Vajon valaki bánja, hogy malloc?
OK, gyere fel.
Mi a neved?
Szivárvány: Rainbow.
DAVID MALAN: Rainbow?
Minden rendben.
Malloc Rainbow.
Gyere fel.
Tehát most már tennünk magunknak Algoritmikusan ahol tudunk rakni 55.
Szóval mindannyian tudjuk, nyilván, ahol valószínűleg
tartozik, ha megpróbálunk tartani ezt a rendezve
és ha a srácok is eltarthat egy lépjen vissza, így nem esik le
a színpadon, az nagyszerű lenne.
Tehát tulajdonképpen, Rainbow, kezdje újra itt vagy velem,
mert mi, mint a számítógép most is csak az egyik változót egy időben.
Tehát, ha ez az első csomópont.
Figyeljük meg, ő nem egy csomópont, ő csak egy mutató,
és ezért ő húzott lenni csak akkora, mint egy mutatót, és nem
az egyik ilyen teljes téglalapok.
Mi is így fogjuk ellenőrizni az egyes iteráció 55 kevesebb, mint 9?
Nem.
55 kevesebb, mint 17?
Nem.
Kevesebb, mint 22?
Kevesebb, mint 26?
Kevesebb, mint 34?
És így most, nyilván Szivárványos tartozik a végén.
Tehát, hogy világos legyen, és milyen volt a neve, Taylor?
>> Taylor: Taylor.
DAVID MALAN: Szóval körében Taylor bal és a Rainbow keze van,
akinek a keze meg kell mutatni, hogy mi a beillesztése érdekében 55 ebbe a listán?
Mit kell tennünk?
Igen?
>> Közönség: Taylor kezét kell mutatnia balra.
>> DAVID MALAN: Pontosan.
Tehát behelyezése csomópont a végén a lista
nagyon egyszerű, mert Taylor csak meg kell mutatni, ahelyett, hogy a földre
vagy hívjuk meg null, null egyfajta hiánya
pointer vagy egy speciális nulla mutatót, te
fog mutatni a bal kezét a Rainbow majd Rainbow,
Hol kell a bal kéz talán pont?
Lefelé.
Ez nem jó, ha a kezét a rendezés rámutatva le itt, vagy valami olyan
milyen módon.
Hogy úgy kellene tekinteni egy szemetes értéke,
de ha ő mutat Néhány ismert érték, akkor
hívják nulla vagy nulla, ez rendben van mert van egy kifejezés ebben az
és tudjuk, hogy a lista most elkészült.
>> Tehát mi a másik viszonylag egyszerű eset?
Tudnánk malloc 5?
Gyere fel.
Mi a neved?
Tiffany: Tiffany.
DAVID MALAN: Sajnálom?
Tiffany: Tiffany.
DAVID MALAN: Tiffany.
Minden rendben.
Tiffany már malloced melynek értéke 5.
Gyere fel.
Ez egy viszonylag könnyű is, de nézzük műveletek sorrendjét most.
Ez elég könnyű volt Taylor a végén.
5. számú természetesen kevesebb, mint 9, és így már David, van Tiffany,
és mi volt a neve?
>> Jake: Jake.
>> DAVID MALAN: Jake.
Tiffany, Jake, és David.
Kinek a kezét frissíteni kell az első?
Mit akar itt csinálni?
Van egy pár lehetséges módon, de van még egy vagy több rossz módon.
>> Közönség: Kezdje balszélső.
>> DAVID MALAN: Kezdjük a bal szélső.
Ki a bal szélső itt akkor?
Közönség: First.
>> DAVID MALAN: OK.
Így kezdődik az első és hol frissíteni kívánt Dávid kezében lenni?
KÖZÖNSÉG felé: az 5.
DAVID MALAN: OK.
Dávid pedig pont ötkor vagy Tiffany itt, és most?
>> Közönség: Tiffany rámutat, hogy a 9?
DAVID MALAN: Tökéletes, kivéve Muci a fej csak a fajta leesett, ugye?
Mert mi a baj ez a kép szó?
Közönség: Semmi sem mutat.
DAVID MALAN: Semmi sem rámutatva, hogy Jake most.
Már szó árván 9 és 17. között, és most szó szerint
kiszivárgott mindezt memóriát, mert frissítése Dávid kezében először, hogy ez
finom, amennyiben ez helyes mutatva Tiffany most,
de ha senki nem volt előrelátás rámutatni Jake,
akkor elvesztettük a teljes egészében ezt a listát.
Úgyhogy visszavonni.
Szóval ez egy jó dolog, hogy megbotlani de nézzük most már megfelelő.
Mit tegyünk először helyette?
Igen?
>> Közönség: Tiffany kell mutatnia a 9?
DAVID MALAN: Nem tudok kap, hogy közel áll hozzád.
Ki kell emelnem a 9?
>> Közönség: Tiffany.
>> DAVID MALAN: Rendben.
Tehát Tiffany először pontot a 9.
Szóval Tiffany kell venni egy azonos értéket
David, amely úgy tűnik, redundáns egy pillanatra,
de ez rendben van, mert most, a második lépésben tudjuk frissíteni Dávid kezében
rámutatni Tiffany, majd ha mi csak egyfajta tiszta dolgokat
mintha ez a fajta tavasz-szerű, Most, hogy egy helyes szerelést.
Így kiváló.
Tehát most már majdnem ott vagyunk.
Nézzük helyezzen be egy végleges értéket, mint az érték 20.
Ha tudnánk malloc egy végső önkéntes?
Gyere fel.
Tehát ez az ember egy kicsit trükkösebb.
De tényleg, a kód vagyunk írás, bár verbálisan,
olyan, mint átélni egy rakás Az, ha olyan feltételeket teremteni, ugye?
Volt olyan állapot ellenőrizve, hogy tartozik
a végén, talán az elején.
Szükségünk van valamilyen hurok megtalálni a folt közepén.
Tehát lássuk, hogy a mi a neved?
>> ERIC: Eric.
>> DAVID MALAN: Eric?
Eric.
Örvendek.
Tehát van 20.
Kevesebb, mint öt?
Nem.
Kevesebb mint kilenc?
Nem.
Kevesebb, mint 17?
Nem.
OKÉ.
Ő ide tartozik, és a neveket ismét van?
Sue: Sue.
DAVID MALAN: Sue.
ALEX: Alex.
DAVID MALAN: Sue, Alex, és?
ERIC: Eric.
DAVID MALAN: Eric.
Kinek a kezében van szüksége, hogy folyamatosan az első?
>> Közönség: Eric.
OKÉ.
Szóval Eric kell mutatni hol?
A 22.
Jó.
És most mi következik?
Sue majd pont Eric és most, ha srácok csak
hogy néhány szoba, ami rendben van vizuálisan, most tettünk a szerelést.
Úgyhogy most egy kérdés vizsgálatára, de Köszönöm szépen, hogy önkénteseink.
Nagyon jól sikerült.
Tudod tartani azokat, ha úgy tetszik.
És van egy szép búcsú ajándék, ha azt minden tetszik, hogy a stressz labdát.
Hadd át ezt le.
Tehát mi a elvihető e?
Úgy tűnik, ez a csodálatos amennyiben mi most
bevezetett alternatívájaként tömb, ami nem annyira korlátozódik
hogy egy sor néhány fix méretű.
Ezek dinamikusan növekszik.
>> De hasonlóan láttunk hétig Korábban soha nem kap semmit ingyen,
mint biztosan van egy trade-off itt.
Tehát egy fejjel egy csatolt listán, ez a dinamika?
Ez növekedni tudjon, és őszintén szólva, tudtunk volna törlés
és mi csökkenhet, ha szükséges.
Milyen árat fizetünk?
Kétszer annyi helyet, először.
Ha megnézzük a képet, már nem vagyok tárolására listáját egészek.
Én tárolására listáját egészek plusz mutatók.
Úgyhogy megduplázva a helyet.
Most, talán ez nem is olyan egy nagy dolog 4 bájt, 8 bájt,
de minden bizonnyal hozzá fel nagy adathalmazok.
Mi egy másik hátránya?
Igen?
>> Közönség: Meg kell keresztezik őket egy-az-egyben.
DAVID MALAN: Igen.
Van bejárására őket egy-az-egyben.
Tudod mit, feladtuk a szuper kényelmes funkció a szögletes zárójel
jelölést, pontosabban néven véletlenszerű hozzáférés,
ahol tudunk csak ugrani egy egyedi elem
de most, ha még mindig volt én önkéntesek itt,
ha akartam, hogy megtalálják a száma 22, nem tudok most
ugrás konzol valami ilyesmi.
Van, hogy nézd át a listán, sok mint a mi keresés példák lineárisan,
hogy megtalálják a szám 22.
Tehát úgy tűnik, hogy nagy árat fizetett ott.
De mindazonáltal egyéb problémák megoldásához.
>> Sőt, hadd mutassam be Csak pár látvány.
Tehát, ha már le Mather étkezőjében közelmúltban,
emlékezzünk csak vissza, hogy a A felhalmozott dobozokat, mint ez,
kaptuk kölcsön ezeket re Annenberg osztály előtt.
Tehát ez a halom tálcák, bár, reprezentatív ténylegesen
A számítástechnika adatok szerkezetét.
Van egy adatstruktúra számítástechnika
néven egy köteg, amely nagyon szépen alkalmas arra, hogy pontosan ez a vizuális.
Tehát, ha minden egyes ilyen tálcák nem egy tálca de mint egy számot, és azt akartam,
tárolni számokat, azt sodorhatják egy itt,
és tudtam tenni egy másik idelent, és továbbra is egymásra számok
a tetején egy másik, és mi potenciálisan hasznos erről
az, hogy mi a következménye Ezen adatok szerkezet?
Melyik szám lehet kihúzni első legkényelmesebben?
A legutóbb az egyik fel ott.
>> Szóval ez az, amit neveznék a számítástechnika LIFO adatszerkezet.
Tart, first out.
És majd meglátjuk nemsokára miért hogy hasznosak lehetnek, de most,
csak úgy a tulajdon.
És ez elég hülyén, ha úgy gondolja, arról, hogy a ebédlőben csinálja.
Minden alkalommal, amikor tiszta tálcák és tedd a legfrissebb felülre,
akkor lehetett volna egy korábban tiszta de végül nagyon piszkos, poros
tálca legalján ha soha nem
kap az aljára, hogy verem, mert csak
folyamatosan üzembe az új és a tiszta is a tetején.
Ugyanez megtörténhet egy szupermarketben is.
Ha van egy vitrinben A tej és minden alkalommal CVS
vagy aki többet kap tejet, csak dugjon a tejek
már van hátra, és teszel az újak elöl,
fogsz néhány elég csúnya tej végén az adatstruktúra,
mert mindig alul, vagy egyenértékűen ez mindig hátul.
>> De van egy másik módja annak, hogy gondoljon sorakozó adatok és például ez.
Ha egy olyan ember, aki szereti sorakoznak kívül az Apple boltokban
ha egy új termék jön ki, akkor valószínűleg
Nem használ verem adatok szerkezete, mert
azt elidegeníteni mindenki más, aki sorakozó vásárolni néhány új játékot.
Inkább akkor valószínűleg a milyen adatstruktúra
vagy milyen rendszer a való világban?
Remélhetőleg ez egy sort, vagy több megfelelően, vagy több brit-szerű, egy sorban.
És kiderül, egy sorban is adatszerkezethez számítástechnika,
de egy sorban van egy nagyon másik tulajdonságot.
Ez nem LIFO.
Tart, first out.
Isten ments.
Ez helyett FIFO.
Először, first out.
És ez egy jó dolog A méltányosság kedvéért
természetesen, ha éppen bélés up szuper kora reggel.
Ha odaér az első, akkor akarjuk, hogy ki az első is.
>> És ezért az összes ilyen adatok struktúrák, a sorban állást és halmok
és fürtök mások, kiderül, akkor lehet gondolni ezt csak egy tömbben.
Ez egy tömb, talán fix 4-es méretű, de ez lenne
legyen kedves a jó, ha tudnánk csak gyarapodnak tálcák szinte végtelenül magas, ha
Van, hogy sok tálca vagy számokat.
Így talán akarunk készítesz egy listát itt,
de a trade-off lesz potenciálisan, hogy szükségünk van több memória,
Beletelik egy kis időt, de nem korlátozzák a magassága a verem,
hasonlóan Mather vitrinben korlátozhatja a méret a verem,
és így ezek tervezési döntések vagy rendelkezésre álló lehetőségek számunkra végül.
Tehát ezek az adatok struktúrák, kezdtük
vannak új felső korlátot potenciálisan milyen volt korábban szupergyors
és hol fogjuk hagyni off ma, és hol
akkor remélem, hogy a szerdán, akkor
elkezdi nézni egy adat struktúra, amely lehetővé teszi számunkra keresni
keresztül adatokat napló végén újra.
És láttuk, hogy emlékszem, a héten nulla és egy bináris keresés, osztás
és meghódítani.
Ez jön vissza, és még jobb, A szent grál erre szerda
az lesz, hogy dolgozzon ki a adatszerkezet fut igazán
vagy elméletileg állandó, s eközben
nem számít, hány millió vagy milliárd dolgok
van az adatstruktúra, akkor hogy minket állandóan időt, talán egy lépéssel
vagy két lépésben, vagy 10 lépésben, de állandó számokat lépések
keresgélni, hogy az adatok szerkezetét.
Hogy valóban lesz a szent grál de erről bővebben szerdán.
Viszlát akkor.
>> [Zenelejátszási]