1 00:00:00,000 --> 00:00:11,242 >> [Prehrávanie hudby] 2 00:00:11,242 --> 00:00:16,630 >> David J. Malan: Tak to je CS50 a to je začiatok týždňa päť. 3 00:00:16,630 --> 00:00:21,480 Takže dnes, pod svojím sedákov, nenájdete nič. 4 00:00:21,480 --> 00:00:24,790 Ale predovšetkým, mali by ste si nájsť to, malý prejav nášho uznania za 5 00:00:24,790 --> 00:00:26,970 všetky práce, ktoré ste vložili do hry pätnástich. 6 00:00:26,970 --> 00:00:30,290 Jednoducho odstráňte malý kruh na Spodná začať hrať 7 00:00:30,290 --> 00:00:31,680 Zvyšok triedy. 8 00:00:31,680 --> 00:00:38,930 >> Takže pripomínam, že ani vedieť, že nastavenie problém štyri, ktorý vyšiel tento víkend, 9 00:00:38,930 --> 00:00:40,340 zahŕňa písať ďalšiu hru. 10 00:00:40,340 --> 00:00:43,740 Ale tentoraz to zahŕňa použitie Aktuálne grafické užívateľské rozhranie, a to 11 00:00:43,740 --> 00:00:46,310 textové rozhranie, ako Hra Fifteen. 12 00:00:46,310 --> 00:00:50,210 A hra, ktorá leží pred vami, ak ste ešte nevidel to ďalej, 13 00:00:50,210 --> 00:00:52,310 Vyzerá trochu niečo takého. 14 00:00:52,310 --> 00:00:55,170 Chystám sa ísť do môjho terminálu okná tu v GDB. 15 00:00:55,170 --> 00:00:58,600 A ja idem dopredu a spustite personál riešenie, ktoré môžete pristupovať 16 00:00:58,600 --> 00:01:01,010 Po spustení aktualizácie 50 ako obvykle. 17 00:01:01,010 --> 00:01:04,090 >> Ale ja idem dať do trochu tajný režim, trochu veľkonočné vajíčko, 18 00:01:04,090 --> 00:01:08,480 tzv nesmrteľnosť, by uvedenie Boha argv1. 19 00:01:08,480 --> 00:01:12,920 A musím riadiť svoje vlastné usmernenia, beží to v mojej vlastnej 20 00:01:12,920 --> 00:01:14,220 problém nastaviť adresár. 21 00:01:14,220 --> 00:01:19,190 Takže teraz vidíte kompletnú verziu z hry Breakout. 22 00:01:19,190 --> 00:01:21,090 V skutočnosti je to ne-ruke režim. 23 00:01:21,090 --> 00:01:24,850 Takže je to vlastne - 24 00:01:24,850 --> 00:01:26,470 ohromení keď môže byť - 25 00:01:26,470 --> 00:01:30,850 celkom triviálne realizovať Boha režim, vo Breakout, na rozdiel od hry pätnástich, 26 00:01:30,850 --> 00:01:33,590 ktoré niektorí z vás mohli riešiť pre hackera vydanie. 27 00:01:33,590 --> 00:01:37,890 >> V Breakout postačuje v Boha Režim jednoducho robiť to, čo, 28 00:01:37,890 --> 00:01:41,220 intuitívne s pádlom? 29 00:01:41,220 --> 00:01:45,630 Len sa to rovná bez ohľadu na vodorovná poloha je lopta. 30 00:01:45,630 --> 00:01:49,220 A tak dlho, ako si to ako jeden muž sa lopta v pohybe táto hra 31 00:01:49,220 --> 00:01:53,100 Nikdy, nikdy, nikdy ujsť loptu a budete zakaždým vyhrať. 32 00:01:53,100 --> 00:01:55,430 >> Ale v tomto týždni hacker vydania je to viac než len režim Boha. 33 00:01:55,430 --> 00:01:56,720 K dispozícii je celý rad ďalších funkcií. 34 00:01:56,720 --> 00:01:58,140 Medzi nimi, lasery. 35 00:01:58,140 --> 00:02:01,070 Takže ak ste naozaj netrpezlivý si môže začať zostrelenie tehly 36 00:02:01,070 --> 00:02:02,120 a niekoľko ďalších. 37 00:02:02,120 --> 00:02:04,560 A pre tých z vás, ktorí by chceli kalibráciu štandardu oproti Hacker 38 00:02:04,560 --> 00:02:08,750 vydanie, vidím, že tento týždeň hacker vydanie zámerne je 39 00:02:08,750 --> 00:02:12,830 trochu uskutočniteľné, povedzme, ako Boh Režim bol s Game of Fifteen. 40 00:02:12,830 --> 00:02:15,300 >> Takže ak hľadáte úseku a hľadáte nejakú ďalšiu zábavu 41 00:02:15,300 --> 00:02:18,400 vlastnosti sa potápať v prípade záujmu. 42 00:02:18,400 --> 00:02:21,280 Teraz viac prakticky, dovoľte mi pripomenúť, na jednu vec rovnako. 43 00:02:21,280 --> 00:02:24,780 GDB, ktorý niektorí z vás nemusia mať ešte dotkla osobne, čo je v poriadku. 44 00:02:24,780 --> 00:02:28,530 Ale teraz je naozaj čas si zvyknúť na to a pohodlne s týmto nástrojom 45 00:02:28,530 --> 00:02:31,510 , Pretože to bude vaše životy oveľa jednoduchšie, naozaj. 46 00:02:31,510 --> 00:02:34,900 >> Na prednáške Roba o GDB pár týždne, spomínam 47 00:02:34,900 --> 00:02:36,810 že GDB je debugger. 48 00:02:36,810 --> 00:02:41,230 Je to nástroj, ktorý vám umožní spúšťať vaše Program ale nechajte ju krok za krokom, riadok 49 00:02:41,230 --> 00:02:45,680 po riadku, takže môžete hrabať okolo seba, takže vidíte, čo sa deje, a tak 50 00:02:45,680 --> 00:02:47,310 ktoré si môžete vytlačiť hodnoty premenných. 51 00:02:47,310 --> 00:02:50,580 Stručne povedané, to vám dáva oveľa viac energie ako printDef robí. 52 00:02:50,580 --> 00:02:52,900 >> Teraz síce rozhranie je dosť tajomný. 53 00:02:52,900 --> 00:02:55,180 Čierna a biela textové rozhranie z väčšej časti. 54 00:02:55,180 --> 00:02:57,400 Príkazy sú trochu ťažké pamätať na prvom mieste. 55 00:02:57,400 --> 00:03:01,230 Ale aj keď to môže trvať do polovice hodina, hodina, aby to vopred 56 00:03:01,230 --> 00:03:02,940 investície času na to, ver mi. 57 00:03:02,940 --> 00:03:06,440 Iste by semestra nakoniec ušetrí ste rádovo viac 58 00:03:06,440 --> 00:03:07,600 času než to. 59 00:03:07,600 --> 00:03:09,200 >> Takže na začiatku týždňa ponoru palcov 60 00:03:09,200 --> 00:03:13,200 A čo sa týka Breakout, viem, že ste môže to tak dlho, kým budete mať 61 00:03:13,200 --> 00:03:18,230 distribúcia kód alebo vlastný kód Prebieha vo vašej Pst4 adresára. 62 00:03:18,230 --> 00:03:21,680 Vedzte, že môžete spustiť gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> To bude otvárať okno takhle. 64 00:03:23,490 --> 00:03:25,530 Dovoľte mi, aby som sám seba viac z terminálu. 65 00:03:25,530 --> 00:03:27,770 A čo potom budem pokračovať a robiť, že to nie je len spustiť. 66 00:03:27,770 --> 00:03:30,690 Chystám sa najprv nastaviť bod prerušenia Pripomeňme, ktorý umožňuje pozastaviť 67 00:03:30,690 --> 00:03:32,500 prevedenie na určitom mieste. 68 00:03:32,500 --> 00:03:35,750 >> Len aby to jednoduché idem rozbiť na linke jedna jednoduchým zadaním 69 00:03:35,750 --> 00:03:37,000 číslo jedna. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Dovoľte mi, aby som vlastne znovu otvoriť toto okno pretože je to stále 72 00:03:43,250 --> 00:03:45,700 malý malý tam. 73 00:03:45,700 --> 00:03:53,270 Takže to, čo som teraz robiť je tu keď otvoria svoje okno terminálu. 74 00:03:53,270 --> 00:03:53,910 Poď, ideme na to. 75 00:03:53,910 --> 00:03:59,850 >> Takže teraz, ak sa vrátim do Dropbox, Pst4 a spustiť gdb. / breakout vstúpiť, všimnite si, 76 00:03:59,850 --> 00:04:02,600 Chystám sa zlomiť jeden pre nastavenie bod zlomu na linke jedna. 77 00:04:02,600 --> 00:04:04,840 A teraz idem dopredu a typ spustenia. 78 00:04:04,840 --> 00:04:07,370 A keď sa mi to, všimnite si, nič Zdá sa, že sa stalo. 79 00:04:07,370 --> 00:04:08,120 >> Neexistuje žiadny pop-up. 80 00:04:08,120 --> 00:04:09,790 Neexistuje žiadny grafický užívateľské rozhranie ešte. 81 00:04:09,790 --> 00:04:13,340 Ale to je pochopiteľné, pretože som doslova na linke jedna v mojom programe. 82 00:04:13,340 --> 00:04:17,110 A všimnite si, že som sa rýchlo odovzdaná, konkrétne sa na 62, pretože všetky 83 00:04:17,110 --> 00:04:20,600 veci v hornej časti tohto súboru je veci ako pripomienky a konštánt a 84 00:04:20,600 --> 00:04:22,460 nezaujímavé veci pre teraz. 85 00:04:22,460 --> 00:04:25,840 >> Takže teraz som vnútri hlavné, Zdá sa, že na riadku 62. 86 00:04:25,840 --> 00:04:27,960 A to je len rozdelenie kód odvolanie. 87 00:04:27,960 --> 00:04:33,810 Keď otvorím môžete ísť, podobne, do môjho rozbaľovacieho zoznamu adresára do Pst4, 88 00:04:33,810 --> 00:04:35,450 do breakout.c. 89 00:04:35,450 --> 00:04:40,670 A keby som prejdite dole a dole a dole, a nechaj ma ísť dopredu a zapnúť 90 00:04:40,670 --> 00:04:44,990 moje čísla riadkov. 91 00:04:44,990 --> 00:04:50,300 >> Čo uvidím, či by som prejdite na linka 62 je presne ten riadok, ktorý 92 00:04:50,300 --> 00:04:50,910 sme sa zastavil na. 93 00:04:50,910 --> 00:04:53,720 Takže tento riadok tu, 62, je kde sa chystáme byť. 94 00:04:53,720 --> 00:04:57,470 Takže teraz v GDB, keď pôjdem napred a zadajte teraz ďalší, zadajte, že to bude 95 00:04:57,470 --> 00:04:58,450 vykonanie tohto riadku. 96 00:04:58,450 --> 00:05:00,610 A voila, máme tzv g okno. 97 00:05:00,610 --> 00:05:02,800 Ak oboznámení s tým, čo GWindow je, nie sa báť. 98 00:05:02,800 --> 00:05:05,740 Spec vás zoznámi s tým, ako rovnako ako počet Walkthrough videá 99 00:05:05,740 --> 00:05:06,830 vložené do spec. 100 00:05:06,830 --> 00:05:08,610 >> Ale teraz poďme urobiť to trochu zaujímavejšie. 101 00:05:08,610 --> 00:05:10,960 Dovoľte mi, aby som presunúť okno na na stranu trochu. 102 00:05:10,960 --> 00:05:13,480 Dovoľte mi, aby som oknu trochu väčšie, takže vidím viac. 103 00:05:13,480 --> 00:05:16,140 >> A teraz mi dovoľte pokračovať a ďalej znova. 104 00:05:16,140 --> 00:05:17,550 A tam sú moje tehly. 105 00:05:17,550 --> 00:05:20,490 Keď píšem ďalší zase teraz vidím loptu. 106 00:05:20,490 --> 00:05:23,520 A keď píšem ďalší zase teraz vidím, pádlo. 107 00:05:23,520 --> 00:05:26,690 >> A našťastie to gedit nie je Naozaj spoluprácu tým, že ukazuje mi 108 00:05:26,690 --> 00:05:27,660 všetko, čo chcem. 109 00:05:27,660 --> 00:05:30,820 Ale teraz keď mám robiť ďalej znova, ďalší zase, ja som len 110 00:05:30,820 --> 00:05:32,260 deklarovanie niektoré premenné. 111 00:05:32,260 --> 00:05:34,750 A môžem vytlačiť jednu z týchto chalanov. 112 00:05:34,750 --> 00:05:37,170 Tlač tehly, výtlačky životoch. 113 00:05:37,170 --> 00:05:39,910 >> A teraz keď som v tom pokračovať ďalšie, všimnite si, že budem 114 00:05:39,910 --> 00:05:40,870 Vnútri tejto slučky. 115 00:05:40,870 --> 00:05:43,380 Ale kód bude vykonávať presne tak, ako som čakať. 116 00:05:43,380 --> 00:05:45,810 Takže keď som narazila túto funkciu, počkajte Pre Click, že to bude robiť 117 00:05:45,810 --> 00:05:46,830 doslova, že. 118 00:05:46,830 --> 00:05:48,870 Tak som zrejme stratil kontrolu na programe. 119 00:05:48,870 --> 00:05:50,480 >> GDB nie je, že mi ďalší riadok. 120 00:05:50,480 --> 00:05:51,500 Ale nie sa báť. 121 00:05:51,500 --> 00:05:53,720 Prejdite na svoju hru, kliknite kamkoľvek. 122 00:05:53,720 --> 00:05:56,270 >> A voila, teraz pokračuje na linku 86. 123 00:05:56,270 --> 00:05:59,460 Takže znova, je to neoceniteľná, nakoniec, pre ladenie problémov. 124 00:05:59,460 --> 00:06:03,050 Pretože môžete doslova prechádzať Váš kód, tlačové veci a oveľa, 125 00:06:03,050 --> 00:06:03,640 oveľa viac. 126 00:06:03,640 --> 00:06:07,210 Ale teraz, tieto nástroje samy o sebe by vám dosť ďaleko. 127 00:06:07,210 --> 00:06:10,050 >> Takže sme, samozrejme, že pohľad Grafika na teraz, všetci naraz. 128 00:06:10,050 --> 00:06:12,350 A teraz náš svet je trochu zaujímavejšie. 129 00:06:12,350 --> 00:06:15,680 A vieš, možno z niektorých Videa online, ktoré máme tieto 130 00:06:15,680 --> 00:06:18,280 šortky, ktoré ste sledovali ako súčasť základnej problémové okruhy. 131 00:06:18,280 --> 00:06:20,460 >> A že som bol zastrelený, a to úmyselne, proti bielemu pozadia. 132 00:06:20,460 --> 00:06:23,380 A niektoré z nich majú výučbu Fellows kreslenie nejaký text na 133 00:06:23,380 --> 00:06:25,490 Obrazovka, ktorá je prekrytá na ich vnútornej strane. 134 00:06:25,490 --> 00:06:27,760 Ale samozrejme, je to, že nie všetky zaujímavé, v reálnom svete. 135 00:06:27,760 --> 00:06:30,520 To je len prednášková sála s veľká biela obrazovka a pozadia. 136 00:06:30,520 --> 00:06:33,330 A náš úžasný produkčný tím triedenie zo je všetko pristane 137 00:06:33,330 --> 00:06:36,620 po faktu orezanie z alebo prekrývanie nič 138 00:06:36,620 --> 00:06:37,840 robíme, alebo nechceme. 139 00:06:37,840 --> 00:06:41,560 >> Teraz už len stačí motivovať tento týždeň Naozaj, kam môžete ísť, nakoniec, 140 00:06:41,560 --> 00:06:42,560 s informatike. 141 00:06:42,560 --> 00:06:44,260 Nielen po probléme nastaviť štyri. 142 00:06:44,260 --> 00:06:48,240 Ale po inom kurze alebo celého Kurikulum je to úžasné, čo všetko môžete 143 00:06:48,240 --> 00:06:51,090 robiť v týchto dňoch, pokiaľ ide o grafika zvlášť. 144 00:06:51,090 --> 00:06:53,440 >> Niektorí z vás možno videli toto tečie okolo on-line. 145 00:06:53,440 --> 00:06:56,240 Ale myslel som, že ukážem, len za pár minút, letmý pohľad na to, čo 146 00:06:56,240 --> 00:07:01,890 výpočtovej techniky a čo CGI, počítačová grafika môže robiť v týchto dňoch 147 00:07:01,890 --> 00:07:04,510 sa známym pieseň a možno aj film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Mladá a krásna] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Je to len trochu úžasný, snáď, ako 151 00:10:52,470 --> 00:10:52,857 všadeprítomný - 152 00:10:52,857 --> 00:10:57,040 >> [APPLAUSE] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Stiahol som si to. 154 00:10:59,230 --> 00:11:02,920 Ale je to naozaj úžasné, myslím, že práve ako všadeprítomný softvér a kód a 155 00:11:02,920 --> 00:11:04,230 nástroje, ako je to v skutočnosti. 156 00:11:04,230 --> 00:11:07,685 Takže je to chuť smeru v ktorom môžete ísť. 157 00:11:07,685 --> 00:11:10,620 Oh, nie viac zariadení dnes. 158 00:11:10,620 --> 00:11:14,640 No, to je skutočne tragická načasovanie vzhľadom k bodu som sa snažil urobiť. 159 00:11:14,640 --> 00:11:18,670 >> Dobre, tak sa poďme spustiť Fusion znova. 160 00:11:18,670 --> 00:11:20,800 Pripomenúť neskôr. 161 00:11:20,800 --> 00:11:24,190 Dobre, a mali by ste sa dostali email ako stranou, ak ste si 162 00:11:24,190 --> 00:11:25,460 Všimnite si takto. 163 00:11:25,460 --> 00:11:29,940 Dobre, takže pripomínam, že minulý týždeň sme začali olúpte to 164 00:11:29,940 --> 00:11:31,380 neskôr známy ako reťazec. 165 00:11:31,380 --> 00:11:34,700 >> string pripomína dátový typ, ktorý je vyhlásil v CS50 knižnici. 166 00:11:34,700 --> 00:11:37,740 A to je časť koliesok že teraz začne vzlietnuť. 167 00:11:37,740 --> 00:11:41,280 Bol to užitočný koncept čoskoro. 168 00:11:41,280 --> 00:11:43,750 Ale teraz to bude získať viac zaujímavejšie a silný 169 00:11:43,750 --> 00:11:48,330 skutočne vidieť, že pod kapotou reťazec je práve to, čo, to sme si povedali? 170 00:11:48,330 --> 00:11:50,500 >> Jo, je to tzv char *. 171 00:11:50,500 --> 00:11:53,860 A * sa označuje, že je nejaký druh adresu zapojiť. 172 00:11:53,860 --> 00:11:58,690 A tak, keď hovoríte, char * stačí povedať premenná ktorej dátový typ je 173 00:11:58,690 --> 00:11:59,290 ukazovateľ teraz. 174 00:11:59,290 --> 00:12:01,770 Skutočnosť, že je hviezda tu jednoducho znamená, že prohašuješ 175 00:12:01,770 --> 00:12:03,020 tzv ukazovateľ. 176 00:12:03,020 --> 00:12:06,220 A že ukazovateľ bude zrejme uložiť adresu, na 177 00:12:06,220 --> 00:12:07,810 Samozrejme, char. 178 00:12:07,810 --> 00:12:08,960 >> A teraz, prečo to zmysel? 179 00:12:08,960 --> 00:12:11,200 No, a čo je reťazec pod kapotou? 180 00:12:11,200 --> 00:12:15,130 No, nejakú dobu sme hovorili že reťazec je pod kapotou 181 00:12:15,130 --> 00:12:18,460 len h-e-l-l-o, napríklad. 182 00:12:18,460 --> 00:12:21,585 >> Ale my sme o tom hovorili ako je v podstate poľa. 183 00:12:21,585 --> 00:12:25,410 A pole by potom vyzerať trochu ďalšie podobné, pričom každá z nich 184 00:12:25,410 --> 00:12:26,460 nástupu do sústo. 185 00:12:26,460 --> 00:12:28,710 A potom sme povedali, že je tu niečo zvláštneho sem, 186 00:12:28,710 --> 00:12:31,270 spätné lomítko 0 alebo null terminátor. 187 00:12:31,270 --> 00:12:35,230 >> Takže celú tú dobu, tohle je reťazec. 188 00:12:35,230 --> 00:12:38,320 Ale v skutočnosti je reťazec vlastne adresu. 189 00:12:38,320 --> 00:12:43,210 A adresy, ako uvidíme, sú často s predponou 0x konvencií. 190 00:12:43,210 --> 00:12:44,540 Čo 0x naznačovať? 191 00:12:44,540 --> 00:12:45,970 Vie to niekto? 192 00:12:45,970 --> 00:12:47,320 >> Tak to jednoducho znamená, šestnástkovej. 193 00:12:47,320 --> 00:12:52,360 Takže si možno pamätáte, vlastne od PST 1. Verím, že jedným z warm-up 194 00:12:52,360 --> 00:12:55,740 otázky vlastne pýtal hexadecimálny zápis okrem 195 00:12:55,740 --> 00:12:57,100 binárne a desiatkovej. 196 00:12:57,100 --> 00:13:00,460 A motivácia je, že s hexadecimálne máte 16 197 00:13:00,460 --> 00:13:01,770 číslice k dispozícii. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, po od a, b, c, d, e, f 199 00:13:07,900 --> 00:13:10,430 >> A ak budete počítať všetky tie hore, získate celkom 16. 200 00:13:10,430 --> 00:13:13,200 Tak to je v rozpore s desatinné číslo, kde máme 10 201 00:13:13,200 --> 00:13:14,690 číslice, 0 až deväť. 202 00:13:14,690 --> 00:13:17,750 Je to v rozpore s binárnym kde sme len 0 a 1. 203 00:13:17,750 --> 00:13:21,450 >> Ale na konci dňa si môžete len predstavujú rovnaké čísla, ale 204 00:13:21,450 --> 00:13:22,500 trochu inak. 205 00:13:22,500 --> 00:13:25,840 A hexadecimálne je časté, pretože ako to dopadá - a uvidíme to 206 00:13:25,840 --> 00:13:28,790 neskôr v priebehu - aj keď sme sa na webové programovanie v rámci 207 00:13:28,790 --> 00:13:32,100 HTML a farebné kódy, hexadecimálny je pekná. 208 00:13:32,100 --> 00:13:36,390 Pretože každá číslica, ukazuje, predstavuje štyri bity dokonale. 209 00:13:36,390 --> 00:13:39,280 Tak to tak nejako liniek pekne ako budeme nakoniec vidieť. 210 00:13:39,280 --> 00:13:44,720 Takže to môže byť Ox123 alebo tak niečo ako to, že označuje adresa 123 211 00:13:44,720 --> 00:13:47,050 niekde vnútri môjho pamäte počítača. 212 00:13:47,050 --> 00:13:50,600 >> Samozrejme, niektoré problémy vznikajú pretože toto základné 213 00:13:50,600 --> 00:13:51,520 implementácia. 214 00:13:51,520 --> 00:13:55,930 A pripomínam, že som nahodil na vykonávanie funkcie, ako je tento - 215 00:13:55,930 --> 00:14:00,260 porovnať palubný 0 dot c minulý týždeň, že aj keď to vyzeralo, že to bolo 216 00:14:00,260 --> 00:14:04,270 Dobre, to jednoducho nie je v porovnaní dva reťazce správne. 217 00:14:04,270 --> 00:14:07,470 >> Som zahodil hlavné, a ja som hodil preč pripomienky len zamerať sa na 218 00:14:07,470 --> 00:14:08,970 kód, ktorý je v záujme tu. 219 00:14:08,970 --> 00:14:10,660 A to je v červenej farbe, pretože je to kočík. 220 00:14:10,660 --> 00:14:11,670 Z akého dôvodu? 221 00:14:11,670 --> 00:14:15,890 >> No, hore tam, keď som vyhlásil, reťazec, čo sa naozaj deje 222 00:14:15,890 --> 00:14:17,260 pod kapotou? 223 00:14:17,260 --> 00:14:19,530 No, dovoľte mi prejsť na obrazovky, a kresliť to. 224 00:14:19,530 --> 00:14:23,230 Tak som vyhlásil znova, reťazca s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Takže budem pokračovať a teraz kresliť s pre čo to vlastne je. 226 00:14:26,640 --> 00:14:28,590 To bude štvorec tu. 227 00:14:28,590 --> 00:14:30,490 A budem tvrdiť, , Že to je 32 bitov. 228 00:14:30,490 --> 00:14:32,890 Aspoň to obvykle je, aspoň na CS50 229 00:14:32,890 --> 00:14:34,520 spotrebič v mnohých počítačov. 230 00:14:34,520 --> 00:14:35,980 Budem hovoriť to. 231 00:14:35,980 --> 00:14:39,070 >> Ale teraz spomínam, že sme volal GetString. 232 00:14:39,070 --> 00:14:41,430 Takže GetString vracia, Samozrejme, reťazec. 233 00:14:41,430 --> 00:14:45,790 V prípade, že používateľ zadá h-e-l-l-o zadanie reťazec ahoj dostane sa vrátil. 234 00:14:45,790 --> 00:14:51,010 A to reťazec, ako sme práve povedal, končí niekde v pamäti počítača 235 00:14:51,010 --> 00:14:53,240 s lomítkom 0 na konci. 236 00:14:53,240 --> 00:14:56,650 Budem kresliť to ako pole - alebo súvislý blok znakov - 237 00:14:56,650 --> 00:14:58,330 že to vlastne je. 238 00:14:58,330 --> 00:15:01,790 >> A teraz, čo je getString vlastne vracia? 239 00:15:01,790 --> 00:15:04,340 Čo GetString vracajú celú dobu? 240 00:15:04,340 --> 00:15:07,520 No, povedzme, v týždňoch pred, vráti reťazec. 241 00:15:07,520 --> 00:15:10,250 Ale technicky, čo robí GetString návrat zdanlivo? 242 00:15:10,250 --> 00:15:11,610 >> Divákov: adresa. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: adresa. 244 00:15:12,600 --> 00:15:16,630 Konkrétne sa vráti adresu prvé sústo, nech je to čokoľvek. 245 00:15:16,630 --> 00:15:18,830 Len som naďalej používať jednu, dve, tri pretože je to pohodlnejšie. 246 00:15:18,830 --> 00:15:21,380 >> Vracia adresu prvej znak v reťazci. 247 00:15:21,380 --> 00:15:23,510 A my sme minulý týždeň uviedol, že , Že je postačujúce. 248 00:15:23,510 --> 00:15:26,710 Vzhľadom k tomu môžeme vždy prísť na to, kde koniec reťazca len tým, že 249 00:15:26,710 --> 00:15:30,150 iterácie, možno sa pre slučka alebo while, alebo niečo také 250 00:15:30,150 --> 00:15:34,990 , Že len hľadá "lomítkom 0", špeciálny sentinel charakter. 251 00:15:34,990 --> 00:15:37,220 >> A potom vieme, že reťazec sa stane, že dĺžky - 252 00:15:37,220 --> 00:15:37,980 V tomto prípade - 253 00:15:37,980 --> 00:15:38,670 päť. 254 00:15:38,670 --> 00:15:43,800 Takže technicky to, čo robí GetString ich vráti Ox123 v tomto prípade. 255 00:15:43,800 --> 00:15:53,670 A technicky čo sa stane, je potom že budeme ukladať, vo vnútri s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Na konci dňa, aj keď to je nový koncept, ukazovatele, sú 257 00:15:56,460 --> 00:15:57,350 len premenné. 258 00:15:57,350 --> 00:16:00,440 Ale stalo ukladať bity dohromady predstavujú adresu. 259 00:16:00,440 --> 00:16:03,700 Takže technicky všetko, čo dostane uložené v s je Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Ale my ako ľudia - 261 00:16:04,680 --> 00:16:06,020 vrátane dnes ďalej - 262 00:16:06,020 --> 00:16:09,290 naozaj nebude starať, typicky, čo je skutočná adresa 263 00:16:09,290 --> 00:16:10,520 nejakého kusu pamäti. 264 00:16:10,520 --> 00:16:14,040 Je to len na nízkej úrovni detailu byť intelektuálne zaujímavé. 265 00:16:14,040 --> 00:16:15,440 Takže idem vrátiť späť. 266 00:16:15,440 --> 00:16:19,810 A miesto, viac na vysokej úrovni, stačí povedať že keď hovoríme o ukazovatele 267 00:16:19,810 --> 00:16:22,170 Budem len kresliť viac užívateľsky príjemný šípka, ktorá vyjadruje 268 00:16:22,170 --> 00:16:26,060 Rovnaký nápad a abstrakty ďaleko, že údaje, aké sú skutočné 269 00:16:26,060 --> 00:16:27,700 základná adresa. 270 00:16:27,700 --> 00:16:33,290 >> Teraz, keď sa vrátime do kódu, čo sa stalo minulý týždeň, ak máme reťazec t 271 00:16:33,290 --> 00:16:34,510 rovná GetString? 272 00:16:34,510 --> 00:16:38,630 No, keby som znova zadajte ahoj Tentoraz budem mať 273 00:16:38,630 --> 00:16:40,460 ďalší kus pamäte. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o spätné lomítko 0. 275 00:16:44,820 --> 00:16:48,320 >> Ale pretože som volal getString druhýkrát - 276 00:16:48,320 --> 00:16:51,100 a viem, že to z pohľadu na Zdrojový kód getString - aj 277 00:16:51,100 --> 00:16:54,350 aj keď je to náhodou, že bol ahoj zadali dvakrát, GetString nie je 278 00:16:54,350 --> 00:16:55,890 bude snažiť optimalizovať a byť šikovný. 279 00:16:55,890 --> 00:16:58,550 Je to jednoducho dostane ďalší kus pamäť z počítača, ktorý je 280 00:16:58,550 --> 00:16:59,640 bude na inej adrese. 281 00:16:59,640 --> 00:17:02,330 Poďme ľubovoľne stačí povedať 456. 282 00:17:02,330 --> 00:17:04,079 >> A potom, čo sa to deje vrátiť? 283 00:17:04,079 --> 00:17:08,030 Bude to návrat 456 a uložte ho na t 284 00:17:08,030 --> 00:17:12,010 Takže to, čo sa naozaj deje, na ľavá strana je mám iný kus 285 00:17:12,010 --> 00:17:14,260 pamäti, typicky 32 bitov. 286 00:17:14,260 --> 00:17:16,720 A tam sa chystá ísť Ox456. 287 00:17:16,720 --> 00:17:20,140 Ale znovu opakujem, nemám záujem v týchto konkrétne čísla ešte. 288 00:17:20,140 --> 00:17:23,069 Ja som jednoducho ísť abstraktne kresliť ako šíp. 289 00:17:23,069 --> 00:17:25,202 >> Tak to je teraz nová vysvetlenie. 290 00:17:25,202 --> 00:17:28,735 Ale je to presne rovnaký názor, že je dialo celú tú dobu. 291 00:17:28,735 --> 00:17:33,150 A tak dôvod sa teda, že tento prvý verzia Compare bol kočík 292 00:17:33,150 --> 00:17:34,480 minulý týždeň sa prečo? 293 00:17:34,480 --> 00:17:38,000 Keď to urobíte, ak je rovná rovná t, čo sa naozaj 294 00:17:38,000 --> 00:17:40,550 pod pokrievku porovnanie? 295 00:17:40,550 --> 00:17:41,910 >> Tie porovnaním adresy. 296 00:17:41,910 --> 00:17:47,950 A len intuitívne, jasne, Ox123 nebude rovnaké Ox456. 297 00:17:47,950 --> 00:17:49,380 Tieto čísla, tieto bity sú jednoducho iné. 298 00:17:49,380 --> 00:17:53,220 >> A tak dôsledne, minulý týždeň povedal, Zadáte rôzne veci, a to aj v prípade, že 299 00:17:53,220 --> 00:17:55,360 slová doslovne rovnaká. 300 00:17:55,360 --> 00:17:58,770 Tak sme sa opraviť. 301 00:17:58,770 --> 00:18:00,120 Laicky povedané, čo je oprava? 302 00:18:00,120 --> 00:18:02,110 >> DIVÁKOV: Použite funkciu. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Použite funkciu. 304 00:18:02,870 --> 00:18:05,190 Alebo hviezdy sú rozhodne zúčastňuje, ale použiť funkciu robiť čo? 305 00:18:05,190 --> 00:18:05,962 >> DIVÁKOV: Pre porovnanie reťazcov. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Pre porovnanie reťazcov. 307 00:18:07,390 --> 00:18:11,030 Takže zásadný problém tu bol že som sa práve s ohľadom na 308 00:18:11,030 --> 00:18:15,870 Kvalita reťazcov, ktoré budú definované porovnanie ich adresy. 309 00:18:15,870 --> 00:18:18,540 A samozrejme to je len hlúpy teraz jednou aby ste pochopili, čo sa deje 310 00:18:18,540 --> 00:18:19,510 pod kapotou. 311 00:18:19,510 --> 00:18:23,270 Ak chcete naozaj nákupný reťazcov, či sú rovné tým spôsobom, že ľudské 312 00:18:23,270 --> 00:18:26,680 by za dva reťazce sa rovná musíme porovnať im postavu 313 00:18:26,680 --> 00:18:28,070 znak pre znak. 314 00:18:28,070 --> 00:18:30,020 >> Teraz som mohol urobiť Jedná sa o veľmi zdĺhavo. 315 00:18:30,020 --> 00:18:32,240 Ale dôverne, sme pomocou slučky for. 316 00:18:32,240 --> 00:18:36,050 A stačí porovnať s držiak i proti t držiaku i 317 00:18:36,050 --> 00:18:39,590 Držiak je aj plus 1 proti t držiaku i a 1, a tak ďalej, v 318 00:18:39,590 --> 00:18:40,580 nejaké slučky. 319 00:18:40,580 --> 00:18:44,950 A keď som sa zistiť akékoľvek dva znaky, ktoré sa líši, alebo ak si uvedomujem, že ooh, s je 320 00:18:44,950 --> 00:18:48,410 kratšie než T alebo dlhšia ako t Ja môžem okamžite povedať nepravdivé, 321 00:18:48,410 --> 00:18:49,390 že to nie je to isté. 322 00:18:49,390 --> 00:18:55,370 >> Ale keď som sa prejsť na S a T a povedal rovnaký, rovnaký, rovnaký, rovnaký, rovnaký, koniec 323 00:18:55,370 --> 00:18:58,520 oba reťazce, môžem povedať, Je pravda, že sú rovnaké. 324 00:18:58,520 --> 00:19:01,040 No, našťastie, pred rokmi niekto napísal, že kód pre nás. 325 00:19:01,040 --> 00:19:03,790 >> A oni hovorili StrComp pre reťazec porovnanie. 326 00:19:03,790 --> 00:19:11,900 A aj keď je to trochu proti intuitívne, StrComp vráti 0, ak sú 327 00:19:11,900 --> 00:19:14,520 dva reťazce, s a t sú rovnaké. 328 00:19:14,520 --> 00:19:18,090 Ale vráti zápornú hodnotu, ak je by mala prísť pred t abecedne alebo 329 00:19:18,090 --> 00:19:20,610 kladná hodnota, ak by mala prísť po t abecedne. 330 00:19:20,610 --> 00:19:24,030 >> Takže ak ste niekedy chceli zorganizovať niečo, ukázalo sa, že je užitočné StrComp. 331 00:19:24,030 --> 00:19:26,660 Pretože to nie je len povedať, áno alebo nie, ktorá sa rovná alebo nie. 332 00:19:26,660 --> 00:19:30,440 To vám dáva pocit objednávanie podobne ako v slovníku silu. 333 00:19:30,440 --> 00:19:33,770 Takže StrComp, s čiarka t sa rovná 0 znamená, že sa rovná 334 00:19:33,770 --> 00:19:35,200 Reťazce sú naozaj rovnaké. 335 00:19:35,200 --> 00:19:38,680 Pretože ten, kto napísal túto funkciu rokmi pravdepodobne použitá pre sláčiky 336 00:19:38,680 --> 00:19:42,840 alebo while, alebo niečo také integrovať nad znaky znova 337 00:19:42,840 --> 00:19:45,270 a znova a znova. 338 00:19:45,270 --> 00:19:47,300 >> Ale problém dve storočia tu vyrástla. 339 00:19:47,300 --> 00:19:48,750 To bolo copy0.c. 340 00:19:48,750 --> 00:19:51,680 A dva červeno je pretože to je chybný. 341 00:19:51,680 --> 00:19:52,800 A čo tu robíme? 342 00:19:52,800 --> 00:19:54,310 No, najprv som volal getString. 343 00:19:54,310 --> 00:19:56,255 A ja uložená návratovú hodnotu v sekundách. 344 00:19:56,255 --> 00:20:00,260 Tak to je skoro rovnaké ako táto horná časť obrazu. 345 00:20:00,260 --> 00:20:01,490 >> Ale to, čo príde potom? 346 00:20:01,490 --> 00:20:04,980 No, dovoľte mi ísť dopredu a zbaviť z celej banda to. 347 00:20:04,980 --> 00:20:09,650 Budeme dozadu v čase, kedy sme práve majú s, ktorý je teraz v súlade s 348 00:20:09,650 --> 00:20:10,940 linka jeden tam. 349 00:20:10,940 --> 00:20:11,400 >> Aj skontrolovať. 350 00:20:11,400 --> 00:20:13,450 Pokiaľ je rovná rovná 0. 351 00:20:13,450 --> 00:20:18,670 Teraz rýchlo okrajová poznámka, keď môže vrátiť GetString 0? 352 00:20:18,670 --> 00:20:19,580 K dispozícii je dostatok pamäte. 353 00:20:19,580 --> 00:20:19,880 Je to tak? 354 00:20:19,880 --> 00:20:22,310 >> Je to vzácne, že sa to stane, Určite na počítači, ktorý je 355 00:20:22,310 --> 00:20:24,740 mám stovky megs alebo dokonca giga RAM. 356 00:20:24,740 --> 00:20:27,080 Ale mohlo by, teoreticky, vráti 0, a to najmä v prípade, že 357 00:20:27,080 --> 00:20:28,080 užívateľ nespolupracuje. 358 00:20:28,080 --> 00:20:31,640 Existuje spôsob, ako predstierať, že nemáte Zadaný čokoľvek a trik 359 00:20:31,640 --> 00:20:34,100 GetString k návratu 0 efektívne. 360 00:20:34,100 --> 00:20:35,470 >> Takže to bude kontrolovať, že. 361 00:20:35,470 --> 00:20:39,430 Pretože ak niekto z vás začali sa už, segmentácia poruchy - 362 00:20:39,430 --> 00:20:42,280 ktorý bol pravdepodobne zdrojom nejaké frustrácie - 363 00:20:42,280 --> 00:20:46,150 tie sú takmer vždy výsledkom pamäti súvisiace chyby. 364 00:20:46,150 --> 00:20:50,440 Nejako si spackal s ohľadom na ukazovateľ, aj keď ste si neuvedomil, 365 00:20:50,440 --> 00:20:51,530 bol ukazovateľ. 366 00:20:51,530 --> 00:20:55,260 Takže môžete mať vyvolané segmentáciu chyby sú už prvý týždeň pomocou 367 00:20:55,260 --> 00:21:02,100 niečo ako pre sláčiky alebo v stave slučka a pole tým, že ide príliš ďaleko 368 00:21:02,100 --> 00:21:05,900 okolo hranice niektorých polia, ktoré ste deklarovali v týždni dva v 369 00:21:05,900 --> 00:21:06,690 zvlášť. 370 00:21:06,690 --> 00:21:09,220 >> Môžete to urobiť aj problém nastaviť štyri s Breakout. 371 00:21:09,220 --> 00:21:12,910 Aj keď ste možno ešte nevideli všetky hviezdy v distribučnej kódu pre 372 00:21:12,910 --> 00:21:17,410 Breakout, sa ukazuje, že tí, GRect a goval a iné takéto veci, 373 00:21:17,410 --> 00:21:19,650 tie sú vlastne ukazovatele pod kapotou. 374 00:21:19,650 --> 00:21:23,430 >> Ale Stanford, rovnako ako my, tak nejako kožou ktorý podrobne uvedie prinajmenšom pre knižnice 375 00:21:23,430 --> 00:21:26,540 účely, rovnako ako my reťazca a char *. 376 00:21:26,540 --> 00:21:30,060 Ale GRect a goval a všetky z nich čo vy ste, alebo bude používať 377 00:21:30,060 --> 00:21:32,630 Tento týždeň sú nakoniec adresy pamäte. 378 00:21:32,630 --> 00:21:33,650 Proste to neviem. 379 00:21:33,650 --> 00:21:37,240 >> Takže to nie je divu, snáď, že by ste mohli zakopnúť niektoré 380 00:21:37,240 --> 00:21:38,580 segmentácia chyby. 381 00:21:38,580 --> 00:21:41,290 Ale čo je zaujímavé, tu, ak potom, ako skontrolovať, čo robíme 0 382 00:21:41,290 --> 00:21:43,460 string t dostane s 383 00:21:43,460 --> 00:21:44,690 No, dovoľte mi vyhlásiť t 384 00:21:44,690 --> 00:21:47,730 Chystám sa kresliť ako štvorec, 32 bitov, hovoria t 385 00:21:47,730 --> 00:21:49,740 A potom budem robiť, dostane s 386 00:21:49,740 --> 00:21:51,130 >> No, čo to znamená? 387 00:21:51,130 --> 00:21:53,280 No, je to trochu ťažké, že o tom si predstaviť múdre. 388 00:21:53,280 --> 00:21:55,025 Ale poďme premýšľať o tom, to, čo je vnútri X? 389 00:21:55,025 --> 00:21:59,430 Čo je doslova vnútri tejto premennej? 390 00:21:59,430 --> 00:22:01,500 Hodnota Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Takže keď poviem, string t dostane s, že práve doslovne znamená vziať číslo 392 00:22:05,815 --> 00:22:10,070 v s, čo je Ox123 a dať to Ox123. 393 00:22:10,070 --> 00:22:13,740 Alebo obrazovo, keď som trochu abstraktné od toho, že má informáciu 394 00:22:13,740 --> 00:22:16,600 Vplyv doslova robiť to tiež. 395 00:22:16,600 --> 00:22:22,110 >> Takže teraz, myslím, že späť do minulého týždňa, kedy sme pristúpili k kapitalistického T. Aj 396 00:22:22,110 --> 00:22:23,800 to T držiak 0. 397 00:22:23,800 --> 00:22:27,150 No, T držiak 0, aj keď je to ukazovateľ, môžete zaobchádzať, ako by 398 00:22:27,150 --> 00:22:29,220 je to pole, s námestí držiak notácie. 399 00:22:29,220 --> 00:22:31,550 >> Tak kde je T držiak 0? 400 00:22:31,550 --> 00:22:32,990 No, je to h 401 00:22:32,990 --> 00:22:36,800 A tak keď sme sa použiť tento riadok kódu, dve horné, ktorá je v tomto c type.h 402 00:22:36,800 --> 00:22:38,460 hlavičkový súbor, to je miesto, kde to vyhlásil. 403 00:22:38,460 --> 00:22:44,410 Ste zarábaní túto H. Ale Samozrejme, že je to presne rovnaký h to 404 00:22:44,410 --> 00:22:46,540 vnútri s, aby som tak povedal. 405 00:22:46,540 --> 00:22:51,930 A tak teraz ste zmenili alebo Aktivácia pôvodné i 406 00:22:51,930 --> 00:22:53,120 tzv kópie. 407 00:22:53,120 --> 00:22:56,620 Pretože ste neurobili kópiu v spôsobom, že človek by chcel, aby to bolo. 408 00:22:56,620 --> 00:22:59,710 >> Takže to, čo bolo tu fix, v copy1.c minulý týždeň? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkcie, takže sme mohli vlastne kopírovať reťazec. 411 00:23:05,580 --> 00:23:08,700 A v podstate, čo musíme urobiť, aby sa kopírovať reťazec? 412 00:23:08,700 --> 00:23:12,070 >> No, v tomto zelenom prevedení tu som robiť to pomerne nízkej úrovni. 413 00:23:12,070 --> 00:23:14,260 Tam sú vlastne funkcie by mohli pomôcť s týmto. 414 00:23:14,260 --> 00:23:17,710 Ale tie základné, a najviac pozná jeden, aspoň bude čoskoro 415 00:23:17,710 --> 00:23:19,600 poznáme, je nasledovné - 416 00:23:19,600 --> 00:23:21,910 takže je na prvom riadku kódu v zelenom teraz. 417 00:23:21,910 --> 00:23:23,970 >> Len som prepísal s ako char *. 418 00:23:23,970 --> 00:23:25,250 Nie je funkčný rozdiel tam. 419 00:23:25,250 --> 00:23:28,790 Len som zahodil CS50 knižnice a Volám to, čo je, char *. 420 00:23:28,790 --> 00:23:31,640 >> Teraz bodka, bodka, bodka, pretože tam boli niektoré kontrola chýb, že to nie je 421 00:23:31,640 --> 00:23:33,200 zaujímavé rozprávanie o znovu. 422 00:23:33,200 --> 00:23:34,710 Takže teraz t je deklarovaná. 423 00:23:34,710 --> 00:23:35,780 To je tiež char *. 424 00:23:35,780 --> 00:23:38,280 Tak som vytiahol malý štvorec na obrazovka ako predtým. 425 00:23:38,280 --> 00:23:41,870 >> Ale na pravej strane, malloc, sme si povedali, je pamäť alokovať. 426 00:23:41,870 --> 00:23:44,130 Takže prideliť nejaký kus pamäte. 427 00:23:44,130 --> 00:23:48,830 A koľko bajtov my vlastne chcete vyhradiť, to vyzerá? 428 00:23:48,830 --> 00:23:50,340 >> No, dĺžka reťazca s 429 00:23:50,340 --> 00:23:52,310 Takže ak je to ahoj to je bude päť. 430 00:23:52,310 --> 00:23:53,950 Povieme, že h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Takže päť bajtov. 432 00:23:55,090 --> 00:23:57,960 >> Ale potom naviac 1, prečo jeden? 433 00:23:57,960 --> 00:23:58,830 0 charakteru. 434 00:23:58,830 --> 00:24:03,640 Ak nebudeme ponechať priestor pre toho chlapa sme môže náhodne vytvoriť situáciu, 435 00:24:03,640 --> 00:24:05,600 kde reťazec je h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 A potom nabudúce GetString je volal a ja zadajte napríklad 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, ktorý počítač bude myslieť si, že to je vlastne 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d, pretože tam bez prerušenia medzi týmito slovami. 439 00:24:18,900 --> 00:24:19,810 >> Takže musíme tú pauzu. 440 00:24:19,810 --> 00:24:20,720 Takže nechceme päť. 441 00:24:20,720 --> 00:24:22,100 Chceme šesť bajtov. 442 00:24:22,100 --> 00:24:23,110 >> A bajtov hovorím. 443 00:24:23,110 --> 00:24:25,220 Ale je to naozaj čas veľkosť char. 444 00:24:25,220 --> 00:24:28,040 Technicky char je takmer vždy jeden byte. 445 00:24:28,040 --> 00:24:31,030 >> Ale len preto, aby náš kód prenosné, aby som tak povedal, tak, že to funguje na 446 00:24:31,030 --> 00:24:33,750 rôznych počítačov, aj keď by mohli byť trochu odlišný pod 447 00:24:33,750 --> 00:24:36,590 kapucňa, budem všeobecne povedať veľkosť char, aby 448 00:24:36,590 --> 00:24:37,660 môj kód vždy funguje. 449 00:24:37,660 --> 00:24:40,610 A nemám překompilovat to len pretože som upgradovať svoj počítač alebo pomocou 450 00:24:40,610 --> 00:24:42,140 nejaké iné platforme. 451 00:24:42,140 --> 00:24:45,300 >> Tak som dostal 6 krát veľkosť char, ktorý sa stane byť jeden. 452 00:24:45,300 --> 00:24:47,440 Takže to znamená, že by malloc Dajte mi šesť bajtov. 453 00:24:47,440 --> 00:24:49,140 Čo je to vlastne robí? 454 00:24:49,140 --> 00:24:52,810 No, dovoľte mi vrátiť sa späť v čase tu tam, kde sme v príbehu. 455 00:24:52,810 --> 00:24:57,620 >> Takže keď sa vraciam domov, som vyhlásil, char * s názvom t 456 00:24:57,620 --> 00:25:00,280 Ja som teraz volal malloc šesť bajtov. 457 00:25:00,280 --> 00:25:06,400 A teraz budem kresliť týchto šiestich bytoch rovnako ako pole predtým. 458 00:25:06,400 --> 00:25:10,570 Ale ja vlastne neviem, čo je to vnútri tohto poľa. 459 00:25:10,570 --> 00:25:14,640 >> Ak sa alokovať pamäť sa ukáže, že nemôžete veriť, že tam je nejaký 460 00:25:14,640 --> 00:25:15,810 známa hodnota tam. 461 00:25:15,810 --> 00:25:18,400 To by boli použité niečím inak, iné funkcie, iné 462 00:25:18,400 --> 00:25:19,630 riadok kódu, ktorý ste napísal. 463 00:25:19,630 --> 00:25:22,870 Takže budeme všeobecne nazývali odpadky hodnoty a kresliť, snáď, ako 464 00:25:22,870 --> 00:25:26,170 otázniky, len naznačuje, že sme Neviem, čo to vlastne je. 465 00:25:26,170 --> 00:25:30,390 A to nie je žiadny veľký problém, tak dlho, ako sme sú dosť bystrí na to prepísať tie 466 00:25:30,390 --> 00:25:34,550 odpadky hodnoty s číslami alebo znaky, ktoré sa starajú o 467 00:25:34,550 --> 00:25:36,340 >> Takže v tomto prípade to, čo budem robiť? 468 00:25:36,340 --> 00:25:38,670 No, moja riadok kódu ďalšie, mám štyri. 469 00:25:38,670 --> 00:25:41,350 int i dostať 0, n dostane dĺžka reťazca s 470 00:25:41,350 --> 00:25:42,750 Takže známy pre sláčiky. 471 00:25:42,750 --> 00:25:45,875 Aj je menšie ako alebo rovný n, ktorá je zvyčajne vyššia. 472 00:25:45,875 --> 00:25:47,500 >> Ale tentokrát je to úmyselné. 473 00:25:47,500 --> 00:25:51,890 I + +, a potom som jednoducho robiť t i držiak dostane s 474 00:25:51,890 --> 00:25:56,320 Pretože môj obrázok vyzerá to na Tento moment, uložené v t je 475 00:25:56,320 --> 00:25:59,530 adresa tohto náhodného kusu pamäti ktorých hodnoty nie sú známe. 476 00:25:59,530 --> 00:26:03,030 Ale akonáhle som sa do t držiak 0, ktorá stavia ma sem. 477 00:26:03,030 --> 00:26:07,430 >> A čo skončí dobývanie vyvodiť? 478 00:26:07,430 --> 00:26:08,740 Sme skončili uvedenie h 479 00:26:08,740 --> 00:26:11,170 Pretože to je to, čo je v držiaku s 0. 480 00:26:11,170 --> 00:26:14,300 A potom to isté pre e a l a l, a o 481 00:26:14,300 --> 00:26:17,930 >> n, prečo som ísť hore cez rovnať k n? 482 00:26:17,930 --> 00:26:19,200 Vzhľadom k charakteru 0.. 483 00:26:19,200 --> 00:26:23,580 Tak aby bolo jasno, potom keď som vlastne vymazať, čo tie odpadky 484 00:26:23,580 --> 00:26:28,870 hodnoty a potom vlastne kresliť to, čo očakávam, je to držiak s 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, a to je koncové nová postava. 486 00:26:32,440 --> 00:26:36,080 >> A tak teraz, ak sme pokračovali okolo bodu, bodka, bodka v tomto správnu verziu 487 00:26:36,080 --> 00:26:41,930 a kapitalizované t držiak 0 by som, ze Samozrejme, bude zarábať práve tento 488 00:26:41,930 --> 00:26:47,050 chlap tu, ktoré koncepčne, bol nakoniec cieľ. 489 00:26:47,050 --> 00:26:48,040 Tak to je všetko, je ukazovateľ. 490 00:26:48,040 --> 00:26:51,430 >> A vy ste používali ich už niekoľko týždňov sa v súvislosti s reťazca. 491 00:26:51,430 --> 00:26:53,530 Ale pod kapotou sú trochu zložitejšie. 492 00:26:53,530 --> 00:26:57,520 Ale ak si myslíte, že o nich v tejto obrazová forma navrhujem, aby to 493 00:26:57,520 --> 00:27:01,720 zrejme nie je všetko, že desivé ako oni mohlo na prvý pohľad zdať na prvý pohľad, 494 00:27:01,720 --> 00:27:04,730 najmä s takou novou syntax. 495 00:27:04,730 --> 00:27:07,290 Akékoľvek otázky týkajúce sa ukazovateľov, reťazca, alebo chars? 496 00:27:07,290 --> 00:27:07,580 Jo? 497 00:27:07,580 --> 00:27:09,252 >> Divákov: môžete sa vrátiť späť na [nepočuteľné]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Iste. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Publikum: Tak ako to, že vo vašom úplne posledný linka, nemusíte mať * T linku 501 00:27:19,525 --> 00:27:21,513 a * s v rade? 502 00:27:21,513 --> 00:27:23,004 Ešte nemáte odkaz na - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ach, je naozaj dobrá otázka. 504 00:27:24,640 --> 00:27:26,800 Prečo mám * T a A * S? 505 00:27:26,800 --> 00:27:30,340 Pretože krátko, minulý týždeň, rovnako ako v našom zameniť funkciu, povedal som, že keď 506 00:27:30,340 --> 00:27:33,350 máš ukazovateľ prostriedkov, ktoré sa tam ako my 507 00:27:33,350 --> 00:27:36,590 fyzicky na javisku, bol skutočne použite hviezdy operátora. 508 00:27:36,590 --> 00:27:40,570 >> Ukazuje sa, že toto námestie-držiak notácie je to, čo budeme hovoriť syntaktická 509 00:27:40,570 --> 00:27:44,190 cukor, ktorý je len spôsob, ako sexy hovorí, že je to skrátený zápis pre 510 00:27:44,190 --> 00:27:45,950 presne to, čo popisujete. 511 00:27:45,950 --> 00:27:49,385 Ale je to trochu viac intuitívne. 512 00:27:49,385 --> 00:27:53,510 A na nebezpečenstvo, že by to vyzerať viac zložitejšie, než je potrebné, aby sa, 513 00:27:53,510 --> 00:27:56,990 čo sa naozaj deje je nasledovné - 514 00:27:56,990 --> 00:28:01,450 Keď poviem, * t to znamená, že ísť do adresa uložená v t 515 00:28:01,450 --> 00:28:04,350 >> Tak doslova, ak t je ukladanie adresa, že H 516 00:28:04,350 --> 00:28:07,300 spočiatku, * t znamená ísť sem. 517 00:28:07,300 --> 00:28:10,730 A teraz, čo sa t držiak 0 znamená? 518 00:28:10,730 --> 00:28:11,560 Presne rovnakú vec. 519 00:28:11,560 --> 00:28:13,510 Je to len o málo viac užívateľovi priateľský písať. 520 00:28:13,510 --> 00:28:14,430 >> Ale ja som neskončil. 521 00:28:14,430 --> 00:28:17,800 Nemôžem len tak povedať * t * S dostane. 522 00:28:17,800 --> 00:28:19,440 Vzhľadom k tomu, čo by som mala robiť potom? 523 00:28:19,440 --> 00:28:22,950 Ja by som dávať h, h, h, h, h v celej veci. 524 00:28:22,950 --> 00:28:22,995 Je to tak? 525 00:28:22,995 --> 00:28:26,020 >> Vzhľadom k tomu * t, je ísť na adresu vt. 526 00:28:26,020 --> 00:28:27,580 Ale my sme vnútri slučky. 527 00:28:27,580 --> 00:28:32,150 A akú hodnotu mám zvyšovanie, Samozrejme, že pri každom opakovaní? 528 00:28:32,150 --> 00:28:32,690 i 529 00:28:32,690 --> 00:28:34,590 >> Ale je tu možnosť tu, že jo? 530 00:28:34,590 --> 00:28:37,870 Aj keď tento pocit, je to čím ďalej trochu sofistikovanejšie 531 00:28:37,870 --> 00:28:40,730 ako štvorcového držiaka zápisu sme použili nejakú dobu - 532 00:28:40,730 --> 00:28:43,840 dovoľte mi vrátiť moju h zmenu tu - 533 00:28:43,840 --> 00:28:48,870 Aj keď je to dnes už trochu milovník, základná myšlienka, ak je t * 534 00:28:48,870 --> 00:28:53,630 tu znamená a * t len prejdite na adresu vt. 535 00:28:53,630 --> 00:28:54,990 >> Ale čo sa adresa v t? 536 00:28:54,990 --> 00:28:56,850 Počet držíme používate? 537 00:28:56,850 --> 00:29:00,540 Ako Ox456, vráťme to späť len kvôli diskusie. 538 00:29:00,540 --> 00:29:05,380 No, keď chcem sa dostať na e do t reťazec, len chcem ísť, 539 00:29:05,380 --> 00:29:06,460 v podstate, 456. 540 00:29:06,460 --> 00:29:09,230 >> Alebo skôr, 457. 541 00:29:09,230 --> 00:29:10,590 Len chcem pridať. 542 00:29:10,590 --> 00:29:11,790 Ale môžem robiť, že jo? 543 00:29:11,790 --> 00:29:14,680 Vzhľadom k tomu, t, i keď stále výkres teraz ako šíp, je to len 544 00:29:14,680 --> 00:29:16,570 číslo, Ox456. 545 00:29:16,570 --> 00:29:21,400 A keď pridám jednu k tomu, alebo viac Všeobecne platí, že keď pridám ja k tomu môžem 546 00:29:21,400 --> 00:29:24,350 skutočne dostať presne tam, kde chcem. 547 00:29:24,350 --> 00:29:26,260 Takže keď som vlastne to - 548 00:29:26,260 --> 00:29:28,970 a to je to, čo sa teraz nazýva ukazovateľ aritmetika - 549 00:29:28,970 --> 00:29:30,375 Nemôžem odstrániť tento riadok. 550 00:29:30,375 --> 00:29:33,550 Čo je, úprimne povedané, myslím, že jasnejšie a trochu viac užívateľsky prívetivé pre čítanie. 551 00:29:33,550 --> 00:29:35,970 Jedná sa však o menej správne. 552 00:29:35,970 --> 00:29:38,570 >> Tento riadok kódu sa používa ukazovateľ aritmetika. 553 00:29:38,570 --> 00:29:40,920 Je to reč choď do nasledujúce adresu - 554 00:29:40,920 --> 00:29:44,670 bez ohľadu na začiatok T, ktorý je t a i, ktorá spočiatku 555 00:29:44,670 --> 00:29:45,730 je 0, čo je skvelé. 556 00:29:45,730 --> 00:29:49,280 Pretože to znamená, že začiatok t plus 1 plus 2 plus 3, a tak ďalej. 557 00:29:49,280 --> 00:29:51,030 A to isté sa zaoberajú s 558 00:29:51,030 --> 00:29:52,750 >> Takže syntaktický cukor pre toto. 559 00:29:52,750 --> 00:29:55,900 Ale pochopenie toho, čo sa naozaj deje pod kapotou, povedal by som, 560 00:29:55,900 --> 00:29:57,410 v skutočnosti užitočné samo o sebe. 561 00:29:57,410 --> 00:30:00,620 Pretože to znamená, že teraz už to nie je oveľa viac mágie deje 562 00:30:00,620 --> 00:30:01,620 pod kapotou. 563 00:30:01,620 --> 00:30:03,920 Nie sú tu bude oveľa viac vrstvy, ktoré môžeme Zlúpnite pre vás. 564 00:30:03,920 --> 00:30:04,810 To je cca. 565 00:30:04,810 --> 00:30:06,410 A to je programovanie. 566 00:30:06,410 --> 00:30:08,002 Naozaj dobrá otázka. 567 00:30:08,002 --> 00:30:11,570 >> Tak jo, bolo to, že kočík program, ktorý som mal na mysli skôr. 568 00:30:11,570 --> 00:30:12,650 odkladacia bola chybná. 569 00:30:12,650 --> 00:30:14,070 Ak sa zdá, že práca. 570 00:30:14,070 --> 00:30:17,390 Pripomeňme, že rovnako ako s mliekom a pomarančový džús - čo som začal 571 00:30:17,390 --> 00:30:18,660 pitie dnešnej demonštrácii. 572 00:30:18,660 --> 00:30:22,220 Takže rovnako ako s pomarančovým džúsom a mlieko, sme musieť použiť 573 00:30:22,220 --> 00:30:26,200 dočasné premenné, tmp, držať dočasne tak, že by sme mohli 574 00:30:26,200 --> 00:30:28,820 zmeňte jeho hodnotu a potom aktualizovať b 575 00:30:28,820 --> 00:30:32,870 >> Ale táto funkcia, sme si povedali, a to program, v ktorom bola táto funkcia 576 00:30:32,870 --> 00:30:35,670 napísal, bola zle a chybný, prečo? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Áno? 579 00:30:39,090 --> 00:30:42,471 >> DIVÁKOV: [nepočuteľné]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Presne tak, keď zavoláte odkladacie - 581 00:30:44,940 --> 00:30:47,820 alebo všeobecnejšie, keď zavolajte najviac akúkoľvek funkciu - 582 00:30:47,820 --> 00:30:51,210 ak sú argumenty tejto funkcie sú primitívne, aby som tak povedal, ints a chars 583 00:30:51,210 --> 00:30:56,740 a dvojlôžkové a plaváky, veci bez hviezdy, ste okoloidúci v kópii 584 00:30:56,740 --> 00:30:57,540 argument. 585 00:30:57,540 --> 00:31:01,580 Takže ak je x 1 a y 2 bol, bude na 1 a b bude 2. 586 00:31:01,580 --> 00:31:05,250 Ale oni sa chystáte byť rôzne kusy bitov, rôzne kúsky 587 00:31:05,250 --> 00:31:07,540 pamäti, že stalo, že sa ukladanie rovnaké hodnoty. 588 00:31:07,540 --> 00:31:12,160 >> Takže tento kód je super perfektné na odkladanie a a b 589 00:31:12,160 --> 00:31:13,850 Je to k ničomu swapping - 590 00:31:13,850 --> 00:31:15,290 minulý týždeň napríklad - 591 00:31:15,290 --> 00:31:16,390 x a y. 592 00:31:16,390 --> 00:31:18,780 Vzhľadom k tomu znova, že sú v nesprávnom rozsahu. 593 00:31:18,780 --> 00:31:21,310 >> Teraz, ako sme ísť o stanovenie toto? 594 00:31:21,310 --> 00:31:23,140 Museli sme funkciu vyzerať trochu škaredšie. 595 00:31:23,140 --> 00:31:25,250 Ale znovu, zvážte, čo to znamená len. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> A vlastne, nechaj ma, konzistencia, zmeniť jednu vec, takže je to rovnaké 598 00:31:31,500 --> 00:31:33,200 čo sme práve urobili. 599 00:31:33,200 --> 00:31:35,690 Ako som už spomenul minulý týždeň, to nie je na tom, kde to ide. 600 00:31:35,690 --> 00:31:38,120 V skutočnosti, zvyčajne by ste dal hviezdy vedľa názvu premennej. 601 00:31:38,120 --> 00:31:40,750 Ale myslím, že to bude trochu jednoduchšie zvážiť * vedľa 602 00:31:40,750 --> 00:31:44,910 dátový typ v tom zmysle, že je to ukazovateľ na int v tomto prípade. 603 00:31:44,910 --> 00:31:46,270 >> Takže to, čo tu vlastne robím? 604 00:31:46,270 --> 00:31:49,590 Hovorím, že mi nedáš int nasleduje ďalšie int, 605 00:31:49,590 --> 00:31:50,810 volať je a, b 606 00:31:50,810 --> 00:31:52,460 Dajte mi adresu int. 607 00:31:52,460 --> 00:31:53,960 Daj mi adresu iného int. 608 00:31:53,960 --> 00:31:56,330 Zavolajte tie adresy a a b 609 00:31:56,330 --> 00:32:00,860 >> A potom pomocou * notáciu dole nižšie, ísť do každej z týchto adries 610 00:32:00,860 --> 00:32:05,290 V prípade potreby sa buď získať alebo nastaviť jeho hodnotu. 611 00:32:05,290 --> 00:32:07,400 Ale je tu výnimka tu. 612 00:32:07,400 --> 00:32:11,130 Prečo nemôžem mať * vedľa tmp? 613 00:32:11,130 --> 00:32:15,070 Prečo to robiť, napríklad? 614 00:32:15,070 --> 00:32:19,370 Mám pocit, ako by som mal ísť all von a opraviť celú vec. 615 00:32:19,370 --> 00:32:19,752 Jo? 616 00:32:19,752 --> 00:32:21,002 >> DIVÁKOV: [nepočuteľné]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: ja som prehlásil, tmp ako reťazec. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Takže by to vyhlásiť, v tomto prípade, tmp byť adresa int. 621 00:32:34,950 --> 00:32:37,380 Ale to nie je to, čo chcem, na niekoľkých dôvodov. 622 00:32:37,380 --> 00:32:38,616 >> DIVÁKOV: Nechcete vymeniť je. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Presne tak, ja nechcem vymeniť čokoľvek s tmp. tmp je len 624 00:32:41,800 --> 00:32:42,790 týždeň jedna vec. 625 00:32:42,790 --> 00:32:45,150 Všetko, čo chcem je premenná uložiť určitý počet. 626 00:32:45,150 --> 00:32:47,330 Nemám ani starať o adresách v tomto okamihu. 627 00:32:47,330 --> 00:32:50,530 >> Potrebujem len 32 bitov alebo takže k uloženiu int. 628 00:32:50,530 --> 00:32:56,690 A ja chcem, aby v týchto 32 bitov čo nie je, aby som tak povedal, ale 629 00:32:56,690 --> 00:33:01,260 čo je, len preto, aby bol presnejší. 630 00:33:01,260 --> 00:33:06,420 Vzhľadom k tomu, ak je adresa, * znamená ísť a získať hodnotu 1. 631 00:33:06,420 --> 00:33:10,560 Napríklad minulý týždeň napríklad alebo v prípade B je, získať hodnotu 2. 632 00:33:10,560 --> 00:33:11,750 >> Takže to, čo sa naozaj deje? 633 00:33:11,750 --> 00:33:15,070 Dovoľte mi, aby som tu nakresliť obrázok, ktorý bude len srandista oddelene časť dnes. 634 00:33:15,070 --> 00:33:18,580 Ale tento trend bude pokračovať, aby sa pre docela nejaký čas. 635 00:33:18,580 --> 00:33:22,430 >> To tvrdím, je to, čo počítač je Pamäť vyzerá pri spustení 636 00:33:22,430 --> 00:33:24,060 programu, každý program. 637 00:33:24,060 --> 00:33:28,340 Pri spustení programu na samom vrchole z pamäte RAM vášho počítača - takže myslieť 638 00:33:28,340 --> 00:33:33,530 Tento obdĺžnik, naozaj, ako váš počítača RAM alebo pamäti, všetky 101 639 00:33:33,530 --> 00:33:36,920 miliarda bajtov, to všetko dve miliardy bajtov, celé dva gigabajty tom, 640 00:33:36,920 --> 00:33:39,910 bez ohľadu na množstvo, ktoré majú, je, Poďme nakresliť napríklad obdĺžnik. 641 00:33:39,910 --> 00:33:43,260 A tvrdím, že pri spustení programu ako je Microsoft Word alebo Chrome 642 00:33:43,260 --> 00:33:49,220 alebo niečo podobné, bity, ktoré Microsoft alebo že Google písal - 643 00:33:49,220 --> 00:33:50,910 V prípade týchto programov - 644 00:33:50,910 --> 00:33:54,490 sú načítané do pamäte počítača kde môžu byť vykonané ďalšie 645 00:33:54,490 --> 00:33:57,520 rýchlo a dodal do procesora, ktorý je mozog počítača. 646 00:33:57,520 --> 00:34:00,940 >> A TAM oni sú skladované pri veľmi horná časť programu, aby som tak povedal. 647 00:34:00,940 --> 00:34:03,300 Inými slovami, ak je to kus pamäť, pri poklepaní na 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bity prichádzajú vypnutie pevného disku. 649 00:34:05,740 --> 00:34:06,680 Dostanú načítaný do pamäte RAM. 650 00:34:06,680 --> 00:34:10,330 A budeme strkať ich do úplne hore tohto obdĺžnika koncepčne. 651 00:34:10,330 --> 00:34:13,010 >> No, zvyšok pamäte je použiť pre rôzne veci. 652 00:34:13,010 --> 00:34:16,460 Na samom vrchole vidíte inicializovať dát a inicializáciu dát. 653 00:34:16,460 --> 00:34:20,500 To súvisí, z väčšej časti, s konštanty alebo globálne premenné 654 00:34:20,500 --> 00:34:21,340 ktoré majú hodnoty. 655 00:34:21,340 --> 00:34:22,980 Ale o tých inokedy. 656 00:34:22,980 --> 00:34:25,150 >> Potom máte hromadu, ktorá vrátime sa. 657 00:34:25,150 --> 00:34:28,420 Ale v spodnej časti, je tá časť, ktorá je najmä Germaine práve teraz. 658 00:34:28,420 --> 00:34:30,210 Je to tzv stack. 659 00:34:30,210 --> 00:34:33,850 Takže rovnako ako vo väčšine akejkoľvek D haly tu kampus, máte tie zásobníky, ktoré 660 00:34:33,850 --> 00:34:37,210 len zásobník na seba, na ktorom si môžete dať jedlo a kto vie čo ešte. 661 00:34:37,210 --> 00:34:40,139 Zásobník v počítačovom systéme je veľmi podobný. 662 00:34:40,139 --> 00:34:42,679 Okrem kým zásobníka, ako ich používame v jedáleň, samozrejme, je potrebné 663 00:34:42,679 --> 00:34:45,710 niesť veci zásobníky alebo rámy - 664 00:34:45,710 --> 00:34:49,469 ako budeme nazývať - ​​v počítači je pamäť sa používa pre zastavenie 665 00:34:49,469 --> 00:34:51,610 premenné a hodnoty. 666 00:34:51,610 --> 00:34:53,929 >> Takže to, čo sa naozaj deje pod kapotou? 667 00:34:53,929 --> 00:34:55,820 No, dovoľte mi otočiť na obrazovku tu. 668 00:34:55,820 --> 00:34:58,370 A poďme zamerať iba na spodná časť na chvíľu. 669 00:34:58,370 --> 00:35:02,770 Pokiaľ sa jedná o spodnú časť z mojich pamäti počítača to dopadá, keď som 670 00:35:02,770 --> 00:35:05,350 volanie funkcie main - čo sa stáva, úprimne povedané, 671 00:35:05,350 --> 00:35:06,950 automaticky pre mňa - 672 00:35:06,950 --> 00:35:10,510 Mám kus pamäte na Spodná časť mojej pamäti, aby som tak povedal. 673 00:35:10,510 --> 00:35:13,390 A to je miesto, kde je hlavnou lokálne premenné ísť. 674 00:35:13,390 --> 00:35:16,770 To je miesto, kde argc a argv možná ísť, a všetky premenné Aj 675 00:35:16,770 --> 00:35:18,170 vyhlásiť vnútri hlavné. 676 00:35:18,170 --> 00:35:20,260 Skončí na dne mojej pamäti RAM počítača. 677 00:35:20,260 --> 00:35:25,040 >> Teraz predpokladajme, že hlavné výzvy funkcie ako odkladací priestor, ako to urobil minulý týždeň? 678 00:35:25,040 --> 00:35:30,620 No, sme v podstate dať nový zásobník novú snímku, na mojom kuse pamäti. 679 00:35:30,620 --> 00:35:34,160 A budem popisovať to ako patriaci do swap. 680 00:35:34,160 --> 00:35:35,770 >> Teraz, čo je vnútri swapu? 681 00:35:35,770 --> 00:35:39,240 No, na základe minulého týždňa a programu tá, ktorú sme práve videli ukážku z, 682 00:35:39,240 --> 00:35:46,590 vnútri swapových rámu, alebo na swapu zásobník, sú to premenné? 683 00:35:46,590 --> 00:35:47,970 No, a, b 684 00:35:47,970 --> 00:35:51,850 Pretože to boli jeho miestnej argumenty, a za tretie, tmp. 685 00:35:51,850 --> 00:35:54,470 Takže naozaj, mohol by som nakresliť to trochu čistejšie. 686 00:35:54,470 --> 00:35:56,680 Nechaj ma ísť dopredu a späť štítku. 687 00:35:56,680 --> 00:35:58,520 A dovoľte mi tvrdiť, že viete, čo? 688 00:35:58,520 --> 00:36:00,560 >> pravdepodobne skončí tu. 689 00:36:00,560 --> 00:36:02,160 B skončí tu. 690 00:36:02,160 --> 00:36:03,810 A tmp skončí tu. 691 00:36:03,810 --> 00:36:05,160 Teraz, možno usporiadanie byť trochu inak. 692 00:36:05,160 --> 00:36:06,840 Ale koncepčne to je nápad. 693 00:36:06,840 --> 00:36:11,490 >> A len spoločne, to je to, čo zavoláme swapu rámu, alebo 694 00:36:11,490 --> 00:36:12,136 jedálenská sála zásobník. 695 00:36:12,136 --> 00:36:13,150 A to isté sa zaoberajú hlavnou. 696 00:36:13,150 --> 00:36:14,040 Ale nebudem prekresľovať, že. 697 00:36:14,040 --> 00:36:17,810 Ale to je miesto, kde argc a argv a akékoľvek svojich lokálnych premenných, ako je x a y 698 00:36:17,810 --> 00:36:18,940 môže byť tiež. 699 00:36:18,940 --> 00:36:22,170 >> Takže teraz zvažuje, čo sa skutočne deje keď zavoláte swapu. 700 00:36:22,170 --> 00:36:26,370 Ak voláte do swapu, spustenie kódu ako to, že ste odovzdaním, v 701 00:36:26,370 --> 00:36:30,670 buggy verzia A a B ako kópia x a y. 702 00:36:30,670 --> 00:36:34,300 Takže keď som sa teraz kresliť to na displeji - 703 00:36:34,300 --> 00:36:36,700 sa dostať lepšie na to - 704 00:36:36,700 --> 00:36:40,850 tak príbeh hovoril som si pre seba bolo v tejto verzii kočíku, keď 705 00:36:40,850 --> 00:36:46,130 zavolajte vymeniť odovzdaním doslova a a b ako celé čísla, čo sa skutočne deje? 706 00:36:46,130 --> 00:36:48,250 >> No, čo sa naozaj deje, je to. 707 00:36:48,250 --> 00:36:52,850 Nechaj ma ísť dopredu a späť len upratať nejaký priestor tu. 708 00:36:52,850 --> 00:36:54,720 Tak toto je moja pamäť počítača. 709 00:36:54,720 --> 00:36:57,510 >> Takže ak mám napríklad - 710 00:36:57,510 --> 00:36:58,910 vlastne urobíme to takto - 711 00:36:58,910 --> 00:37:02,690 keď tvrdí, že je to x, skladovanie hodnota 1, rovnako ako minulý týždeň. 712 00:37:02,690 --> 00:37:05,930 A to je y, uloženie hodnoty 2 rovnako ako minulý týždeň. 713 00:37:05,930 --> 00:37:11,370 A to je hlavné, keď volám swapu, čím sám prístup a 714 00:37:11,370 --> 00:37:15,150 b a tmp, budem tvrdiť, že to je, a to je 1. 715 00:37:15,150 --> 00:37:16,080 >> To je b 716 00:37:16,080 --> 00:37:17,010 To je 2. 717 00:37:17,010 --> 00:37:18,370 To sa nazýva tmp. 718 00:37:18,370 --> 00:37:23,360 >> A spočiatku, to má určitú hodnotu, odpadky kým som vlastne ukladať v ňom, 719 00:37:23,360 --> 00:37:24,450 čo je 1. 720 00:37:24,450 --> 00:37:28,320 Potom som sa do toho pustite a zmeniť byť čo? 721 00:37:28,320 --> 00:37:29,720 B je hodnota. 722 00:37:29,720 --> 00:37:31,980 >> A tak teraz mám dva tu. 723 00:37:31,980 --> 00:37:34,050 A potom sme si povedali, b dostane tmp. 724 00:37:34,050 --> 00:37:37,670 Opäť, rovnako ako zdravý rozum skontrolujte, tretí riadok kódu je tu jednoducho toto 725 00:37:37,670 --> 00:37:39,440 jeden, b dostane tmp. 726 00:37:39,440 --> 00:37:41,730 >> A tak nakoniec, čo mám robiť? 727 00:37:41,730 --> 00:37:46,800 Idem do toho a zmeňte b ako niečo, čo hodnota TMP je, čo je 1. 728 00:37:46,800 --> 00:37:48,390 Ja sa nedotýkajte tmp znova. 729 00:37:48,390 --> 00:37:54,100 >> Ale teraz, problém je, akonáhle odkladacia vracia, pretože nie je rozdávajú 730 00:37:54,100 --> 00:37:57,540 späť nejakú hodnotu, nie je návratu vyhlásenie výslovne v ňom. 731 00:37:57,540 --> 00:37:59,080 Čo sa vlastne deje? 732 00:37:59,080 --> 00:38:03,480 No, v podstate všetko pamäť - 733 00:38:03,480 --> 00:38:07,410 OK, zrejme guma páči len jedným prstom naraz - 734 00:38:07,410 --> 00:38:08,180 jednoducho zmizne. 735 00:38:08,180 --> 00:38:10,070 >> Teraz v skutočnosti to nie je nejdem. 736 00:38:10,070 --> 00:38:11,810 Ale môžete si ju teraz ako otázniky. 737 00:38:11,810 --> 00:38:14,040 Pretože je to už v súčasnej dobe používajú. 738 00:38:14,040 --> 00:38:17,470 A nič sa vykonáva s týmito hodnotami. 739 00:38:17,470 --> 00:38:21,920 >> Takže v prípade zeleného verzia tento kód, čo namiesto toho je, že 740 00:38:21,920 --> 00:38:24,640 prechádzal do swapu? 741 00:38:24,640 --> 00:38:25,770 Tak rieši. 742 00:38:25,770 --> 00:38:28,520 Takže adresa xa adresa y. 743 00:38:28,520 --> 00:38:35,790 Takže keď znovu povedať tento príbeh ešte posledný čas, a ja som vlastne kresliť odkladacia znova, 744 00:38:35,790 --> 00:38:44,620 ale s ukazovateľmi, čo je, to b je, a to je tmp, čo je 745 00:38:44,620 --> 00:38:49,080 v skutočnosti uložené v tejto zelenej verzia môjho kódu, kde som okolo 746 00:38:49,080 --> 00:38:52,110 na adresách? 747 00:38:52,110 --> 00:38:53,780 >> To bude ukazovateľ na x. 748 00:38:53,780 --> 00:38:54,890 Takže som mohol nakresliť šípku. 749 00:38:54,890 --> 00:38:57,310 Ale poďme používajú rovnaké ľubovoľná napríklad ako predtým. 750 00:38:57,310 --> 00:39:01,220 Povedzme, že je to niečo ako Ox123. 751 00:39:01,220 --> 00:39:04,970 A to bude, pretože Ox127 je to štyri byty preč, pretože je to 752 00:39:04,970 --> 00:39:07,370 int, takže Ox127. 753 00:39:07,370 --> 00:39:09,080 >> A opäť, beriem nejaké slobody s číslami. 754 00:39:09,080 --> 00:39:11,430 Sú oveľa menšie, než by v skutočnosti byť, a v inom poradí. 755 00:39:11,430 --> 00:39:14,350 Ale to je, ako sa obraz je teraz iný. 756 00:39:14,350 --> 00:39:19,060 >> Ale keď som sa použiť túto zelenú kód a ja int tmp dostať *. 757 00:39:19,060 --> 00:39:25,010 * Prostriedok vykonať nasledujúce kroky, sa riešenie, ktoré je v a ísť k nej, 758 00:39:25,010 --> 00:39:26,190 čo je 1. 759 00:39:26,190 --> 00:39:28,480 A to je to, čo som potom dal do tmp. 760 00:39:28,480 --> 00:39:32,480 Medzitým sa na ďalšom riadku kódu tu * dostane b, čo to znamená? 761 00:39:32,480 --> 00:39:36,910 >> No, *, tak choďte sem dostane * b, čo znamená, že sa tam. 762 00:39:36,910 --> 00:39:39,310 A to znamená, dať hodnotu tam. 763 00:39:39,310 --> 00:39:43,670 Konečne, posledný riadok kódu jednoducho povedané b * dostane tmp. 764 00:39:43,670 --> 00:39:48,900 >> Tak b hovorí, že tam a prepísať ju tmp, ktoré je v tomto prípade, bude 765 00:39:48,900 --> 00:39:51,520 sa opäť, 1. 766 00:39:51,520 --> 00:39:54,920 A to je dôvod, prečo zelená verzia Náš kódex práce, zatiaľ čo červená 767 00:39:54,920 --> 00:39:56,010 verzia nikdy. 768 00:39:56,010 --> 00:39:59,020 To všetko len sa scvrkáva na tom, ako pamäť je riadená a kde je to 769 00:39:59,020 --> 00:40:02,580 v skutočnosti uložené do počítača RAM. 770 00:40:02,580 --> 00:40:07,270 A teraz, to je jedna z vecí, že zásobník sa používa. 771 00:40:07,270 --> 00:40:09,225 >> Otázky týkajúce sa rozvrhnutia? 772 00:40:09,225 --> 00:40:10,380 Na ukazovateli? 773 00:40:10,380 --> 00:40:11,630 Alebo o swapu? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Dobre, takže malloc, odvolanie, urobil niečo také. 776 00:40:17,043 --> 00:40:18,260 To bol výborný jednoduchý príklad. 777 00:40:18,260 --> 00:40:20,550 A to bol ten, že Binky nám predstavil, i keď úplne 778 00:40:20,550 --> 00:40:21,870 rýchlo, na konci hodiny. 779 00:40:21,870 --> 00:40:24,480 Sakra, tam zase. 780 00:40:24,480 --> 00:40:28,780 >> Takže pripomenúť, že to bol príklad, ktorý Binky nám predstavil, aj keď 781 00:40:28,780 --> 00:40:30,360 trochu rýchlo na konci hodiny. 782 00:40:30,360 --> 00:40:33,640 A tu sme naozaj malloc druhýkrát. 783 00:40:33,640 --> 00:40:37,330 Vzhľadom k tomu, prvýkrát sme ho vytvoriť dostatok pamäte RAM, prideliť dostatok pamäte RAM 784 00:40:37,330 --> 00:40:38,340 pre uloženie reťazca. 785 00:40:38,340 --> 00:40:40,250 >> Tentoraz Binky držal to jednoduché. 786 00:40:40,250 --> 00:40:42,465 Takže je to len na ukladanie int, zrejme. 787 00:40:42,465 --> 00:40:43,510 A to je úplne v pohode. 788 00:40:43,510 --> 00:40:46,560 Je to trochu divné, úprimne povedané, na používať malloc alokovať jeden int. 789 00:40:46,560 --> 00:40:50,650 Ale bod claymation Nick bol naozaj len rozprávať príbeh o tom, čo 790 00:40:50,650 --> 00:40:53,830 sa stane alebo nestane, keď môžete týrať pamäti. 791 00:40:53,830 --> 00:40:56,520 >> Takže v tomto prípade, tento program Urobil pár vecí. 792 00:40:56,520 --> 00:41:01,580 V prvom prípade sa tu, sa vyhlasuje ukazovateľ s názvom x na int. 793 00:41:01,580 --> 00:41:04,480 To potom deklaruje ukazovateľ volal y na int. 794 00:41:04,480 --> 00:41:06,150 To potom uloží do x, čo? 795 00:41:06,150 --> 00:41:07,110 Niekto teraz. 796 00:41:07,110 --> 00:41:09,685 Čo je uložená v X podľa Tretí riadok tohto programu? 797 00:41:09,685 --> 00:41:12,380 >> DIVÁKOV: [nepočuteľné]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: No, nie tak celkom bajtov, za hovoria. 799 00:41:14,130 --> 00:41:16,760 Byť presnejší teraz. 800 00:41:16,760 --> 00:41:18,325 Čo je uložená v X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Adresa, myslím, že som to počul. 803 00:41:22,060 --> 00:41:23,570 >> Takže čo malloc vráti? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorálne prideľuje kus pamäte. 805 00:41:26,030 --> 00:41:27,850 Ale ako to umožňujú prístup k nej? 806 00:41:27,850 --> 00:41:29,460 Vracia čo? 807 00:41:29,460 --> 00:41:32,000 Adresa prvého bajtu v bloku pamäti. 808 00:41:32,000 --> 00:41:33,020 >> Teraz, to je super jednoduchý. 809 00:41:33,020 --> 00:41:35,380 Je to len jeden bajt, čo znamená, že zaoberať sa dostávame späť je 810 00:41:35,380 --> 00:41:37,300 adresa z toho všetkého. 811 00:41:37,300 --> 00:41:42,070 Skladovať tak v X, potom je adresa tohto bloku pamäte. 812 00:41:42,070 --> 00:41:43,400 Medzitým, čo sa stane ďalej? 813 00:41:43,400 --> 00:41:45,890 Takže vlastne, poďme ďalej a čerpať z tohto naozaj rýchlo. 814 00:41:45,890 --> 00:41:52,490 >> Takže ak prejdeme na obrazovku a tu budeme hrať na to int * x a int * y 815 00:41:52,490 --> 00:41:53,740 bude robiť to, čo pre mňa? 816 00:41:53,740 --> 00:41:58,280 Tvrdím, že je to len bude robiť niečo také a nazývať to x a 817 00:41:58,280 --> 00:42:00,010 to a hovoria y. 818 00:42:00,010 --> 00:42:03,110 Medzitým, tretí riadok kódu je bude alokovať veľkosť int, 819 00:42:03,110 --> 00:42:06,160 ktorý sa stane byť - Ospravedlňujem sa, či som povedal, jeden predtým, než som chcel jeden int - 820 00:42:06,160 --> 00:42:08,280 štyri byty na typickom počítači. 821 00:42:08,280 --> 00:42:09,720 Aspoň sa CS50 spotrebiča. 822 00:42:09,720 --> 00:42:11,490 >> Takže to bude prideľovať to, kto vie? 823 00:42:11,490 --> 00:42:12,800 Niekde tu. 824 00:42:12,800 --> 00:42:15,780 A táto je uložená na niektoré Adresa Ox, kto vie? 825 00:42:15,780 --> 00:42:18,330 Ale to, čo sa deje, aby sa vrátil je tá adresa. 826 00:42:18,330 --> 00:42:22,270 Ale budeme kresliť to obrazovo len ako šípka takhle. 827 00:42:22,270 --> 00:42:25,430 >> Teraz v ďalšom riadku * x dostane 42. 828 00:42:25,430 --> 00:42:29,400 Čo * x znamená laicky povedané? 829 00:42:29,400 --> 00:42:30,040 Len tam. 830 00:42:30,040 --> 00:42:30,960 Prejdite na túto adresu. 831 00:42:30,960 --> 00:42:35,900 Alebo inými slovami, postupujte šípka a dať tam 42. 832 00:42:35,900 --> 00:42:38,140 Ale potom sa niečo zlé stalo na Binky, že jo? 833 00:42:38,140 --> 00:42:43,950 >> Pripomeňme, že linku päť tu, * y dostane 13, naozaj nešťastné číslo, 834 00:42:43,950 --> 00:42:44,760 čo urobil pre nás? 835 00:42:44,760 --> 00:42:47,320 No, * y znamená ísť. 836 00:42:47,320 --> 00:42:50,460 No, nebola táto možnosť daná hodnota ešte, že jo? 837 00:42:50,460 --> 00:42:54,090 Kód nemá y je inicializovaný na čokoľvek. 838 00:42:54,090 --> 00:42:56,120 Mali sme x inicializované na adresu. 839 00:42:56,120 --> 00:42:57,640 Ale y bol vyhlásený až vrchol. 840 00:42:57,640 --> 00:43:00,250 Ale potom bodkočiarka, žiadna hodnota bol vlastne do neho. 841 00:43:00,250 --> 00:43:02,330 Takže je to fér nazývať odpadky hodnota. 842 00:43:02,330 --> 00:43:03,430 Kto vie, čo je to? 843 00:43:03,430 --> 00:43:07,160 Sú to zvyšky bitov, ktoré boli použité nejakým predchádzajúcom riadku kódu v 844 00:43:07,160 --> 00:43:08,300 môj program. 845 00:43:08,300 --> 00:43:13,250 >> Takže keď poviem, tam ísť, je to ako, Nemám tušenie, kde to je šípka 846 00:43:13,250 --> 00:43:14,490 Skončím. 847 00:43:14,490 --> 00:43:17,720 A to je, keď sa obvykle dostanete segmentation fault. 848 00:43:17,720 --> 00:43:22,430 Ak ste omylom dereferencia, tak hovoriť, alebo prejdite na adresu, že to nie je 849 00:43:22,430 --> 00:43:25,400 vlastne legitímne adresa, zlé veci sa stávajú. 850 00:43:25,400 --> 00:43:27,550 >> A to je presne to, čo sa stalo myslieť Binky. 851 00:43:27,550 --> 00:43:31,060 Takže pripomenúť, že príbeh, ktorý je Nick rozprávanie tu bol rovnaký nápad ako to, čo 852 00:43:31,060 --> 00:43:34,050 Som sa vypracovaný s ilúziou krieda na tabuľu tam. 853 00:43:34,050 --> 00:43:35,960 X a Y sú deklarované. 854 00:43:35,960 --> 00:43:39,690 >> Potom sme pridelené veľkosť int a uložiť ho do x. 855 00:43:39,690 --> 00:43:42,130 Potom ďalší riadok sme * x. 856 00:43:42,130 --> 00:43:46,070 To bol Nickov kúzelná palička z dereferencing. 857 00:43:46,070 --> 00:43:49,780 To dal 42 do pamäti poukázal x. 858 00:43:49,780 --> 00:43:51,600 >> Ale to je miesto, kde sa veci išiel strašne zle. 859 00:43:51,600 --> 00:43:51,820 Je to tak? 860 00:43:51,820 --> 00:43:53,550 Snažili sme sa dereferencování y. 861 00:43:53,550 --> 00:43:55,620 Ale y mal nejakú fiktívnu hodnotu, nie? 862 00:43:55,620 --> 00:43:57,720 >> To Šípka v ľavom dolnom roh, nie je 863 00:43:57,720 --> 00:43:58,950 v skutočnosti ukazuje na čokoľvek. 864 00:43:58,950 --> 00:44:01,520 Je to niečo, čo som robil som tu na palube. 865 00:44:01,520 --> 00:44:05,900 Tak zlé veci sa stávajú, segmentácia chyba, alebo chyba Binky, v tomto prípade. 866 00:44:05,900 --> 00:44:10,800 >> Ale keď sme potom opraviť, že tým x dostane y, ako ten príbeh zmenu? 867 00:44:10,800 --> 00:44:15,760 No, keď to urobím x y dostane, to je fakticky rovnaké, ako hovorí 868 00:44:15,760 --> 00:44:19,235 bez ohľadu na to, čo Ox- bude rovnaký tu, 869 00:44:19,235 --> 00:44:20,080 Ox-niečo. 870 00:44:20,080 --> 00:44:22,970 Alebo obrazovo budeme kresliť šípku. 871 00:44:22,970 --> 00:44:25,530 >> Tak tu na doske s Binky, s ďalší riadok 872 00:44:25,530 --> 00:44:28,350 kód * y znamená ísť. 873 00:44:28,350 --> 00:44:29,400 Kde je tam? 874 00:44:29,400 --> 00:44:30,820 To znamená, že tu. 875 00:44:30,820 --> 00:44:36,050 >> A keď sme aktualizáciu, že je to 13 to jednoducho znamená ísť a 876 00:44:36,050 --> 00:44:39,470 písanie 13 tu. 877 00:44:39,470 --> 00:44:44,130 Takže možno nie je úplne jednoduché na prvý pohľad. 878 00:44:44,130 --> 00:44:47,740 Ale zhrnúť a používať rovnaký žargón že Binky použil tu, tak 879 00:44:47,740 --> 00:44:50,485 Prvé dve prideliť ukazovateľov, x a y, ale nie pointees. 880 00:44:50,485 --> 00:44:54,750 A pointees nie je všeobecne používaný termín. 881 00:44:54,750 --> 00:44:56,120 Ale je úplne ukazovateľ. 882 00:44:56,120 --> 00:44:59,200 Ale to je to, čo ich upozornil na základe nomenklatúry Binky je. 883 00:44:59,200 --> 00:45:01,660 >> Táto ďalší rad, samozrejme, prideľuje int pointee. 884 00:45:01,660 --> 00:45:04,840 Takže kus pamäti - ako som nakreslil viac ako na pravá strana existuje - a set 885 00:45:04,840 --> 00:45:06,470 x rovné odkázať sa na neho. 886 00:45:06,470 --> 00:45:11,350 To dereferences x ukladať 42 v pamäti, že je to ukázal na. 887 00:45:11,350 --> 00:45:13,380 A potom, samozrejme, bola zlá vec. 888 00:45:13,380 --> 00:45:15,600 Vzhľadom k tomu, y nebol ukázal na niečo ešte. 889 00:45:15,600 --> 00:45:16,530 To opraví ju. 890 00:45:16,530 --> 00:45:18,240 Takže je to stále buggy programu. 891 00:45:18,240 --> 00:45:21,580 Len preto, že sme prefúknutiu kód riadok po riadku a hovorí, ach dobre, 892 00:45:21,580 --> 00:45:22,690 nechať to spadnúť tam. 893 00:45:22,690 --> 00:45:23,420 To je zlé. 894 00:45:23,420 --> 00:45:26,790 Kurz je program práve chystá prerušiť úplne na tomto riadku. 895 00:45:26,790 --> 00:45:30,550 Ale ak by ste chceli odstrániť havaroval linka a nahradiť ju posledné dva 896 00:45:30,550 --> 00:45:32,470 riadkoch priradíte - 897 00:45:32,470 --> 00:45:35,310 pomocou priradenie ukazovateľa - y poukázať na x ako bod t. 898 00:45:35,310 --> 00:45:39,280 A potom si dereferencia y vo veľmi bezpečným spôsobom. 899 00:45:39,280 --> 00:45:41,520 >> Takže tam, kde to nás? 900 00:45:41,520 --> 00:45:45,350 No, ukázalo sa, že pod kapotou v CS50 knižnici ukazovatele sú 901 00:45:45,350 --> 00:45:46,320 používaný v celom. 902 00:45:46,320 --> 00:45:48,910 A budeme skutočne začať lúpať späť táto vrstva onedlho. 903 00:45:48,910 --> 00:45:51,740 Ale ukazuje sa tiež, že výraz niektorí z vás by mohol byť poznať, 904 00:45:51,740 --> 00:45:54,580 najmä pohodlnejšie, je v skutočnosti, že z veľmi populárnej 905 00:45:54,580 --> 00:45:56,390 webové stránky, alebo pretečeniu zásobníka, v týchto dňoch. 906 00:45:56,390 --> 00:45:58,720 >> Ale to v skutočnosti má veľmi technický význam. 907 00:45:58,720 --> 00:46:00,160 Teraz vieme, čo stack. 908 00:46:00,160 --> 00:46:02,550 Je to ako hromada zásobníkov vnútri jedálni. 909 00:46:02,550 --> 00:46:05,140 >> Alebo vo vnútri vášho počítača Pamäť its tie rámy 910 00:46:05,140 --> 00:46:06,900 , Ktoré sú používané funkcie. 911 00:46:06,900 --> 00:46:10,760 No, ukázalo sa, že z dôvodu, že veľmi jednoduchá implementácia 912 00:46:10,760 --> 00:46:14,970 pamäť a rámy na tzv stack, môžete skutočne prevziať kontrolu 913 00:46:14,970 --> 00:46:17,050 z počítačového systému pomerne ľahko. 914 00:46:17,050 --> 00:46:22,180 Môžete sa preniknúť do systému, ak ľudia ako my nenapísal náš kód 915 00:46:22,180 --> 00:46:23,300 veľmi dobre. 916 00:46:23,300 --> 00:46:26,670 >> Ak sa ľudia ako my používajú kusy pamäťových alebo použitie polí - 917 00:46:26,670 --> 00:46:27,810 ešte častejšie - 918 00:46:27,810 --> 00:46:31,800 ale niekedy nezabudnite skontrolovať Hranice našej ponuku, ako si môžete 919 00:46:31,800 --> 00:46:38,470 Nechať sa niekedy, a opakoval príliš ďaleko za koncom poľa. 920 00:46:38,470 --> 00:46:40,520 V najlepšom prípade je váš program môže len pád. 921 00:46:40,520 --> 00:46:42,280 Segmentation fault, druh trápne. 922 00:46:42,280 --> 00:46:45,480 Nič moc, ale nie je to nevyhnutne veľmi zlé. 923 00:46:45,480 --> 00:46:49,480 >> Ale ak váš program je vlastne v reálnom počítače užívateľov, ak je to beh 924 00:46:49,480 --> 00:46:53,070 na internetových stránkach, že skutočné náhodné občanov, na internete sa biť, prenájom 925 00:46:53,070 --> 00:46:56,690 ľudí vyvolať zlé veci vo vašom kóde vo všeobecnosti nie je dobrá vec, pretože 926 00:46:56,690 --> 00:46:59,930 to znamená, že príležitosť na ovládanie z počítača. 927 00:46:59,930 --> 00:47:01,350 A to bude vyzerať trochu záhadný. 928 00:47:01,350 --> 00:47:04,570 Ale ja som myslel, že by som ťa vydesiť sa Tento posledný príklad tu. 929 00:47:04,570 --> 00:47:05,650 >> Tu je príklad kódu. 930 00:47:05,650 --> 00:47:07,370 A je to dobrý Wikipedia článok, ktorý prechádza 931 00:47:07,370 --> 00:47:08,530 to podrobnejšie. 932 00:47:08,530 --> 00:47:13,890 Mám hlavné na spodnej povolania foo, prechádzajúcej v argv dňa 1.. 933 00:47:13,890 --> 00:47:15,750 A to len preto, že môžete spustiť program a odovzdať 934 00:47:15,750 --> 00:47:17,080 ľubovoľný vstup. 935 00:47:17,080 --> 00:47:20,180 >> A potom foo oznámené až hore ako prijímať reťazec, alebo viac 936 00:47:20,180 --> 00:47:21,700 presne, char *. 937 00:47:21,700 --> 00:47:23,860 To potom deklaruje pole znakov. 938 00:47:23,860 --> 00:47:27,130 Nazvime to buffer, všeobecnejšie, o veľkosti 12. 939 00:47:27,130 --> 00:47:30,900 Takže 12 znakov vojde dovnútra tohto poľa s názvom C. 940 00:47:30,900 --> 00:47:33,510 >> A potom sa to používa túto novú funkciu, ktorý je nový, ale nie je ťažké 941 00:47:33,510 --> 00:47:34,930 Rozumiem, pamäte kópiu. 942 00:47:34,930 --> 00:47:39,290 To skopíruje pamäť z baru, ktorý bol premenná n minulosti, bez ohľadu na 943 00:47:39,290 --> 00:47:42,080 užívateľ zadať do argv 1 do cca. 944 00:47:42,080 --> 00:47:43,090 Koľko bajtov? 945 00:47:43,090 --> 00:47:44,260 Dĺžka reťazca baru. 946 00:47:44,260 --> 00:47:48,380 >> Takže inými slovami, v prípade, že používateľ zadá h-e-l-l-o enter, dĺžka reťazca 947 00:47:48,380 --> 00:47:49,260 z ahoj je päť. 948 00:47:49,260 --> 00:47:52,790 Takže päť z týchto bytov bude mať skopírované do poľa s názvom C, čo 949 00:47:52,790 --> 00:47:54,110 je o veľkosti 12. 950 00:47:54,110 --> 00:47:58,710 Ale to, čo používateľ zadá oveľa dlhšie Slovo, ktoré je 13 znakov alebo 14 951 00:47:58,710 --> 00:48:01,250 znakov alebo 100 alebo viac znakov? 952 00:48:01,250 --> 00:48:02,660 >> Kam sa chystajú ísť? 953 00:48:02,660 --> 00:48:06,090 No, to rám, že je zásobník v jedálni zásobníku, 954 00:48:06,090 --> 00:48:06,930 idú tam ísť. 955 00:48:06,930 --> 00:48:10,080 A je to len začnú prepisovať ďalšie veci, ktoré už 956 00:48:10,080 --> 00:48:12,880 na tomto zásobníku, pretekajúca zásobník, aby som tak povedal. 957 00:48:12,880 --> 00:48:14,780 >> Takže obrazne, myslím, že to takto. 958 00:48:14,780 --> 00:48:17,970 To je len farebné verzie obrázok sme boli kreslenie. 959 00:48:17,970 --> 00:48:20,060 V dolnej časti, povedzme, je hlavné. 960 00:48:20,060 --> 00:48:24,690 A na vrchole, čo vidíte teraz Rám je, farebne značená teraz, pre 961 00:48:24,690 --> 00:48:26,090 volaná funkcia foo. 962 00:48:26,090 --> 00:48:30,170 Ale čo je zaujímavé, o foo je, že tu je jeho rám. 963 00:48:30,170 --> 00:48:32,860 Takže je vypracovaný tak ako ja urobil, ale vo svetle modrej farbe. 964 00:48:32,860 --> 00:48:35,220 A teraz to je miesto, kde c držiak 0 ide. 965 00:48:35,220 --> 00:48:37,410 A to je miesto, kde c držiak 11 sa chystá skončiť. 966 00:48:37,410 --> 00:48:39,670 >> Inými slovami, to sa stane môže byť reprezentovaný ako štvorca. 967 00:48:39,670 --> 00:48:42,320 Ale ak si len udržať plopping bajtov dole - alebo znaky - idú až do konca 968 00:48:42,320 --> 00:48:46,070 sa na mieste 0 až hore na 11, pretože je to 0 indexované. 969 00:48:46,070 --> 00:48:49,170 >> Ale kde je 13. znak Skončím? 970 00:48:49,170 --> 00:48:50,310 Kde je 14? 971 00:48:50,310 --> 00:48:52,430 Kde je 50. znak Skončím? 972 00:48:52,430 --> 00:48:54,070 >> Bude to ďalej dole. 973 00:48:54,070 --> 00:48:57,350 Pretože aj keď sme vypracovali obraz s zásobníka vyrastal, 974 00:48:57,350 --> 00:48:59,920 adresy, to dopadá, ísť od malé adresy, malé 975 00:48:59,920 --> 00:49:01,830 ukazovatele, na veľkých adresy. 976 00:49:01,830 --> 00:49:03,540 Tak to jednoducho stále ísť vyššie a vyššie. 977 00:49:03,540 --> 00:49:05,660 >> Takže v prípade, že používateľ zadá Dobrý deň, to je skvelé. 978 00:49:05,660 --> 00:49:08,650 Žiadny problém, žiadny problém, každý je v bezpečí. 979 00:49:08,650 --> 00:49:11,940 Ale v prípade, že používateľ zadá, čo budeme zavolajte kontradiktórne kód, zastúpená 980 00:49:11,940 --> 00:49:16,040 druhovo ako, útok, útok, Útok, útok, môže, čo sa stalo? 981 00:49:16,040 --> 00:49:19,760 >> No, ak sú všetky vstupe, že užívateľ zadali nie je len nejaký priateľský 982 00:49:19,760 --> 00:49:21,540 alebo urážlivé reťazec znakov. 983 00:49:21,540 --> 00:49:24,050 Je to vlastne postupnosť znakov že ak si ju vydal, 984 00:49:24,050 --> 00:49:26,050 to vlastne je kód. 985 00:49:26,050 --> 00:49:29,570 Možno je to kód, ktorý odstráni všetky súbory na vašom pevnom disku alebo odosiela spam 986 00:49:29,570 --> 00:49:30,810 alebo niečo také. 987 00:49:30,810 --> 00:49:35,110 Všimnite si, že to, čo je kľúčové je to, že v prípade, že zlý človek má to šťastie, že 988 00:49:35,110 --> 00:49:37,830 prepísať červený kus pamäti - 989 00:49:37,830 --> 00:49:41,080 ktoré som nevytiahol na mojom obrázku, ale tento obrázok Wikipedia tu má - 990 00:49:41,080 --> 00:49:42,890 jeho tzv spiatočná adresa. 991 00:49:42,890 --> 00:49:47,470 >> Keď jedlo vracia, keď swapové priznanie, ako sa počítač vedieť, ísť od 992 00:49:47,470 --> 00:49:49,790 sa sem tu dole? 993 00:49:49,790 --> 00:49:52,920 Alebo v tech segmente hore, ako to viem, ísť zo swapu 994 00:49:52,920 --> 00:49:54,870 kód - 0 a 1 je , Ktoré tvorí odkladaciu - 995 00:49:54,870 --> 00:49:56,020 Späť na hlavnú stranu? 996 00:49:56,020 --> 00:50:00,450 K dispozícii je tzv spiatočná adresa uložené v rovnakom zásobníku rám, na 997 00:50:00,450 --> 00:50:02,140 rovnaké jedáleň zásobník. 998 00:50:02,140 --> 00:50:06,080 >> Takže v prípade, že zloduch je natoľko šikovný, aby vložte kód útoku, útok kód, útok 999 00:50:06,080 --> 00:50:07,960 kód a získať šťastie - 1000 00:50:07,960 --> 00:50:11,630 často prostredníctvom pokusov a omylov - do prepísať červené spiatočnú adresu, 1001 00:50:11,630 --> 00:50:14,360 s adresou a oznámenia na samý vrchol. 1002 00:50:14,360 --> 00:50:16,830 Všimnite si, 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Je napísaný späť hore hore pre Dôvody budeme snáď znova. 1004 00:50:20,650 --> 00:50:22,050 Je to, že číslo. 1005 00:50:22,050 --> 00:50:25,790 >> Takže ak zloduch dostane šťastie alebo je dosť chytrý, aby prepísať červená 1006 00:50:25,790 --> 00:50:29,480 pás z pamäte s adresou Kód, ktorý on alebo ona má nejako 1007 00:50:29,480 --> 00:50:34,980 vstrekuje do počítača, myslím, ktorého kód bude vrátená 1008 00:50:34,980 --> 00:50:38,260 akonáhle foo sa vykonáva spustením? 1009 00:50:38,260 --> 00:50:39,440 >> Zloducha v code. 1010 00:50:39,440 --> 00:50:43,610 Takže ten útok kódu, AAA, znova, možno odosielanie nevyžiadanej pošty, môže odstrániť všetky súbory 1011 00:50:43,610 --> 00:50:44,500 na pevnom disku. 1012 00:50:44,500 --> 00:50:48,740 Ale to je to, čo skutočne pretečenie zásobníka je, alebo pretečeniu vyrovnávacej pamäte, alebo 1013 00:50:48,740 --> 00:50:51,060 buffer overflow útok. 1014 00:50:51,060 --> 00:50:54,400 >> A je to neuveriteľne, neuveriteľne časté k tomuto dňu s programy napísané v 1015 00:50:54,400 --> 00:50:58,220 C, C + +, a dokonca aj niektoré ďalšie jazyky. 1016 00:50:58,220 --> 00:51:02,275 Na tomto desivé vedomie, budeme končí vtip. 1017 00:51:02,275 --> 00:51:03,230 >> [Smiech] 1018 00:51:03,230 --> 00:51:04,550 >> Uvidíme sa v stredu. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na ďalšie CS50 - 1021 00:51:10,310 --> 00:51:15,920 Takže som všetko z disku lámp, ale dnes počkajte, odtučnené mlieko, polovica telefón 1022 00:51:15,920 --> 00:51:17,850 kniha, pomarančový džús že som pil dnes. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB kábel, kľúč. 1025 00:51:22,780 --> 00:51:24,800 >> [Prehrávanie hudby]