1 00:00:00,000 --> 00:00:11,242 >> [Predvajanja glasbe] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. Malan: Prav to je CS50 in to je začetek petih teden. 3 00:00:16,630 --> 00:00:21,480 Torej danes, pod vašim sedežnih blazin, ne boste našli ničesar. 4 00:00:21,480 --> 00:00:24,790 Predvsem pa bi morali najti to, majhen znak naše presoje za 5 00:00:24,790 --> 00:00:26,970 vse delo, ki ga dajo v igri petnajsterice. 6 00:00:26,970 --> 00:00:30,290 Preprosto odstranite majhen krog na dno, da začnete igrati za 7 00:00:30,290 --> 00:00:31,680 Preostali del razreda. 8 00:00:31,680 --> 00:00:38,930 >> Tako opozarjajo, da ali vedo, da je problem iz štiri, ki je šla ven ta vikend, 9 00:00:38,930 --> 00:00:40,340 vključuje pisanje drugo igro. 10 00:00:40,340 --> 00:00:43,740 Ampak tokrat gre za uporabo Dejansko grafični uporabniški vmesnik, ne 11 00:00:43,740 --> 00:00:46,310 tekstovni vmesnik, kot Igra petnajsterice je bil. 12 00:00:46,310 --> 00:00:50,210 In igra, ki je pred vami, če ste še videli to naslednji, 13 00:00:50,210 --> 00:00:52,310 Izgleda malo nekaj takega. 14 00:00:52,310 --> 00:00:55,170 Jaz grem v mojo terminal Okno tukaj v GDB. 15 00:00:55,170 --> 00:00:58,600 In jaz grem naprej in zagon Rešitev osebje, ki lahko dostopate 16 00:00:58,600 --> 00:01:01,010 po zagonu posodobitev 50 kot ponavadi. 17 00:01:01,010 --> 00:01:04,090 >> Ampak jaz ga bom dal v malo skrivnost način, malo Pirh, 18 00:01:04,090 --> 00:01:08,480 tako imenovani način Bog, ki ga dajanje Boga v argv1. 19 00:01:08,480 --> 00:01:12,920 In moram upoštevati svoje lastne usmeritve, da teče v moji 20 00:01:12,920 --> 00:01:14,220 Problem nastavite imenik. 21 00:01:14,220 --> 00:01:19,190 Torej, zdaj boste videli popolno različico v igri Breakout. 22 00:01:19,190 --> 00:01:21,090 V bistvu je to način no-roke. 23 00:01:21,090 --> 00:01:24,850 Torej je pravzaprav - 24 00:01:24,850 --> 00:01:26,470 navdušili, čeprav boste morda - 25 00:01:26,470 --> 00:01:30,850 precej nepomembno za izvajanje načina Boga v Zlom, za razliko od igre petnajsterice 26 00:01:30,850 --> 00:01:33,590 ki bi lahko bili nekateri od vas rešiti za izdajo hacker. 27 00:01:33,590 --> 00:01:37,890 >> V Breakout zadostuje v Boga Način za preprosto storite kaj, 28 00:01:37,890 --> 00:01:41,220 intuitivno z veslom? 29 00:01:41,220 --> 00:01:45,630 Samo da bo enaka ne glede na vodoravni položaj je žogo. 30 00:01:45,630 --> 00:01:49,220 In tako dolgo, kot ste to naredili v lockstep z žogo premika to igro se bo 31 00:01:49,220 --> 00:01:53,100 nikoli, nikoli, nikoli zamudili žogo in boste zmagali vsakič. 32 00:01:53,100 --> 00:01:55,430 >> Toda v hacker izdaje tega tedna tam je več kot le način Boga. 33 00:01:55,430 --> 00:01:56,720 Obstaja več drugih funkcij. 34 00:01:56,720 --> 00:01:58,140 Med njimi laserji. 35 00:01:58,140 --> 00:02:01,070 Tako da če si res dobil nestrpni ste Lahko začnete sestrelil opeke 36 00:02:01,070 --> 00:02:02,120 in še nekaj drugih. 37 00:02:02,120 --> 00:02:04,560 In za tiste, ki bi radi umerjanje standarda v primerjavi Hacker 38 00:02:04,560 --> 00:02:08,750 izdaja, vidim, da ta teden je heker izdaja namenoma je 39 00:02:08,750 --> 00:02:12,830 malo več izvedljivo, recimo, od Boga Način je bil z igro petnajsterice. 40 00:02:12,830 --> 00:02:15,300 >> Torej, če iščete odsek in iščete nekaj dodatne zabave 41 00:02:15,300 --> 00:02:18,400 lastnosti ni potop v če interesov. 42 00:02:18,400 --> 00:02:21,280 Zdaj bolj praktično, naj omenim ven eno stvar, kot dobro. 43 00:02:21,280 --> 00:02:24,780 GDB, kar nekateri od vas morda še dotakne osebno, kar je v redu. 44 00:02:24,780 --> 00:02:28,530 Zdaj pa je res čas, da se privadite to in udobno s tem orodjem 45 00:02:28,530 --> 00:02:31,510 ker bo vaše življenje veliko lažje, resnično. 46 00:02:31,510 --> 00:02:34,900 >> Na predavanju Rob o GDB par tedni, odpoklic 47 00:02:34,900 --> 00:02:36,810 da GDB je razhroščevalnik. 48 00:02:36,810 --> 00:02:41,230 To je orodje, ki vam omogoča, da vodijo svoje Program pa vodijo korak za korakom, skladno 49 00:02:41,230 --> 00:02:45,680 po liniji, tako da lahko suniti okrog, tako da vidite stvari se dogaja, da 50 00:02:45,680 --> 00:02:47,310 , ki jo lahko natisnete Vrednosti spremenljivk. 51 00:02:47,310 --> 00:02:50,580 Na kratko, da vam toliko več moč kot printDef ne. 52 00:02:50,580 --> 00:02:52,900 >> Zdaj pa res, vmesnik je precej skrivnostno. 53 00:02:52,900 --> 00:02:55,180 Črno-beli tekstovni vmesnik za večino del. 54 00:02:55,180 --> 00:02:57,400 Ukazi so nekoliko težko da se spomnimo na prvi. 55 00:02:57,400 --> 00:03:01,230 Toda čeprav bi lahko ti pol traja uro, uro, naj to vnaprej 56 00:03:01,230 --> 00:03:02,940 vložek časa v to, verjemite mi. 57 00:03:02,940 --> 00:03:06,440 Zagotovo do konca semester bo prihranilo vam red velikosti več 58 00:03:06,440 --> 00:03:07,600 Čas od tega. 59 00:03:07,600 --> 00:03:09,200 >> Torej, v začetku tedna potop palcev 60 00:03:09,200 --> 00:03:13,200 In v smislu Breakout, veš, da si To lahko storite tako dolgo, kot ste 61 00:03:13,200 --> 00:03:18,230 Koda za distribucijo ali svoje kode v teku v vašem Pst4 imenik. 62 00:03:18,230 --> 00:03:21,680 Vem, da lahko zaženete gdb. / Zlom. 63 00:03:21,680 --> 00:03:23,490 >> To se dogaja, da odprejo okno, kot je ta. 64 00:03:23,490 --> 00:03:25,530 Dovolite mi, da sam daje več z okna terminala. 65 00:03:25,530 --> 00:03:27,770 In kaj potem jaz grem naprej in ne, to ni samo teči. 66 00:03:27,770 --> 00:03:30,690 Bom najprej nastaviti break točko Odpoklic, ki vam omogoča, da ustavite 67 00:03:30,690 --> 00:03:32,500 izvedba v določenem mestu. 68 00:03:32,500 --> 00:03:35,750 >> Samo, da stvari enostavno grem vdreti na liniji ena samo z vnosom 69 00:03:35,750 --> 00:03:37,000 številka ena. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Dovolite mi, da dejansko ponovno odpre to okno ker je pridobivanje 72 00:03:43,250 --> 00:03:45,700 malo majhen tam. 73 00:03:45,700 --> 00:03:53,270 Torej, kaj bom zdaj storil tukaj če sem odprl svoj terminal okno. 74 00:03:53,270 --> 00:03:53,910 Pridi, greva. 75 00:03:53,910 --> 00:03:59,850 >> Torej, zdaj, če grem nazaj v nabiralnik, Pst4 in vodijo gdb. / zlom vstopiti, opazili 76 00:03:59,850 --> 00:04:02,600 Bom prekinil eden nastaviti odmor točko na liniji ena. 77 00:04:02,600 --> 00:04:04,840 In zdaj bom šel naprej in tip teči. 78 00:04:04,840 --> 00:04:07,370 In ko sem naredil, opazil ničesar Zdi se, da se zgodi. 79 00:04:07,370 --> 00:04:08,120 >> Ni pop up. 80 00:04:08,120 --> 00:04:09,790 Ni grafični uporabniški vmesnik še ni. 81 00:04:09,790 --> 00:04:13,340 Ampak to je razumljivo, saj sem dobesedno na liniji ena v mojem programu. 82 00:04:13,340 --> 00:04:17,110 In opazil, da sem hitro posredovati, posebej sedaj 62, ker so vse 83 00:04:17,110 --> 00:04:20,600 stvari na vrhu te datoteke je stvari, kot so komentarji in konstant in 84 00:04:20,600 --> 00:04:22,460 nezanimiv stvari za zdaj. 85 00:04:22,460 --> 00:04:25,840 >> Torej, zdaj sem znotraj main, zdi se, v skladu 62. 86 00:04:25,840 --> 00:04:27,960 In to je samo porazdelitev koda, odpoklic. 87 00:04:27,960 --> 00:04:33,810 Če odprem ki ga bo, podobno, v mojem drop box imenik v Pst4, 88 00:04:33,810 --> 00:04:35,450 v breakout.c. 89 00:04:35,450 --> 00:04:40,670 In če sem se pomaknite navzdol in dol in dol, in mi gredo naprej in ga vklopite 90 00:04:40,670 --> 00:04:44,990 moje vrstice številke. 91 00:04:44,990 --> 00:04:50,300 >> Kaj bom videl, če bom pomaknite navzdol linija 62, ravno črto, ki 92 00:04:50,300 --> 00:04:50,910 smo prekinjeno naprej. 93 00:04:50,910 --> 00:04:53,720 Torej, ta vrstica tukaj, 62, je kjer smo na tem, da bo. 94 00:04:53,720 --> 00:04:57,470 Torej, zdaj v GDB, če grem naprej in vnesite zdaj naslednji, vpišite se dogaja, da 95 00:04:57,470 --> 00:04:58,450 izvršitev to vrstico. 96 00:04:58,450 --> 00:05:00,610 In voila, imamo tako imenovane g okno. 97 00:05:00,610 --> 00:05:02,800 Če seznanjeni s tem, kaj GWindow je, ne skrbi. 98 00:05:02,800 --> 00:05:05,740 Spec vam bo predstavil z njim, kot je tudi število obiskov videov 99 00:05:05,740 --> 00:05:06,830 vgrajeni v spec. 100 00:05:06,830 --> 00:05:08,610 >> Ampak zdaj pa bo ta malo bolj zanimivo. 101 00:05:08,610 --> 00:05:10,960 Dovolite mi, da se premaknete okno čez na strani malo. 102 00:05:10,960 --> 00:05:13,480 Naj oknu malo Večji da bom lahko več videti. 103 00:05:13,480 --> 00:05:16,140 >> In zdaj mi gredo naprej in storiti še enkrat. 104 00:05:16,140 --> 00:05:17,550 In tam so moji opeke. 105 00:05:17,550 --> 00:05:20,490 Če bom naslednji znova vnesite zdaj vidim žogo. 106 00:05:20,490 --> 00:05:23,520 In če sem ob znova vnesite zdaj vidim veslo. 107 00:05:23,520 --> 00:05:26,690 >> In na srečo je to gedit ni Res sodelovanju z mi pokazala, 108 00:05:26,690 --> 00:05:27,660 vse, kar si želim. 109 00:05:27,660 --> 00:05:30,820 Zdaj pa če naredim naslednji spet, Naslednji enkrat, jaz sem samo 110 00:05:30,820 --> 00:05:32,260 razglasitvi nekaterih spremenljivk. 111 00:05:32,260 --> 00:05:34,750 In sem lahko natisnete eno od teh fantov ven. 112 00:05:34,750 --> 00:05:37,170 Print opeke, odtisi življenje. 113 00:05:37,170 --> 00:05:39,910 >> In zdaj, če bom še naprej delati Naslednji, opazil, da se bom 114 00:05:39,910 --> 00:05:40,870 znotraj te zanke. 115 00:05:40,870 --> 00:05:43,380 Ampak koda se dogaja, da izvrši točno tako, kot pričakujem. 116 00:05:43,380 --> 00:05:45,810 Torej, ko sem udaril to funkcijo, počakajte za klik, da se bo to 117 00:05:45,810 --> 00:05:46,830 to dobesedno. 118 00:05:46,830 --> 00:05:48,870 Tako sem zdelo, da so izgubili nadzor preko programa. 119 00:05:48,870 --> 00:05:50,480 >> GDB niso mi dali drugo vprašanje. 120 00:05:50,480 --> 00:05:51,500 Ampak ne skrbi. 121 00:05:51,500 --> 00:05:53,720 Pojdite na mojo igro, kliknite nekje. 122 00:05:53,720 --> 00:05:56,270 >> In voila, zdaj pa nadaljuje z linijo 86. 123 00:05:56,270 --> 00:05:59,460 Torej, še enkrat, to je neprecenljivo, končno, za težave debugging. 124 00:05:59,460 --> 00:06:03,050 Ker lahko dobesedno korak skozi kodo, tiskanje stvari in še veliko, 125 00:06:03,050 --> 00:06:03,640 veliko več. 126 00:06:03,640 --> 00:06:07,210 Vendar za zdaj, ti samo orodja naj bi dobil precej daleč. 127 00:06:07,210 --> 00:06:10,050 >> Tako da smo, seveda, ob pogled ob Grafika zdaj, vse naenkrat. 128 00:06:10,050 --> 00:06:12,350 In sedaj naš svet postane malo bolj zanimivo. 129 00:06:12,350 --> 00:06:15,680 In veš, morda, od nekaterih videi na spletu, ki smo jih 130 00:06:15,680 --> 00:06:18,280 Kratke hlače, ki ste gledal kot del problemskih sklopov. 131 00:06:18,280 --> 00:06:20,460 >> In sem jih ustrelili, namenoma, pred belo ozadje. 132 00:06:20,460 --> 00:06:23,380 In nekateri izmed njih so poučevanje Fantje risanje nekaj besedila na 133 00:06:23,380 --> 00:06:25,490 Zaslon, ki je prevlekel na strani njih. 134 00:06:25,490 --> 00:06:27,760 Seveda pa to ni tako zanimivo, v resničnem svetu. 135 00:06:27,760 --> 00:06:30,520 To je samo predavalnica z velik bel zaslon in ozadje. 136 00:06:30,520 --> 00:06:33,330 In naša neverjetno produkcijska ekipa vrste od naredi vse, kar je videti lepa 137 00:06:33,330 --> 00:06:36,620 po dejstvu, ki ga izvajajo obrezovanje ali prekrivanje ničesar 138 00:06:36,620 --> 00:06:37,840 storimo ali ne želite. 139 00:06:37,840 --> 00:06:41,560 >> Zdaj pa samo motivirati tem tednu res, kjer lahko greste, na koncu, 140 00:06:41,560 --> 00:06:42,560 z računalništva. 141 00:06:42,560 --> 00:06:44,260 Ne samo po problem nastaviti štiri. 142 00:06:44,260 --> 00:06:48,240 Toda po drugi tečaja ali celotnega Kurikulum je to neverjetno, kaj lahko 143 00:06:48,240 --> 00:06:51,090 storiti v teh dneh v smislu Grafika še posebej. 144 00:06:51,090 --> 00:06:53,440 >> Nekateri izmed vas ste to lahko videli teče po spletu. 145 00:06:53,440 --> 00:06:56,240 Mislila sem, da ti pokažem, za samo nekaj minut, pogled na to, kaj 146 00:06:56,240 --> 00:07:01,890 računalniška tehnologija in tisto, CGI, računalniška grafika lahko storite v teh dneh 147 00:07:01,890 --> 00:07:04,510 z znano pesmijo in morda film. 148 00:07:04,510 --> 00:07:05,760 >> [GLASBA - LANA DEL RAY, "Mlada in lepa] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: To je samo malo neverjetno, morda, kako 151 00:10:52,470 --> 00:10:52,857 vseprisotna - 152 00:10:52,857 --> 00:10:57,040 >> [APLAVZ] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Pravkar sem jo prenesli. 154 00:10:59,230 --> 00:11:02,920 Ampak to je res neverjetno, mislim, samo kako vseprisotna programske opreme in številka in 155 00:11:02,920 --> 00:11:04,230 orodja, kot je to v resnici. 156 00:11:04,230 --> 00:11:07,685 Tako da je okus smeri , v katerem lahko greš. 157 00:11:07,685 --> 00:11:10,620 Oh, ne več danes Appliance. 158 00:11:10,620 --> 00:11:14,640 No, to je pravzaprav tragični čas Glede na točko sem poskušal narediti. 159 00:11:14,640 --> 00:11:18,670 >> Vse je v redu, tako da je začela Fusion znova. 160 00:11:18,670 --> 00:11:20,800 Spomni me kasneje. 161 00:11:20,800 --> 00:11:24,190 Vse je v redu, in ti naj bi dobil e-pošto, ne upoštevajo, če si dobil 162 00:11:24,190 --> 00:11:25,460 Opazili tako. 163 00:11:25,460 --> 00:11:29,940 Vse je v redu, tako opozarjajo, da je prejšnji teden smo začeli lupine nazaj to 164 00:11:29,940 --> 00:11:31,380 pozneje znan kot niz. 165 00:11:31,380 --> 00:11:34,700 >> Niz opozarja, podatkovni tip, ki je prijavljeni v knjižnici CS50. 166 00:11:34,700 --> 00:11:37,740 In to je del koles usposabljanja da bo zdaj začela na vzlet. 167 00:11:37,740 --> 00:11:41,280 Bilo je uporaben pojem že na začetku. 168 00:11:41,280 --> 00:11:43,750 Zdaj pa se dogaja, da bi dobili več zanimivo in bolj močan, da bi 169 00:11:43,750 --> 00:11:48,330 dejansko videli, da je pod pokrovom motorja, Niz je samo tisto, sva rekla? 170 00:11:48,330 --> 00:11:50,500 >> Ja, to je tako imenovani char *. 171 00:11:50,500 --> 00:11:53,860 In tam * označuje, da je nekakšen naslov vpletene. 172 00:11:53,860 --> 00:11:58,690 In tako, ko rečeš char * vam pomeni le spremenljivka, katerega podatkovni tip je 173 00:11:58,690 --> 00:11:59,290 Kazalec zdaj. 174 00:11:59,290 --> 00:12:01,770 Dejstvo, da je zvezda tam pomeni le, da ste o razglasitvi 175 00:12:01,770 --> 00:12:03,020 tako imenovani kazalec. 176 00:12:03,020 --> 00:12:06,220 In da kazalec se bo očitno shrani naslov, na 177 00:12:06,220 --> 00:12:07,810 Tečaj, char. 178 00:12:07,810 --> 00:12:08,960 >> Zdaj zakaj je to smiselno? 179 00:12:08,960 --> 00:12:11,200 No, kaj je niz pod pokrovom? 180 00:12:11,200 --> 00:12:15,130 No, nekaj časa smo bili pravi da je niz pod pokrovom 181 00:12:15,130 --> 00:12:18,460 Samo h-e-l-l-o, na primer. 182 00:12:18,460 --> 00:12:21,585 >> Ampak smo se pogovarjali o tem, kot pa v bistvu matrika. 183 00:12:21,585 --> 00:12:25,410 In bi matrika, potem poglej malo več kot je ta, vsak od teh 184 00:12:25,410 --> 00:12:26,460 ob nastopu ugriz. 185 00:12:26,460 --> 00:12:28,710 In potem smo rekli, da obstaja nekaj posebnega nazaj, 186 00:12:28,710 --> 00:12:31,270 Nagibnica 0 ali null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Torej vsem tem času to tukaj je niz. 188 00:12:35,230 --> 00:12:38,320 Ampak res, niz dejansko naslov. 189 00:12:38,320 --> 00:12:43,210 In naslovi, kot bomo videli, so pogosto s predpono 0x po dogovoru. 190 00:12:43,210 --> 00:12:44,540 Kaj 0x pomenita? 191 00:12:44,540 --> 00:12:45,970 Ali kdo ve? 192 00:12:45,970 --> 00:12:47,320 >> Torej to pomeni le šestnajstiški. 193 00:12:47,320 --> 00:12:52,360 Tako da boste morda spomni, pravzaprav iz Pst 1. Verjamem, eden izmed toplo-up 194 00:12:52,360 --> 00:12:55,740 Vprašanja dejansko spraševali šestnajstiški zapis poleg 195 00:12:55,740 --> 00:12:57,100 binarno in desetiško. 196 00:12:57,100 --> 00:13:00,460 In motivacija tukaj je, da z šestnajstiškem imate 16 197 00:13:00,460 --> 00:13:01,770 številke na razpolago. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, čemur z a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> In če šteješ vse tiste gor, boste dobili skupaj 16 let. 200 00:13:10,430 --> 00:13:13,200 Torej, to je v nasprotju z decimalno, kjer imamo 10 201 00:13:13,200 --> 00:13:14,690 cifer, 0 do devetih. 202 00:13:14,690 --> 00:13:17,750 To je v nasprotju z binarno kjer imamo samo 0 in 1. 203 00:13:17,750 --> 00:13:21,450 >> Toda ob koncu dneva si lahko samo predstavljajo enake številke, vendar 204 00:13:21,450 --> 00:13:22,500 nekoliko drugače. 205 00:13:22,500 --> 00:13:25,840 In šestnajstiški je pogosta, saj so Izkazalo se je - in bomo to videli 206 00:13:25,840 --> 00:13:28,790 kasneje v teku - tudi ko smo dobili na spletni programov v okviru 207 00:13:28,790 --> 00:13:32,100 HTML in barvne oznake, šestnajstiški je lepo. 208 00:13:32,100 --> 00:13:36,390 Ker vsako številko, se izkaže, predstavlja štiri bite odlično. 209 00:13:36,390 --> 00:13:39,280 Tako da nekako linije lepo gor saj bomo sčasoma videli. 210 00:13:39,280 --> 00:13:44,720 Torej je to lahko Ox123 ali kaj takega, ki označuje naslov 123 211 00:13:44,720 --> 00:13:47,050 nekje znotraj mojega spomin računalnika. 212 00:13:47,050 --> 00:13:50,600 >> Seveda pa nastopijo težave zaradi tega osnovnega 213 00:13:50,600 --> 00:13:51,520 izvajanje. 214 00:13:51,520 --> 00:13:55,930 In spomnim, da sem se zabodel izvajanje funkcije, kot je ta - 215 00:13:55,930 --> 00:14:00,260 primerjajo dash 0 dot c prejšnji teden, da čeprav je bilo videti, kot da je 216 00:14:00,260 --> 00:14:04,270 Dobro, to preprosto ni primerjala dveh nizov pravilno. 217 00:14:04,270 --> 00:14:07,470 >> Sem zavrgli Glavni in sem vrgli stran pripombe le, da se osredotoči na na 218 00:14:07,470 --> 00:14:08,970 kodo, ki je v interesu tukaj. 219 00:14:08,970 --> 00:14:10,660 In to je v rdeči, ker je buggy. 220 00:14:10,660 --> 00:14:11,670 Zakaj? 221 00:14:11,670 --> 00:14:15,890 >> No, na vrhu pa, ko sem razglasila string, kaj se je v resnici dogajalo 222 00:14:15,890 --> 00:14:17,260 pod pokrovom? 223 00:14:17,260 --> 00:14:19,530 No, naj gredo čez, da zaslon tukaj in pripraviti to. 224 00:14:19,530 --> 00:14:23,230 Zato sem razglasila, še enkrat, String s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Tako da sem šel naprej in zdaj pripravi s za kaj je v resnici. 226 00:14:26,640 --> 00:14:28,590 To se dogaja, da je kvadratni tukaj. 227 00:14:28,590 --> 00:14:30,490 In bom trdijo da je to 32 bitov. 228 00:14:30,490 --> 00:14:32,890 Vsaj ponavadi je, vsaj na CS50 229 00:14:32,890 --> 00:14:34,520 Naprava v veliko računalnikov. 230 00:14:34,520 --> 00:14:35,980 Bom pa je poklical. 231 00:14:35,980 --> 00:14:39,070 >> Toda zdaj opozarjajo, da smo imenovano GetString. 232 00:14:39,070 --> 00:14:41,430 Torej GetString vrne, Seveda niz. 233 00:14:41,430 --> 00:14:45,790 Če uporabnik v h-e-l-l-o vnesti Niz dobi zdravo vrne. 234 00:14:45,790 --> 00:14:51,010 In to string, kot smo pravkar rekel, konča nekje v spominu računalnika 235 00:14:51,010 --> 00:14:53,240 z backslash 0 na koncu. 236 00:14:53,240 --> 00:14:56,650 Pritegnil bom to kot array - ali sosednje blok znakov - 237 00:14:56,650 --> 00:14:58,330 da je v resnici. 238 00:14:58,330 --> 00:15:01,790 >> In zdaj, kaj se GetString pravzaprav vrača? 239 00:15:01,790 --> 00:15:04,340 Kaj je GetString bilo vračanje Vse v tem času? 240 00:15:04,340 --> 00:15:07,520 No, recimo, v tednih pred, vrne niz. 241 00:15:07,520 --> 00:15:10,250 Ampak bolj tehnično, kaj GetString vrnitev očitno? 242 00:15:10,250 --> 00:15:11,610 >> PUBLIKA: naslov. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: naslov. 244 00:15:12,600 --> 00:15:16,630 Posebej vrne naslov prvi ugriz, karkoli že je. 245 00:15:16,630 --> 00:15:18,830 Kar naprej z uporabo enega, dva, tri ker je priročno. 246 00:15:18,830 --> 00:15:21,380 >> Vrne naslov prva znak v nizu. 247 00:15:21,380 --> 00:15:23,510 In mi je prejšnji teden dejal, da je da zadostuje. 248 00:15:23,510 --> 00:15:26,710 Ker smo vedno lahko ugotoviti, kje konca niza le z 249 00:15:26,710 --> 00:15:30,150 ponavljanjem nad njim, morda z za zanka ali while zanko ali kaj podobnega 250 00:15:30,150 --> 00:15:34,990 da, samo iščejo "backslash 0", Posebna sentinel znak. 251 00:15:34,990 --> 00:15:37,220 >> In potem vemo, da niz zgodi, da se na dolžini - 252 00:15:37,220 --> 00:15:37,980 v tem primeru - 253 00:15:37,980 --> 00:15:38,670 pet. 254 00:15:38,670 --> 00:15:43,800 Torej, tehnično, kaj počne GetString se vrne Ox123 v tem primeru. 255 00:15:43,800 --> 00:15:53,670 In tehnično kaj se potem zgodi, je da hranimo, notranjost s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Ob koncu dneva, čeprav ta je nov koncept, kazalci, oni 257 00:15:56,460 --> 00:15:57,350 le spremenljivke. 258 00:15:57,350 --> 00:16:00,440 Ampak se zgodi, da shranite bite, ki skupaj predstavljajo naslov. 259 00:16:00,440 --> 00:16:03,700 Torej tehnično vse, kar dobi shranjeni v ih je Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Vendar smo kot ljudje - 261 00:16:04,680 --> 00:16:06,020 vključno danes dalje - 262 00:16:06,020 --> 00:16:09,290 res ne bo mar, običajno, kaj je dejanski naslov 263 00:16:09,290 --> 00:16:10,520 neke kos pomnilnika. 264 00:16:10,520 --> 00:16:14,040 To je samo na nizki ravni podrobnosti za intelektualnem zanimivo. 265 00:16:14,040 --> 00:16:15,440 Torej bom to izbiro. 266 00:16:15,440 --> 00:16:19,810 In namesto, bolj visoka, samo reci da ko govorimo o kazalci 267 00:16:19,810 --> 00:16:22,170 Jaz bom samo pripravi več uporabniku prijazen puščica, ki izraža 268 00:16:22,170 --> 00:16:26,060 Isto idejo in povzetki proč podatke o tem, kaj dejansko 269 00:16:26,060 --> 00:16:27,700 osnovni naslov. 270 00:16:27,700 --> 00:16:33,290 >> Zdaj, če gremo nazaj v kodi, kaj se je zgodilo prejšnji teden, če imamo niz t 271 00:16:33,290 --> 00:16:34,510 enako GetString? 272 00:16:34,510 --> 00:16:38,630 No, če sem ponovno vtipkajte zdravo Tokrat bom dobil 273 00:16:38,630 --> 00:16:40,460 en kos pomnilnika. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o nagibnica 0. 275 00:16:44,820 --> 00:16:48,320 >> Ampak zato, ker sem poklical GetString drugič - 276 00:16:48,320 --> 00:16:51,100 in vem, da je to, če si ogledamo Izvorna koda za GetString - tudi 277 00:16:51,100 --> 00:16:54,350 čeprav je naključje, da je zdravo vnesli dvakrat, GetString ni 278 00:16:54,350 --> 00:16:55,890 bomo poskušali optimizirati in biti pameten. 279 00:16:55,890 --> 00:16:58,550 To je le, da bo dobil še en kos pomnilnik računalnika, ki je 280 00:16:58,550 --> 00:16:59,640 bo na drug naslov. 281 00:16:59,640 --> 00:17:02,330 Oglejmo samovoljno pravkar rekel 456. 282 00:17:02,330 --> 00:17:04,079 >> In potem kaj se gre, da se vrnete? 283 00:17:04,079 --> 00:17:08,030 To se dogaja, da se vrnete 456 in ga shranite v t. 284 00:17:08,030 --> 00:17:12,010 Torej, kaj se v resnici dogaja, na Na levi strani je imam še en kos 285 00:17:12,010 --> 00:17:14,260 pomnilnika, 32 bitov običajno. 286 00:17:14,260 --> 00:17:16,720 In tam je šel Ox456. 287 00:17:16,720 --> 00:17:20,140 Ampak še enkrat, me ne zanima ti posebne številke več. 288 00:17:20,140 --> 00:17:23,069 Grem na abstraktno jo pripravijo kot puščica. 289 00:17:23,069 --> 00:17:25,202 >> Torej, to je zdaj nova razlaga. 290 00:17:25,202 --> 00:17:28,735 Ampak to je enako natančno idejo, da je je dogajalo ves ta čas. 291 00:17:28,735 --> 00:17:33,150 Tako razloga, da prvi različica primerjanje bil vozičkom 292 00:17:33,150 --> 00:17:34,480 Prejšnji teden je, zakaj? 293 00:17:34,480 --> 00:17:38,000 Ko boste to storili, če je enaka enaka Ne, kaj ste resnično 294 00:17:38,000 --> 00:17:40,550 pod kapuco primerjavo? 295 00:17:40,550 --> 00:17:41,910 >> Ste primerjali naslove. 296 00:17:41,910 --> 00:17:47,950 In samo intuitivno, jasno, Ox123 ne bo enako Ox456. 297 00:17:47,950 --> 00:17:49,380 Te številke, tiste nastavke so samo različni. 298 00:17:49,380 --> 00:17:53,220 >> In tako dosledno, prejšnji teden pa je dejal vnesete različne stvari, tudi če 299 00:17:53,220 --> 00:17:55,360 besede so bile dobesedno enako. 300 00:17:55,360 --> 00:17:58,770 Zato smo to popraviti. 301 00:17:58,770 --> 00:18:00,120 V smislu navadnega je, kaj je fix? 302 00:18:00,120 --> 00:18:02,110 >> PUBLIKA: Uporabite funkcijo. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Uporabite funkcijo. 304 00:18:02,870 --> 00:18:05,190 Ali so zvezd zagotovo vključeni, ampak uporabiti funkcijo za kaj? 305 00:18:05,190 --> 00:18:05,962 >> PUBLIKA: Za primerjavo nizov. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Za primerjavo nizov. 307 00:18:07,390 --> 00:18:11,030 Torej temeljni problem tukaj je da sem samo razmišlja 308 00:18:11,030 --> 00:18:15,870 Kakovost strune, ki jih določi Primerjava njihove naslove. 309 00:18:15,870 --> 00:18:18,540 In seveda, da je samo neumen zdaj enkrat boste razumeli, kaj se dogaja 310 00:18:18,540 --> 00:18:19,510 Pod pokrovom. 311 00:18:19,510 --> 00:18:23,270 Resnično primerjati nize, da vidim, če oni so enaka na način, da ljudi 312 00:18:23,270 --> 00:18:26,680 razmišlja dveh nizov enaka jim moramo primerjati znak za 313 00:18:26,680 --> 00:18:28,070 znak za znakom. 314 00:18:28,070 --> 00:18:30,020 >> Zdaj bi lahko jaz naredil To zelo tediously. 315 00:18:30,020 --> 00:18:32,240 Ampak familiarly, smo uporabljajo za zanke. 316 00:18:32,240 --> 00:18:36,050 In ravno primerjati nosilcem S sem proti t nosilec i. 317 00:18:36,050 --> 00:18:39,590 S podstavki i plus 1 proti t nosilec i + 1, in tako naprej, znotraj 318 00:18:39,590 --> 00:18:40,580 nekakšna zanka. 319 00:18:40,580 --> 00:18:44,950 In če opazim nobene dva znaka, da razlikujejo, ali če se zavedam, da oh, i je 320 00:18:44,950 --> 00:18:48,410 krajši od t ali več kot t Jaz lahko takoj reči false, 321 00:18:48,410 --> 00:18:49,390 oni niso enaki. 322 00:18:49,390 --> 00:18:55,370 >> Ampak, če sem priti skozi s in t in reči isti, isti, isti, isti, isti, konec 323 00:18:55,370 --> 00:18:58,520 obe strune, lahko rečem, Res je, da so enaki. 324 00:18:58,520 --> 00:19:01,040 Pred No, na srečo, let nekdo napisal kodo za nas. 325 00:19:01,040 --> 00:19:03,790 >> In so ga imenovali StrComp za niz primerjavo. 326 00:19:03,790 --> 00:19:11,900 In čeprav je malo števec intuitivno, StrComp vrne 0, če je tisti, 327 00:19:11,900 --> 00:19:14,520 dveh nizov, s in t so enake. 328 00:19:14,520 --> 00:19:18,090 Ampak to vrne negativno vrednost, če je naj pridejo pred t abecedi ali 329 00:19:18,090 --> 00:19:20,610 Pozitivna vrednost, če bi moralo priti po t po abecedi. 330 00:19:20,610 --> 00:19:24,030 >> Torej, če si kdaj želeli rešiti nekaj, Izkazalo se je, da je StrComp koristno. 331 00:19:24,030 --> 00:19:26,660 Ker ne samo, da da ali ne, enaka ali ne. 332 00:19:26,660 --> 00:19:30,440 To vam daje občutek naročanje podobno kot v slovarju mogočnosti. 333 00:19:30,440 --> 00:19:33,770 Torej StrComp, s vejica t enaka enaka 0, pomeni, da 334 00:19:33,770 --> 00:19:35,200 strune so resnično enaki. 335 00:19:35,200 --> 00:19:38,680 Ker to funkcijo kdo je napisal pred leti domnevno uporabljajo za zanke 336 00:19:38,680 --> 00:19:42,840 ali pa zanke ali kaj podobnega vključiti več znakov znova 337 00:19:42,840 --> 00:19:45,270 in znova in znova. 338 00:19:45,270 --> 00:19:47,300 >> Ampak problem je nastal dve tukaj. 339 00:19:47,300 --> 00:19:48,750 To je bila copy0.c. 340 00:19:48,750 --> 00:19:51,680 In dve v rdeči barvi je ker je napačna. 341 00:19:51,680 --> 00:19:52,800 In kaj počnemo tukaj? 342 00:19:52,800 --> 00:19:54,310 No, najprej sem poklical GetString. 343 00:19:54,310 --> 00:19:56,255 In jaz shranjeno vrednost pri vračanju v s. 344 00:19:56,255 --> 00:20:00,260 Tako da je precej enak kot ta zgornji del slike. 345 00:20:00,260 --> 00:20:01,490 >> Toda, kaj pride potem? 346 00:20:01,490 --> 00:20:04,980 No, naj gredo naprej in se znebite za cel kup tega. 347 00:20:04,980 --> 00:20:09,650 Mi bomo nazaj v čas, kjer smo pravkar imajo s, ki je sedaj v skladu z 348 00:20:09,650 --> 00:20:10,940 prva vrstica tam gor. 349 00:20:10,940 --> 00:20:11,400 >> Preveril sem. 350 00:20:11,400 --> 00:20:13,450 Če je enaka enaka 0.. 351 00:20:13,450 --> 00:20:18,670 Zdaj pa hitro side note, ko Morda GetString vrne 0? 352 00:20:18,670 --> 00:20:19,580 Ni dovolj pomnilnika. 353 00:20:19,580 --> 00:20:19,880 Kajne? 354 00:20:19,880 --> 00:20:22,310 >> To je redko, da se bo to zgodilo, zagotovo na računalniku, ki je 355 00:20:22,310 --> 00:20:24,740 dobil na stotine MB ali celo nastopov RAM-a. 356 00:20:24,740 --> 00:20:27,080 Ampak to bi v teoriji vrnete 0, še posebej, če 357 00:20:27,080 --> 00:20:28,080 Uporabnik ne sodeluje. 358 00:20:28,080 --> 00:20:31,640 Obstaja način, da se pretvarjamo, kot da niso vnesene karkoli in trik 359 00:20:31,640 --> 00:20:34,100 GetString v vračanje 0 učinkovito. 360 00:20:34,100 --> 00:20:35,470 >> Tako se dogaja, da preverite to. 361 00:20:35,470 --> 00:20:39,430 Ker če je kdo izmed vas je začel razumem, že, segmentacijske napake - 362 00:20:39,430 --> 00:20:42,280 , ki je verjetno bil vir neke frustracije - 363 00:20:42,280 --> 00:20:46,150 to so skoraj vedno posledica spomina povezanih napak. 364 00:20:46,150 --> 00:20:50,440 Nekako si zamočil v zvezi z kazalec, tudi če ne zavedaš 365 00:20:50,440 --> 00:20:51,530 je bil kazalec. 366 00:20:51,530 --> 00:20:55,260 Torej, ste morda povzroča segmentacijo napake so že teden eno uporabo 367 00:20:55,260 --> 00:21:02,100 nekaj podobnega kot za zanke ali časa zanke in niz, ki ga šla predaleč 368 00:21:02,100 --> 00:21:05,900 mimo meja neke matrike, ki ste prijavljeni v dva tedna v 369 00:21:05,900 --> 00:21:06,690 posebej. 370 00:21:06,690 --> 00:21:09,220 >> Morda ste to storili tudi v problemu nastavite štiri z Breakout. 371 00:21:09,220 --> 00:21:12,910 Čeprav ste verjetno ni videl vse zvezde v kodo distribucije za 372 00:21:12,910 --> 00:21:17,410 Zlom, se je izkazalo, da tisti, GRect in GOval in druge takšne stvari, 373 00:21:17,410 --> 00:21:19,650 to so pravzaprav kazalci Pod pokrovom. 374 00:21:19,650 --> 00:21:23,430 >> Ampak Stanford, tako kot nas, neke vrste kož Podatek, da je vsaj za knjižnice 375 00:21:23,430 --> 00:21:26,540 namene, podobno kot mi za niz in char *. 376 00:21:26,540 --> 00:21:30,060 Ampak GRect in GOval in vse tiste, Stvari, ki jih fantje so ali bodo lahko uporabljali 377 00:21:30,060 --> 00:21:32,630 Ta teden so v končni fazi pomnilniških naslovov. 378 00:21:32,630 --> 00:21:33,650 Enostavno ne vem. 379 00:21:33,650 --> 00:21:37,240 >> Tako ni presenetljivo, potem, morda, da bi lahko spotakne nekaj 380 00:21:37,240 --> 00:21:38,580 segmentacija napake. 381 00:21:38,580 --> 00:21:41,290 Ampak kaj je zanimivo, tukaj zdaj, če se po preverjanju za 0 počnemo 382 00:21:41,290 --> 00:21:43,460 Niz t dobi s. 383 00:21:43,460 --> 00:21:44,690 No, naj razglasi t. 384 00:21:44,690 --> 00:21:47,730 Jaz grem, da ga pripravijo kot kvadrat, 32 bitov, pa kliči. 385 00:21:47,730 --> 00:21:49,740 In potem bom naredil dobi s. 386 00:21:49,740 --> 00:21:51,130 >> No, kaj to pomeni? 387 00:21:51,130 --> 00:21:53,280 No, to je malo težko razmišljati o tem predstavljam pametno. 388 00:21:53,280 --> 00:21:55,025 Ampak kaj je razmišljati o kaj je notri od x? 389 00:21:55,025 --> 00:21:59,430 Kaj je dobesedno znotraj te spremenljivke? 390 00:21:59,430 --> 00:22:01,500 Ox123 vrednost. 391 00:22:01,500 --> 00:22:05,815 >> Torej, ko rečem niz t dobi s, da samo dobesedno pomeni, da je število 392 00:22:05,815 --> 00:22:10,070 vs, kar je Ox123 in ga Ox123 dal. 393 00:22:10,070 --> 00:22:13,740 Ali slikovno, če sem nekako abstraktno od tega podrobneje ima 394 00:22:13,740 --> 00:22:16,600 Učinek dobesedno delaš tudi to. 395 00:22:16,600 --> 00:22:22,110 >> Torej, zdaj, pomislite na zadnji teden, ko smo nadaljevali s kapitalistično T. I 396 00:22:22,110 --> 00:22:23,800 si T nosilec 0. 397 00:22:23,800 --> 00:22:27,150 No, T bracket 0, čeprav je kazalec, jo lahko kot če zdravljenje 398 00:22:27,150 --> 00:22:29,220 je matrika, s kvadrat Nosilec zapis. 399 00:22:29,220 --> 00:22:31,550 >> Torej, če je T nosilec 0? 400 00:22:31,550 --> 00:22:32,990 No, to je h. 401 00:22:32,990 --> 00:22:36,800 In tako, ko smo uporabi to vrstico kode, dve zgornji del, ki je v tem c type.h 402 00:22:36,800 --> 00:22:38,460 glava datoteke, ki je, če to je razglašena. 403 00:22:38,460 --> 00:22:44,410 Ste izkoristiti ta H. Ampak Tečaj, ki je enako natančen h, ki je 404 00:22:44,410 --> 00:22:46,540 Notranjost s, tako rekoč. 405 00:22:46,540 --> 00:22:51,930 In tako zdaj ste spremenili ali začetnico tako izvirno in 406 00:22:51,930 --> 00:22:53,120 tako imenovane kopija. 407 00:22:53,120 --> 00:22:56,620 Ker niste naredili kopijo v način, da bi človek rad, da bo. 408 00:22:56,620 --> 00:22:59,710 >> Torej, kaj je fix tukaj V copy1.c zadnjem tednu? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkcije, tako da smo lahko dejansko kopirati niz. 411 00:23:05,580 --> 00:23:08,700 In bistveno, kaj moramo storiti, da bi kopirali niz? 412 00:23:08,700 --> 00:23:12,070 >> No, v tej zeleni različici, tukaj sem dogaja, da je precej nizko raven storiti. 413 00:23:12,070 --> 00:23:14,260 Obstaja dejansko deluje jim lahko pomaga s tem. 414 00:23:14,260 --> 00:23:17,710 Toda najbolj osnovni eno in najbolj znana ena, vsaj, bo kmalu 415 00:23:17,710 --> 00:23:19,600 da nas poznajo, je naslednja: - 416 00:23:19,600 --> 00:23:21,910 tako ena v prvi vrstici kode v zeleno zdaj. 417 00:23:21,910 --> 00:23:23,970 >> Pravkar sem predelal S kot char *. 418 00:23:23,970 --> 00:23:25,250 Ni funkcionalna Razlika tam. 419 00:23:25,250 --> 00:23:28,790 Pravkar sem vrgel proč CS50 knjižnico in Jaz sem ga kliče, kaj je, char *. 420 00:23:28,790 --> 00:23:31,640 >> Sedaj pika, dot, pika, ker ni bilo nekateri preverjanje napak, da ni 421 00:23:31,640 --> 00:23:33,200 zanimivo, da spet govoriti. 422 00:23:33,200 --> 00:23:34,710 Torej, zdaj je t prijavljeni. 423 00:23:34,710 --> 00:23:35,780 Tudi ta je char *. 424 00:23:35,780 --> 00:23:38,280 Tako sem narisal malo kvadrat na zaslon kot prej. 425 00:23:38,280 --> 00:23:41,870 >> Toda na desni strani, malloc, rečeno je spomin dodeliti. 426 00:23:41,870 --> 00:23:44,130 Tako razporedilo kake kos pomnilnika. 427 00:23:44,130 --> 00:23:48,830 In koliko bajtov ali imamo dejansko želite dodeliti, ne zdi? 428 00:23:48,830 --> 00:23:50,340 >> No, dolžina niz s. 429 00:23:50,340 --> 00:23:52,310 Torej, če je to zdravo, da je bo pet. 430 00:23:52,310 --> 00:23:53,950 Bomo rekli, h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Torej pet zlogov. 432 00:23:55,090 --> 00:23:57,960 >> Ampak potem plus 1, zakaj 1? 433 00:23:57,960 --> 00:23:58,830 0 značaj. 434 00:23:58,830 --> 00:24:03,640 Če nam ne puščajo prostora za tega fanta smo Morda po naključju ustvarili razmere 435 00:24:03,640 --> 00:24:05,600 kjer niz h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 In potem naslednjič GetString je imenuje in tip I, na primer, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, računalnik se bo mislim, da se je dejansko 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d, ker tam Ne prelom med temi besedami. 439 00:24:18,900 --> 00:24:19,810 >> Zato moramo ta odmor. 440 00:24:19,810 --> 00:24:20,720 Zato ne želimo pet. 441 00:24:20,720 --> 00:24:22,100 Želimo šest zlogov. 442 00:24:22,100 --> 00:24:23,110 >> In bajti rečem. 443 00:24:23,110 --> 00:24:25,220 Ampak to je velikost res čas char. 444 00:24:25,220 --> 00:24:28,040 Tehnično lastnost je skoraj Vedno sam bajt. 445 00:24:28,040 --> 00:24:31,030 >> Ampak samo, da bi naša koda prenosni, tako rekoč, tako da deluje na 446 00:24:31,030 --> 00:24:33,750 različnih računalnikih, tudi če bi se lahko nekoliko drugačno pod 447 00:24:33,750 --> 00:24:36,590 napa, bom generično pomeni velikost lastnost, tako da 448 00:24:36,590 --> 00:24:37,660 moja koda deluje vedno. 449 00:24:37,660 --> 00:24:40,610 In nimam, da ga prevedem samo ker sem nadgraditi svoj računalnik ali uporabite 450 00:24:40,610 --> 00:24:42,140 nekateri drugačna platforma. 451 00:24:42,140 --> 00:24:45,300 >> Torej imam 6-krat na velikost char, kar se zgodi, da je 1. 452 00:24:45,300 --> 00:24:47,440 Torej to pomeni malloc bi Dajte mi šest zlogov. 453 00:24:47,440 --> 00:24:49,140 Kaj je to dejansko počne? 454 00:24:49,140 --> 00:24:52,810 No, naj roll nazaj v čas tukaj , kjer smo v zgodbi. 455 00:24:52,810 --> 00:24:57,620 >> Torej, če grem nazaj, sem razglasila char * imenovano t. 456 00:24:57,620 --> 00:25:00,280 Sem se zdaj imenuje malloc za šest bajtov. 457 00:25:00,280 --> 00:25:06,400 In zdaj bom pripravi teh šestih zlogov, tako kot niz prej. 458 00:25:06,400 --> 00:25:10,570 Ampak jaz pravzaprav ne vem, kaj je znotraj tega polja. 459 00:25:10,570 --> 00:25:14,640 >> Če dodeliti pomnilnika se izkaže, da ne moreš zaupati, da obstaja nekaj 460 00:25:14,640 --> 00:25:15,810 znana vrednost tam. 461 00:25:15,810 --> 00:25:18,400 To bi lahko bila uporabljena z nečim drugega, nekatere druge funkcije, nekatere druge 462 00:25:18,400 --> 00:25:19,630 vrstica kode, ki jo je napisal. 463 00:25:19,630 --> 00:25:22,870 Tako da bomo na splošno imenujemo te smeti vrednote in jih neodločeno, morda, kot je 464 00:25:22,870 --> 00:25:26,170 vpraĹĄajev, samo kaže, da smo Ne vem, kaj se je dejansko tam. 465 00:25:26,170 --> 00:25:30,390 In to ni nič takega, tako dolgo, kot smo dovolj pameten, da prepiše tiste 466 00:25:30,390 --> 00:25:34,550 Smetarska vrednosti s številkami ali znakov, da nam je mar. 467 00:25:34,550 --> 00:25:36,340 >> Torej v tem primeru, kaj bom naredil? 468 00:25:36,340 --> 00:25:38,670 No, moj linija koda Naslednji, imam štiri. 469 00:25:38,670 --> 00:25:41,350 int dobim 0, n dobi Niz dolžina s. 470 00:25:41,350 --> 00:25:42,750 Torej poznate za zanko. 471 00:25:42,750 --> 00:25:45,875 I je manjša ali enaka n ki je običajno nad. 472 00:25:45,875 --> 00:25:47,500 >> Toda tokrat je to namerno. 473 00:25:47,500 --> 00:25:51,890 Jaz + +, potem pa sem preprosto storite t nosilec i dobi s. 474 00:25:51,890 --> 00:25:56,320 Ker je moja slika izgleda takole na ta trenutek, shranjena t = 475 00:25:56,320 --> 00:25:59,530 naslov tega naključnega kos pomnilnika katerih vrednosti so znani. 476 00:25:59,530 --> 00:26:03,030 Ampak takoj, ko sem naredil t nosilec 0, da me postavi tukaj. 477 00:26:03,030 --> 00:26:07,430 >> In kaj se konča tam dobili pripraviti? 478 00:26:07,430 --> 00:26:08,740 Smo na koncu dajanje h. 479 00:26:08,740 --> 00:26:11,170 Ker to je tisto, kar je pri nosilcem S 0. 480 00:26:11,170 --> 00:26:14,300 In potem isto stvar za e in l, l, o. 481 00:26:14,300 --> 00:26:17,930 >> n, zakaj sem šel skozi enako n? 482 00:26:17,930 --> 00:26:19,200 Zaradi 0 značaja. 483 00:26:19,200 --> 00:26:23,580 Torej, samo da bo jasno, potem pa, če sem dejansko izbrisati vse, kar ti smeti 484 00:26:23,580 --> 00:26:28,870 Vrednosti so nato dejansko pripravijo v kaj pričakovali, to je nosilec 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, ter da je vlečni Novi znak. 486 00:26:32,440 --> 00:26:36,080 >> In sedaj, če bomo nadaljevali mimo piko, pika, pika na tem pravilno različico 487 00:26:36,080 --> 00:26:41,930 in kapitalizirane t kotnik 0 Jaz bi, v Tečaj se kapitalizacijo samo to 488 00:26:41,930 --> 00:26:47,050 tukaj tip, ki je konceptualno, je navsezadnje cilj. 489 00:26:47,050 --> 00:26:48,040 Tako da je je vse kazalec. 490 00:26:48,040 --> 00:26:51,430 >> In ste jih jemljete več tednov da v okviru nizov. 491 00:26:51,430 --> 00:26:53,530 Ampak pod pokrovom oni malo bolj zapletena. 492 00:26:53,530 --> 00:26:57,520 Ampak, če mislite, da o njih v tem slikovno obliko predlagam, da si 493 00:26:57,520 --> 00:27:01,720 Verjetno ni vse tako grozno, kot so morda sprva zdi na prvi pogled, 494 00:27:01,720 --> 00:27:04,730 še posebej s tako novo sintakso. 495 00:27:04,730 --> 00:27:07,290 Vsa vprašanja glede kazalcev, strune, ali nabora znakov? 496 00:27:07,290 --> 00:27:07,580 Ja? 497 00:27:07,580 --> 00:27:09,252 >> OBČINSTVO: lahko vrnete na [neslišno]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Seveda. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PUBLIKA: Torej, kako priti v vaš zelo zadnja linija, ne boste imeli * t linijo 501 00:27:19,525 --> 00:27:21,513 in * je na vrsti? 502 00:27:21,513 --> 00:27:23,004 Nimate sklicevanja na - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, res dobro vprašanje. 504 00:27:24,640 --> 00:27:26,800 Zakaj ne dobim * t in A * S? 505 00:27:26,800 --> 00:27:30,340 Ker je kratko, prejšnji teden, tako kot v našem funkcijo swap, nisem rekel, da ko 506 00:27:30,340 --> 00:27:33,350 imaš kazalec sredstvi, ki jih kar greš tja, kot smo 507 00:27:33,350 --> 00:27:36,590 fizično na odru, je bilo dejansko uporabite operator zvezdica. 508 00:27:36,590 --> 00:27:40,570 >> Izkaže se, da je to kvadratni oklepaj Zapis je tisto, kar imenujemo skladenjska 509 00:27:40,570 --> 00:27:44,190 sladkor, ki je samo seksi način pojasni, je to stenografski zapis za 510 00:27:44,190 --> 00:27:45,950 točno to kar opisujete. 511 00:27:45,950 --> 00:27:49,385 Ampak to je malo bolj intuitivno. 512 00:27:49,385 --> 00:27:53,510 In na tveganja, da bi to lahko zdi bolj zapleteno, kot je treba, 513 00:27:53,510 --> 00:27:56,990 kaj se v resnici dogaja je naslednja: - 514 00:27:56,990 --> 00:28:01,450 Če rečem * t to pomeni, da gre za naslov shranjena v t. 515 00:28:01,450 --> 00:28:04,350 >> Torej dobesedno, če je t je shranjevanje naslov te h 516 00:28:04,350 --> 00:28:07,300 Sprva * t pomeni iti tukaj. 517 00:28:07,300 --> 00:28:10,730 Zdaj, kaj t kotnik 0 pomeni? 518 00:28:10,730 --> 00:28:11,560 Enako natančna stvar. 519 00:28:11,560 --> 00:28:13,510 To je samo malo bolj uporabniku prijazen pisati. 520 00:28:13,510 --> 00:28:14,430 >> Ampak jaz še nisem storil. 521 00:28:14,430 --> 00:28:17,800 Ne morem reči * t dobi * s. 522 00:28:17,800 --> 00:28:19,440 Ker kaj bi se potem delaš? 523 00:28:19,440 --> 00:28:22,950 Želel je dajanje h, h, h, h, h skozi celotno stvar. 524 00:28:22,950 --> 00:28:22,995 Kajne? 525 00:28:22,995 --> 00:28:26,020 >> Ker * t je šel na naslov v t. 526 00:28:26,020 --> 00:28:27,580 Vendar smo znotraj zanke. 527 00:28:27,580 --> 00:28:32,150 In kakšno vrednost sem povečevanje, Seveda, na vsaki ponovitvi? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Ampak tam je priložnost tukaj, kajne? 530 00:28:34,590 --> 00:28:37,870 Čeprav se ta počuti, kot je pridobivanje Malo bolj prefinjene 531 00:28:37,870 --> 00:28:40,730 od kvadratnih nosilec zapisa smo nekaj časa uporabljali - 532 00:28:40,730 --> 00:28:43,840 Naj mi odvezal h spremembo tam - 533 00:28:43,840 --> 00:28:48,870 čeprav je to zdaj že malo Ljubitelj, osnovna ideja, če * t 534 00:28:48,870 --> 00:28:53,630 pomeni tukaj in * t je samo pojdite na naslov v t. 535 00:28:53,630 --> 00:28:54,990 >> Ampak kaj je naslov v t? 536 00:28:54,990 --> 00:28:56,850 Število hranimo uporabljate? 537 00:28:56,850 --> 00:29:00,540 Tako kot Ox456, pripeljimo da nazaj samo zaradi razprave. 538 00:29:00,540 --> 00:29:05,380 No, če želim priti na e leta t niz, samo želim iti, 539 00:29:05,380 --> 00:29:06,460 v bistvu, 456. 540 00:29:06,460 --> 00:29:09,230 >> Oziroma, 457. 541 00:29:09,230 --> 00:29:10,590 Moram dodati eno. 542 00:29:10,590 --> 00:29:11,790 Vendar pa lahko naredim to, kajne? 543 00:29:11,790 --> 00:29:14,680 Ker t, čeprav sem voditi risanje zdaj kot puščica, to je samo 544 00:29:14,680 --> 00:29:16,570 Številka, Ox456. 545 00:29:16,570 --> 00:29:21,400 In če dodam nekaj na to, ali več na splošno, če dodam I do, da sem lahko 546 00:29:21,400 --> 00:29:24,350 dejansko dobili točno tam, kjer želim. 547 00:29:24,350 --> 00:29:26,260 Torej, če Pravzaprav to počnem - 548 00:29:26,260 --> 00:29:28,970 in to je tisto, kar danes imenujemo kazalec aritmetično - 549 00:29:28,970 --> 00:29:30,375 Jaz lahko odstranite to linijo. 550 00:29:30,375 --> 00:29:33,550 Ki je, odkrito povedano, mislim, da jasno in malo bolj prijazen za branje. 551 00:29:33,550 --> 00:29:35,970 Vendar pa to ne manj pravilna. 552 00:29:35,970 --> 00:29:38,570 >> Ta vrstica kode sedaj uporablja kazalec aritmetično. 553 00:29:38,570 --> 00:29:40,920 To je rekel, pojdite na po naslov - 554 00:29:40,920 --> 00:29:44,670 ne glede na začetek t je, ki je t plus i, ki se sprva 555 00:29:44,670 --> 00:29:45,730 0, kar je super. 556 00:29:45,730 --> 00:29:49,280 Ker to pomeni začetek t plus 1, plus 2 plus 3, in tako naprej. 557 00:29:49,280 --> 00:29:51,030 In isto se ukvarjajo s s. 558 00:29:51,030 --> 00:29:52,750 >> Tako skladenjska sladkor za to. 559 00:29:52,750 --> 00:29:55,900 Ampak razumevanje, kaj se v resnici dogaja Pod pokrovom motorja, bi lahko dejali, 560 00:29:55,900 --> 00:29:57,410 dejansko uporabna in sama po sebi. 561 00:29:57,410 --> 00:30:00,620 Ker to pomeni, zdaj pa je ni veliko bolj čarobno dogaja 562 00:30:00,620 --> 00:30:01,620 Pod pokrovom. 563 00:30:01,620 --> 00:30:03,920 Tam se ne bo veliko več plasti, da bomo lahko Odlepite za vas. 564 00:30:03,920 --> 00:30:04,810 To je c. 565 00:30:04,810 --> 00:30:06,410 In to je programiranje. 566 00:30:06,410 --> 00:30:08,002 Res dobro vprašanje. 567 00:30:08,002 --> 00:30:11,570 >> Vse je v redu, tako da je bilo to, da vozičkom Program sem imel v mislih prej. 568 00:30:11,570 --> 00:30:12,650 swap je bil pomanjkljiv. 569 00:30:12,650 --> 00:30:14,070 Če pa se zdi, da deluje. 570 00:30:14,070 --> 00:30:17,390 Spomnimo se, da tako kot z mlekom in pomarančni sok - ki sem ga začel 571 00:30:17,390 --> 00:30:18,660 pitje današnjo predstavitev. 572 00:30:18,660 --> 00:30:22,220 Torej, tako kot s pomarančnim sokom in mleko, nismo morali uporabiti 573 00:30:22,220 --> 00:30:26,200 začasna spremenljivka, tmp, da imajo začasno, tako da bomo lahko potem 574 00:30:26,200 --> 00:30:28,820 spremeniti svojo vrednost in nato posodobite b. 575 00:30:28,820 --> 00:30:32,870 >> Ampak to funkcijo, smo rekli, ali je to program, v katerem je ta funkcija 576 00:30:32,870 --> 00:30:35,670 napisano je bilo narobe in pomanjkljiv, zakaj? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ja? 579 00:30:39,090 --> 00:30:42,471 >> PUBLIKA: [neslišno]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Točno, ko pokličete swap - 581 00:30:44,940 --> 00:30:47,820 ali bolj na splošno, ko pokličite najbolj nobene funkcije - 582 00:30:47,820 --> 00:30:51,210 če so argumenti za to funkcijo, so primitivni, tako rekoč, ints in nabora znakov 583 00:30:51,210 --> 00:30:56,740 in dvojnih in boje, stvari brez zvezde, ste minljivi, v kopiji 584 00:30:56,740 --> 00:30:57,540 argument. 585 00:30:57,540 --> 00:31:01,580 Torej, če je x 1, in y je 2, bo za 1 in b se bo 2. 586 00:31:01,580 --> 00:31:05,250 Ampak oni bodo različni kosi bitov, različne kose 587 00:31:05,250 --> 00:31:07,540 pomnilnika, ki se zgodi, da se shranjevanje enaki vrednosti. 588 00:31:07,540 --> 00:31:12,160 >> Tako da je ta koda je super odlična V zamenjavo a in b. 589 00:31:12,160 --> 00:31:13,850 To ni dobro zamenjavo - 590 00:31:13,850 --> 00:31:15,290 na primer prejšnji teden - 591 00:31:15,290 --> 00:31:16,390 x in y. 592 00:31:16,390 --> 00:31:18,780 Ker še enkrat, oni v napačnem področju. 593 00:31:18,780 --> 00:31:21,310 >> Zdaj, kako bomo šli o določitvi to? 594 00:31:21,310 --> 00:31:23,140 Smo morali narediti funkcijo poglej malo grši. 595 00:31:23,140 --> 00:31:25,250 Ampak še enkrat, razmisli, kaj To samo pomeni. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> In pravzaprav, kaj mi je, za doslednost, spremenite eno stvar, tako da je enak 598 00:31:31,500 --> 00:31:33,200 kar smo pravkar storil. 599 00:31:33,200 --> 00:31:35,690 Kot sem že omenil prejšnji teden, pa ne važno, kam gre. 600 00:31:35,690 --> 00:31:38,120 Dejstvo je, ponavadi ti bi dal zvezdice poleg spremenljivko. 601 00:31:38,120 --> 00:31:40,750 Ampak mislim, da bi bilo malo lažje upoštevati * poleg 602 00:31:40,750 --> 00:31:44,910 Tip podatkov, kot jo smislu je kazalec za notr v tem primeru. 603 00:31:44,910 --> 00:31:46,270 >> Torej, kaj počnem tukaj? 604 00:31:46,270 --> 00:31:49,590 Pravim, da ne mi int sledila druga notr, 605 00:31:49,590 --> 00:31:50,810 njih in b kliče. 606 00:31:50,810 --> 00:31:52,460 Daj mi naslov notr. 607 00:31:52,460 --> 00:31:53,960 Daj mi naslov drugega notr. 608 00:31:53,960 --> 00:31:56,330 Pokličite tisti naslovi in ​​b. 609 00:31:56,330 --> 00:32:00,860 >> Nato pa z uporabo * zapis navzdol spodaj, pojdite na vsakega od teh naslovov 610 00:32:00,860 --> 00:32:05,290 , kot je potrebno, da se bodisi ali pa nastavite njegove vrednosti. 611 00:32:05,290 --> 00:32:07,400 Toda obstaja izjema. 612 00:32:07,400 --> 00:32:11,130 Zakaj ne imel * poleg tmp? 613 00:32:11,130 --> 00:32:15,070 Zakaj ne naredi tega, na primer? 614 00:32:15,070 --> 00:32:19,370 Zdi se, kot bi morala sem iti vse ven in popraviti celotno stvar. 615 00:32:19,370 --> 00:32:19,752 Ja? 616 00:32:19,752 --> 00:32:21,002 >> PUBLIKA: [neslišno]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Nisem prijavljeni NTU kot niz. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Torej bi to ugotovi, v tem primeru tmp biti naslov notr. 621 00:32:34,950 --> 00:32:37,380 Ampak to ni ravno to, kar hočem, za nekaj razlogov. 622 00:32:37,380 --> 00:32:38,616 >> PUBLIKA: Vi ne želite, da jih swap. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Točno tako, ne želim, da bi zamenjali karkoli z tmp. tmp je le 624 00:32:41,800 --> 00:32:42,790 teden ena stvar. 625 00:32:42,790 --> 00:32:45,150 Vse kar hočem je spremenljivka za shranjevanje nekaj več. 626 00:32:45,150 --> 00:32:47,330 Jaz sploh ne briga naslovov v tem trenutku. 627 00:32:47,330 --> 00:32:50,530 >> Potrebujem samo 32 bitov ali tako za shranjevanje int. 628 00:32:50,530 --> 00:32:56,690 In hočem, da v teh 32 bitov kar ni v tako rekoč, vendar 629 00:32:56,690 --> 00:33:01,260 kaj je, samo da bi se bolj natančno. 630 00:33:01,260 --> 00:33:06,420 Ker če je naslov * pomeni pojdi tja in dobite vrednost 1. 631 00:33:06,420 --> 00:33:10,560 Na primer, na primer prejšnji teden ali v primeru B je, dobil vrednost 2. 632 00:33:10,560 --> 00:33:11,750 >> Torej, kaj se v resnici dogaja? 633 00:33:11,750 --> 00:33:15,070 Naj ti narišem tukaj, da se bo samo draži narazen del danes. 634 00:33:15,070 --> 00:33:18,580 Vendar bo še vedno prikazana za kar nekaj časa. 635 00:33:18,580 --> 00:33:22,430 >> To Trdim, je tisto, kar računalniku spomin zgleda, ko zaženete 636 00:33:22,430 --> 00:33:24,060 Program, kateri koli program. 637 00:33:24,060 --> 00:33:28,340 Ko zaženete program na sam vrh od računalnika RAM - tako mislim 638 00:33:28,340 --> 00:33:33,530 Ta pravokotnik, resnično, kot vaš računalnika RAM ali spomin, vse 101 639 00:33:33,530 --> 00:33:36,920 milijarda bajtov njim, vsi dve milijardi zlogov, vse dva gigabajta njej, 640 00:33:36,920 --> 00:33:39,910 ne glede na količino, kar imate, je, kaj je to, kot pravokotnik pripravi. 641 00:33:39,910 --> 00:33:43,260 In trdim, da ko zaženete program kot so Microsoft Word ali Chrome 642 00:33:43,260 --> 00:33:49,220 ali kaj podobnega, bitov, da Microsoft ali Google napisal - 643 00:33:49,220 --> 00:33:50,910 v primerih, navedenih programov - 644 00:33:50,910 --> 00:33:54,490 se naloži v pomnilnik računalnika kjer se lahko izvede več 645 00:33:54,490 --> 00:33:57,520 hitro in krmijo v CPU, ki je možgane v računalniku. 646 00:33:57,520 --> 00:34:00,940 >> In v TAM oni so shranjeni v zelo vrh svojega programa, tako rekoč. 647 00:34:00,940 --> 00:34:03,300 Z drugimi besedami, če je to kos spomin, ko boste dvakrat kliknite na 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bitov pridejo na trdem disku. 649 00:34:05,740 --> 00:34:06,680 So se naložijo v RAM. 650 00:34:06,680 --> 00:34:10,330 In jih bomo zabil v sam vrh tega pravokotnika konceptualno. 651 00:34:10,330 --> 00:34:13,010 >> No, preostanek svojega spomina je uporabijo za različne stvari. 652 00:34:13,010 --> 00:34:16,460 Na samem vrhu vidite inicializacijo Podatki in ustavljanja podatke. 653 00:34:16,460 --> 00:34:20,500 To mora storiti, za večino del, s konstante ali globalne spremenljivke 654 00:34:20,500 --> 00:34:21,340 da imajo vrednosti. 655 00:34:21,340 --> 00:34:22,980 Ampak bolj na tiste, drugič. 656 00:34:22,980 --> 00:34:25,150 >> Potem imate kup, ki je bomo prišli nazaj. 657 00:34:25,150 --> 00:34:28,420 Toda na dnu je del, ki je zlasti Germane zdaj. 658 00:34:28,420 --> 00:34:30,210 To je tako imenovani dimnik. 659 00:34:30,210 --> 00:34:33,850 Torej, tako kot v večini vseh D dvorani tukaj kampus, imate te pladnje, da 660 00:34:33,850 --> 00:34:37,210 Samo zložene druga nad drugo, na kateri lahko dajo hrane in drugih malenkosti. 661 00:34:37,210 --> 00:34:40,139 Opremo v računalniškem sistemu je zelo podoben. 662 00:34:40,139 --> 00:34:42,679 Razen ker pladenj, kot jih uporabljamo v jedilnica seveda pomeni 663 00:34:42,679 --> 00:34:45,710 za opravljanje stvari pladnje ali okvirji - 664 00:34:45,710 --> 00:34:49,469 saj jih bomo imenovali - v računalnik je pomnilnik se uporablja za vodenje 665 00:34:49,469 --> 00:34:51,610 spremenljivke in vrednot. 666 00:34:51,610 --> 00:34:53,929 >> Torej, kaj v resnici gre naprej pod pokrovom? 667 00:34:53,929 --> 00:34:55,820 No, naj obrnila na zaslon tukaj. 668 00:34:55,820 --> 00:34:58,370 In naj se osredotoči le na Spodnji del za trenutek. 669 00:34:58,370 --> 00:35:02,770 Če je to spodnji del mojega računalnika spomin se je izkazalo, ko sem 670 00:35:02,770 --> 00:35:05,350 pokličite funkcijo main - ki se zgodi, odkrito povedano, 671 00:35:05,350 --> 00:35:06,950 samodejno zame - 672 00:35:06,950 --> 00:35:10,510 Dobim kos pomnilnika na Spodnji del mojega RAM, tako govoriti. 673 00:35:10,510 --> 00:35:13,390 In to je, če je glavni lokalne spremenljivke iti. 674 00:35:13,390 --> 00:35:16,770 Tam, kjer argc in argv morda iti in vse spremenljivke I 675 00:35:16,770 --> 00:35:18,170 razglasi znotraj glavnega. 676 00:35:18,170 --> 00:35:20,260 Končajo na dnu mojega računalnika RAM. 677 00:35:20,260 --> 00:35:25,040 >> Zdaj pa recimo, da so glavne klice funkcijo kot zamenjavo, kot je to storila prejšnji teden? 678 00:35:25,040 --> 00:35:30,620 No, v bistvu dal nov pladenj, Novi okvir, na svoj kos pomnilnika. 679 00:35:30,620 --> 00:35:34,160 In jaz bom opisati to kot spada v funkciji zamenjavi. 680 00:35:34,160 --> 00:35:35,770 >> Zdaj, kaj je notri za zamenjavo? 681 00:35:35,770 --> 00:35:39,240 No, temelji na programu prejšnji teden in Tisti, ki smo pravkar videli odlomek iz, 682 00:35:39,240 --> 00:35:46,590 znotraj okvirja swap je, ali je zamenjava pladenj, so tisto, kar spremenljivke? 683 00:35:46,590 --> 00:35:47,970 No, in b. 684 00:35:47,970 --> 00:35:51,850 Zato, ker jih njeni lokalni argumenti, plus tretja NTU. 685 00:35:51,850 --> 00:35:54,470 Torej, res sem lahko pripravi to malo bolj čisto. 686 00:35:54,470 --> 00:35:56,680 Dovolite mi, da gredo naprej in razveljaviti nalepko. 687 00:35:56,680 --> 00:35:58,520 In mi zatrjujejo, da veste, kaj? 688 00:35:58,520 --> 00:36:00,560 >> Verjetno bo na koncu tukaj. 689 00:36:00,560 --> 00:36:02,160 B se bo končalo tukaj. 690 00:36:02,160 --> 00:36:03,810 In tmp se bo končalo tukaj. 691 00:36:03,810 --> 00:36:05,160 Zdaj, morda naročanje je malo drugačen. 692 00:36:05,160 --> 00:36:06,840 Vendar konceptualno to zamisel. 693 00:36:06,840 --> 00:36:11,490 >> In samo skupaj, to je tisto, bomo poklical okvir swap je, ali 694 00:36:11,490 --> 00:36:12,136 jedilnica, dvorana pladenj. 695 00:36:12,136 --> 00:36:13,150 In isto se ukvarjajo z glavno. 696 00:36:13,150 --> 00:36:14,040 Ampak ne bom, da izvlečete. 697 00:36:14,040 --> 00:36:17,810 Ampak to je, če argc in argv in vse krajevno spremenljivk, kot so x in y 698 00:36:17,810 --> 00:36:18,940 lahko tudi. 699 00:36:18,940 --> 00:36:22,170 >> Torej, zdaj razmisliti, kaj se v resnici dogaja Ko kličete zamenjave. 700 00:36:22,170 --> 00:36:26,370 Ko pokličete zamenjave, izvajanje kode, kot so To, da ste potujejo v 701 00:36:26,370 --> 00:36:30,670 verzija buggy, in b kot kopije x in y. 702 00:36:30,670 --> 00:36:34,300 Torej, če mi sedaj pripraviti to na zaslonu - 703 00:36:34,300 --> 00:36:36,700 spraviti boljši pri tem - 704 00:36:36,700 --> 00:36:40,850 Tako zgodbo sem povedal, da sam je bil v tem buggy različici, ko smo 705 00:36:40,850 --> 00:36:46,130 pokličite swap poteka v dobesedno in b kot cela števila, kaj se v resnici dogaja? 706 00:36:46,130 --> 00:36:48,250 >> No, kaj se v resnici dogaja, je to. 707 00:36:48,250 --> 00:36:52,850 Dovolite mi, da gredo naprej in razveljaviti le razčistiti nekaj prostora tukaj. 708 00:36:52,850 --> 00:36:54,720 Torej je ta spomin mojega računalnika. 709 00:36:54,720 --> 00:36:57,510 >> Torej, če imam na primer - 710 00:36:57,510 --> 00:36:58,910 dejansko pa to storite na ta način - 711 00:36:58,910 --> 00:37:02,690 če trdim, da je to x, shranjevanje vrednost 1, tako kot prejšnji teden. 712 00:37:02,690 --> 00:37:05,930 In to je y, shranjevanje vrednosti 2. tako kot prejšnji teden. 713 00:37:05,930 --> 00:37:11,370 In to je glavni, ko kličem zamenjave, s čimer sam dostop do in 714 00:37:11,370 --> 00:37:15,150 b in tmp, bom trdijo, da to, kar 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 se imenuje tmp. 718 00:37:18,370 --> 00:37:23,360 >> In na začetku, ima nekaj smeti vrednost dokler nisem dejansko shrani v njej, 719 00:37:23,360 --> 00:37:24,450 ki je 1. 720 00:37:24,450 --> 00:37:28,320 Potem sem šel naprej in spremenite za kaj? 721 00:37:28,320 --> 00:37:29,720 Vrednost B-jev. 722 00:37:29,720 --> 00:37:31,980 >> In tako zdaj imam dva tukaj. 723 00:37:31,980 --> 00:37:34,050 In potem smo rekli b dobi tmp. 724 00:37:34,050 --> 00:37:37,670 Spet, tako kot preverjanje sanity, tretji vrstica kode tu je preprosto to 725 00:37:37,670 --> 00:37:39,440 ena, b dobi tmp. 726 00:37:39,440 --> 00:37:41,730 >> In tako na koncu, kaj naj storim? 727 00:37:41,730 --> 00:37:46,800 Grem naprej in spremeniti b, da karkoli vrednost NTU je, kar je 1. 728 00:37:46,800 --> 00:37:48,390 Ne dotikajte tmp. 729 00:37:48,390 --> 00:37:54,100 >> Toda zdaj, problem je, kakor hitro zamenjavo vrne, ker ne predaja 730 00:37:54,100 --> 00:37:57,540 nazaj neko vrednost, ni vrnitev Izjava nedvoumno izraža v njem. 731 00:37:57,540 --> 00:37:59,080 Kaj se dejansko dogaja? 732 00:37:59,080 --> 00:38:03,480 No, v bistvu vse to spomin - 733 00:38:03,480 --> 00:38:07,410 OK, očitno radirka všeč samo en prst naenkrat - 734 00:38:07,410 --> 00:38:08,180 samo izgine. 735 00:38:08,180 --> 00:38:10,070 >> Zdaj v resnici to ni grem nikamor. 736 00:38:10,070 --> 00:38:11,810 Lahko pa pomislim Zdaj so vprašaji. 737 00:38:11,810 --> 00:38:14,040 Ker ne gre več dejansko v uporabi. 738 00:38:14,040 --> 00:38:17,470 In ne bo nič storjeno s temi vrednotami. 739 00:38:17,470 --> 00:38:21,920 >> Tako v primeru zelene različico ta koda, kar je namesto počutje 740 00:38:21,920 --> 00:38:24,640 prešla v zamenjavo? 741 00:38:24,640 --> 00:38:25,770 Tako obravnava. 742 00:38:25,770 --> 00:38:28,520 Torej naslov x in naslov y. 743 00:38:28,520 --> 00:38:35,790 Torej, če bomo ponovno povem to zgodbo še zadnjič čas, in dejansko sem spet sestaviti zamenjave, 744 00:38:35,790 --> 00:38:44,620 vendar z kazalcev, kar je v tem da b, in kar je NTU, kar je 745 00:38:44,620 --> 00:38:49,080 dejansko shrani v te zelene različica mojo kodo, kjer sem mimo 746 00:38:49,080 --> 00:38:52,110 v naslovih? 747 00:38:52,110 --> 00:38:53,780 >> To se dogaja, da se kazalec na x. 748 00:38:53,780 --> 00:38:54,890 Tako sem lahko nariše puščico. 749 00:38:54,890 --> 00:38:57,310 Vendar naj uporabi isto samovoljno Primer kot prej. 750 00:38:57,310 --> 00:39:01,220 Recimo, da je to nekaj podobnega Ox123. 751 00:39:01,220 --> 00:39:04,970 In to se bo Ox127 ker to je štiri bajte stran, ker je to 752 00:39:04,970 --> 00:39:07,370 int, tako Ox127. 753 00:39:07,370 --> 00:39:09,080 >> In spet bom vzel nekaj svoboščin s številkami. 754 00:39:09,080 --> 00:39:11,430 Oni so veliko manjši, kot bi jih dejansko in v drugačnem vrstnem redu. 755 00:39:11,430 --> 00:39:14,350 Ampak to je, kako slika Zdaj je drugače. 756 00:39:14,350 --> 00:39:19,060 >> Toda, ko sem uporabo te zelene kodo in jaz int tmp dobil *. 757 00:39:19,060 --> 00:39:25,010 * Sredstvo narediti naslednje, da obravnavati, da je v in iti k njej, 758 00:39:25,010 --> 00:39:26,190 ki je 1. 759 00:39:26,190 --> 00:39:28,480 In to je tisto, kar sem potem dal v tmp. 760 00:39:28,480 --> 00:39:32,480 Medtem, v naslednji vrstici kode Tukaj, * postane B, kaj to pomeni? 761 00:39:32,480 --> 00:39:36,910 >> No, *, tako da gredo tu dobi * b, kar pomeni, da gredo tja. 762 00:39:36,910 --> 00:39:39,310 Kar pomeni, da je dal vrednost tam. 763 00:39:39,310 --> 00:39:43,670 Končno, zadnja vrstica kode preprosto rekel * b dobi tmp. 764 00:39:43,670 --> 00:39:48,900 >> Torej b pravi tja in ga prepisati z NTU, ki v tem primeru bo 765 00:39:48,900 --> 00:39:51,520 da je, še enkrat, 1. 766 00:39:51,520 --> 00:39:54,920 In zato zelena različica naša koda deluje, ker je rdeča 767 00:39:54,920 --> 00:39:56,010 različica nikoli ni. 768 00:39:56,010 --> 00:39:59,020 To vse je le izvira, kako Pomnilnik je uspelo in kje je 769 00:39:59,020 --> 00:40:02,580 dejansko postavi v vašem računalnika RAM. 770 00:40:02,580 --> 00:40:07,270 In za zdaj, to je ena od stvari, da je sklad se uporablja za. 771 00:40:07,270 --> 00:40:09,225 >> Vprašanja o postavitvi? 772 00:40:09,225 --> 00:40:10,380 Na namig? 773 00:40:10,380 --> 00:40:11,630 Ali zamenjave? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Vse je v redu, tako da malloc, odpoklic, storil kaj takega. 776 00:40:17,043 --> 00:40:18,260 To je zelo preprost primer. 777 00:40:18,260 --> 00:40:20,550 In to je bil tisti, ki Binky nam je predstavil, čeprav dokaj 778 00:40:20,550 --> 00:40:21,870 hitro, na koncu razreda. 779 00:40:21,870 --> 00:40:24,480 Prekleto, pa smo spet tam. 780 00:40:24,480 --> 00:40:28,780 >> Tako opozarjajo, da je to primer, ki Binky nam predstavili, čeprav 781 00:40:28,780 --> 00:40:30,360 nekoliko hitro konec razreda. 782 00:40:30,360 --> 00:40:33,640 In tukaj smo res malloc za drugič. 783 00:40:33,640 --> 00:40:37,330 Ker smo prvič uporabili, ustvariti dovolj RAM-a, dodeliti dovolj pomnilnika 784 00:40:37,330 --> 00:40:38,340 za shranjevanje niz. 785 00:40:38,340 --> 00:40:40,250 >> Tokrat Binky biti enostavno. 786 00:40:40,250 --> 00:40:42,465 Tako da je za shranjevanje samo int, očitno. 787 00:40:42,465 --> 00:40:43,510 In da je povsem v redu. 788 00:40:43,510 --> 00:40:46,560 To je malo čudno, odkrito povedano, da uporabiti malloc dodeliti eno int. 789 00:40:46,560 --> 00:40:50,650 Ampak točka Nickov claymation je res samo povedati zgodbo o čem 790 00:40:50,650 --> 00:40:53,830 zgodi ali ne zgodi, ko vam zlorabljati spomin. 791 00:40:53,830 --> 00:40:56,520 >> Torej, v tem primeru ta program naredil nekaj stvari. 792 00:40:56,520 --> 00:41:01,580 V prvem primeru tukaj, razglasi kazalec se imenuje x na notr. 793 00:41:01,580 --> 00:41:04,480 Nato razglasi kazalec imenovano y notr. 794 00:41:04,480 --> 00:41:06,150 Nato shrani v x, kaj? 795 00:41:06,150 --> 00:41:07,110 Nekdo drug zdaj. 796 00:41:07,110 --> 00:41:09,685 Kar je shranjena v x po Tretja vrstica tega programa? 797 00:41:09,685 --> 00:41:12,380 >> PUBLIKA: [neslišno]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: No, ne čisto zlogov, na reči. 799 00:41:14,130 --> 00:41:16,760 Bodite bolj natančni zdaj. 800 00:41:16,760 --> 00:41:18,325 Kaj gets shranjeni v X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Naslov, mislim, da sem ga slišal. 803 00:41:22,060 --> 00:41:23,570 >> Torej, kaj malloc vrne? 804 00:41:23,570 --> 00:41:26,030 malloc vedenjsko razporeja kos pomnilnika. 805 00:41:26,030 --> 00:41:27,850 Ampak kako se vam dostop do njega? 806 00:41:27,850 --> 00:41:29,460 Se vrne kaj? 807 00:41:29,460 --> 00:41:32,000 Naslov prvega bajta v bloku pomnilnika. 808 00:41:32,000 --> 00:41:33,020 >> Zdaj, to je zelo preprosta. 809 00:41:33,020 --> 00:41:35,380 To je samo en bajt, kar pomeni, obravnavali smo dobili nazaj, je 810 00:41:35,380 --> 00:41:37,300 naslov celotno stvar. 811 00:41:37,300 --> 00:41:42,070 Torej shranjena v X nato je naslov navedene kos pomnilnika. 812 00:41:42,070 --> 00:41:43,400 Medtem, kaj se zgodi potem? 813 00:41:43,400 --> 00:41:45,890 Torej dejansko, gremo naprej in pripravi tega se resnično hitro. 814 00:41:45,890 --> 00:41:52,490 >> Torej, če bomo šli čez na zaslonu tukaj in igramo tole int * x in y int * 815 00:41:52,490 --> 00:41:53,740 se bo kaj storil za mene? 816 00:41:53,740 --> 00:41:58,280 Trdim, da bo le to kaj takega in to x poklicati, in 817 00:41:58,280 --> 00:42:00,010 ta in y pokličite. 818 00:42:00,010 --> 00:42:03,110 Medtem, tretja vrstica kode je gre za dodelitev velikosti notr, 819 00:42:03,110 --> 00:42:06,160 ki se zgodi, da - se opravičujem, če sem rekel, eden preden sem mislil eno int - 820 00:42:06,160 --> 00:42:08,280 štiri bajte na tipičnem računalniku. 821 00:42:08,280 --> 00:42:09,720 Vsaj z CS50 aparata. 822 00:42:09,720 --> 00:42:11,490 >> Torej, to se bo dodelila to, kdo ve? 823 00:42:11,490 --> 00:42:12,800 Nekje tukaj. 824 00:42:12,800 --> 00:42:15,780 In to je shranjena pri nekaterih naslov Ox, kdo ve? 825 00:42:15,780 --> 00:42:18,330 Ampak, kaj se dogaja, da se vrne je ta naslov. 826 00:42:18,330 --> 00:42:22,270 Ampak bomo to pripraviti slikovno saj samo arrow tako. 827 00:42:22,270 --> 00:42:25,430 >> Zdaj v naslednjo vrstico * x dobi 42. 828 00:42:25,430 --> 00:42:29,400 Kaj * x pomeni v smislu navadnega je? 829 00:42:29,400 --> 00:42:30,040 Samo pojdi tja. 830 00:42:30,040 --> 00:42:30,960 Pojdi na ta naslov. 831 00:42:30,960 --> 00:42:35,900 Ali z drugimi besedami, sledite puščica in dal 42 tam. 832 00:42:35,900 --> 00:42:38,140 Ampak potem se je zgodilo nekaj slabega za Binky, kajne? 833 00:42:38,140 --> 00:42:43,950 >> Spomnimo se, da pete tukaj, * y dobi 13, res nesrečno število, 834 00:42:43,950 --> 00:42:44,760 naredil kaj za nas? 835 00:42:44,760 --> 00:42:47,320 No, * y pomeni iti tja. 836 00:42:47,320 --> 00:42:50,460 No, to ni dobil še vrednost, kajne? 837 00:42:50,460 --> 00:42:54,090 Koda nima y pa inicializirana ničesar. 838 00:42:54,090 --> 00:42:56,120 Mi je pa x inicializiran na naslov. 839 00:42:56,120 --> 00:42:57,640 Vendar je bil y prijaviti do vrha. 840 00:42:57,640 --> 00:43:00,250 Ampak potem podpičje, nobena vrednost dejansko jih v njej. 841 00:43:00,250 --> 00:43:02,330 Torej je pošteno, da to imenujemo smeti vrednost. 842 00:43:02,330 --> 00:43:03,430 Kdo ve, kaj je tam? 843 00:43:03,430 --> 00:43:07,160 To so ostanki bitov, ki so bile uporabljene z neko prejšnjo vrstico kode v 844 00:43:07,160 --> 00:43:08,300 moj program. 845 00:43:08,300 --> 00:43:13,250 >> Torej, če rečem, tja, to je kot, Nimam pojma, kje je puščica 846 00:43:13,250 --> 00:43:14,490 bo na koncu. 847 00:43:14,490 --> 00:43:17,720 In to je, ko po navadi dobili napako segmentacije. 848 00:43:17,720 --> 00:43:22,430 Če ste pomotoma posebnih datotek, tako da govori, ali na naslov, ki je ni 849 00:43:22,430 --> 00:43:25,400 dejansko legitimno naslov dogajajo slabe stvari. 850 00:43:25,400 --> 00:43:27,550 >> In to je točno tisto, kar se je zgodilo za Binky mislim. 851 00:43:27,550 --> 00:43:31,060 Tako opozarjajo, da je zgodba, ki je bil Nick govoril sem bila ista ideja, saj česa 852 00:43:31,060 --> 00:43:34,050 Sem sestavljen z iluzijo krede na tabli tam. 853 00:43:34,050 --> 00:43:35,960 X in Y sta prijavljeni. 854 00:43:35,960 --> 00:43:39,690 >> Potem smo dodeljen velikost int in shranjena v x. 855 00:43:39,690 --> 00:43:42,130 Potem naslednji vrstici sva * x. 856 00:43:42,130 --> 00:43:46,070 To je bil Nick čarobno palico od Dereferenciranje. 857 00:43:46,070 --> 00:43:49,780 To naj 42 v pomnilniku poudaril x. 858 00:43:49,780 --> 00:43:51,600 >> Ampak to je, če stvari šlo hudo narobe. 859 00:43:51,600 --> 00:43:51,820 Kajne? 860 00:43:51,820 --> 00:43:53,550 Poskušali smo dereference y. 861 00:43:53,550 --> 00:43:55,620 Ampak y imel nekaj lažne vrednosti, kajne? 862 00:43:55,620 --> 00:43:57,720 >> To puščica v spodnjem levem kotiček, ni 863 00:43:57,720 --> 00:43:58,950 dejansko kaže na nič. 864 00:43:58,950 --> 00:44:01,520 To je nekako to, kar sem pa tu na forumu. 865 00:44:01,520 --> 00:44:05,900 Tako slabe stvari dogajajo, segmentacija napaka ali napaka Binky, v tem primeru. 866 00:44:05,900 --> 00:44:10,800 >> Ampak, če bomo nato določiti, da s tem x y dobi kako spremembo zgodbo? 867 00:44:10,800 --> 00:44:15,760 Torej, če naredim x dobi Y, ki je in ista kot pravim 868 00:44:15,760 --> 00:44:19,235 karkoli že to je, Ox-nekaj se bo enaka tukaj 869 00:44:19,235 --> 00:44:20,080 Ox-nekaj. 870 00:44:20,080 --> 00:44:22,970 Ali slikovno bomo potegniti puščico. 871 00:44:22,970 --> 00:44:25,530 >> Torej, tukaj na tabli z Binky, z naslednjo vrstico 872 00:44:25,530 --> 00:44:28,350 koda * y pomeni iti tja. 873 00:44:28,350 --> 00:44:29,400 Kje je tu? 874 00:44:29,400 --> 00:44:30,820 To pomeni, da sem. 875 00:44:30,820 --> 00:44:36,050 >> In ko smo posodobiti, da bo 13 to samo pomeni tekoč in 876 00:44:36,050 --> 00:44:39,470 pisanje 13 tukaj. 877 00:44:39,470 --> 00:44:44,130 Torej, morda ne povsem enostavno na prvi pogled. 878 00:44:44,130 --> 00:44:47,740 Ampak da Rekapitulacija in uporabiti isto žargonu da Binky je uporabljal tukaj, tako da 879 00:44:47,740 --> 00:44:50,485 Prvi dve razdeli napotke, x in y, vendar ne pointees. 880 00:44:50,485 --> 00:44:54,750 In pointees ne običajno uporablja izraz. 881 00:44:54,750 --> 00:44:56,120 Ampak kazalec absolutno je. 882 00:44:56,120 --> 00:44:59,200 Ampak to je tisto, kar se je izpostavil na v Binky v nomenklaturi. 883 00:44:59,200 --> 00:45:01,660 >> Ta druga skupina, seveda razporeja int pointee. 884 00:45:01,660 --> 00:45:04,840 Torej kos pomnilnika - kot sem narisal kot na desna stran obstaja - in set 885 00:45:04,840 --> 00:45:06,470 x enak kaže na to. 886 00:45:06,470 --> 00:45:11,350 Ta dereferences x za shranjevanje 42 v pomnilnika, ki ga je gledala. 887 00:45:11,350 --> 00:45:13,380 In potem je to, seveda, je slaba stvar. 888 00:45:13,380 --> 00:45:15,600 Ker y ni obrnjena na kaj še. 889 00:45:15,600 --> 00:45:16,530 Ta določa ga. 890 00:45:16,530 --> 00:45:18,240 Torej, to je še vedno buggy programa. 891 00:45:18,240 --> 00:45:21,580 Samo zato, ker smo piha skozi koda po vrsticah in rekel, oh no, 892 00:45:21,580 --> 00:45:22,690 pustite, da crash tam. 893 00:45:22,690 --> 00:45:23,420 To je slaba stvar. 894 00:45:23,420 --> 00:45:26,790 Stave so Program bo le abort skupaj na tej liniji. 895 00:45:26,790 --> 00:45:30,550 Ampak, če ste bili, da odstranite strmoglavilo Line in ga nadomestiti z zadnjih dveh 896 00:45:30,550 --> 00:45:32,470 smernicami, ki jih dodelite - 897 00:45:32,470 --> 00:45:35,310 uporabo kazalca nalogo - y izpostaviti x kot točka t. 898 00:45:35,310 --> 00:45:39,280 In potem si dereference y v zelo varen način. 899 00:45:39,280 --> 00:45:41,520 >> Torej, če nam to pusti? 900 00:45:41,520 --> 00:45:45,350 No, izkaže, da je pod pokrovom v knjižnici CS50, kazalci so 901 00:45:45,350 --> 00:45:46,320 uporablja v celotnem besedilu. 902 00:45:46,320 --> 00:45:48,910 In bomo dejansko začeli z lupino nazaj, da plast pred dolgo. 903 00:45:48,910 --> 00:45:51,740 Ampak se je izkazalo tudi, da je izraz nekatere od vas morda pozna, 904 00:45:51,740 --> 00:45:54,580 zlasti tistih bolj udobno, je pravzaprav, da od zelo priljubljena 905 00:45:54,580 --> 00:45:56,390 Spletna stran, ali prekoračitev, v teh dneh. 906 00:45:56,390 --> 00:45:58,720 >> Ampak to dejansko ima zelo tehnični pomen. 907 00:45:58,720 --> 00:46:00,160 Zdaj vemo, kaj stack. 908 00:46:00,160 --> 00:46:02,550 To je kot kup pladnjev notranjost jedilnici. 909 00:46:02,550 --> 00:46:05,140 >> Ali znotraj računalniku Pomnilnik njenih teh okvirjev 910 00:46:05,140 --> 00:46:06,900 ki se uporablja funkcij. 911 00:46:06,900 --> 00:46:10,760 No, izkazalo se je, da zaradi tega zelo preprosta izvedba 912 00:46:10,760 --> 00:46:14,970 spomin in okvirji za tako imenovani kup, lahko dejansko prevzeti nadzor 913 00:46:14,970 --> 00:46:17,050 v računalniškem sistemu dokaj enostavno. 914 00:46:17,050 --> 00:46:22,180 Lahko vdreti v sistem, če ljudje kot da nas ni napisal svojo kodo 915 00:46:22,180 --> 00:46:23,300 Zlasti dobro. 916 00:46:23,300 --> 00:46:26,670 >> Če ljudje, kot nas uporablja koščkih spominskih ali uporaba nizi - 917 00:46:26,670 --> 00:46:27,810 Še bolj pogosto - 918 00:46:27,810 --> 00:46:31,800 ampak včasih pozabite, da preverite Meje našega niza, kot si morda 919 00:46:31,800 --> 00:46:38,470 imajo sami včasih, in poudarili, Tako daleč mimo koncu polja. 920 00:46:38,470 --> 00:46:40,520 V najboljšem primeru je vaš program lahko samo crash. 921 00:46:40,520 --> 00:46:42,280 Segmentacije krivda, nekako v zadrego. 922 00:46:42,280 --> 00:46:45,480 Ni veliko, vendar pa to ni nujno zelo slaba stvar. 923 00:46:45,480 --> 00:46:49,480 >> Toda, če je vaš program dejansko na pravi računalnikih uporabnikov, če je tekmovanje v teku 924 00:46:49,480 --> 00:46:53,070 na spletni strani, da so dejanski naključnih ljudi na internetu so hitting, dajanje v najem 925 00:46:53,070 --> 00:46:56,690 ljudje povzročajo slabe stvari o vašem koda na splošno ni dobro, saj 926 00:46:56,690 --> 00:46:59,930 to pomeni priložnost, da se nadzor nad računalnikom. 927 00:46:59,930 --> 00:47:01,350 In to se dogaja, da si malo skrivnosten. 928 00:47:01,350 --> 00:47:04,570 Mislila sem, da sem te prestrašil s Ta zadnji primer tukaj. 929 00:47:04,570 --> 00:47:05,650 >> Tukaj je primer kode. 930 00:47:05,650 --> 00:47:07,370 In tam je dobra Wikipedia Članek, ki hodi skozi 931 00:47:07,370 --> 00:47:08,530 to bolj podrobno. 932 00:47:08,530 --> 00:47:13,890 Imam glavni na spodnji kliče foo, ki poteka v argv od 1. 933 00:47:13,890 --> 00:47:15,750 In to samo zato, da lahko zagon programa in mimo 934 00:47:15,750 --> 00:47:17,080 samovoljno vhod. 935 00:47:17,080 --> 00:47:20,180 >> In potem se foo prijaviti do vrh kot sprejemanje niz ali več 936 00:47:20,180 --> 00:47:21,700 Natančneje, char *. 937 00:47:21,700 --> 00:47:23,860 Nato izjavlja niz znakov. 938 00:47:23,860 --> 00:47:27,130 Je buffer, bolj splošno, pokličite velikosti 12. 939 00:47:27,130 --> 00:47:30,900 Torej lahko 12 znakov prilagaja notranjosti te matrike se imenuje c. 940 00:47:30,900 --> 00:47:33,510 >> In potem se uporablja to novo funkcijo, ki je nov, vendar ni težko 941 00:47:33,510 --> 00:47:34,930 razumeti, spomin kopijo. 942 00:47:34,930 --> 00:47:39,290 To kopira spomin iz bara, ki je bil spremenljivka peto n, ne glede 943 00:47:39,290 --> 00:47:42,080 Vtipkali v argv 1 v c. 944 00:47:42,080 --> 00:47:43,090 Koliko zlogov? 945 00:47:43,090 --> 00:47:44,260 Dolžina niza v baru. 946 00:47:44,260 --> 00:47:48,380 >> Torej, z drugimi besedami, če uporabnik vnese v h-e-l-l-o enter, dolžina niza 947 00:47:48,380 --> 00:47:49,260 z zdravo je pet. 948 00:47:49,260 --> 00:47:52,790 Torej, pet od teh bajtov bo dobil kopirati v matriko imenovano c, ki 949 00:47:52,790 --> 00:47:54,110 z velikostjo 12. 950 00:47:54,110 --> 00:47:58,710 Toda kaj, uporabnik vnese v veliko dlje Beseda, ki je 13 znakov ali 14 951 00:47:58,710 --> 00:48:01,250 znakov ali 100 znakov ali več? 952 00:48:01,250 --> 00:48:02,660 >> Kam gredo iti? 953 00:48:02,660 --> 00:48:06,090 No, to je okvir, da pladenj v jedilnico, hodnik dimnika, 954 00:48:06,090 --> 00:48:06,930 oni šli tja. 955 00:48:06,930 --> 00:48:10,080 In to je šele tekoč, da začnete prepisovanje druge stvari, ki je že 956 00:48:10,080 --> 00:48:12,880 na tem kupu, prepolno sklad, tako rekoč. 957 00:48:12,880 --> 00:48:14,780 >> Torej, slikovno, mislim, da na ta način. 958 00:48:14,780 --> 00:48:17,970 To je samo barvita različica slika smo bili risanje. 959 00:48:17,970 --> 00:48:20,060 Na dnu, recimo, je glavni. 960 00:48:20,060 --> 00:48:24,690 In na vrhu, kaj ste videli zdaj je okvir, barvno kodirane sedaj na 961 00:48:24,690 --> 00:48:26,090 funkcijo imenovano foo. 962 00:48:26,090 --> 00:48:30,170 Ampak kaj je zanimivo tukaj o foo je, da to je njegova okvir. 963 00:48:30,170 --> 00:48:32,860 Torej je sestavljen tako kot I storil, ampak v svetlo modri barvi. 964 00:48:32,860 --> 00:48:35,220 In zdaj to je, če c konzola 0 gre. 965 00:48:35,220 --> 00:48:37,410 In to je, če c nosilec 11 se bo končalo. 966 00:48:37,410 --> 00:48:39,670 >> Z drugimi besedami, se zgodi, da zastopani kot kvadrat. 967 00:48:39,670 --> 00:48:42,320 Ampak, če si obdržati plopping bajte dol - ali ožge - gredo do konca 968 00:48:42,320 --> 00:48:46,070 gor na lokaciji 0 vso pot navzgor do 11, ker je 0 indeksirajo. 969 00:48:46,070 --> 00:48:49,170 >> Kje pa je 13. znak bo na koncu? 970 00:48:49,170 --> 00:48:50,310 Kje je 14? 971 00:48:50,310 --> 00:48:52,430 Kje je 50. znak bo na koncu? 972 00:48:52,430 --> 00:48:54,070 >> To se dogaja, da gredo dol. 973 00:48:54,070 --> 00:48:57,350 Ker, čeprav smo pripravljeni Slika z dimnika odraščanja, 974 00:48:57,350 --> 00:48:59,920 naslove, se je izkazalo, gredo od majhne naslovi, mala 975 00:48:59,920 --> 00:49:01,830 kazalci, do velikih naslovov. 976 00:49:01,830 --> 00:49:03,540 Tako da samo ohranja gredo gor in gor. 977 00:49:03,540 --> 00:49:05,660 >> Torej, če uporabnik vnese v Pozdravljeni, to je super. 978 00:49:05,660 --> 00:49:08,650 Ne napako, ni problem, varno vsakogar. 979 00:49:08,650 --> 00:49:11,940 Ampak, če uporabnik vnese v kaj bomo pokličite kontradiktornost kodo, ki jo zastopa 980 00:49:11,940 --> 00:49:16,040 generično kot, napad, napad, napad, napad, kaj se lahko zgodi? 981 00:49:16,040 --> 00:49:19,760 >> Torej, če vse vložka, ki uporabniku vnesli ni samo nekaj prijaznih 982 00:49:19,760 --> 00:49:21,540 ali žaljivo niz znakov. 983 00:49:21,540 --> 00:49:24,050 To je pravzaprav zaporedje znakov da, če ga pripravijo, 984 00:49:24,050 --> 00:49:26,050 dejansko je koda. 985 00:49:26,050 --> 00:49:29,570 Morda je oznaka, ki izbriše vse datotek na trdem disku ali pošilja spam 986 00:49:29,570 --> 00:49:30,810 ali nekaj takega. 987 00:49:30,810 --> 00:49:35,110 Obvestilo, da tisto, kar je ključnega pomena v tem, da če je slab fant dobil dovolj srečni, da 988 00:49:35,110 --> 00:49:37,830 prepisati rdeči kos pomnilnika - 989 00:49:37,830 --> 00:49:41,080 ki jih nisem pripraviti na mojo sliko, ampak To Wikipedia slika tukaj je - 990 00:49:41,080 --> 00:49:42,890 njegova tako imenovana Povratni naslov. 991 00:49:42,890 --> 00:49:47,470 >> Ko se vrne hrana, ko swap vrne, kako računalnik vedo, da gredo iz 992 00:49:47,470 --> 00:49:49,790 do tu do tu dol? 993 00:49:49,790 --> 00:49:52,920 Ali v tech segmentu do zgoraj, kako tako ne vedo, da gredo od zamenjave 994 00:49:52,920 --> 00:49:54,870 koda - 0 in 1 je da sestavite swap - 995 00:49:54,870 --> 00:49:56,020 Nazaj na glavno? 996 00:49:56,020 --> 00:50:00,450 Tam je tako imenovani povratni naslov shranjeni v isti dimnik okvir, na 997 00:50:00,450 --> 00:50:02,140 Enako kavarno pladenj. 998 00:50:02,140 --> 00:50:06,080 >> Torej, če je slab fant je dovolj pameten, da dal napad kodo, napad kodo, napad 999 00:50:06,080 --> 00:50:07,960 kodo, in dobili srečo - 1000 00:50:07,960 --> 00:50:11,630 pogosto s pomočjo poskusov in napak - na prepisala tisto rdečo povratni naslov, 1001 00:50:11,630 --> 00:50:14,360 z naslovom in obvestilo vrhu. 1002 00:50:14,360 --> 00:50:16,830 Obvestilo 0835C080. 1003 00:50:16,830 --> 00:50:20,650 To je napisano nazaj gor top za Razlogi bomo morda ponovno. 1004 00:50:20,650 --> 00:50:22,050 To je ta številka. 1005 00:50:22,050 --> 00:50:25,790 >> Torej, če je slab človek dobi dovolj srečni ali je dovolj pameten, da prepišete rdeča 1006 00:50:25,790 --> 00:50:29,480 strip spomina z naslovom koda, da on ali ona ima nekako 1007 00:50:29,480 --> 00:50:34,980 vbrizga v računalnik, mislim, katerih Koda se bo vrnil na 1008 00:50:34,980 --> 00:50:38,260 takoj foo poteka izvršitve? 1009 00:50:38,260 --> 00:50:39,440 >> Koda slab fant je. 1010 00:50:39,440 --> 00:50:43,610 Torej to kodo napada, AAA, še enkrat, morda pošiljanje neželene elektronske pošte, lahko izbrišete vse datoteke 1011 00:50:43,610 --> 00:50:44,500 na trdem disku. 1012 00:50:44,500 --> 00:50:48,740 Ampak to je tisto, kar resnično prekoračitev je ali pufer prekoračitev ali 1013 00:50:48,740 --> 00:50:51,060 Overflow napad. 1014 00:50:51,060 --> 00:50:54,400 >> In to je neverjetno, neverjetno pogosti na ta dan s programi napisani v 1015 00:50:54,400 --> 00:50:58,220 C, C + + in celo nekateri drugi jeziki. 1016 00:50:58,220 --> 00:51:02,275 Na tej strašno opombo, da bomo konec s šalo. 1017 00:51:02,275 --> 00:51:03,230 >> [SMEH] 1018 00:51:03,230 --> 00:51:04,550 >> Se vidimo v sredo. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na naslednjem CS50 - 1021 00:51:10,310 --> 00:51:15,920 Tako da sem vse od diskov svetilk danes pa počakajte, brez maščob mleka, pol telefon 1022 00:51:15,920 --> 00:51:17,850 knjiga, pomarančni sok da sem danes pil. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB kabel, ključ. 1025 00:51:22,780 --> 00:51:24,800 >> [Predvajanja glasbe]