>> [Přehrávání hudby]
>> [VIDEOPŘEHRÁVÁNÍ]
>> -Je Lže.
>> -O čem?
>> Já nevím.
>> -Tak Co víme?
>> -To V ​​9:15, Ray Santoya byl u bankomatu.
-To jo.
Takže otázka je, co dělal v 9:16?
>> -Shooting Č.9 milimetr na něco.
Možná viděl odstřelovače.
>> -Nebo Pracoval s ním.
>> Počkat.
Zpátky o jednu.
>> -Co vidíš?
>> -Bring Jeho tvář plném rozsahu.
>> His brýle.
>> -Je To odraz.
>> -Je To baseballového týmu Nuevitas.
To je jejich logo.
>> -A Mluví se kdo má na sobě tu bundu.
>> [END Přehrávání]
>> DAVID Malan: Dobře.
To je CS50 a to je trochu více ze dne [neslyšitelný], s níž jste
pustily s problémem set čtyři.
Dnes začneme trochu vypadat více hluboce se na tyto věci zvané ukazatele,
který i když je to docela tajemný téma,
Ukazuje se, že to bude být prostředky, které jsme
může začít stavět a montáže mnohem sofistikovanější programy.
Ale my jsme to udělali na poslední středu prostřednictvím nějakého claymation prvního.
Takže to, odvolání, je Binky a my ho použít
aby se podívat na program, který se opravdu dělat nic zajímavého,
ale to přece odhalil několik problémů.
Takže začít dnes, proč chodíme rychle procházet některé z těchto kroků,
se snaží pálit do lidského hlediska je přesně to, co se tady děje
a proč je to špatné, a pak přejít na a skutečně začít budovat něco,
s touto technikou?
Tak to byl první dva řádky v tomto programu
a Laicky řečeno, to, co jsou tyto dva řádky dělají?
Někdo, kdo je přiměřeně komfortní s tím, co je deklarováno na obrazovce?
Jaké jsou tyto dva řádky dělají?
To není všechno, se liší od jednoho týdne,
ale tam je nějaká nová speciální symbol.
To jo?
Tam vzadu.
>> Diváků: Deklarování ukazatele?
DAVID Malan: znovu, řekni?
Diváků: Deklarování ukazatele?
DAVID Malan: Deklarace ukazatele a pojďme upřesnit to trochu víc.
Diváků: [Neslyšitelné] adresa x a pak y.
DAVID Malan: A pak se zabývat.
Takže, co konkrétně děláme je deklarujeme dvě proměnné.
Tyto proměnné, ačkoli, jdou být typu int hvězdy, které
konkrétněji znamená, jdou k ukládání
adresu int, respektive, x a y.
Nyní existují nějaké hodnoty?
Existují nějaké skutečné adresy v nich dvě proměnné v tomto okamžiku?
Ne.
Je to jen tzv hodnoty odpadky.
Pokud nemáte skutečně přiřadit variabilní, co bylo v RAM
předtím se chystá vyplnit nulami a ty, obě z těchto proměnných.
Ale my ještě nevíme co jsou a to je
Bude klíčem k proč Binkym ztratil hlavu minulý týden.
>> Tak tohle byl claymation ztělesnění tohoto
kdy máte jen dvě proměnné, malé kruhové kusy hlíny,
které lze ukládat proměnné, ale jako zabalený up šipky naznačují,
oni nejsou ve skutečnosti ukazující kamkoliv o sobě známé.
A tak jsme měli tento řádek, a to byl nový minulý týden, malloc pro paměť
alokace, což je jen ozdobný způsob, jak vyprávění operační systém, Linux
nebo Mac OS nebo Windows, hej, dej mi nějakou paměť,
a vše, co musíte říct, operační systém
je to, co když žádají to pro paměť.
Není to bude jedno, co budeš dělat s tím,
ale musíte říci provozní Systém, co cestou malloc.
To jo?
>> Diváků: Kolik?
DAVID Malan: Kolik?
Kolik v bytech, a tak, tak se opět neobvyklý způsob příklad, je jen říct,
dej mi velikost int.
Nyní, velikost int čtyři bajtů nebo 32 bitů.
Tak to je jen způsob, jak řka, hej, operační systém,
dej mi čtyři bajtů paměti že mohu použít mám k dispozici,
a zejména, co dělá malloc Přiznání k dani s ohledem
k tomuto kusu čtyři bajty?
Publikum: Adresa?
DAVID Malan: Adresa.
Adresa tohoto kusu čtyř bajtů.
Přesně tak.
A tak to je to, co je uloženo v konečném v x, a to je důvod, proč jsme opravdu nemám
jedno, co je počet, který adresa, ať už je to OX1 nebo OX2
nebo nějaký tajemný hexadecimální adresa.
Jen Staráme obrazově že tato proměnná x je nyní
směřovat k tomuto kusu paměti.
Takže šipka představuje ukazatel, nebo Více specificky, adresa paměti.
Ale opět, my ne typicky jedno co tyto skutečné adresy.
Nyní říká, že tento řádek co v Laicky řečeno?
Hvězda x dostane 42 středník.
Co to znamená?
Chceš jít?
Nepoškrábejte krk.
>> Diváků: Adresa x je na 42.
>> DAVID Malan: Adresa x je na 42.
Ne tak docela.
Tak blízko, ale ne tak docela, protože tam je hvězda, která je prefixu tuto x.
Proto musíme vyladit trochu.
To jo?
>> Diváků: Hodnota, že pointer x ukazuje, je 42.
DAVID Malan: OK.
Hodnota, že ukazatel je x ukázal na, řekněme, bude 42,
nebo jinak řečeno, hvězdu x říká, jděte na adresu jakéhokoli
je v x, ať už je to 1 Oxford Ulice nebo 33 Oxford Street
nebo OX1 nebo ox33, cokoliv že číselná adresa,
hvězda x je dereferencing x.
Tak jděte na tuto adresu a pak dal číslo 42 tam.
Tak, že by bylo ekvivalent způsob, jak říct, že.
Tak to je vše v pořádku a poté bychom představovat obraz
takto, kde jsme přidali element 42 na tento kus čtyř
bajtů na pravé straně, ale Tato linka byla, kde věci pokazilo
a Binky hlava vyskočila off v tomto bodě,
proto, že špatné věci se stávají, když jste dereference hodnot odpadky
nebo dereference neplatné ukazatele, a já říkám neplatné
protože v tomto bodě příběh, co je uvnitř y?
Jaká je hodnota y na bázi Na posledních několika krocích?
To jo?
Co je to?
>> Diváků: Adresu.
DAVID Malan: adresy.
Mělo by se jednat o adresu ale jsem inicializaci to?
Takže mám ještě ne.
Takže to, co je známo, že je tam?
Je to jen nějaký odpad hodnotu.
Mohlo by to být jakákoliv adresa od nuly do 2000000000 pokud máte dva koncerty RAM,
nebo nula až 4000000000, pokud jste dostal čtyři GB paměti RAM.
Je to nějaký odpad hodnota, ale problém je
že operační systém, pokud není vám dal
že kus paměti specificky že se snažíte jít do,
to obecně bude způsobovat to, co jsme viděli jako poruchu segmentaci.
Takže ve skutečnosti, některé z vás, kteří mají bojoval na problémy v úředních hodinách
nebo problémů, které je více obecně se snaží přijít na to,
chyba segmentace, že obecně znamená,
jste dotýká segment paměti, že byste neměli být.
Ty dotýká paměť, která operační systém nemá
nechá vás dotknout, ať už je to tím, že jde příliš daleko ve svém poli
nebo od této chvíle, ať už je to proto, že jste se dotknete
paměť, která prostě nějaký odpad hodnota.
>> Tak dělá hvězda x zde druh nedefinované chování.
Nikdy byste neměli dělat, protože kurzy jsou, program to jen bude k havárii,
protože jste říkal, jděte na tuto adresu
a nemáte tušení, kde že adresa ve skutečnosti je.
Tudíž systém je pravděpodobné spadne svůj program
jako výsledek a opravdu, to je co se tam stalo, aby Binkym.
Takže nakonec, Binky fixní tento problém s tím.
Takže tento program sám byl chybný.
Ale pokud jste nějak kupředu a místo toho spustit tento řádek,
y se rovná x prostě znamená cokoliv adresa je x, také dát ji do y.
>> A tak obrazově, máme reprezentován to s dvěma šipkami
z x a y z ukazující na stejné místo.
Takže sémanticky, x je rovno k y, protože oba tyto
ukládáte stejný adresa, ergo ukázal na 42,
a teď, když říkáte, hvězda y, jděte na adresu v y,
to má zajímavý vedlejší efekt.
Takže adresu v y je totéž jako adresu v x.
Takže pokud jste, že jít na adresu v y a změňte hodnotu na 13,
kdo jiný je ovlivněn?
X, bod D, abych tak řekl, by měly být ovlivněny také.
>> A skutečně, jak se Nick nakreslil tento obrázek v claymation bylo přesně to.
I když jsme sledovat ukazatel y, jsme skončili na stejném místě,
a tak pokud bychom měli k vytištění out X nebo Y je pointee,
pak bychom vidět hodnotu 13.
A teď, říkám pointee být v souladu s videem.
Programátoři, k mému znalosti, vlastně nikdy
řekni slovo pointee, to, co je špičatá
na, ale pro konzistence s videem, realizovat
to je vše, co bylo znamenalo v takové situaci.
Takže jakékoli otázky týkající claymation nebo ukazovátka nebo malloc ještě ne?
Ne?
Dobře.
>> Takže bez dalšího ado, pojďme se podívat
na to, kde to má vlastně byl používán na nějakou dobu.
Takže jsme měli tuto knihovnu CS50 že má všechny tyto funkce.
Použili jsme GetInt hodně, getString, Pravděpodobně GetLongLong dříve
v mém pset jednoho nebo tak, ale co se skutečně děje?
Dobře, pojďme se rychle podívat pod kapotou v programu, který
inspiruje, proč dáváme vám to CS50 knihovna, a dokonce od minulého týdne,
jsme začali brát ty, tréninkové kola off.
Takže toto je nyní seřazena z toho, co posmrtné
má se děje uvnitř knihovny CS50,
i když jsme teď začne pohybovat pryč od toho u většiny programů.
>> Takže tohle je program s názvem scanf 0.
Je to super krátké.
To se prostě musí tyto řádky, ale to zavádí funkci nazvanou scanf
že jsme skutečně uvidí v moment uvnitř knihovny CS50,
i když v trochu jiné podobě.
Takže tento program na řádku 16 je deklarování proměnné x.
Tak mi dej čtyři byty pro int.
Je to už říkal uživatele, číslo, prosím, a poté
To je zajímavé, že linka ve skutečnosti spojuje dohromady minulý týden
a tohle.
Scanf, a pak všimnete, že trvá formát řetězce, stejně jako printf,
% i znamená int, a pak to trvá Druhý argument, který vypadá trochu
funky.
Je to ampersand x, a připomenout, jsme viděli jen jednou minulý týden.
Co ampersand x představuje?
Co ampersand dělat v C?
To jo?
>> Diváků: Adresa.
DAVID Malan: Adresa.
Takže je to naopak provozovatele hvězdy,
že se provozovatel hvězda říká, jděte na tato adresa, ampersand operátor
říká, zjistit adresa této proměnné,
a proto je tento klíč, protože Účelem scanf v životě
je pro skenování uživatele vstup z klávesnice,
v závislosti na co on nebo ona typy, a pak si přečtěte vstup daného uživatele
do proměnné, ale viděli v posledních dvou týdnech
že tato funkce odkládací, že jsme Snažil snadno implementovat
Jen rozbité.
Připomeňme si, že s funkcí odkládací, pokud bychom prostě prohlásil, A a B, jak ints,
jsme se úspěšně swap dvě proměnné vnitřek swapu
Stejně jako u mléka a Úředním věstníku, ale jakmile odkládací vrátil,
co byl výsledek s ohledem k x a y, původní hodnoty?
Nic.
To jo.
Nic se nestalo, že čas, protože swapy měnit pouze jeho místní kopie,
což znamená, všechny Tentokrát, kdykoli máme
předával v argumentech k funkcím, my jsme
právě procházející kopie těchto argumentů.
Můžete to udělat s tím co chcete s nimi,
ale oni budou mít žádný vliv na původní hodnoty.
Tak to je problematické, pokud vás Chcete mít funkci jako scanf
v životě, jejichž účelem je skenování uživatelského vstupu z klávesnice
a pak vyplnit prázdná místa, tak aby mluvit, to je, dát proměnné, jako je x
hodnotu, protože kdybych byl jen projít x na scanf,
pokud se domníváte, logiku poslední týden, může scanf dělat, co chce
s kopií x, ale to nemohlo trvalou změnu x, pokud dáváme
scanf mapu pokladu, abych tak řekl, kde x označuje místo, přičemž
míjíme v adrese X tak, scanf může jít tam a vlastně změna
hodnota x.
A tak opravdu, vše že tento program dělá
když udělám scanf 0, v mém zdroji 5 m adresář, aby scanf 0,
dot lomítko scanf, číslo prosím 50, díky za 50.
>> Takže to není všechno tak zajímavé, ale co se skutečně děje
je to, že jakmile jsem zavolat scanf tady, hodnotu x
se trvale měnit.
Teď se to zdá pěkné a dobře, a ve skutečnosti je
Zdá se, jako bychom vlastně nepotřebujeme CS50 knihovna vůbec už ne.
Například, pojďme běžet tento více zde jednou.
Dovolte mi, abych ho znovu na vteřinu.
Zkusme číslo, prosím, a místo toho říká, 50 jako předtím,
řekněme, ne.
OK, to je trochu divný.
DOBŘE.
A jen některé nesmysl zde.
Takže to nevypadá, zvládnout chybné situace.
Proto musíme minimálně začátek přidá nějaká chyba v kontrole
aby se ujistil, že má uživatel napsáno v skutečného počtu, jako 50,
protože prý psaní slova není detekován jako problematické,
ale pravděpodobně by mělo být.
>> Podívejme se na tuto verzi nyní to je můj pokus o reimplement getString.
Pokud scanf má tohle všechno funkčnost postavený v roce,
Proto jsme byli pustily s těmito koleček, jako getString?
No, tady je snad moje vlastní jednoduchá verze getString
přičemž před týdnem, možná jsem již uvedl, dej mi řetězec a říkají vyrovnávací paměti.
Dnes, budu začít právě řka: char hvězdu, kterou si vzpomínat,
je to jen synonyma.
Vypadá to děsivější, ale je to přesně to samé.
Tak mi dej proměnnou s názvem vyrovnávací paměti že to bude ukládat řetězec,
řekněte uživatelské řetězec, prosím, a potom, stejně jako předtím,
Zkusme si půjčit této lekci scanf % s tentokrát a předat do vyrovnávací paměti.
Nyní, rychlá kontrola zdravý rozum.
Proč jsem neříkám ampersand vyrovnávací paměti tentokrát?
Vyvodit z předchozího příkladu.
Diváků: Char hvězda je ukazatel.
DAVID Malan: Přesně tak, protože tentokrát, char
Hvězda je již ukazatel, adresu, podle definice této hvězdy bytí tam.
A pokud scanf očekává adresu, stačí jen projít do vyrovnávací paměti.
Nepotřebuji říkat ampersand vyrovnávací paměti.
Pro zvědavá, mohl byste něco takového.
Měla by mít jiný význam.
To by vám ukazatel na ukazatel, který je vlastně
platný věc C, ale pro Nyní, pojďme aby to jednoduché
a udržet příběh konzistentní.
Já jsem prostě jít projít do vyrovnávací paměti, a to je správné.
Problémem však je toto.
Nech mě jít napřed a spuštění tohoto Program po kompilaci to.
Proveďte scanf 1.
Sakra, moje kompilátoru lov moje chyba.
Dejte mi jednu sekundu.
Řinčení.
Řekněme, že scanf-1.C.
DOBŘE.
Tam jedeme.
Potřebuji to.
CS50 ID má různé nastavení konfigurace
že vás chrání proti sobě.
Potřeboval jsem vypnout ty by spuštění řinčení ručně této doby.
Takže řetězec prosím.
Chystám se jít dopředu a zadejte v mé oblíbené Hello World.
OK, null.
To není to, co jsem napsal.
Takže je to svědčí o něco mýlit.
Nech mě jít dopředu a zadejte v opravdu dlouhý řetězec.
Díky za null, a já nevím, pokud budu mít možnost to selhání.
Zkusme trochu kopie vložit, a uvidíme, jestli to pomůže.
Stačí vložit spoustu to.
Je to určitě větší string než obvykle.
Pojďme se jen opravdu napsat.
Ne.
Sakra.
Command not found.
Tak to je nesouvisí.
Je to proto, že jsem vložit některé špatné znaky,
ale to ukáže, nebude fungovat.
>> Zkusme to ještě jednou, protože je to větší zábava, když jsme vlastně jeho zhroucení.
Pojďme napište to a teď jsem bude kopírovat opravdu dlouhý řetězec
a teď uvidíme, jestli budeme může způsobit zhroucení tuto věc.
Všimněte si, jsem vynechal prostory a Nové linky a středníky
a všechny funky znaky.
Enter.
A teď síť právě bytí pomalu.
Držel jsem se Command-V příliš dlouhý, jasně.
Sakra!
Command not found.
>> DOBŘE.
No, jde o to, Nicméně následující.
Takže co se vlastně děje Na tomuto prohlášení
char hvězdy vyrovnávací paměti na řádku 16?
Takže to, co jsem dostat Prohlašuji, když ukazatel?
Všechno Začínám je hodnota čtyř bajtů volal vyrovnávací paměti, ale to, co je uvnitř ní
v současné době?
Je to jen nějaký odpad hodnotu.
Vzhledem k tomu, kdykoli budete deklarovat proměnnou v C, je to jen nějaký odpad hodnota,
a my teď začínáme Podražení této reality.
Teď, když řeknu scanf, jděte na tuto adresu
a dal za jakýchkoliv uživatel zadá.
Pokud se uživatel zadá ve ahoj svět, no, kde mám dát?
Buffer je hodnota odpadky.
>> Takže to je něco jako šíp to je ukázal, kdo ví kde.
Možná, že je to ukázal přímo tady v mé paměti.
A tak, když se uživatel druhy uvedené v hello world,
se program pokusí dát string hello world zpětné lomítko 0
se tím, že kus paměti.
Ale s vysokou pravděpodobností, ale zjevně není 100% pravděpodobnost,
Počítač bude pak pád program protože to není
paměť I by mělo být umožněno na dotek.
Takže ve zkratce, je tento program chybná přesně z tohoto důvodu.
Já zásadně nedělám to, co?
Jaké kroky mám vynechány, stejně jako jsme se vynechat Binkym první příklad?
To jo?
>> Diváků: alokace paměti?
>> DAVID Malan: alokace paměti.
Nemám ve skutečnosti přiděleny jakýkoli paměti pro tento řetězec.
Takže můžeme opravit v několika způsoby.
Jeden z nich, můžeme aby to jednoduché a ve skutečnosti, teď jsi
začnou vidět rozostření z linek mezi tím, co
Pole je, jaký je řetězec, jaká char hvězda je to, co řada znaků
je.
Zde je druhý příklad zahrnující řetězců a oznámení
všechno, co jsem udělal na lince 16 je, místo toho říkat
že vyrovnávací paměť bude char hvězda, ukazatel na kus paměti,
Budu velmi aktivně dát sám sebe jako buffer pro 16 znaků,
a ve skutečnosti, pokud jste obeznámeni s termínem vyrovnávací paměti,
pravděpodobně ze světa videí, kde je video do vyrovnávací paměti, ukládání do vyrovnávací paměti,
ukládání do vyrovnávací paměti.
No, co je tu souvislost?
No, Uvnitř YouTube a uvnitř video přehrávače
obecně je pole to je větší než 16 let.
To by mohlo být pole o velikosti jedné megabajt, možná 10 megabajtů,
a do tohoto pole se váš prohlížeč stáhnout spoustu bytů,
celá parta megabajtů video, a video přehrávač,
YouTube je, nebo ten, kdo to začíná čtení bajtů z tohoto pole,
a kdykoliv vidíte Slovo buffering, ukládání do vyrovnávací paměti,
to znamená, že má hráč dostali na konec tohoto pole.
Síť je tak pomalé, že to nemá naplnil pole s více byty
a tak jste mimo bitů Pro zobrazení pro uživatele.
>> Takže vyrovnávací paměť je výstižný termín zde v tom, že je to jen pole, kus paměti.
A to bude opravit proto, že se ukazuje,
že můžete léčit pole, jako kdyby jsou adresy, i když pufr
je jen symbol, je to posloupnost znaků, pufr,
To je užitečné pro mě, programátor, můžete předat své jméno kolem
jako by se jednalo o ukazatel, jako by to
byly adresa bloku paměti pro 16 znaků.
Takže to má říkat, můžu projít scanf přesně to slovo
a tak teď, když jsem dělat tento program, aby scanf 2, tečka lomítko scanf 2,
a zadejte hello world, Enter, že time--
>> Hmm, co se stalo?
String prosím.
Co jsem udělal špatně?
Hello world, vyrovnávací paměti.
Ahoj světe.
Ach, já vím, co to dělá.
DOBŘE.
Takže to čte up až do prvního prostoru.
Takže pojďme cheat na chvíli a říkají Chtěl jsem psát něco
opravdu dlouhé, jako je to dlouhá věta to je jedna, dva, tři, čtyři, pět,
šest, sedm, osm, devět, 10, 11, 12, 13, 14, 15, 16.
DOBŘE.
Je to skutečně dlouhá věta.
Takže tato věta delší než 16 znaků
a tak když jsem stiskněte klávesu Enter, co se bude dít?
No, v tomto případě z příběh, jsem prohlásil, vyrovnávací
ve skutečnosti, že pole s 16 znaky připraven jít.
Takže jeden, dva, tři, čtyři, pět, šest, sedm, osm, devět, 10, 11, 12, 13, 14,
15, 16.
Takže 16 postavy, a teď, když jsem číst v něčem, jako je to dlouhá
věta, co se bude dít se že budu číst v tomto je dlouhá
S-E-N-T-E-N-C-E, věty.
>> Tak tohle je záměrně špatná věc, kterou jsem
udržet psaní za hranice Hranice mého pole,
za hranice mé paměti.
Mohl bych mít štěstí a program bude mít na chod a ne jedno,
ale obecně řečeno, toto bude skutečně dojít k selhání mého programu,
a to je chyba v mém kód v okamžiku, kdy vyjdu
za hranice tohoto pole, protože já
Nevím, jestli je to nutně spadne
nebo jestli jsem jen tak mít štěstí.
Takže to je problematické, protože v Tento případ, nezdá se, že práce
a pojďme se pokoušet osud tady, i když IDE Zdá se, že tolerovat docela dost
of--
>> Tam jedeme.
Na závěr.
Takže já jsem jediný, který může vidět.
Tak jsem prostě musel hodně zábavné psaní out opravdu dlouhou skutečné fráze
že to určitě překročila 16 bajtů, protože já
napsaný v této bláznivé dlouhé multi-linka fráze, a Všimněte si, co se stalo.
Program to zkusil tisk a pak se dostal chybu segmentace
a segmentace chyby je, když něčemu takovému dojde,
a operační systém říká, Ne, nemůže dotknout, že paměť.
Chystáme se zabít program úplně.
>> Takže to vypadá problematické.
Já jsem zlepšil programu, který zaručuje mít alespoň část paměti,
ale bude to zdá se, že omezit Funkce GetString k získání
řetězce nějakého konečné délky 16.
Takže pokud chcete podpořit déle věty než 16 znaků,
Co děláte?
No, můžete zvýšit velikost vyrovnávací paměti do 32
nebo že se zdá trochu krátká.
Proč ne my jen aby to 1000, ale tlačit zpět.
Jaká je odpověď intuitivně z Jen vyhnout se tento problém tím, že
můj vyrovnávací paměti větší, stejně jako 1000 znaků?
Realizací getString tímto způsobem.
Co je to tady dobré nebo špatné?
To jo?
Diváků: Pokud svázat až hodně prostoru a nechcete používat,
pak nemůžete přerozdělit ten prostor.
DAVID Malan: Rozhodně.
Je to plýtvání, pokud, pokud nemáte skutečně potřebují 900 těchto bytů
a přesto žádáte 1000 celkem tak jako tak,
jste právě náročný na paměť počítač uživatele, než je třeba,
a po tom všem, některé jste se již setkali
v životě, že když jste běh spoustu programů
a jedí až velké množství paměti, to může skutečně ovlivnit výkon
a zkušenosti uživatele na počítači.
Tak to je trochu líný řešení, pro jistotu, a naopak,
to není jen plýtvání, jaký problém stále zůstává, i když jsem se, aby můj vyrovnávací paměti
1000?
To jo?
>> Diváků: Řetězec je délka 1001.
DAVID Malan: Přesně tak.
Pokud je váš řetězec je délka 1001, máte přesně stejný problém,
a mým argumentem, udělal bych to Jen pak 2.000 dělat,
ale nevíte, v předem, jak velký by to mělo být,
a přesto, musím sestavit svůj program předtím, než povolí lidé používají a download
za to.
Tak tohle je přesně ten druh věci, které se knihovna snaží CS50
aby nám pomohli s a my jen pohled na některé z podkladové provádění
tady, ale je to CS50 tečka C. Tato je soubor, který je už na CS50 IDE
všechny tyto týdny, které jste používali.
Je to pre-zkompilovaný a vy jste byla automaticky používat to
podle povahy mající pomlčka L CS50 vlajku s zazvoněním,
ale když jsem se posunout dolů přes všechny tyto funkce, tady je getString,
a jen na vás vzniku chuť, co se děje,
pojďme se rychle podívat na relativní složitost.
Není to super dlouhé funkce, ale my ne
muset přemýšlet o všechno tvrdě jak jít o získání řetězce.
>> Takže tady je moje vyrovnávací paměti a já zřejmě inicializovat ji na hodnotu null.
To, samozřejmě, je totéž jako char hvězda,
ale já jsem se rozhodl v realizaci knihovny CS50
že pokud budeme zcela dynamický,
Nevím předem, jak velkej Uživatelé řetězec budou chtít dostat.
Takže já jdu začít jen s prázdný řetězec
a budu vybudovat tolik paměť as Potřebuji, aby se vešly uživatele řetězec
a jestli nemám dost, jdu se zeptat
operační systém pro více paměti.
Chystám se přesouvat své řetězec do většího kusu paměti
a budu uvolnit nebo osvobodit nedostatečně velký kus paměti
a my jen tak k tomu opakovaně.
>> Tak rychlý pohled, tady je jen proměnná
s níž budu sledovat kapacity mé pufru.
Kolik bytů mohu fit?
Zde je proměnná n s který budu držet
Trať kolik bajtů jsou vlastně v vyrovnávací paměti, nebo že uživatel napsali.
Pokud jste ještě neviděli to předtím, vás můžete určit, že proměnná jako int
je nepodepsaný, který, jak název napovídá, znamená, že je nezáporné, a proč by
Co jsem kdy chtěl obtěžovat specifikující že int není jen int,
ale je to unsigned int?
To je non-negativní int.
Co [neslyšitelné] znamená?
>> Diváků: Je to popisující částku paměti, která může být [neslyšitelných].
>> DAVID Malan: Jo.
Takže když řeknu unsigned, je to vlastně která vám jeden bit navíc paměti
a zdá se, trochu hloupé, ale pokud budete mají jeden bit přídavné paměti, že
znamená, že máte dvakrát tolik Hodnoty můžete zastupují,
protože to může být 0 nebo 1.
Takže ve výchozím nastavení, int může být hrubě negativní 2000000000 celou cestu
až do pozitivního 2 miliardy.
Ti, kteří jsou velkými rozsahy, ale je to pořád trochu marnotratný
pokud jste jen o velikosti, která se právě intuitivně
by měla být non-negativní nebo kladné nebo 0, no a pak,
proč jste ztrácíš 2 miliardy Možné hodnoty pro záporných čísel
pokud jste nikdy používat?
Takže tím, že říká nepodepsaný, teď můj int může být mezi 0 a přibližně 4 miliard.
>> Tak tady je jen int C z důvodů, nebudeme se do právě teď jako
proč je to int místo na char, ale tady je
podstata toho, co se děje o, a někteří z vás
by mohly být za použití, například, fgetc fungovat iv pset čtyři
nebo později, budeme ho vidět opět v problému set pět,
fgetc je pěkné, protože jako název druh, druh arcanely napovídá,
je to funkce, která dostane charakter, a tak,
co je zásadně odlišná o tom, co děláme v getString
je, že nepoužíváte scanf stejným způsobem.
Jsme jen plíživé po krok-za-krokem přes co uživatel zadal,
protože můžeme vždy přidělit jeden char, a proto můžeme vždy bezpečně
se na jedné znak v době, a kouzlo začne dít tady.
Chystám se nalistujte prostřední této funkce
Jen stručně představit tuto funkci.
Stejně jako je tu Funkce malloc, je tu
funkce realloc kde realloc vám umožní přerozdělit kus paměti
a dělat to větší nebo menší.
Tak dlouhý příběh krátký as vlna mé ruky pro dnešek,
vím, že to, co getString dělá, je, že to něco
z magicky rostoucí nebo smršťování vyrovnávací paměti jako uživatel
typy ve svém řetězci.
>> Takže v případě, že uživatel zadá krátký řetězec, tento kód
Pouze přiděluje dost paměť, aby se vešly řetězec.
Pokud uživatel stále psát jak jsem to udělal znovu a znovu
a znovu, no, v případě, že vyrovnávací paměť je zpočátku tento velký
a program realizuje, aby počkej, já jsem z vesmíru,
to bude dvojnásobek velikost vyrovnávací paměti
a pak zdvojnásobit velikost vyrovnávací paměti a kód, který dělá zdvojnásobení,
Podíváme-li se na to tady, je to právě tento chytrý jednořádkový.
Je možné, že jste viděli tuto syntaxi předtím, ale když řeknete hvězda rovná,
To je totéž, jako říká časy objemu 2.
Tak to prostě pořád zdvojnásobení kapacita pufru
a pak říkat realloc dát sama o sobě, že mnohem více paměti.
>> A teď, jak stranou, tam jsou další funkce v zde
že nebudeme dívat do detailů jiné než ukázat v GetInt,
používáme getString v GetInt.
Ověříme, že to není null, což, odvolání,
je zvláštní hodnota, která znamená, že se něco pokazilo.
Jsme z paměti.
Lepší zkontrolovat, že.
A my jsme se vrátit hodnotu sentinelové.
Ale budu odložit na připomínky pokud jde o proč a pak jsme se použít tento bratranec scanf
volal sscanf a ukazuje se, že sscanf, nebo řetězec scanf,
vám umožní se podívat na řádku uživatel zadal, a nechat vás
analyzovat je v podstatě, a to, co já jsem tady je Říkám sscanf,
analyzovat bez ohledu má uživatel zadali a ujistěte se, že% i,
je celé číslo v ní, a my ne dostat se do dneška přesně důvod, proč tam je také
A% c tady, ale že v kostce umožňuje us zjistit, zda má uživatel zadané
v něčem falešné za číslem.
Takže důvod, že GetInt a GetString ti k opakování, opakování, opakování
Je to proto, ze všech že kód psali jsme,
Je to trochu dívá na vstupu uživatele V ujistěte se, že je to úplně číselné
nebo je to skutečný floating Bodová hodnota nebo podobně,
V závislosti na tom, jaký hodnotě funkci, kterou používáte.
>> Uff.
DOBŘE.
To bylo sousto ale bod je zde
že důvod, proč jsme měli tato školení kola na
Je tomu tak proto na nejnižší úrovni, tam je jen tolik věcí, které
může jít špatně, že jsme chtěli preventivně zvládnout
tyto věci jistě v nejčasnější týdnů třídy,
ale nyní s pset čtyři a pět a pset za uvidíte, že je to spíš k
vy, ale i vy jste schopnější řešit tyto druhy problémů
sami.
Jakékoliv dotazy týkající getString nebo GetInt?
To jo?
>> Diváků: Proč byste zdvojnásobí kapacita pufru
spíše než jen rostoucí to o přesné částky?
>> DAVID Malan: Dobrá otázka.
Proč bychom zdvojnásobit kapacitu pufru, na rozdíl
jen ji zvýšit nějakou konstantní hodnotu?
Bylo rozhodnutí o designu.
Prostě jsme se rozhodli, že proto, že má tendenci být o něco dražší časově se zeptat
operační systém pro paměť, my ne
chtějí nakonec dostat do situace pro velké řetězce
že jsme se ptali znovu a znovu OS
a znovu a znovu Rychlá obměna pro paměť.
Tak jsme se prostě rozhodli, poněkud libovolně, ale doufáme, že rozumně,
že, víte co, pojďme pokusit se dostat před sebe
a jen držet zdvojnásobení to tak, že jsme se minimalizovalo množství časů
musíme zavolat malloc nebo realloc, ale celkem rozsudek
volání v nepřítomnosti vědět co uživatelé chtít psát.
Oba způsoby mohou být diskutabilní.
Pravděpodobně dobře.
>> Takže pojďme se podívat na pár jiných vedlejších účinků paměti,
věci, které se mohou pokazit a nástroje, které vám mohou
používají k zachycení tyto druhy chyb.
Ukazuje se, že vás všechny, i když check50 neřekl ti tolik,
Byly psaní buggy kód od jednoho týdne,
i kdyby všechny check50 testy prošel, a to i v případě, vy a vaše TF
jsou super přesvědčeni, že váš kód funguje, jak bylo zamýšleno.
Váš kód byl kočárek nebo chybná v tom, že všichni z vás,
v pomocí knihovny CS50, Byly netěsní paměti.
Byli jste žádá operační systém pro paměť ve většině programů
jste napsali, ale vy jste vlastně nikdy dal ji zpět.
Vy jste volal GetString a GetInt a GetFloat,
ale s getString, nemáš nikdy volal unGetString nebo Dej
Řetězec Back nebo podobně, ale my jsme viděli že GetString dělá alokovat paměť
prostřednictvím malloc nebo to Funkce realloc, což je jen
velmi podobný v duchu, a přesto jsme byli
žádá operační systém pro paměť a paměť znovu a znovu
ale nikdy dávat to zpátky.
>> A teď, jak stranou, se ukazuje, že když je program ukončen, všechny paměti
je automaticky uvolněna.
Takže to nebyl velký problém.
Nebude to rozbít IDE nebo zpomalují,
Ale když programy se obecně úniku paměti
a oni běží na dlouhou dobu.
Pokud jste někdy viděli stupidní nafukovací míč v Mac OS nebo přesýpací hodiny
v systému Windows, kde je to trochu zpomalení nebo myšlení nebo myšlení
nebo jen opravdu začíná zpomalit na procházení,
Je to velmi pravděpodobně mohlo být výsledkem nevracení paměti.
Programátoři, kteří psali software, který používáte
zeptejte operační systém pro paměť každých pár minut, každou hodinu.
Ale pokud jste běží software, i když je to
minimalizovat ve vašem počítači hodiny nebo dny na konci,
můžete se ptát na víc a víc Paměť a vlastně nikdy používat
a tak váš kód může být, nebo programy by mohly být netěsní paměti,
a pokud začnete úniku paměti, tam je méně paměti pro ostatní programy,
a výsledek je pro zpomalit všechno dolů.
>> Nyní, to je zdaleka jedním z těch nejděsivějších programy
budete mít možnost spustit v CS50, pokud
neboť jeho výkon je ještě více než esoterický řinčet je nebo učinit, nebo některý z příkazu
linka programy Udělali jsme dříve, ale naštěstí, vložené do jeho výstupu
je několik užitečných tipů, které výborný budou užitečné buď pro pset čtyři
nebo rozhodně pset pět.
Takže Valgrind je nástroj , které mohou být použity k vypadat
pro úniky paměti v programu.
Je relativně jednoduché pro spuštění.
Spustit Valgrind a pak, dokonce i když je to trochu upovídaný,
pomlčka únik pomlčka kontrola rovná plné, a poté dot
lomítko a název vašeho programu.
Takže Valgrind pak poběží program a na samém konci svého programu
běh před tím, než ukončí a vám dává další výzvu,
to bude analyzovat váš Program, zatímco to byla spuštěna
a ti jsi úniku jakýkoli paměti a ještě lépe,
jste se dotknete paměť, která nepatřil k vám?
To nemůže chytit všechno, ale je to docela dobrý v chytání většinu věcí.
>> Tak tady je příklad, který má mé běhu tento program, mají běh Valgrind,
na programu s názvem paměť, a já jdu
upozornit na řádky, které jsou nakonec nás zajímají.
Takže tam je ještě více rozptýlení že jsem vymazány ze snímku.
Ale pojďme se prostě vidět, co to Program je schopen nám říká.
To je schopné vyprávět nám věci jako neplatné zápisu o velikosti 4.
Jinými slovy, pokud se dotknete paměť, konkrétně 4 bajtů paměti
že byste neměli mít, Valgrind vám může říct, že.
Neplatný zápis velikosti 4.
Dotkl ses čtyři byty že byste neměli mít.
Kde jsi to udělal?
To je krása.
Paměť dot c linka 21 je místo, kde vás podělal, a to je důvod, proč je to užitečné.
Stejně jako GDB, může pomoci bod, který v aktuálním chyby.
>> Nyní, to je trochu více verbose, ne-li matoucí.
40 bytů v 1 blocích jsou rozhodně ztracen v záznam ztráty 1 z 1.
Co to znamená?
No, to prostě znamená, že jste požádal o 40 bytů a nikdy ji vrátil.
Volal jste malloc nebo jste volal GetString a operační systém
ti dal 40 bytů, ale ty nikdy osvobozen nebo povolený, že paměť,
a být spravedlivý, nikdy jsme se ukázat, , jak se vrátit paměť.
Ukázalo se, že tam je super jednoduchá funkce s názvem zdarma.
Přijímá jeden argument, věc Chcete-li uvolnit nebo vrátit,
ale 40 bytů, zdá se, v tomto programu
byly ztraceny na řádku 20 paměti dot c.
>> Tak uvidíme, tento program.
Je to super k ničemu.
To jen dokazuje, tento konkrétní chybě.
Takže pojďme se podívat.
Zde je hlavní a hlavní, vývěsní, hovory funkce nazvaná f, a pak se vrátí.
Takže není všechno tak zajímavé.
Co f dělat?
Všimněte si, jsem se neobtěžoval s prototypem.
Chtěl jsem, aby kód co nejmenší.
Tak jsem dal f nad hlavní a to je v pořádku, určitě,
pro krátké programy, jako je tento.
Takže f nic nevrací a dělá nebere nic, ale je to to udělat.
To prohlašuje, podobně jako v příkladu binky,
ukazatel s názvem x, co se děje uložit adresu int.
Tak to je levá strana.
V angličtině, co je pravá strana dělá?
Každý, kdo?
Co je to dělá pro nás?
To jo?
>> Diváků: [Neslyšitelné] měří velikost int
což je 10 krát vyšší než [neslyšitelných]
DAVID Malan: Dobrý, a dovolte mi shrnout.
Takže přidělit dostatečný prostor pro 10 celá čísla nebo 10, co je velikost int,
je to čtyři bajtů, takže 10 krát 4 je 40, takže pravé straně, které jsem
zvýrazněný, je dát mi 40 bajtů a uložit adresu prvního bajtu
do x.
A teď konečně, a tady je místo, kde tento program je buggy, co je
s čárou 21 špatného na základě této logiky?
Co je na řádku 21 v nepořádku?
To jo?
Diváků: Nemůžete index do x [neslyšitelných].
DAVID Malan: Jo.
Neměla bych index do x, jako je to.
Takže syntakticky, to je v pořádku.
Co je příjemné je, stejně jako vy může léčit název pole
, jako když je to ukazatel, podobně můžete léčit ukazatel, jako když je to
pole, a tak mohu syntakticky říkají x držák něco, x držák i,
ale 10 je problematické.
Proč?
>> Diváků: Protože to není uvnitř.
>> DAVID Malan: To není Uvnitř tohoto kusu paměti.
Jaká je největší hodnota bych měl být uvedení v těch hranatých závorkách?
9, 0 až 9.
Vzhledem k tomu, nulového indexování.
Takže od 0 do 9 bude v pořádku.
Držák 10 není dobrá a ale vzpomínám i když, pokaždé
Připadá mi, že se snaží, aby se CS50 IDE crash zadáním falešných hodnot,
to není vždy spolupracovat, a opravdu, často
štěstí jen proto, že Operační systém není
Všimněte si, že jste někdy tak trochu projít nějaký kus paměti,
proto, že jste zůstal v technicky Váš segmentu, ale o tom více
ve třídě operačních systémů, a tak se něco takového
by mohla velmi snadno uniknou pozornosti.
Váš program se nikdy havárii důsledně ale možná jednou za čas.
>> A tak se pojďme zkusit Valgrind na to, a tady je
kde budeme dostat ohromen na výstupu za okamžik.
Tak, aby nevracení paměti valgrind šek se rovná plné tečka lomítko paměti.
A tady je důvod, proč Slibuji To by přemoci.
Tady je to, co valgrind, tady je to, co programátor, některé roky ago-
rozhodl, že by to byl dobrý nápad pro výstup vypadat.
Takže pojďme smysl tohoto.
A tak celou cestu na levé straně side bezdůvodně
je proces ID programu my stačí spustit, jedinečný identifikátor
pro program jsme právě utekl.
Vypouští jsme, že z šoupátko, ale tam
je několik užitečných informací zde.
>> Pojďme rolovat nahoru až na samý vrchol.
Tady je místo, kde jsme začali.
Takže to není tak moc výstup.
Tady je neplatné write velikosti 4 na řádku 21.
No, co bylo řádku 21?
Linka 21 bylo přesně to a to dává smysl
že jsem v platně psaní 4 bajty, protože jsem
se snaží dát tuto číslo, což může být cokoliv,
to jen se stane být nula, ale snažím
aby ji na místě že nepatří ke mně.
Kromě toho, tady dole, 40 bytů v jednom bloky jsou definitivně ztraceny v záznamu 1.
To proto, že když volám malloc tady, jsem vlastně nikdy uvolnit paměť.
>> Tak jak můžeme opravit?
Nech mě jít dál a být trochu bezpečnější a dělat 9 tam a dovolte mi, abych zde zdarma x.
Toto je nová funkce pro dnešek.
Kdybych teď znovu spustit, aby vzpomínka dot lomítko, pojďme běžet valgrind na to znovu,
maximalizovat okno a stiskněte klávesu Enter.
Teď, je to dobré.
Oni pohřbít dobré zprávy ve všech tohoto výstupu.
Všechny haldy bloky jsou zdarma.
Vrátíme se na to, co haldy je, ale žádná úniky jsou možné.
Takže je to jen další nástrojem pro vaše sadě nářadí
se kterými můžete začít nyní najít chyby, jako to.
>> Ale pojďme se podívat, co více se může pokazit zde.
Pojďme přechod nyní ve skutečnosti řešení problému.
Jako stranou, pokud to bude ulehčit Trochu zmatku nebo napětí,
toto je nyní legrační.
To jo.
To je docela dobrý.
Vzhledem k tomu, ukazatele jsou adresy a adresy
jsou obecně konvencí psaný s šestnáctkové.
Ha, ha, to je nyní legrační.
Tak či onak, takže pojďme teď ve skutečnosti vyřešit problém.
To byl výborný, extra low-level tak daleko,
a my můžeme vlastně dělat užitečné věci s těmito detaily low-level.
>> Proto jsme zavedli několik týdnů Před pojem pole.
Pole bylo fajn, protože je těžké uklidit náš kód
protože pokud bychom chtěli napsat program s několika studenty
nebo více názvů a domy a dorms a vysoké školy a všechno,
jsme mohli uložit všechno více čistě uvnitř pole.
Ale navrhnout jednu stinnou stránku z pole tak daleko.
I když jste neutrpělo sami v programu, prostě instinktivně,
co je to špatná věc o matici, snad?
Slyšel jsem nějaké mumlání.
Diváků: Je to těžké změnit velikost.
DAVID Malan: Je to těžké změnit velikost.
Nelze změnit velikost z pole, ve skutečnosti, samo o sobě
v C. můžete přidělit další pole, přesunout vše od starého
do nového, a teď mít nějaký prostor navíc,
ale není to asi tak, jako jazyk jako Java nebo Python
nebo libovolný počet jiné jazyky, se kterými někteří z vás
může být obeznámeni kde na vás stačí držet přidání věci
omrzení na konec pole.
Když máte řadu velikost 6, to je jeho velikost,
a tak stejně jako myšlenka dříve který má vyrovnávací paměť určité velikosti,
musíte uhodnout z brány Jakou velikost chceš, aby to bylo?
Máte-li hádat příliš velký, ztrácíte prostor.
Máte-li hádat příliš malá, vás nemůže uložit, že data, přinejmenším
bez mnohem víc práce.
>> Takže dnes, díky ukazatele, můžeme začátek šití dohromady vlastní vlastní
datové struktury, a fakt, tady je něco,
že vypadá trochu víc mystické na první pohled,
ale to je to, co budeme nazývat připojený Seznam a jeho jméno druh shrnuje
za to.
Je to seznam čísel, nebo tento případ, seznam čísel,
ale může to být seznam čehokoli, ale to je propojeny prostřednictvím šipek,
a jen se hádat s tím, co technika
budeme moci šít dohromady,
něco jako popcorn se závitem, propojené seznamy obdélníky tady?
Její čísla?
Co je základní jazyk funkce?
>> Diváků: Ukazatel.
>> DAVID Malan: Ukazatel.
Takže každý z těchto šipek zde reprezentuje ukazatel nebo jen adresa.
Takže jinými slovy, když budu chtít pro uložení seznam čísel,
Nemůžu jen ukládat, pokud chci, schopnost růst a zmenšit
můj struktura dat v poli.
Tak jsem třeba mít trochu více propracovanost,
nevšimnout, že tento obrázek druh naznačuje,
že pokud jste právě dostali malé závity spojovací všechno dohromady,
asi není tak těžké, aby se prostor mezi dvě z těchto obdélníků
nebo dva z těchto uzlů, jak začneme volat, vložte novou uzlu,
a pak s nějakým novým závitem, jen příkop tři uzly dohromady,
první, poslední, a ten, že jste právě vložena do středu.
>> A vskutku spojový seznam, Na rozdíl od pole, je dynamický.
To může růst, a to může zmenšovat a vy ne
musí znát nebo péči předem, jak mnoho dat budete se skladování,
ale ukázalo se, musíme být trochu Dbejte na to, jak to provést.
Takže nejprve uvažujme, jak implementovat jeden z těchto malých obdélníků.
Je to snadné implementovat int.
Stačí říct int N, a získáte 4 bajty pro int,
ale jak to mám dostat int, říkají n, a pak ukazatel, nazvěme to příště.
Mohli bychom zavolat tito věci, cokoli chceme,
ale potřebuji strukturu vlastní data.
To jo?
>> Diváků: Ampersand [Neslyšitelné].
>> DAVID Malan: Takže ampersand budeme používat k získat adresu uzlu potenciálně.
Ale my potřebujeme další rysem C za účelem
mi dát schopnost vytvářet Tento zvyk obdélník, tento zvyk
Proměnná chcete-li, v paměti.
Diváků: struct.
DAVID Malan: struct.
Připomeňme, od minulého týdne, jsme zavedli struct, tento poměrně jednoduchý klíčové slovo
že nám umožňuje dělat věci, jako je tento.
C nepřišel s daty strukturu zvanou student.
Dodává se s int a plovákem a char a takový, ale to nepřichází s student,
ale můžeme vytvořit typ studenta dat, struktura student, s touto syntaxí
sem.
A budete vidět znovu a znovu.
Takže se nemusíte bát, memorování klíčová slova,
ale klíčové slovo, které je důležité je, jen to, že jsme si řekli, struct
a pak jsme říkali, že studenta a uvnitř studenta bylo jméno a dům
nebo koleji nebo podobně.
>> A tak teď, dnes pojďme navrhnout tohle.
Přidal jsem pár slov, ale pokud chci k provedení tohoto obdélník, který je
dostal oba int a ukazatel, víte co, já jsem
chystá vyhlásit struct názvem uzlu.
Jsem také, uvnitř ní, řekneš že uzel, tento obdélník, má int
a my budeme nazývat n a to má další ukazatel.
A to je trochu upovídaný, ale pokud si myslíte o tom,
šipky, které byly v obraze před chvílí jsou jakého datového typu?
Tam, kde každý z těchto šipek ukazuje jaký typ datové struktury?
Není to jen proto, aby ukázal int per se.
Je to ukazujíc na Celá věc obdélníkový
a že obdélníkový věc, jsme si řekli, se nazývá uzel.
A tak jsme se trochu muset rekurzivně definovat to, jako
že uzel, řekněme, bude obsahovat int názvem n
a ukazatel s názvem další a druh datové struktury, ke kterému
že ukazatel bodů je zřejmě Bude struct uzlu.
>> Tak tohle je protivně upovídaný a prostě být pedantský,
důvod, proč nemůžeme Jen říkám, což upřímně řečeno
vypadá mnohem čitelnější, Je to proto, připomeňme, že C číst
věci shora dolů, zleva doprava.
Není to až dostaneme středník že uzel klíčové slovo skutečně existuje.
Takže pokud chceme mít tento druh cyklické reference uvnitř data
struktura, musíme to udělat, pokud říkáme struct uzel na vrcholu, který
nám dává delší způsob, jak popsat to věc, pak uvnitř říkáme struct uzel,
a poté na poslední řádek říkáme, v pořádku, C, mimochodem,
stačí zavolat celou ta zatracená věc uzel a zastavit
pomocí klíčového slova struct úplně.
Takže je to jen něco jako syntaktický trik, který nakonec nám umožňuje vytvářet
něco, co vypadá přesně takhle.
>> Takže pokud budeme předpokládat, teď můžeme provádět tuto věc C,
Jak máme vlastně začít pojezdu to?
No, ve skutečnosti, všechno, co musíte udělat, je opakovat zleva doprava a jen
druh vložit uzlů nebo odstranit uzly nebo hledat věci, všude tam, kde chceme,
ale k tomu, pojďme do toho a dělat o něco reálnější věci, protože to
byla mimořádně nízké úrovni tak daleko.
By někdo doslova chtěl být první?
DOBŘE.
Pojď nahoru.
Jak se jmenuješ?
>> DAVID: David.
DAVID Malan: David.
Rád tě poznávám.
Já taky.
Dobře.
A my potřebujeme číslo 9.
Ne tak dobrý jako dříve, možná.
OK, číslo 9.
Číslo 17, prosím.
Dovolte mi, abych se vrátit o kousek dál.
Číslo 22, prosím, a Jak se o dál zpět
jestli můžu vidět žádné ruce se všechno světlo, nebo ne.
Někdo se přihlásil právě tam.
Chcete přijít?
Vaše předloktí se násilně stoupá.
OK, 17.
22.
26 přichází dolů.
By někdo jiný chtěl forcefully-- Pojď nahoru.
Skutečný dobrovolník.
>> Takže velmi rychle, je-li vy mohl zařídit
sami stejně jako uzly na obrazovce.
Děkuji.
A budete mít 26.
Všechny správné a rychlé úvody.
Takže jsem David a jste také?
DAVID: David.
DAVID Malan: A vy jste?
JAKE: Jake.
SUE: Sue.
ALEX: Alex.
RAPHAEL: Raphael.
Taylor: Taylor.
DAVID Malan: Taylor.
Výborně.
Tak to jsou naši dobrovolníci pro dnes a pokračovat
a posunout trochu to tak, a prostě jít dopředu a držet
holding vaše čísla jako vy nebo váš První známkou a levou rukou,
jděte do toho a prostě realizovat Tyto šipky, jen
tak, aby vaše levá ruka je doslova ukazuje na co byste se měli ukázat
u, a dát si tak, aby nějaké místo můžeme vizuálně vidět ruce vlastně
bodování, a vy můžete jen bod druh u země je v pořádku.
>> Takže tady máme propojeného seznamu jednoho, dva, tři, čtyři, pět uzly zpočátku,
a všimněte si, máme to zvláštní ukazatel na začátku, kdo je
key protože musíme sledovat celé délce seznamu nějak.
Tihle kluci, a to i přesto, že jste opustili doprava, zády k sobě v paměti,
mohou ve skutečnosti být kdekoli V paměti počítače.
Takže tito lidé mohou být stojící kdekoliv na pódiu
a to je v pořádku, tak dlouho, jak oni jsou ve skutečnosti ukazuje na sebe,
ale udržet věci čistý a jednoduchý, budeme
jen kreslit je zleva doprava, jako , ale mohlo by být masivní mezery
mezi těmito uzly.
>> A teď, když chci opravdu vložit některé nová hodnota, pojďme do toho a to udělat.
Máme příležitost teď zvolit jiný uzel.
Řekněme, pojďme začít s mallocing 55.
Nevadilo by je někdo malloc?
OK, pojď nahoru.
Jak se jmenuješ?
RAINBOW: Duha.
DAVID Malan: Duha?
Dobře.
Malloc Duha.
Pojď nahoru.
Takže teď se musíme ptát sami sebe, algoritmicky kde můžeme dát 55.
Takže všichni víme, samozřejmě, kde nejspíš
Patří-li, že se snažíme aby tento seřazena
a pokud by bylo vy mít jednu krok zpět, takže nemáme spadnout
fáze, to by bylo skvělé.
Takže vlastně, Duha, začít znovu tady se mnou,
proto, že jsme jako počítač nyní může vidět pouze jednu proměnnou najednou.
Takže pokud se jedná o první uzel.
Všimněte si, že to není uzel, je to jen ukazatel,
a to je důvod, proč je třeba věnovat se pouze velikost ukazatele, ne
jeden z těchto plných obdélníků.
Takže jdeme zkontrolovat na sebe iterace je 55 méně než 9?
Ne.
Je 55 méně než 17?
Ne.
Méně než 22?
Méně než 26?
Méně než 34?
A tak teď, samozřejmě Duha patří na závěr.
Tak aby bylo jasno, a to, co bylo vaše jméno, Taylor?
>> Taylor: Taylor.
DAVID Malan: Takže mezi Taylora Levá ruka a rainbow ruce tady,
jehož rukou je třeba poukázat na to, co v Pro vložení 55 do tohoto seznamu?
Co musíme udělat?
To jo?
>> Diváků: Taylor ruka potřebuje k bodu doleva.
>> DAVID Malan: Přesně tak.
Takže vložení uzlu na konec seznamu
je velmi jednoduché, protože právě Taylor má na bod, namísto na zem
nebo budeme nazývat null, null je něco absence
z ukazatele nebo speciální nulový ukazatel, že jste
jít k bodu s vaší levici ruka Rainbow a pak Rainbow,
kde by měla být vaše doleva ruka pravděpodobně bod?
Down.
Není to dobré, když její ruka je trochu ukazování zde, nebo tak nějak jakékoliv off
jakým způsobem.
Které by bylo považováno hodnota odpadky,
ale když poukazuje na Některé známé hodnoty, budeme
nazývají nula nebo null, to je v pořádku protože máme termín v tom
a víme, že seznam je nyní kompletní.
>> Takže to, co je další poměrně jednoduchý případ?
Mohli bychom malloc 5?
Pojď nahoru.
Jak se jmenuješ?
TIFFANY: Tiffany.
DAVID Malan: Je mi to líto?
TIFFANY: Tiffany.
DAVID Malan: Tiffany.
Dobře.
Tiffany byla malloced s hodnotou 5.
Pojď nahoru.
Tohle je relativně snadné taky, ale uvažujme pořadí operací teď.
Bylo to docela snadné s Taylorem na konci.
Číslo 5 je samozřejmě menší než 9, a tak máme Davida, máme Tiffany,
a jaká byla vaše jméno?
>> JAKE: Jake.
>> DAVID Malan: Jake.
Tiffany Jake, a David.
Čí ruka by měly být aktualizovány jako první?
Co chceš dělat?
Je tu pár možné způsoby, ale tam je také jeden nebo více špatné cesty.
>> Diváků: Začněte s zcela vlevo.
>> DAVID Malan: Začněte zcela vlevo.
Kdo je tady vlevo pak?
Diváků: První.
>> DAVID Malan: OK.
Takže začít s prvním a kam vás Chcete aktualizovat Davidovi ruce být?
Diváků: Směrem k 5.
DAVID Malan: OK.
A tak David, bod v pět nebo Tiffany tady a teď?
>> Diváků: Tiffany poukazuje na 9?
DAVID Malan: Perfect, s výjimkou Binky je Hlava tak nějak spadl, že jo?
Vzhledem k tomu, co je špatně tento obrázek doslova?
Diváků: Nic se ukázal.
DAVID Malan: Nic není ukázal na Jakem teď.
My jsme doslova osiřelý 9 a 17, a my jsme doslova
unikly všechny této paměti, protože tím, První aktualizace Davidovu ruku, to je
pořádku, pokud je to správně ukázal na Tiffany teď,
ale pokud nikdo měl předvídavost poukázat na Jakea,
pak jsme ztratili celistvost tohoto seznamu.
Takže pojďme vrátit zpět.
Takže to byla dobrá věc, zakopnout ale pojďme napravit nyní.
Co bychom měli udělat jako první místo?
To jo?
>> Diváků: Tiffany by měl ukázat na 9?
DAVID Malan: Nemohu dostat, že blízko k vám.
Kdo by měl ukázat na 9?
>> Diváků: Tiffany.
>> DAVID Malan: Dobře.
Takže Tiffany by První bod na 9.
Takže Tiffany by měly přijmout na stejnou hodnotu
Davidovi, který se zdá redundantní na chvíli,
ale to je v pořádku, protože hned druhý krok, můžeme aktualizovat Davidovu ruku
poukázat na Tiffany, a pak v případě my tak nějak čisté věci nahoru
jako by toto je druh jaro-jako, Nyní to je správné vložení.
Tak vynikající.
Jsme skoro tam, takže teď máme.
Pojďme vložte jeden finále hodnota jako hodnota 20.
Kdybychom mohli malloc jednu závěrečnou dobrovolník?
Pojď nahoru.
Tak tohle je trochu složitější.
Ale vážně, kód jsme psaní, i když slovně,
je stejně jako mít hromadu ze pokud to podmínky, ne?
Měli jsme podmínku kontrolovat, zda patří
na konci, možná na počátku.
Potřebujeme nějaký druh smyčky najít místo uprostřed.
Takže pojďme to udělat s Jak se jmenujete?
>> ERIC: Eric.
>> DAVID Malan: Eric?
Eriku.
Rád tě poznávám.
Takže máme 20.
Méně než pět?
Ne.
Méně než devět?
Ne.
Méně než 17?
Ne.
DOBŘE.
On sem patří, a Vaše jména jsou opět?
SUE: Sue.
DAVID Malan: Sue.
ALEX: Alex.
DAVID Malan: Sue, Alex, a?
ERIC: Eric.
DAVID Malan: Eric.
Potřebujete, abyste mohli aktualizovat jako první, jejichž ruce?
>> Diváků: Eric.
DOBŘE.
Takže Eric to by měla ukazovat na to, kde?
Na 22.
Dobrý.
A teď, co bude dál?
Sue pak mohou poukázat na Eric a teď, pokud jste kluci jen
udělat nějaký prostor, což je v pořádku vizuálně, teď jsme udělali vložení.
Takže pojďme teď posouzení otázky, ale děkuji moc za naše dobrovolníky.
Velmi dobře.
Si můžete nechat ty, pokud se vám líbí.
A máme krásný dárek na rozloučenou, pokud byste každý rád, aby se stres míček.
Dovolte mi to projít dolů.
Takže to, co je stánek s jídlem to?
To se zdá být úžasná pokud máme nyní
představil alternativu k Pole, které není tak omezen
na matici nějakého pevnou velikost.
Mohou dorůst dynamicky.
>> Ale podobně jako jsme viděli v týdnech minulost, jsme se nikdy dostat něco zadarmo,
stejně jako určitě tam je trade-off zde.
Takže se vzhůru propojeného seznam, je tato dynamika?
Tato schopnost růst a upřímně řečeno, jsme mohli udělat delete
a tak bychom mohli zmenšovat podle potřeby.
Jakou cenu platíme?
Dvakrát tolik prostoru, první ze všech.
Pokud se podíváte na obrázek, už ne jsem ukládání seznam celých čísel.
Jsem ukládání seznam celá čísla plus ukazatele.
Takže jsem zdvojnásobení množství prostoru.
Nyní, možná to není tak velký problém 4 bajtů, 8 bajtů,
ale mohla by určitě přidat up pro velké soubory dat.
Co je další nevýhoda?
To jo?
>> Diváků: Musíme přejít jim jeden po druhém.
DAVID Malan: Jo.
Musíme je projít jeden po druhém.
Víš co, jsme se vzdali tento super užitečná funkce z hranatých závorkách
notace, více vhodně známý jako náhodný přístup,
kde si můžeme jen skok na jednotlivé elementy
ale teď, když jsem ještě měl moje dobrovolníci zde,
kdybych chtěl najít číslo 22, nemohu jen
skočit na držák něco něco.
Musím se podívat přes seznam, hodně jako lineárně našich vyhledávacích příkladů,
najít číslo 22.
Takže se zdá, že zaplatili cenu tam.
Ale můžeme přesto vyřešit další problémy.
>> Ve skutečnosti, dovolte mi představit jen pár vizuální.
Takže pokud jste byli dolů Mather jídelně v poslední době,
budete připomenout, že jejich stohy zásobníků, jako je tato,
Půjčili jsme tyto od Annenberg před třídy.
Takže tento sloupec podložek, i když, je vlastně reprezentativní
datové struktury počítačové vědy.
K dispozici je datová struktura v informatice
známý jako zásobník, který velmi pěkně půjčuje sebe přesně to vizuální.
Takže pokud každý z těchto zásobníků není zásobník, ale stejně jako řada a já jsem chtěl,
uložení telefonních čísel, já mohl dát tu jeden dolů,
a já jsem mohl dát další tady, a pokračovat stohování čísla
nad sebou, a to, co je potenciálně užitečné o tom
je to, že to, co je implikace této datové struktury?
Které číslo můžu vytáhnout První nejvýhodněji?
Nejvíce v současnosti jeden dal tam.
>> Takže to je to, co bychom nazvali v informatika datová struktura LIFO.
Last in, first out.
A uvidíme zanedlouho, proč to by mohlo být užitečné, ale pro tuto chvíli,
zvaž vlastnost.
A je to trochu hloupé, pokud si myslíte, o tom, jak ji jídelna dělá.
Pokaždé, když čisté podnosy a dal nejčerstvější ty na vrcholu,
Ty by mohly mít dříve čisté ale nakonec velmi špinavé a zaprášené
zásobník na samém dně Pokud jste nikdy vlastně
dostat se až na dno, které stack, protože jste právě
udržet uvedení nové a Čisté ty, na vrcholu toho.
Stejná věc se může stát v supermarketu příliš.
Pokud máte vitrínu mléka a pokaždé CVS
nebo ten, kdo dostane více mléka, stačí strčit mléka
že již máte na zadní straně a dáte nové vpředu,
budete mít některé docela ošklivé mléko na konci datové struktury,
protože je to vždy na dně nebo ekvivalentně to je vždy na zadní straně.
>> Ale je tu jiný způsob, jak přemýšlet o tom, čekají, až data a například tento.
Pokud jste jeden z těch lidí, kdo má rád na line up mimo obchodech Apple
když nový výrobek pochází out, budete pravděpodobně
bez použití zásobníku dat struktura, protože vás
by odcizit všichni ostatní, kdo je seřazovat koupit nějakou novou hračku.
Spíše, budete pravděpodobně používat jaký druh datové struktury
nebo jaký druh systému v reálném světě?
Doufejme, že je to čára, nebo více správně nebo více Britové-like, fronta.
A ukázalo se, fronta je také struktura dat v informatice,
ale fronta má velmi jiný majetek.
Není to LIFO.
Last in, first out.
Chraň Bůh.
Je to místo FIFO.
První dovnitř, první ven.
A to je dobrá věc na poctivosti "kvůli
jistě, když jste obložení up Super brzy ráno.
Pokud se tam dostat jako první, chtějí se dostat ven nejprve stejně.
>> A tak se všechny z těchto údajů struktury, fronty a komíny
a svazky jiných, dopadá vás můžete myslet na to jako jen pole.
Toto je pole, možná pevnou velikost 4, ale to by
být docela hezké, kdybychom mohli jen hromadu podnosy téměř nekonečně vysoký kdybychom
mají, že mnoho zásobníky nebo čísla.
Takže možná chceme použijte propojeného seznamu tady,
ale trade-off se bude potenciálně, že potřebujeme více paměti,
zabere trochu více času, ale my neomezují výšku stohu,
podobně jako Mather v vitríně může omezit velikost stohu,
a proto se jedná o rozhodnutí návrhu nebo dostupné možnosti k nám nakonec.
Takže s těmito údaji struktury, jsme začali
vidění nová horní hranice potenciálně na to, co dříve bylo velmi rychlé
a kde necháme off ještě dnes a kde
budeme doufat, že se dostat do je ve středu, budeme
začít hledat na datech struktura, která nám umožňuje vyhledávat
prostřednictvím dat v čase konečného znovu přihlásit.
A my jsme viděli, že, vzpomínám, v týdnu nula a jeden s binární vyhledávání nebo dělení
a dobýt.
Je to vrací, a ještě lépe, svatý grál pro tuto středu
bude přijít s Datová struktura, která běží skutečně
nebo teoreticky konstantní čas, přičemž
nezáleží na tom, kolik milióny či miliardy věcí
máme v datové struktuře, to bude trvat nás konstantní čas, možná jeden krok
nebo dva kroky, nebo 10 kroků, ale konstantní počet kroků
prohledávat této struktury dat.
To samozřejmě bude svatý grál ale o tom ve středu.
Uvidíme se pak.
>> [Přehrávání hudby]