>> [Prehrávanie hudby]
>> David J. Malan: Tak to je CS50 a to je začiatok týždňa päť.
Takže dnes, pod svojím sedákov, nenájdete nič.
Ale predovšetkým, mali by ste si nájsť to, malý prejav nášho uznania za
všetky práce, ktoré ste vložili do hry pätnástich.
Jednoducho odstráňte malý kruh na Spodná začať hrať
Zvyšok triedy.
>> Takže pripomínam, že ani vedieť, že nastavenie problém štyri, ktorý vyšiel tento víkend,
zahŕňa písať ďalšiu hru.
Ale tentoraz to zahŕňa použitie Aktuálne grafické užívateľské rozhranie, a to
textové rozhranie, ako Hra Fifteen.
A hra, ktorá leží pred vami, ak ste ešte nevidel to ďalej,
Vyzerá trochu niečo takého.
Chystám sa ísť do môjho terminálu okná tu v GDB.
A ja idem dopredu a spustite personál riešenie, ktoré môžete pristupovať
Po spustení aktualizácie 50 ako obvykle.
>> Ale ja idem dať do trochu tajný režim, trochu veľkonočné vajíčko,
tzv nesmrteľnosť, by uvedenie Boha argv1.
A musím riadiť svoje vlastné usmernenia, beží to v mojej vlastnej
problém nastaviť adresár.
Takže teraz vidíte kompletnú verziu z hry Breakout.
V skutočnosti je to ne-ruke režim.
Takže je to vlastne -
ohromení keď môže byť -
celkom triviálne realizovať Boha režim, vo Breakout, na rozdiel od hry pätnástich,
ktoré niektorí z vás mohli riešiť pre hackera vydanie.
>> V Breakout postačuje v Boha Režim jednoducho robiť to, čo,
intuitívne s pádlom?
Len sa to rovná bez ohľadu na vodorovná poloha je lopta.
A tak dlho, ako si to ako jeden muž sa lopta v pohybe táto hra
Nikdy, nikdy, nikdy ujsť loptu a budete zakaždým vyhrať.
>> Ale v tomto týždni hacker vydania je to viac než len režim Boha.
K dispozícii je celý rad ďalších funkcií.
Medzi nimi, lasery.
Takže ak ste naozaj netrpezlivý si môže začať zostrelenie tehly
a niekoľko ďalších.
A pre tých z vás, ktorí by chceli kalibráciu štandardu oproti Hacker
vydanie, vidím, že tento týždeň hacker vydanie zámerne je
trochu uskutočniteľné, povedzme, ako Boh Režim bol s Game of Fifteen.
>> Takže ak hľadáte úseku a hľadáte nejakú ďalšiu zábavu
vlastnosti sa potápať v prípade záujmu.
Teraz viac prakticky, dovoľte mi pripomenúť, na jednu vec rovnako.
GDB, ktorý niektorí z vás nemusia mať ešte dotkla osobne, čo je v poriadku.
Ale teraz je naozaj čas si zvyknúť na to a pohodlne s týmto nástrojom
, Pretože to bude vaše životy oveľa jednoduchšie, naozaj.
>> Na prednáške Roba o GDB pár týždne, spomínam
že GDB je debugger.
Je to nástroj, ktorý vám umožní spúšťať vaše Program ale nechajte ju krok za krokom, riadok
po riadku, takže môžete hrabať okolo seba, takže vidíte, čo sa deje, a tak
ktoré si môžete vytlačiť hodnoty premenných.
Stručne povedané, to vám dáva oveľa viac energie ako printDef robí.
>> Teraz síce rozhranie je dosť tajomný.
Čierna a biela textové rozhranie z väčšej časti.
Príkazy sú trochu ťažké pamätať na prvom mieste.
Ale aj keď to môže trvať do polovice hodina, hodina, aby to vopred
investície času na to, ver mi.
Iste by semestra nakoniec ušetrí ste rádovo viac
času než to.
>> Takže na začiatku týždňa ponoru palcov
A čo sa týka Breakout, viem, že ste môže to tak dlho, kým budete mať
distribúcia kód alebo vlastný kód Prebieha vo vašej Pst4 adresára.
Vedzte, že môžete spustiť gdb. / Breakout.
>> To bude otvárať okno takhle.
Dovoľte mi, aby som sám seba viac z terminálu.
A čo potom budem pokračovať a robiť, že to nie je len spustiť.
Chystám sa najprv nastaviť bod prerušenia Pripomeňme, ktorý umožňuje pozastaviť
prevedenie na určitom mieste.
>> Len aby to jednoduché idem rozbiť na linke jedna jednoduchým zadaním
číslo jedna.
Dovoľte mi, aby som vlastne znovu otvoriť toto okno pretože je to stále
malý malý tam.
Takže to, čo som teraz robiť je tu keď otvoria svoje okno terminálu.
Poď, ideme na to.
>> Takže teraz, ak sa vrátim do Dropbox, Pst4 a spustiť gdb. / breakout vstúpiť, všimnite si,
Chystám sa zlomiť jeden pre nastavenie bod zlomu na linke jedna.
A teraz idem dopredu a typ spustenia.
A keď sa mi to, všimnite si, nič Zdá sa, že sa stalo.
>> Neexistuje žiadny pop-up.
Neexistuje žiadny grafický užívateľské rozhranie ešte.
Ale to je pochopiteľné, pretože som doslova na linke jedna v mojom programe.
A všimnite si, že som sa rýchlo odovzdaná, konkrétne sa na 62, pretože všetky
veci v hornej časti tohto súboru je veci ako pripomienky a konštánt a
nezaujímavé veci pre teraz.
>> Takže teraz som vnútri hlavné, Zdá sa, že na riadku 62.
A to je len rozdelenie kód odvolanie.
Keď otvorím môžete ísť, podobne, do môjho rozbaľovacieho zoznamu adresára do Pst4,
do breakout.c.
A keby som prejdite dole a dole a dole, a nechaj ma ísť dopredu a zapnúť
moje čísla riadkov.
>> Čo uvidím, či by som prejdite na linka 62 je presne ten riadok, ktorý
sme sa zastavil na.
Takže tento riadok tu, 62, je kde sa chystáme byť.
Takže teraz v GDB, keď pôjdem napred a zadajte teraz ďalší, zadajte, že to bude
vykonanie tohto riadku.
A voila, máme tzv g okno.
Ak oboznámení s tým, čo GWindow je, nie sa báť.
Spec vás zoznámi s tým, ako rovnako ako počet Walkthrough videá
vložené do spec.
>> Ale teraz poďme urobiť to trochu zaujímavejšie.
Dovoľte mi, aby som presunúť okno na na stranu trochu.
Dovoľte mi, aby som oknu trochu väčšie, takže vidím viac.
>> A teraz mi dovoľte pokračovať a ďalej znova.
A tam sú moje tehly.
Keď píšem ďalší zase teraz vidím loptu.
A keď píšem ďalší zase teraz vidím, pádlo.
>> A našťastie to gedit nie je Naozaj spoluprácu tým, že ukazuje mi
všetko, čo chcem.
Ale teraz keď mám robiť ďalej znova, ďalší zase, ja som len
deklarovanie niektoré premenné.
A môžem vytlačiť jednu z týchto chalanov.
Tlač tehly, výtlačky životoch.
>> A teraz keď som v tom pokračovať ďalšie, všimnite si, že budem
Vnútri tejto slučky.
Ale kód bude vykonávať presne tak, ako som čakať.
Takže keď som narazila túto funkciu, počkajte Pre Click, že to bude robiť
doslova, že.
Tak som zrejme stratil kontrolu na programe.
>> GDB nie je, že mi ďalší riadok.
Ale nie sa báť.
Prejdite na svoju hru, kliknite kamkoľvek.
>> A voila, teraz pokračuje na linku 86.
Takže znova, je to neoceniteľná, nakoniec, pre ladenie problémov.
Pretože môžete doslova prechádzať Váš kód, tlačové veci a oveľa,
oveľa viac.
Ale teraz, tieto nástroje samy o sebe by vám dosť ďaleko.
>> Takže sme, samozrejme, že pohľad Grafika na teraz, všetci naraz.
A teraz náš svet je trochu zaujímavejšie.
A vieš, možno z niektorých Videa online, ktoré máme tieto
šortky, ktoré ste sledovali ako súčasť základnej problémové okruhy.
>> A že som bol zastrelený, a to úmyselne, proti bielemu pozadia.
A niektoré z nich majú výučbu Fellows kreslenie nejaký text na
Obrazovka, ktorá je prekrytá na ich vnútornej strane.
Ale samozrejme, je to, že nie všetky zaujímavé, v reálnom svete.
To je len prednášková sála s veľká biela obrazovka a pozadia.
A náš úžasný produkčný tím triedenie zo je všetko pristane
po faktu orezanie z alebo prekrývanie nič
robíme, alebo nechceme.
>> Teraz už len stačí motivovať tento týždeň Naozaj, kam môžete ísť, nakoniec,
s informatike.
Nielen po probléme nastaviť štyri.
Ale po inom kurze alebo celého Kurikulum je to úžasné, čo všetko môžete
robiť v týchto dňoch, pokiaľ ide o grafika zvlášť.
>> Niektorí z vás možno videli toto tečie okolo on-line.
Ale myslel som, že ukážem, len za pár minút, letmý pohľad na to, čo
výpočtovej techniky a čo CGI, počítačová grafika môže robiť v týchto dňoch
sa známym pieseň a možno aj film.
>> [MUSIC - LANA DEL RAY, "Mladá a krásna]
>> SPEAKER 1: Je to len trochu úžasný, snáď, ako
všadeprítomný -
>> [APPLAUSE]
>> SPEAKER 1: Stiahol som si to.
Ale je to naozaj úžasné, myslím, že práve ako všadeprítomný softvér a kód a
nástroje, ako je to v skutočnosti.
Takže je to chuť smeru v ktorom môžete ísť.
Oh, nie viac zariadení dnes.
No, to je skutočne tragická načasovanie vzhľadom k bodu som sa snažil urobiť.
>> Dobre, tak sa poďme spustiť Fusion znova.
Pripomenúť neskôr.
Dobre, a mali by ste sa dostali email ako stranou, ak ste si
Všimnite si takto.
Dobre, takže pripomínam, že minulý týždeň sme začali olúpte to
neskôr známy ako reťazec.
>> string pripomína dátový typ, ktorý je vyhlásil v CS50 knižnici.
A to je časť koliesok že teraz začne vzlietnuť.
Bol to užitočný koncept čoskoro.
Ale teraz to bude získať viac zaujímavejšie a silný
skutočne vidieť, že pod kapotou reťazec je práve to, čo, to sme si povedali?
>> Jo, je to tzv char *.
A * sa označuje, že je nejaký druh adresu zapojiť.
A tak, keď hovoríte, char * stačí povedať premenná ktorej dátový typ je
ukazovateľ teraz.
Skutočnosť, že je hviezda tu jednoducho znamená, že prohašuješ
tzv ukazovateľ.
A že ukazovateľ bude zrejme uložiť adresu, na
Samozrejme, char.
>> A teraz, prečo to zmysel?
No, a čo je reťazec pod kapotou?
No, nejakú dobu sme hovorili že reťazec je pod kapotou
len h-e-l-l-o, napríklad.
>> Ale my sme o tom hovorili ako je v podstate poľa.
A pole by potom vyzerať trochu ďalšie podobné, pričom každá z nich
nástupu do sústo.
A potom sme povedali, že je tu niečo zvláštneho sem,
spätné lomítko 0 alebo null terminátor.
>> Takže celú tú dobu, tohle je reťazec.
Ale v skutočnosti je reťazec vlastne adresu.
A adresy, ako uvidíme, sú často s predponou 0x konvencií.
Čo 0x naznačovať?
Vie to niekto?
>> Tak to jednoducho znamená, šestnástkovej.
Takže si možno pamätáte, vlastne od PST 1. Verím, že jedným z warm-up
otázky vlastne pýtal hexadecimálny zápis okrem
binárne a desiatkovej.
A motivácia je, že s hexadecimálne máte 16
číslice k dispozícii.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, po od a, b, c, d, e, f
>> A ak budete počítať všetky tie hore, získate celkom 16.
Tak to je v rozpore s desatinné číslo, kde máme 10
číslice, 0 až deväť.
Je to v rozpore s binárnym kde sme len 0 a 1.
>> Ale na konci dňa si môžete len predstavujú rovnaké čísla, ale
trochu inak.
A hexadecimálne je časté, pretože ako to dopadá - a uvidíme to
neskôr v priebehu - aj keď sme sa na webové programovanie v rámci
HTML a farebné kódy, hexadecimálny je pekná.
Pretože každá číslica, ukazuje, predstavuje štyri bity dokonale.
Tak to tak nejako liniek pekne ako budeme nakoniec vidieť.
Takže to môže byť Ox123 alebo tak niečo ako to, že označuje adresa 123
niekde vnútri môjho pamäte počítača.
>> Samozrejme, niektoré problémy vznikajú pretože toto základné
implementácia.
A pripomínam, že som nahodil na vykonávanie funkcie, ako je tento -
porovnať palubný 0 dot c minulý týždeň, že aj keď to vyzeralo, že to bolo
Dobre, to jednoducho nie je v porovnaní dva reťazce správne.
>> Som zahodil hlavné, a ja som hodil preč pripomienky len zamerať sa na
kód, ktorý je v záujme tu.
A to je v červenej farbe, pretože je to kočík.
Z akého dôvodu?
>> No, hore tam, keď som vyhlásil, reťazec, čo sa naozaj deje
pod kapotou?
No, dovoľte mi prejsť na obrazovky, a kresliť to.
Tak som vyhlásil znova, reťazca s GetString.
>> Takže budem pokračovať a teraz kresliť s pre čo to vlastne je.
To bude štvorec tu.
A budem tvrdiť, , Že to je 32 bitov.
Aspoň to obvykle je, aspoň na CS50
spotrebič v mnohých počítačov.
Budem hovoriť to.
>> Ale teraz spomínam, že sme volal GetString.
Takže GetString vracia, Samozrejme, reťazec.
V prípade, že používateľ zadá h-e-l-l-o zadanie reťazec ahoj dostane sa vrátil.
A to reťazec, ako sme práve povedal, končí niekde v pamäti počítača
s lomítkom 0 na konci.
Budem kresliť to ako pole - alebo súvislý blok znakov -
že to vlastne je.
>> A teraz, čo je getString vlastne vracia?
Čo GetString vracajú celú dobu?
No, povedzme, v týždňoch pred, vráti reťazec.
Ale technicky, čo robí GetString návrat zdanlivo?
>> Divákov: adresa.
>> SPEAKER 1: adresa.
Konkrétne sa vráti adresu prvé sústo, nech je to čokoľvek.
Len som naďalej používať jednu, dve, tri pretože je to pohodlnejšie.
>> Vracia adresu prvej znak v reťazci.
A my sme minulý týždeň uviedol, že , Že je postačujúce.
Vzhľadom k tomu môžeme vždy prísť na to, kde koniec reťazca len tým, že
iterácie, možno sa pre slučka alebo while, alebo niečo také
, Že len hľadá "lomítkom 0", špeciálny sentinel charakter.
>> A potom vieme, že reťazec sa stane, že dĺžky -
V tomto prípade -
päť.
Takže technicky to, čo robí GetString ich vráti Ox123 v tomto prípade.
A technicky čo sa stane, je potom že budeme ukladať, vo vnútri s, Ox123.
Na konci dňa, aj keď to je nový koncept, ukazovatele, sú
len premenné.
Ale stalo ukladať bity dohromady predstavujú adresu.
Takže technicky všetko, čo dostane uložené v s je Ox123.
>> Ale my ako ľudia -
vrátane dnes ďalej -
naozaj nebude starať, typicky, čo je skutočná adresa
nejakého kusu pamäti.
Je to len na nízkej úrovni detailu byť intelektuálne zaujímavé.
Takže idem vrátiť späť.
A miesto, viac na vysokej úrovni, stačí povedať že keď hovoríme o ukazovatele
Budem len kresliť viac užívateľsky príjemný šípka, ktorá vyjadruje
Rovnaký nápad a abstrakty ďaleko, že údaje, aké sú skutočné
základná adresa.
>> Teraz, keď sa vrátime do kódu, čo sa stalo minulý týždeň, ak máme reťazec t
rovná GetString?
No, keby som znova zadajte ahoj Tentoraz budem mať
ďalší kus pamäte.
h-e-l-l-o spätné lomítko 0.
>> Ale pretože som volal getString druhýkrát -
a viem, že to z pohľadu na Zdrojový kód getString - aj
aj keď je to náhodou, že bol ahoj zadali dvakrát, GetString nie je
bude snažiť optimalizovať a byť šikovný.
Je to jednoducho dostane ďalší kus pamäť z počítača, ktorý je
bude na inej adrese.
Poďme ľubovoľne stačí povedať 456.
>> A potom, čo sa to deje vrátiť?
Bude to návrat 456 a uložte ho na t
Takže to, čo sa naozaj deje, na ľavá strana je mám iný kus
pamäti, typicky 32 bitov.
A tam sa chystá ísť Ox456.
Ale znovu opakujem, nemám záujem v týchto konkrétne čísla ešte.
Ja som jednoducho ísť abstraktne kresliť ako šíp.
>> Tak to je teraz nová vysvetlenie.
Ale je to presne rovnaký názor, že je dialo celú tú dobu.
A tak dôvod sa teda, že tento prvý verzia Compare bol kočík
minulý týždeň sa prečo?
Keď to urobíte, ak je rovná rovná t, čo sa naozaj
pod pokrievku porovnanie?
>> Tie porovnaním adresy.
A len intuitívne, jasne, Ox123 nebude rovnaké Ox456.
Tieto čísla, tieto bity sú jednoducho iné.
>> A tak dôsledne, minulý týždeň povedal, Zadáte rôzne veci, a to aj v prípade, že
slová doslovne rovnaká.
Tak sme sa opraviť.
Laicky povedané, čo je oprava?
>> DIVÁKOV: Použite funkciu.
>> SPEAKER 1: Použite funkciu.
Alebo hviezdy sú rozhodne zúčastňuje, ale použiť funkciu robiť čo?
>> DIVÁKOV: Pre porovnanie reťazcov.
>> SPEAKER 1: Pre porovnanie reťazcov.
Takže zásadný problém tu bol že som sa práve s ohľadom na
Kvalita reťazcov, ktoré budú definované porovnanie ich adresy.
A samozrejme to je len hlúpy teraz jednou aby ste pochopili, čo sa deje
pod kapotou.
Ak chcete naozaj nákupný reťazcov, či sú rovné tým spôsobom, že ľudské
by za dva reťazce sa rovná musíme porovnať im postavu
znak pre znak.
>> Teraz som mohol urobiť Jedná sa o veľmi zdĺhavo.
Ale dôverne, sme pomocou slučky for.
A stačí porovnať s držiak i proti t držiaku i
Držiak je aj plus 1 proti t držiaku i a 1, a tak ďalej, v
nejaké slučky.
A keď som sa zistiť akékoľvek dva znaky, ktoré sa líši, alebo ak si uvedomujem, že ooh, s je
kratšie než T alebo dlhšia ako t Ja môžem okamžite povedať nepravdivé,
že to nie je to isté.
>> Ale keď som sa prejsť na S a T a povedal rovnaký, rovnaký, rovnaký, rovnaký, rovnaký, koniec
oba reťazce, môžem povedať, Je pravda, že sú rovnaké.
No, našťastie, pred rokmi niekto napísal, že kód pre nás.
>> A oni hovorili StrComp pre reťazec porovnanie.
A aj keď je to trochu proti intuitívne, StrComp vráti 0, ak sú
dva reťazce, s a t sú rovnaké.
Ale vráti zápornú hodnotu, ak je by mala prísť pred t abecedne alebo
kladná hodnota, ak by mala prísť po t abecedne.
>> Takže ak ste niekedy chceli zorganizovať niečo, ukázalo sa, že je užitočné StrComp.
Pretože to nie je len povedať, áno alebo nie, ktorá sa rovná alebo nie.
To vám dáva pocit objednávanie podobne ako v slovníku silu.
Takže StrComp, s čiarka t sa rovná 0 znamená, že sa rovná
Reťazce sú naozaj rovnaké.
Pretože ten, kto napísal túto funkciu rokmi pravdepodobne použitá pre sláčiky
alebo while, alebo niečo také integrovať nad znaky znova
a znova a znova.
>> Ale problém dve storočia tu vyrástla.
To bolo copy0.c.
A dva červeno je pretože to je chybný.
A čo tu robíme?
No, najprv som volal getString.
A ja uložená návratovú hodnotu v sekundách.
Tak to je skoro rovnaké ako táto horná časť obrazu.
>> Ale to, čo príde potom?
No, dovoľte mi ísť dopredu a zbaviť z celej banda to.
Budeme dozadu v čase, kedy sme práve majú s, ktorý je teraz v súlade s
linka jeden tam.
>> Aj skontrolovať.
Pokiaľ je rovná rovná 0.
Teraz rýchlo okrajová poznámka, keď môže vrátiť GetString 0?
K dispozícii je dostatok pamäte.
Je to tak?
>> Je to vzácne, že sa to stane, Určite na počítači, ktorý je
mám stovky megs alebo dokonca giga RAM.
Ale mohlo by, teoreticky, vráti 0, a to najmä v prípade, že
užívateľ nespolupracuje.
Existuje spôsob, ako predstierať, že nemáte Zadaný čokoľvek a trik
GetString k návratu 0 efektívne.
>> Takže to bude kontrolovať, že.
Pretože ak niekto z vás začali sa už, segmentácia poruchy -
ktorý bol pravdepodobne zdrojom nejaké frustrácie -
tie sú takmer vždy výsledkom pamäti súvisiace chyby.
Nejako si spackal s ohľadom na ukazovateľ, aj keď ste si neuvedomil,
bol ukazovateľ.
Takže môžete mať vyvolané segmentáciu chyby sú už prvý týždeň pomocou
niečo ako pre sláčiky alebo v stave slučka a pole tým, že ide príliš ďaleko
okolo hranice niektorých polia, ktoré ste deklarovali v týždni dva v
zvlášť.
>> Môžete to urobiť aj problém nastaviť štyri s Breakout.
Aj keď ste možno ešte nevideli všetky hviezdy v distribučnej kódu pre
Breakout, sa ukazuje, že tí, GRect a goval a iné takéto veci,
tie sú vlastne ukazovatele pod kapotou.
>> Ale Stanford, rovnako ako my, tak nejako kožou ktorý podrobne uvedie prinajmenšom pre knižnice
účely, rovnako ako my reťazca a char *.
Ale GRect a goval a všetky z nich čo vy ste, alebo bude používať
Tento týždeň sú nakoniec adresy pamäte.
Proste to neviem.
>> Takže to nie je divu, snáď, že by ste mohli zakopnúť niektoré
segmentácia chyby.
Ale čo je zaujímavé, tu, ak potom, ako skontrolovať, čo robíme 0
string t dostane s
No, dovoľte mi vyhlásiť t
Chystám sa kresliť ako štvorec, 32 bitov, hovoria t
A potom budem robiť, dostane s
>> No, čo to znamená?
No, je to trochu ťažké, že o tom si predstaviť múdre.
Ale poďme premýšľať o tom, to, čo je vnútri X?
Čo je doslova vnútri tejto premennej?
Hodnota Ox123.
>> Takže keď poviem, string t dostane s, že práve doslovne znamená vziať číslo
v s, čo je Ox123 a dať to Ox123.
Alebo obrazovo, keď som trochu abstraktné od toho, že má informáciu
Vplyv doslova robiť to tiež.
>> Takže teraz, myslím, že späť do minulého týždňa, kedy sme pristúpili k kapitalistického T. Aj
to T držiak 0.
No, T držiak 0, aj keď je to ukazovateľ, môžete zaobchádzať, ako by
je to pole, s námestí držiak notácie.
>> Tak kde je T držiak 0?
No, je to h
A tak keď sme sa použiť tento riadok kódu, dve horné, ktorá je v tomto c type.h
hlavičkový súbor, to je miesto, kde to vyhlásil.
Ste zarábaní túto H. Ale Samozrejme, že je to presne rovnaký h to
vnútri s, aby som tak povedal.
A tak teraz ste zmenili alebo Aktivácia pôvodné i
tzv kópie.
Pretože ste neurobili kópiu v spôsobom, že človek by chcel, aby to bolo.
>> Takže to, čo bolo tu fix, v copy1.c minulý týždeň?
Funkcie, takže sme mohli vlastne kopírovať reťazec.
A v podstate, čo musíme urobiť, aby sa kopírovať reťazec?
>> No, v tomto zelenom prevedení tu som robiť to pomerne nízkej úrovni.
Tam sú vlastne funkcie by mohli pomôcť s týmto.
Ale tie základné, a najviac pozná jeden, aspoň bude čoskoro
poznáme, je nasledovné -
takže je na prvom riadku kódu v zelenom teraz.
>> Len som prepísal s ako char *.
Nie je funkčný rozdiel tam.
Len som zahodil CS50 knižnice a Volám to, čo je, char *.
>> Teraz bodka, bodka, bodka, pretože tam boli niektoré kontrola chýb, že to nie je
zaujímavé rozprávanie o znovu.
Takže teraz t je deklarovaná.
To je tiež char *.
Tak som vytiahol malý štvorec na obrazovka ako predtým.
>> Ale na pravej strane, malloc, sme si povedali, je pamäť alokovať.
Takže prideliť nejaký kus pamäte.
A koľko bajtov my vlastne chcete vyhradiť, to vyzerá?
>> No, dĺžka reťazca s
Takže ak je to ahoj to je bude päť.
Povieme, že h-e-l-l-o.
Takže päť bajtov.
>> Ale potom naviac 1, prečo jeden?
0 charakteru.
Ak nebudeme ponechať priestor pre toho chlapa sme môže náhodne vytvoriť situáciu,
kde reťazec je h-e-l-l-o.
A potom nabudúce GetString je volal a ja zadajte napríklad
David, D-a-v-i-d, ktorý počítač bude myslieť si, že to je vlastne
h-e-l-l-o-d-a-v-i-d, pretože tam bez prerušenia medzi týmito slovami.
>> Takže musíme tú pauzu.
Takže nechceme päť.
Chceme šesť bajtov.
>> A bajtov hovorím.
Ale je to naozaj čas veľkosť char.
Technicky char je takmer vždy jeden byte.
>> Ale len preto, aby náš kód prenosné, aby som tak povedal, tak, že to funguje na
rôznych počítačov, aj keď by mohli byť trochu odlišný pod
kapucňa, budem všeobecne povedať veľkosť char, aby
môj kód vždy funguje.
A nemám překompilovat to len pretože som upgradovať svoj počítač alebo pomocou
nejaké iné platforme.
>> Tak som dostal 6 krát veľkosť char, ktorý sa stane byť jeden.
Takže to znamená, že by malloc Dajte mi šesť bajtov.
Čo je to vlastne robí?
No, dovoľte mi vrátiť sa späť v čase tu tam, kde sme v príbehu.
>> Takže keď sa vraciam domov, som vyhlásil, char * s názvom t
Ja som teraz volal malloc šesť bajtov.
A teraz budem kresliť týchto šiestich bytoch rovnako ako pole predtým.
Ale ja vlastne neviem, čo je to vnútri tohto poľa.
>> Ak sa alokovať pamäť sa ukáže, že nemôžete veriť, že tam je nejaký
známa hodnota tam.
To by boli použité niečím inak, iné funkcie, iné
riadok kódu, ktorý ste napísal.
Takže budeme všeobecne nazývali odpadky hodnoty a kresliť, snáď, ako
otázniky, len naznačuje, že sme Neviem, čo to vlastne je.
A to nie je žiadny veľký problém, tak dlho, ako sme sú dosť bystrí na to prepísať tie
odpadky hodnoty s číslami alebo znaky, ktoré sa starajú o
>> Takže v tomto prípade to, čo budem robiť?
No, moja riadok kódu ďalšie, mám štyri.
int i dostať 0, n dostane dĺžka reťazca s
Takže známy pre sláčiky.
Aj je menšie ako alebo rovný n, ktorá je zvyčajne vyššia.
>> Ale tentokrát je to úmyselné.
I + +, a potom som jednoducho robiť t i držiak dostane s
Pretože môj obrázok vyzerá to na Tento moment, uložené v t je
adresa tohto náhodného kusu pamäti ktorých hodnoty nie sú známe.
Ale akonáhle som sa do t držiak 0, ktorá stavia ma sem.
>> A čo skončí dobývanie vyvodiť?
Sme skončili uvedenie h
Pretože to je to, čo je v držiaku s 0.
A potom to isté pre e a l a l, a o
>> n, prečo som ísť hore cez rovnať k n?
Vzhľadom k charakteru 0..
Tak aby bolo jasno, potom keď som vlastne vymazať, čo tie odpadky
hodnoty a potom vlastne kresliť to, čo očakávam, je to držiak s 1, 2,
3, 4, a to je koncové nová postava.
>> A tak teraz, ak sme pokračovali okolo bodu, bodka, bodka v tomto správnu verziu
a kapitalizované t držiak 0 by som, ze Samozrejme, bude zarábať práve tento
chlap tu, ktoré koncepčne, bol nakoniec cieľ.
Tak to je všetko, je ukazovateľ.
>> A vy ste používali ich už niekoľko týždňov sa v súvislosti s reťazca.
Ale pod kapotou sú trochu zložitejšie.
Ale ak si myslíte, že o nich v tejto obrazová forma navrhujem, aby to
zrejme nie je všetko, že desivé ako oni mohlo na prvý pohľad zdať na prvý pohľad,
najmä s takou novou syntax.
Akékoľvek otázky týkajúce sa ukazovateľov, reťazca, alebo chars?
Jo?
>> Divákov: môžete sa vrátiť späť na [nepočuteľné]?
>> SPEAKER 1: Iste.
>> Publikum: Tak ako to, že vo vašom úplne posledný linka, nemusíte mať * T linku
a * s v rade?
Ešte nemáte odkaz na -
>> SPEAKER 1: Ach, je naozaj dobrá otázka.
Prečo mám * T a A * S?
Pretože krátko, minulý týždeň, rovnako ako v našom zameniť funkciu, povedal som, že keď
máš ukazovateľ prostriedkov, ktoré sa tam ako my
fyzicky na javisku, bol skutočne použite hviezdy operátora.
>> Ukazuje sa, že toto námestie-držiak notácie je to, čo budeme hovoriť syntaktická
cukor, ktorý je len spôsob, ako sexy hovorí, že je to skrátený zápis pre
presne to, čo popisujete.
Ale je to trochu viac intuitívne.
A na nebezpečenstvo, že by to vyzerať viac zložitejšie, než je potrebné, aby sa,
čo sa naozaj deje je nasledovné -
Keď poviem, * t to znamená, že ísť do adresa uložená v t
>> Tak doslova, ak t je ukladanie adresa, že H
spočiatku, * t znamená ísť sem.
A teraz, čo sa t držiak 0 znamená?
Presne rovnakú vec.
Je to len o málo viac užívateľovi priateľský písať.
>> Ale ja som neskončil.
Nemôžem len tak povedať * t * S dostane.
Vzhľadom k tomu, čo by som mala robiť potom?
Ja by som dávať h, h, h, h, h v celej veci.
Je to tak?
>> Vzhľadom k tomu * t, je ísť na adresu vt.
Ale my sme vnútri slučky.
A akú hodnotu mám zvyšovanie, Samozrejme, že pri každom opakovaní?
i
>> Ale je tu možnosť tu, že jo?
Aj keď tento pocit, je to čím ďalej trochu sofistikovanejšie
ako štvorcového držiaka zápisu sme použili nejakú dobu -
dovoľte mi vrátiť moju h zmenu tu -
Aj keď je to dnes už trochu milovník, základná myšlienka, ak je t *
tu znamená a * t len prejdite na adresu vt.
>> Ale čo sa adresa v t?
Počet držíme používate?
Ako Ox456, vráťme to späť len kvôli diskusie.
No, keď chcem sa dostať na e do t reťazec, len chcem ísť,
v podstate, 456.
>> Alebo skôr, 457.
Len chcem pridať.
Ale môžem robiť, že jo?
Vzhľadom k tomu, t, i keď stále výkres teraz ako šíp, je to len
číslo, Ox456.
A keď pridám jednu k tomu, alebo viac Všeobecne platí, že keď pridám ja k tomu môžem
skutočne dostať presne tam, kde chcem.
Takže keď som vlastne to -
a to je to, čo sa teraz nazýva ukazovateľ aritmetika -
Nemôžem odstrániť tento riadok.
Čo je, úprimne povedané, myslím, že jasnejšie a trochu viac užívateľsky prívetivé pre čítanie.
Jedná sa však o menej správne.
>> Tento riadok kódu sa používa ukazovateľ aritmetika.
Je to reč choď do nasledujúce adresu -
bez ohľadu na začiatok T, ktorý je t a i, ktorá spočiatku
je 0, čo je skvelé.
Pretože to znamená, že začiatok t plus 1 plus 2 plus 3, a tak ďalej.
A to isté sa zaoberajú s
>> Takže syntaktický cukor pre toto.
Ale pochopenie toho, čo sa naozaj deje pod kapotou, povedal by som,
v skutočnosti užitočné samo o sebe.
Pretože to znamená, že teraz už to nie je oveľa viac mágie deje
pod kapotou.
Nie sú tu bude oveľa viac vrstvy, ktoré môžeme Zlúpnite pre vás.
To je cca.
A to je programovanie.
Naozaj dobrá otázka.
>> Tak jo, bolo to, že kočík program, ktorý som mal na mysli skôr.
odkladacia bola chybná.
Ak sa zdá, že práca.
Pripomeňme, že rovnako ako s mliekom a pomarančový džús - čo som začal
pitie dnešnej demonštrácii.
Takže rovnako ako s pomarančovým džúsom a mlieko, sme musieť použiť
dočasné premenné, tmp, držať dočasne tak, že by sme mohli
zmeňte jeho hodnotu a potom aktualizovať b
>> Ale táto funkcia, sme si povedali, a to program, v ktorom bola táto funkcia
napísal, bola zle a chybný, prečo?
Áno?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: Presne tak, keď zavoláte odkladacie -
alebo všeobecnejšie, keď zavolajte najviac akúkoľvek funkciu -
ak sú argumenty tejto funkcie sú primitívne, aby som tak povedal, ints a chars
a dvojlôžkové a plaváky, veci bez hviezdy, ste okoloidúci v kópii
argument.
Takže ak je x 1 a y 2 bol, bude na 1 a b bude 2.
Ale oni sa chystáte byť rôzne kusy bitov, rôzne kúsky
pamäti, že stalo, že sa ukladanie rovnaké hodnoty.
>> Takže tento kód je super perfektné na odkladanie a a b
Je to k ničomu swapping -
minulý týždeň napríklad -
x a y.
Vzhľadom k tomu znova, že sú v nesprávnom rozsahu.
>> Teraz, ako sme ísť o stanovenie toto?
Museli sme funkciu vyzerať trochu škaredšie.
Ale znovu, zvážte, čo to znamená len.
>> A vlastne, nechaj ma, konzistencia, zmeniť jednu vec, takže je to rovnaké
čo sme práve urobili.
Ako som už spomenul minulý týždeň, to nie je na tom, kde to ide.
V skutočnosti, zvyčajne by ste dal hviezdy vedľa názvu premennej.
Ale myslím, že to bude trochu jednoduchšie zvážiť * vedľa
dátový typ v tom zmysle, že je to ukazovateľ na int v tomto prípade.
>> Takže to, čo tu vlastne robím?
Hovorím, že mi nedáš int nasleduje ďalšie int,
volať je a, b
Dajte mi adresu int.
Daj mi adresu iného int.
Zavolajte tie adresy a a b
>> A potom pomocou * notáciu dole nižšie, ísť do každej z týchto adries
V prípade potreby sa buď získať alebo nastaviť jeho hodnotu.
Ale je tu výnimka tu.
Prečo nemôžem mať * vedľa tmp?
Prečo to robiť, napríklad?
Mám pocit, ako by som mal ísť all von a opraviť celú vec.
Jo?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: ja som prehlásil, tmp ako reťazec.
Takže by to vyhlásiť, v tomto prípade, tmp byť adresa int.
Ale to nie je to, čo chcem, na niekoľkých dôvodov.
>> DIVÁKOV: Nechcete vymeniť je.
>> SPEAKER 1: Presne tak, ja nechcem vymeniť čokoľvek s tmp. tmp je len
týždeň jedna vec.
Všetko, čo chcem je premenná uložiť určitý počet.
Nemám ani starať o adresách v tomto okamihu.
>> Potrebujem len 32 bitov alebo takže k uloženiu int.
A ja chcem, aby v týchto 32 bitov čo nie je, aby som tak povedal, ale
čo je, len preto, aby bol presnejší.
Vzhľadom k tomu, ak je adresa, * znamená ísť a získať hodnotu 1.
Napríklad minulý týždeň napríklad alebo v prípade B je, získať hodnotu 2.
>> Takže to, čo sa naozaj deje?
Dovoľte mi, aby som tu nakresliť obrázok, ktorý bude len srandista oddelene časť dnes.
Ale tento trend bude pokračovať, aby sa pre docela nejaký čas.
>> To tvrdím, je to, čo počítač je Pamäť vyzerá pri spustení
programu, každý program.
Pri spustení programu na samom vrchole z pamäte RAM vášho počítača - takže myslieť
Tento obdĺžnik, naozaj, ako váš počítača RAM alebo pamäti, všetky 101
miliarda bajtov, to všetko dve miliardy bajtov, celé dva gigabajty tom,
bez ohľadu na množstvo, ktoré majú, je, Poďme nakresliť napríklad obdĺžnik.
A tvrdím, že pri spustení programu ako je Microsoft Word alebo Chrome
alebo niečo podobné, bity, ktoré Microsoft alebo že Google písal -
V prípade týchto programov -
sú načítané do pamäte počítača kde môžu byť vykonané ďalšie
rýchlo a dodal do procesora, ktorý je mozog počítača.
>> A TAM oni sú skladované pri veľmi horná časť programu, aby som tak povedal.
Inými slovami, ak je to kus pamäť, pri poklepaní na
Microsoft Word, bity prichádzajú vypnutie pevného disku.
Dostanú načítaný do pamäte RAM.
A budeme strkať ich do úplne hore tohto obdĺžnika koncepčne.
>> No, zvyšok pamäte je použiť pre rôzne veci.
Na samom vrchole vidíte inicializovať dát a inicializáciu dát.
To súvisí, z väčšej časti, s konštanty alebo globálne premenné
ktoré majú hodnoty.
Ale o tých inokedy.
>> Potom máte hromadu, ktorá vrátime sa.
Ale v spodnej časti, je tá časť, ktorá je najmä Germaine práve teraz.
Je to tzv stack.
Takže rovnako ako vo väčšine akejkoľvek D haly tu kampus, máte tie zásobníky, ktoré
len zásobník na seba, na ktorom si môžete dať jedlo a kto vie čo ešte.
Zásobník v počítačovom systéme je veľmi podobný.
Okrem kým zásobníka, ako ich používame v jedáleň, samozrejme, je potrebné
niesť veci zásobníky alebo rámy -
ako budeme nazývať - ​​v počítači je pamäť sa používa pre zastavenie
premenné a hodnoty.
>> Takže to, čo sa naozaj deje pod kapotou?
No, dovoľte mi otočiť na obrazovku tu.
A poďme zamerať iba na spodná časť na chvíľu.
Pokiaľ sa jedná o spodnú časť z mojich pamäti počítača to dopadá, keď som
volanie funkcie main - čo sa stáva, úprimne povedané,
automaticky pre mňa -
Mám kus pamäte na Spodná časť mojej pamäti, aby som tak povedal.
A to je miesto, kde je hlavnou lokálne premenné ísť.
To je miesto, kde argc a argv možná ísť, a všetky premenné Aj
vyhlásiť vnútri hlavné.
Skončí na dne mojej pamäti RAM počítača.
>> Teraz predpokladajme, že hlavné výzvy funkcie ako odkladací priestor, ako to urobil minulý týždeň?
No, sme v podstate dať nový zásobník novú snímku, na mojom kuse pamäti.
A budem popisovať to ako patriaci do swap.
>> Teraz, čo je vnútri swapu?
No, na základe minulého týždňa a programu tá, ktorú sme práve videli ukážku z,
vnútri swapových rámu, alebo na swapu zásobník, sú to premenné?
No, a, b
Pretože to boli jeho miestnej argumenty, a za tretie, tmp.
Takže naozaj, mohol by som nakresliť to trochu čistejšie.
Nechaj ma ísť dopredu a späť štítku.
A dovoľte mi tvrdiť, že viete, čo?
>> pravdepodobne skončí tu.
B skončí tu.
A tmp skončí tu.
Teraz, možno usporiadanie byť trochu inak.
Ale koncepčne to je nápad.
>> A len spoločne, to je to, čo zavoláme swapu rámu, alebo
jedálenská sála zásobník.
A to isté sa zaoberajú hlavnou.
Ale nebudem prekresľovať, že.
Ale to je miesto, kde argc a argv a akékoľvek svojich lokálnych premenných, ako je x a y
môže byť tiež.
>> Takže teraz zvažuje, čo sa skutočne deje keď zavoláte swapu.
Ak voláte do swapu, spustenie kódu ako to, že ste odovzdaním, v
buggy verzia A a B ako kópia x a y.
Takže keď som sa teraz kresliť to na displeji -
sa dostať lepšie na to -
tak príbeh hovoril som si pre seba bolo v tejto verzii kočíku, keď
zavolajte vymeniť odovzdaním doslova a a b ako celé čísla, čo sa skutočne deje?
>> No, čo sa naozaj deje, je to.
Nechaj ma ísť dopredu a späť len upratať nejaký priestor tu.
Tak toto je moja pamäť počítača.
>> Takže ak mám napríklad -
vlastne urobíme to takto -
keď tvrdí, že je to x, skladovanie hodnota 1, rovnako ako minulý týždeň.
A to je y, uloženie hodnoty 2 rovnako ako minulý týždeň.
A to je hlavné, keď volám swapu, čím sám prístup a
b a tmp, budem tvrdiť, že to je, a to je 1.
>> To je b
To je 2.
To sa nazýva tmp.
>> A spočiatku, to má určitú hodnotu, odpadky kým som vlastne ukladať v ňom,
čo je 1.
Potom som sa do toho pustite a zmeniť byť čo?
B je hodnota.
>> A tak teraz mám dva tu.
A potom sme si povedali, b dostane tmp.
Opäť, rovnako ako zdravý rozum skontrolujte, tretí riadok kódu je tu jednoducho toto
jeden, b dostane tmp.
>> A tak nakoniec, čo mám robiť?
Idem do toho a zmeňte b ako niečo, čo hodnota TMP je, čo je 1.
Ja sa nedotýkajte tmp znova.
>> Ale teraz, problém je, akonáhle odkladacia vracia, pretože nie je rozdávajú
späť nejakú hodnotu, nie je návratu vyhlásenie výslovne v ňom.
Čo sa vlastne deje?
No, v podstate všetko pamäť -
OK, zrejme guma páči len jedným prstom naraz -
jednoducho zmizne.
>> Teraz v skutočnosti to nie je nejdem.
Ale môžete si ju teraz ako otázniky.
Pretože je to už v súčasnej dobe používajú.
A nič sa vykonáva s týmito hodnotami.
>> Takže v prípade zeleného verzia tento kód, čo namiesto toho je, že
prechádzal do swapu?
Tak rieši.
Takže adresa xa adresa y.
Takže keď znovu povedať tento príbeh ešte posledný čas, a ja som vlastne kresliť odkladacia znova,
ale s ukazovateľmi, čo je, to b je, a to je tmp, čo je
v skutočnosti uložené v tejto zelenej verzia môjho kódu, kde som okolo
na adresách?
>> To bude ukazovateľ na x.
Takže som mohol nakresliť šípku.
Ale poďme používajú rovnaké ľubovoľná napríklad ako predtým.
Povedzme, že je to niečo ako Ox123.
A to bude, pretože Ox127 je to štyri byty preč, pretože je to
int, takže Ox127.
>> A opäť, beriem nejaké slobody s číslami.
Sú oveľa menšie, než by v skutočnosti byť, a v inom poradí.
Ale to je, ako sa obraz je teraz iný.
>> Ale keď som sa použiť túto zelenú kód a ja int tmp dostať *.
* Prostriedok vykonať nasledujúce kroky, sa riešenie, ktoré je v a ísť k nej,
čo je 1.
A to je to, čo som potom dal do tmp.
Medzitým sa na ďalšom riadku kódu tu * dostane b, čo to znamená?
>> No, *, tak choďte sem dostane * b, čo znamená, že sa tam.
A to znamená, dať hodnotu tam.
Konečne, posledný riadok kódu jednoducho povedané b * dostane tmp.
>> Tak b hovorí, že tam a prepísať ju tmp, ktoré je v tomto prípade, bude
sa opäť, 1.
A to je dôvod, prečo zelená verzia Náš kódex práce, zatiaľ čo červená
verzia nikdy.
To všetko len sa scvrkáva na tom, ako pamäť je riadená a kde je to
v skutočnosti uložené do počítača RAM.
A teraz, to je jedna z vecí, že zásobník sa používa.
>> Otázky týkajúce sa rozvrhnutia?
Na ukazovateli?
Alebo o swapu?
>> Dobre, takže malloc, odvolanie, urobil niečo také.
To bol výborný jednoduchý príklad.
A to bol ten, že Binky nám predstavil, i keď úplne
rýchlo, na konci hodiny.
Sakra, tam zase.
>> Takže pripomenúť, že to bol príklad, ktorý Binky nám predstavil, aj keď
trochu rýchlo na konci hodiny.
A tu sme naozaj malloc druhýkrát.
Vzhľadom k tomu, prvýkrát sme ho vytvoriť dostatok pamäte RAM, prideliť dostatok pamäte RAM
pre uloženie reťazca.
>> Tentoraz Binky držal to jednoduché.
Takže je to len na ukladanie int, zrejme.
A to je úplne v pohode.
Je to trochu divné, úprimne povedané, na používať malloc alokovať jeden int.
Ale bod claymation Nick bol naozaj len rozprávať príbeh o tom, čo
sa stane alebo nestane, keď môžete týrať pamäti.
>> Takže v tomto prípade, tento program Urobil pár vecí.
V prvom prípade sa tu, sa vyhlasuje ukazovateľ s názvom x na int.
To potom deklaruje ukazovateľ volal y na int.
To potom uloží do x, čo?
Niekto teraz.
Čo je uložená v X podľa Tretí riadok tohto programu?
>> DIVÁKOV: [nepočuteľné].
>> SPEAKER 1: No, nie tak celkom bajtov, za hovoria.
Byť presnejší teraz.
Čo je uložená v X?
Adresa, myslím, že som to počul.
>> Takže čo malloc vráti?
malloc behaviorálne prideľuje kus pamäte.
Ale ako to umožňujú prístup k nej?
Vracia čo?
Adresa prvého bajtu v bloku pamäti.
>> Teraz, to je super jednoduchý.
Je to len jeden bajt, čo znamená, že zaoberať sa dostávame späť je
adresa z toho všetkého.
Skladovať tak v X, potom je adresa tohto bloku pamäte.
Medzitým, čo sa stane ďalej?
Takže vlastne, poďme ďalej a čerpať z tohto naozaj rýchlo.
>> Takže ak prejdeme na obrazovku a tu budeme hrať na to int * x a int * y
bude robiť to, čo pre mňa?
Tvrdím, že je to len bude robiť niečo také a nazývať to x a
to a hovoria y.
Medzitým, tretí riadok kódu je bude alokovať veľkosť int,
ktorý sa stane byť - Ospravedlňujem sa, či som povedal, jeden predtým, než som chcel jeden int -
štyri byty na typickom počítači.
Aspoň sa CS50 spotrebiča.
>> Takže to bude prideľovať to, kto vie?
Niekde tu.
A táto je uložená na niektoré Adresa Ox, kto vie?
Ale to, čo sa deje, aby sa vrátil je tá adresa.
Ale budeme kresliť to obrazovo len ako šípka takhle.
>> Teraz v ďalšom riadku * x dostane 42.
Čo * x znamená laicky povedané?
Len tam.
Prejdite na túto adresu.
Alebo inými slovami, postupujte šípka a dať tam 42.
Ale potom sa niečo zlé stalo na Binky, že jo?
>> Pripomeňme, že linku päť tu, * y dostane 13, naozaj nešťastné číslo,
čo urobil pre nás?
No, * y znamená ísť.
No, nebola táto možnosť daná hodnota ešte, že jo?
Kód nemá y je inicializovaný na čokoľvek.
Mali sme x inicializované na adresu.
Ale y bol vyhlásený až vrchol.
Ale potom bodkočiarka, žiadna hodnota bol vlastne do neho.
Takže je to fér nazývať odpadky hodnota.
Kto vie, čo je to?
Sú to zvyšky bitov, ktoré boli použité nejakým predchádzajúcom riadku kódu v
môj program.
>> Takže keď poviem, tam ísť, je to ako, Nemám tušenie, kde to je šípka
Skončím.
A to je, keď sa obvykle dostanete segmentation fault.
Ak ste omylom dereferencia, tak hovoriť, alebo prejdite na adresu, že to nie je
vlastne legitímne adresa, zlé veci sa stávajú.
>> A to je presne to, čo sa stalo myslieť Binky.
Takže pripomenúť, že príbeh, ktorý je Nick rozprávanie tu bol rovnaký nápad ako to, čo
Som sa vypracovaný s ilúziou krieda na tabuľu tam.
X a Y sú deklarované.
>> Potom sme pridelené veľkosť int a uložiť ho do x.
Potom ďalší riadok sme * x.
To bol Nickov kúzelná palička z dereferencing.
To dal 42 do pamäti poukázal x.
>> Ale to je miesto, kde sa veci išiel strašne zle.
Je to tak?
Snažili sme sa dereferencování y.
Ale y mal nejakú fiktívnu hodnotu, nie?
>> To Šípka v ľavom dolnom roh, nie je
v skutočnosti ukazuje na čokoľvek.
Je to niečo, čo som robil som tu na palube.
Tak zlé veci sa stávajú, segmentácia chyba, alebo chyba Binky, v tomto prípade.
>> Ale keď sme potom opraviť, že tým x dostane y, ako ten príbeh zmenu?
No, keď to urobím x y dostane, to je fakticky rovnaké, ako hovorí
bez ohľadu na to, čo Ox- bude rovnaký tu,
Ox-niečo.
Alebo obrazovo budeme kresliť šípku.
>> Tak tu na doske s Binky, s ďalší riadok
kód * y znamená ísť.
Kde je tam?
To znamená, že tu.
>> A keď sme aktualizáciu, že je to 13 to jednoducho znamená ísť a
písanie 13 tu.
Takže možno nie je úplne jednoduché na prvý pohľad.
Ale zhrnúť a používať rovnaký žargón že Binky použil tu, tak
Prvé dve prideliť ukazovateľov, x a y, ale nie pointees.
A pointees nie je všeobecne používaný termín.
Ale je úplne ukazovateľ.
Ale to je to, čo ich upozornil na základe nomenklatúry Binky je.
>> Táto ďalší rad, samozrejme, prideľuje int pointee.
Takže kus pamäti - ako som nakreslil viac ako na pravá strana existuje - a set
x rovné odkázať sa na neho.
To dereferences x ukladať 42 v pamäti, že je to ukázal na.
A potom, samozrejme, bola zlá vec.
Vzhľadom k tomu, y nebol ukázal na niečo ešte.
To opraví ju.
Takže je to stále buggy programu.
Len preto, že sme prefúknutiu kód riadok po riadku a hovorí, ach dobre,
nechať to spadnúť tam.
To je zlé.
Kurz je program práve chystá prerušiť úplne na tomto riadku.
Ale ak by ste chceli odstrániť havaroval linka a nahradiť ju posledné dva
riadkoch priradíte -
pomocou priradenie ukazovateľa - y poukázať na x ako bod t.
A potom si dereferencia y vo veľmi bezpečným spôsobom.
>> Takže tam, kde to nás?
No, ukázalo sa, že pod kapotou v CS50 knižnici ukazovatele sú
používaný v celom.
A budeme skutočne začať lúpať späť táto vrstva onedlho.
Ale ukazuje sa tiež, že výraz niektorí z vás by mohol byť poznať,
najmä pohodlnejšie, je v skutočnosti, že z veľmi populárnej
webové stránky, alebo pretečeniu zásobníka, v týchto dňoch.
>> Ale to v skutočnosti má veľmi technický význam.
Teraz vieme, čo stack.
Je to ako hromada zásobníkov vnútri jedálni.
>> Alebo vo vnútri vášho počítača Pamäť its tie rámy
, Ktoré sú používané funkcie.
No, ukázalo sa, že z dôvodu, že veľmi jednoduchá implementácia
pamäť a rámy na tzv stack, môžete skutočne prevziať kontrolu
z počítačového systému pomerne ľahko.
Môžete sa preniknúť do systému, ak ľudia ako my nenapísal náš kód
veľmi dobre.
>> Ak sa ľudia ako my používajú kusy pamäťových alebo použitie polí -
ešte častejšie -
ale niekedy nezabudnite skontrolovať Hranice našej ponuku, ako si môžete
Nechať sa niekedy, a opakoval príliš ďaleko za koncom poľa.
V najlepšom prípade je váš program môže len pád.
Segmentation fault, druh trápne.
Nič moc, ale nie je to nevyhnutne veľmi zlé.
>> Ale ak váš program je vlastne v reálnom počítače užívateľov, ak je to beh
na internetových stránkach, že skutočné náhodné občanov, na internete sa biť, prenájom
ľudí vyvolať zlé veci vo vašom kóde vo všeobecnosti nie je dobrá vec, pretože
to znamená, že príležitosť na ovládanie z počítača.
A to bude vyzerať trochu záhadný.
Ale ja som myslel, že by som ťa vydesiť sa Tento posledný príklad tu.
>> Tu je príklad kódu.
A je to dobrý Wikipedia článok, ktorý prechádza
to podrobnejšie.
Mám hlavné na spodnej povolania foo, prechádzajúcej v argv dňa 1..
A to len preto, že môžete spustiť program a odovzdať
ľubovoľný vstup.
>> A potom foo oznámené až hore ako prijímať reťazec, alebo viac
presne, char *.
To potom deklaruje pole znakov.
Nazvime to buffer, všeobecnejšie, o veľkosti 12.
Takže 12 znakov vojde dovnútra tohto poľa s názvom C.
>> A potom sa to používa túto novú funkciu, ktorý je nový, ale nie je ťažké
Rozumiem, pamäte kópiu.
To skopíruje pamäť z baru, ktorý bol premenná n minulosti, bez ohľadu na
užívateľ zadať do argv 1 do cca.
Koľko bajtov?
Dĺžka reťazca baru.
>> Takže inými slovami, v prípade, že používateľ zadá h-e-l-l-o enter, dĺžka reťazca
z ahoj je päť.
Takže päť z týchto bytov bude mať skopírované do poľa s názvom C, čo
je o veľkosti 12.
Ale to, čo používateľ zadá oveľa dlhšie Slovo, ktoré je 13 znakov alebo 14
znakov alebo 100 alebo viac znakov?
>> Kam sa chystajú ísť?
No, to rám, že je zásobník v jedálni zásobníku,
idú tam ísť.
A je to len začnú prepisovať ďalšie veci, ktoré už
na tomto zásobníku, pretekajúca zásobník, aby som tak povedal.
>> Takže obrazne, myslím, že to takto.
To je len farebné verzie obrázok sme boli kreslenie.
V dolnej časti, povedzme, je hlavné.
A na vrchole, čo vidíte teraz Rám je, farebne značená teraz, pre
volaná funkcia foo.
Ale čo je zaujímavé, o foo je, že tu je jeho rám.
Takže je vypracovaný tak ako ja urobil, ale vo svetle modrej farbe.
A teraz to je miesto, kde c držiak 0 ide.
A to je miesto, kde c držiak 11 sa chystá skončiť.
>> Inými slovami, to sa stane môže byť reprezentovaný ako štvorca.
Ale ak si len udržať plopping bajtov dole - alebo znaky - idú až do konca
sa na mieste 0 až hore na 11, pretože je to 0 indexované.
>> Ale kde je 13. znak Skončím?
Kde je 14?
Kde je 50. znak Skončím?
>> Bude to ďalej dole.
Pretože aj keď sme vypracovali obraz s zásobníka vyrastal,
adresy, to dopadá, ísť od malé adresy, malé
ukazovatele, na veľkých adresy.
Tak to jednoducho stále ísť vyššie a vyššie.
>> Takže v prípade, že používateľ zadá Dobrý deň, to je skvelé.
Žiadny problém, žiadny problém, každý je v bezpečí.
Ale v prípade, že používateľ zadá, čo budeme zavolajte kontradiktórne kód, zastúpená
druhovo ako, útok, útok, Útok, útok, môže, čo sa stalo?
>> No, ak sú všetky vstupe, že užívateľ zadali nie je len nejaký priateľský
alebo urážlivé reťazec znakov.
Je to vlastne postupnosť znakov že ak si ju vydal,
to vlastne je kód.
Možno je to kód, ktorý odstráni všetky súbory na vašom pevnom disku alebo odosiela spam
alebo niečo také.
Všimnite si, že to, čo je kľúčové je to, že v prípade, že zlý človek má to šťastie, že
prepísať červený kus pamäti -
ktoré som nevytiahol na mojom obrázku, ale tento obrázok Wikipedia tu má -
jeho tzv spiatočná adresa.
>> Keď jedlo vracia, keď swapové priznanie, ako sa počítač vedieť, ísť od
sa sem tu dole?
Alebo v tech segmente hore, ako to viem, ísť zo swapu
kód - 0 a 1 je , Ktoré tvorí odkladaciu -
Späť na hlavnú stranu?
K dispozícii je tzv spiatočná adresa uložené v rovnakom zásobníku rám, na
rovnaké jedáleň zásobník.
>> Takže v prípade, že zloduch je natoľko šikovný, aby vložte kód útoku, útok kód, útok
kód a získať šťastie -
často prostredníctvom pokusov a omylov - do prepísať červené spiatočnú adresu,
s adresou a oznámenia na samý vrchol.
Všimnite si, 0835C080.
Je napísaný späť hore hore pre Dôvody budeme snáď znova.
Je to, že číslo.
>> Takže ak zloduch dostane šťastie alebo je dosť chytrý, aby prepísať červená
pás z pamäte s adresou Kód, ktorý on alebo ona má nejako
vstrekuje do počítača, myslím, ktorého kód bude vrátená
akonáhle foo sa vykonáva spustením?
>> Zloducha v code.
Takže ten útok kódu, AAA, znova, možno odosielanie nevyžiadanej pošty, môže odstrániť všetky súbory
na pevnom disku.
Ale to je to, čo skutočne pretečenie zásobníka je, alebo pretečeniu vyrovnávacej pamäte, alebo
buffer overflow útok.
>> A je to neuveriteľne, neuveriteľne časté k tomuto dňu s programy napísané v
C, C + +, a dokonca aj niektoré ďalšie jazyky.
Na tomto desivé vedomie, budeme končí vtip.
>> [Smiech]
>> Uvidíme sa v stredu.
Na ďalšie CS50 -
Takže som všetko z disku lámp, ale dnes počkajte, odtučnené mlieko, polovica telefón
kniha, pomarančový džús že som pil dnes.
USB kábel, kľúč.
>> [Prehrávanie hudby]