1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Predvajanje glasbe] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: Dobro. 4 00:00:12,640 --> 00:00:14,525 To je CS50. 5 00:00:14,525 --> 00:00:16,009 In to je začetek 5 tedna. 6 00:00:16,009 --> 00:00:18,050 In kot ste morda opazili, nekaj materiala 7 00:00:18,050 --> 00:00:21,050 postaja malo bolj kompleks, malo gostejša. 8 00:00:21,050 --> 00:00:24,560 >> In to je zelo enostavno, še posebej, če ste bili v navadi že nekaj časa, 9 00:00:24,560 --> 00:00:28,600 da se skuša Škrabotine navzdol najbolj kaj počnemo, govoriš v razredu. 10 00:00:28,600 --> 00:00:31,626 Toda zavedati, da je ni mogoče ideal pedagoški pristop 11 00:00:31,626 --> 00:00:34,250 za učenje tovrstno gradivo, in material, bolj na splošno. 12 00:00:34,250 --> 00:00:37,250 In tako smo veseli, da sporočamo, da CS50 lastnega Gheng 13 00:00:37,250 --> 00:00:39,780 Gong je začela pripravljati kanonično set bankovcev 14 00:00:39,780 --> 00:00:42,100 za tečaj, upanje ki je, da ena, ti 15 00:00:42,100 --> 00:00:44,030 služijo le kot referenca in vir 16 00:00:44,030 --> 00:00:47,410 za pregled gradiva in bo nazaj skozi material, ki bi lahko imele 17 00:00:47,410 --> 00:00:51,230 Vam je pobegnil prvič okoli, vendar tudi zato, da lahko svoje glave bolj 18 00:00:51,230 --> 00:00:53,740 navzgor kot navzdol, ko ga pride čas za predavanje, 19 00:00:53,740 --> 00:00:56,960 tako da boste lahko vključijo bolj premišljeno, kot je 20 00:00:56,960 --> 00:00:59,170 v nasprotju z bolj scribbly. 21 00:00:59,170 --> 00:01:02,510 >> S tem je dejal, kaj boste našli na Spletna stran je takšni dokumenti, kot je ta. 22 00:01:02,510 --> 00:01:04,660 In obvestilo, v zgornjem levem kotu, tam je ne le kazalo, 23 00:01:04,660 --> 00:01:06,920 ampak tudi čas kode vas bo takoj skočil 24 00:01:06,920 --> 00:01:09,077 v ustreznem delu v video na spletu. 25 00:01:09,077 --> 00:01:11,410 In kaj Chang je naredila je, v bistvu, dokumentira 26 00:01:11,410 --> 00:01:13,340 kaj se je zgodilo v tem posebno predavanje. 27 00:01:13,340 --> 00:01:16,370 In mnogi od predavanj so že na spletu zdaj s tem URL. 28 00:01:16,370 --> 00:01:20,110 In bomo še naprej objavljati v preostalem tistih, do konca tega tedna 29 00:01:20,110 --> 00:01:22,380 tako da izkoristijo ta vir. 30 00:01:22,380 --> 00:01:25,740 >> Torej, brez odlašanja, smo začeli lupiti nazaj 31 00:01:25,740 --> 00:01:28,180 plast, ki je bila Niz za nekaj časa. 32 00:01:28,180 --> 00:01:30,670 In kaj smo rekli niz dejansko je prejšnji teden? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Torej char zvezda. 35 00:01:32,900 --> 00:01:34,900 In char zvezda, dobro, kaj se je to v resnici pomeni? 36 00:01:34,900 --> 00:01:37,150 No, ves ta čas, če smo jih klical funkcijo, 37 00:01:37,150 --> 00:01:40,450 kot getString in shranjevanje tako imenovani donos 38 00:01:40,450 --> 00:01:42,910 Vrednost getString v variable-- se imenuje 39 00:01:42,910 --> 00:01:47,721 s type string-- smo pisali vrstica kode tam zgoraj. 40 00:01:47,721 --> 00:01:49,970 In to je samo takrat, ko vidim rokopisa veliča tukaj 41 00:01:49,970 --> 00:01:51,930 moram zavedaš, kako krute je to. 42 00:01:51,930 --> 00:01:54,180 >> Vendar pa predpostavimo, da je na desni strani 43 00:01:54,180 --> 00:01:57,070 je kljub temu smiselno upodobitev, kar je 44 00:01:57,070 --> 00:01:58,880 se dogaja vse to Tokrat z getString. 45 00:01:58,880 --> 00:02:00,380 getString, seveda, dobi niz. 46 00:02:00,380 --> 00:02:01,691 Toda kaj to v resnici pomeni? 47 00:02:01,691 --> 00:02:04,190 To pomeni, da dobi kos pomnilnik operacijskega sistema 48 00:02:04,190 --> 00:02:06,040 ki ga kliče funkcijo, ki se imenuje malloc. 49 00:02:06,040 --> 00:02:07,390 Ampak več o tem kasneje. 50 00:02:07,390 --> 00:02:09,139 In potem se poseli da je kos pomnilnika 51 00:02:09,139 --> 00:02:11,764 s črkami, ima uporabnik vnesli v, čemur sledi, seveda, 52 00:02:11,764 --> 00:02:14,800 null znak, ali poševnica nazaj zero na samem koncu. 53 00:02:14,800 --> 00:02:18,280 >> Medtem, na levi strani te zgodbe, ves ta čas, 54 00:02:18,280 --> 00:02:20,850 smo bili razglasitvi spremenljivke, kot s. 55 00:02:20,850 --> 00:02:24,770 In da je spremenljivka, kaj zdaj bo začel kliče kazalec. 56 00:02:24,770 --> 00:02:29,190 To ni škatla znotraj katere smo pripravili niz, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 ampak smo se v tem trgu polje na levi kaj točno? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ja? 60 00:02:35,390 --> 00:02:37,118 >> OBČINSTVO: naslov kje se nahaja v pomnilniku. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Točno tako. 62 00:02:38,118 --> 00:02:40,690 Naslov, kjer Daven se nahaja v pomnilniku. 63 00:02:40,690 --> 00:02:44,650 In ne tam, kjer vse Daven se nahaja, po sebi, ampak zlasti naslov 64 00:02:44,650 --> 00:02:45,150 od česa? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ja? 67 00:02:46,810 --> 00:02:47,460 >> OBČINSTVO: Prvi znak. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: Prvi znak v Daven, ki je v tem primeru, 69 00:02:50,209 --> 00:02:53,820 Predlagal sem samovoljno in nerealno 1, OX1, 70 00:02:53,820 --> 00:02:55,910 ki pomeni le šestnajstiško število 1. 71 00:02:55,910 --> 00:02:57,993 Ampak to je verjetno, da bo da je veliko večja številka 72 00:02:57,993 --> 00:03:01,260 da lahko potegnemo z 0x kot predpono, 73 00:03:01,260 --> 00:03:02,806 predstavlja šestnajstiški značaj. 74 00:03:02,806 --> 00:03:05,930 In ker nam ni treba vedeti, kje ostali liki Daven 75 00:03:05,930 --> 00:03:09,860 so, ker kaj preprosta konstrukcija Odločitev, ki je bila narejena pred mnogimi leti? 76 00:03:09,860 --> 00:03:10,548 Ja? 77 00:03:10,548 --> 00:03:11,651 >> OBČINSTVO: Leva poševnica 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Ja, točno. 79 00:03:12,900 --> 00:03:18,100 Nagibnica 0 vam omogoča, čeprav v linearni čas za prečkanje niz, 80 00:03:18,100 --> 00:03:20,400 hoje od leve proti desni, z zanko ali časa 81 00:03:20,400 --> 00:03:22,608 zanka, ali kaj podobnega da, in ugotoviti, oh, tu 82 00:03:22,608 --> 00:03:24,751 je konec tega posebnega niza. 83 00:03:24,751 --> 00:03:27,000 Torej s samo naslov, začetek niza, 84 00:03:27,000 --> 00:03:30,290 lahko dostopate do celotne to, ker vse to pa, 85 00:03:30,290 --> 00:03:32,030 Niz je bil samo char zvezda. 86 00:03:32,030 --> 00:03:36,370 >> Torej, to je zagotovo v redu, da še naprej uporabljajo Knjižnica CS50 in ta abstrakcija, 87 00:03:36,370 --> 00:03:38,440 tako rekoč, vendar bomo začeli videti natanko 88 00:03:38,440 --> 00:03:41,230 Kaj se je dogajalo Pod tem ves čas. 89 00:03:41,230 --> 00:03:45,260 Torej, se morda spomniš tega primera, Tudi v zadnjem času, pa jih primerjati med 0, 90 00:03:45,260 --> 00:03:47,300 ki dejansko ni primerjati. 91 00:03:47,300 --> 00:03:49,070 Vendar pa smo začeli reševati to. 92 00:03:49,070 --> 00:03:52,020 >> Toda, kot je morda osvežitev, Morda sem koga zanima 93 00:03:52,020 --> 00:03:54,261 v roza slona danes tudi z Chang? 94 00:03:54,261 --> 00:03:55,760 Kaj pa ti pred? [Neslišno]. 95 00:03:55,760 --> 00:03:56,660 Pridi gor. 96 00:03:56,660 --> 00:03:58,740 >> In v tem času, kot ste prišli, dajva 97 00:03:58,740 --> 00:04:01,670 razmisli za trenutek, kaj ta koda je pravzaprav počne. 98 00:04:01,670 --> 00:04:04,917 To je razglasila dve spremenljivki up top, s in t, in kliče getString. 99 00:04:04,917 --> 00:04:08,250 To ni zelo uporabniku prijazen program saj vam ne povem, kaj naj naredim. 100 00:04:08,250 --> 00:04:10,541 Ampak kaj je samo prevzeti smo s poudarkom na sočno delu. 101 00:04:10,541 --> 00:04:14,470 In potem bomo to storili, če je enaka enak t, bi morala reči printf, 102 00:04:14,470 --> 00:04:16,170 ste vnesli isto stvar. 103 00:04:16,170 --> 00:04:16,670 Pozdravljeni. 104 00:04:16,670 --> 00:04:17,050 Kako ti je ime? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, Lepo, da sva se spoznala. 107 00:04:19,529 --> 00:04:21,800 Torej, vaš izziv pri roko za to slona 108 00:04:21,800 --> 00:04:25,230 je, da nam najprej sestaviti sliko o tem, kaj je ki so zastopane v teh prvih dveh 109 00:04:25,230 --> 00:04:25,970 linije. 110 00:04:25,970 --> 00:04:28,139 Torej bi s in t je predstavljal, kako na zaslonu? 111 00:04:28,139 --> 00:04:30,680 In lahko samo izdela z prstom na velikem zaslonu. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Tako da je obe polovici do vsaka stran te enačbe. 114 00:04:34,510 --> 00:04:37,760 Torej je i na levi strani, in nato getString na desni strani. 115 00:04:37,760 --> 00:04:40,540 In potem je t na levi strani, in potem getString na desni strani. 116 00:04:40,540 --> 00:04:42,630 Torej, kako lahko začnemo narisati sliko, ki 117 00:04:42,630 --> 00:04:46,340 predstavlja, kaj se dogaja tukaj v spominu, bi rekli? 118 00:04:46,340 --> 00:04:49,150 In naj vam razloži kaj delaš, kot si. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 No, najprej, da bi se sprašuje da bi dobili niz. 121 00:04:58,890 --> 00:05:00,439 In bi store-- oh, oprostite. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: OK. 123 00:05:01,230 --> 00:05:01,730 Dobro. 124 00:05:01,730 --> 00:05:03,330 In to je tisto, kar se imenuje? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Nadaljuj. 127 00:05:04,450 --> 00:05:05,575 Nisem želela motiti. 128 00:05:05,575 --> 00:05:07,060 Janelle: Žal mi je. 129 00:05:07,060 --> 00:05:14,237 Tako da bi ga vključili v naslov ne o-- prepričan. 130 00:05:14,237 --> 00:05:17,320 Ne morem natančno zapomnil številko, vendar menim, da smo se začne z 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: To je vse v redu, ker sem številke gor, 132 00:05:18,420 --> 00:05:19,650 tako da ni pravi odgovor. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Začenši z 0 loku. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: OK, da element 0. 135 00:05:24,000 --> 00:05:24,765 Seveda. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: In potem, če je bil kot samo dveh letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: Ok, nazaj k tebi. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Torej element 0, in nato element 1 ali element 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: In kateri del slika rišeš zdaj? 140 00:05:36,670 --> 00:05:37,690 Poziv k getString? 141 00:05:37,690 --> 00:05:38,830 Ali izjava o s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Izjava S, verjamem. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, saj bi se vnesejo v vsako [? območje. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Dobro. 145 00:05:46,510 --> 00:05:47,051 Točno tako. 146 00:05:47,051 --> 00:05:49,300 Čeprav to dejansko vrne niz, odpoklic, 147 00:05:49,300 --> 00:05:53,300 ko se vrnemo niz, smo lahko Indeks v ta niz z uporabo 01 in 2. 148 00:05:53,300 --> 00:05:56,180 Tehnično, to so verjetno posameznih naslovov zastopani, 149 00:05:56,180 --> 00:05:57,100 ampak to je v redu. 150 00:05:57,100 --> 00:06:00,170 >> Torej domnevam, če sem lahko samo hitro posreduje, kjer smo končali 151 00:06:00,170 --> 00:06:04,320 zadnji čas, če je eden od strune je bil g b e, 152 00:06:04,320 --> 00:06:10,337 poševnice nazaj 0, kar predstavlja Gabe je input, kako bi lahko zdaj predstavljajo s? 153 00:06:10,337 --> 00:06:12,670 Če je to spomin, ki je je vrnil z getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Bi bilo z loku zastopa? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: Z lok? 157 00:06:18,750 --> 00:06:19,130 No, no. 158 00:06:19,130 --> 00:06:21,171 Reciva, slikovno, Naj samo pojdi naprej 159 00:06:21,171 --> 00:06:25,710 in predlaga, da se, če je to s to je vrnjeno vrednost getString. 160 00:06:25,710 --> 00:06:29,482 In ste to pripravljeni kot 0, 1, 2, ki je popolnoma razumljiva, ker smo 161 00:06:29,482 --> 00:06:30,940 lahko indeks v nizu, kot npr. 162 00:06:30,940 --> 00:06:33,340 Ampak samo, da je v skladu z zadnji čas, naj gredo naprej 163 00:06:33,340 --> 00:06:37,310 in samovoljno predlaga, da se ta je naslov 1, to je naslov 2, 164 00:06:37,310 --> 00:06:39,597 To je naslov 3, in tako naprej. 165 00:06:39,597 --> 00:06:41,430 In tako, samo, da je super jasno, kaj se dogaja 166 00:06:41,430 --> 00:06:44,580 iti s kot posledica ki Prva vrstica kode, bi rekli? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Naslov 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Točno tako. 169 00:06:46,420 --> 00:06:47,190 Tako obravnavati 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 In medtem, naj gredo naprej in dvojnik veliko tega, kar ste storili 172 00:06:51,230 --> 00:06:52,740 in dodajte svoj t tukaj. 173 00:06:52,740 --> 00:06:56,340 Če bi tip v Gabe enkrat, drugič, 174 00:06:56,340 --> 00:07:01,530 Ko ste pozvani, s getString, kje, Seveda, je Gabe šla? 175 00:07:01,530 --> 00:07:02,280 No, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Tako kot tukaj? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Ja. 179 00:07:06,850 --> 00:07:08,516 Janelle: Ali je tudi v enakih škatlah? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Dovolite mi, da predlagam, da, točno, tako da v teh dodatnih poljih. 181 00:07:11,940 --> 00:07:15,230 Toda kaj je ključnega pomena zdaj je, da tudi čeprav sem sestaviti ta precej blizu 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, to je 0x2-- v resnici, 183 00:07:18,650 --> 00:07:25,750 to sedaj lahko naslov 0x10, na primer, in 0x11 in 0x12, 184 00:07:25,750 --> 00:07:26,870 in tako naprej. 185 00:07:26,870 --> 00:07:29,955 In tako, če je temu tako, kaj se dogaja, da na koncu sem t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Točno tako. 188 00:07:31,830 --> 00:07:33,180 Torej 0x10. 189 00:07:33,180 --> 00:07:34,570 In zdaj, zadnje vprašanje. 190 00:07:34,570 --> 00:07:37,510 Ki ste jih do sedaj morali delati Najtežje za slona doslej. 191 00:07:37,510 --> 00:07:42,650 Do sedaj, če potegnem gor kodo še enkrat, ko sem naredil, v skladu tri, 192 00:07:42,650 --> 00:07:47,630 če je enaka enak t, kar sem v resnici primerjali, da smo tukaj pripravljeni? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Dva naslovi? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Točno tako. 195 00:07:50,270 --> 00:07:53,350 Torej, jaz pravim je S enak enaka ne? 196 00:07:53,350 --> 00:07:56,210 Z drugimi besedami, je 1 enak enaka 10? 197 00:07:56,210 --> 00:07:59,710 In seveda, Očiten odgovor je zdaj, ne. 198 00:07:59,710 --> 00:08:02,920 In tako je ta program na koncu tiskanjem, kaj bi rekli? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Ali bi bilo, ste vnesli isto stvar? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Torej, če y je 1 in t je 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Vnesli ste različne stvari. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Točno tako. 204 00:08:13,570 --> 00:08:14,480 Vnesli ste različne stvari. 205 00:08:14,480 --> 00:08:14,850 V redu. 206 00:08:14,850 --> 00:08:16,714 Torej aplavz, če bi lahko, tukaj. 207 00:08:16,714 --> 00:08:17,214 [APLAVZ] 208 00:08:17,214 --> 00:08:17,708 To je bilo boleče. 209 00:08:17,708 --> 00:08:18,208 Vem. 210 00:08:18,208 --> 00:08:19,684 Lepo opravljeno. 211 00:08:19,684 --> 00:08:24,690 Sedaj pa poglejmo, če ne moremo draži narazen, kaj je fix. 212 00:08:24,690 --> 00:08:28,040 In seveda, ko smo določen to-- ki bom zdaj zastopa v green-- 213 00:08:28,040 --> 00:08:29,690 smo naredili nekaj izboljšav tukaj. 214 00:08:29,690 --> 00:08:32,409 Najprej samo kot duševno zdravje preveriti, sem najprej preveri 215 00:08:32,409 --> 00:08:35,110 če je enaka za nično in t enaka null. 216 00:08:35,110 --> 00:08:39,440 In samo zato, da bo jasno, morda kdaj s ali t, je ničen v kodi, kot je ta? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Ko bi s ali t, je nična. 219 00:08:44,490 --> 00:08:44,990 Ja? 220 00:08:44,990 --> 00:08:45,990 >> OBČINSTVO: [neslišno]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Točno tako. 223 00:08:50,510 --> 00:08:52,840 Če niz, da uporabnik vnesli, je predolgo 224 00:08:52,840 --> 00:08:56,140 da se prilega v pomnilnik, ali nekatere čudna zadeva kotiček tako, 225 00:08:56,140 --> 00:08:59,010 getString, kot bomo videli, dobesedno Danes, v dokumentaciji, 226 00:08:59,010 --> 00:09:02,330 pravi, da se bo vrnil null kot posebna sentinel vrednost, 227 00:09:02,330 --> 00:09:05,417 ali samo nekakšen poseben simbol to pomeni, da je šlo nekaj narobe. 228 00:09:05,417 --> 00:09:07,500 Zato smo želeli preveriti da, saj se je izkazalo 229 00:09:07,500 --> 00:09:09,720 da null je zelo nevarno vrednost. 230 00:09:09,720 --> 00:09:14,250 >> Pogosto, če poskusite narediti z nekaj null vključuje function-- tako kratki 231 00:09:14,250 --> 00:09:17,470 kot vhod za instance-- to funkcijo Morda bo zelo crash in s tem, 232 00:09:17,470 --> 00:09:19,090 sneli svoj celoten program. 233 00:09:19,090 --> 00:09:22,570 Torej je to tretja vrstica je sedaj ravno sanity preveriti, preverjanje napak, če hočete. 234 00:09:22,570 --> 00:09:25,450 To je dobro navado zdaj nam, da se v vsakem trenutku smo 235 00:09:25,450 --> 00:09:28,050 poskusite, da uporabijo vrednost, ki mogočih so nične. 236 00:09:28,050 --> 00:09:32,000 >> Zdaj, v četrti vrstici tukaj "Če strcmp (s, t)," dobro, 237 00:09:32,000 --> 00:09:33,180 kaj je to nanaša? 238 00:09:33,180 --> 00:09:36,750 No, mi je dejal, da je to zelo jedrnato poimenovana funkcija za godalni primerjavo. 239 00:09:36,750 --> 00:09:40,370 In njegov namen v življenju je, da primerjajo njen prvi argument proti drugi, 240 00:09:40,370 --> 00:09:44,640 vendar ne glede na njihove naslove, kot smo nehote moment 241 00:09:44,640 --> 00:09:48,270 Pred z rdečo oznako, vendar raje primerjati ta dva 242 00:09:48,270 --> 00:09:53,210 strune v človeško intuitivno smer s primerjavo tem, proti temu, 243 00:09:53,210 --> 00:09:56,690 pred tem, pred tem, in potem ustavljanje, če in ko je eden 244 00:09:56,690 --> 00:09:59,590 ali oboje od mojih prstov hits poševnico 0. 245 00:09:59,590 --> 00:10:04,530 Torej nekdo pred leti izvajal strcmp izvajati za nas funkcionalnost 246 00:10:04,530 --> 00:10:08,890 da smo upali, mi pa bi dobila ga pravkar primerjavo dveh preprostih vrednot. 247 00:10:08,890 --> 00:10:14,929 >> Zdaj pa iskreno, imam risbo vseh teh različnih številk. 248 00:10:14,929 --> 00:10:17,470 Ampak realnost je, da sem bil kar ti gor ves čas. 249 00:10:17,470 --> 00:10:19,580 In zato naj samo pojdi naprej in Škrabotine ti ven 250 00:10:19,580 --> 00:10:23,100 da točke, da se na koncu dneva in napreduje, 251 00:10:23,100 --> 00:10:30,160 ne bomo zares skrbi Kaj obravnava stvari dejansko 252 00:10:30,160 --> 00:10:30,790 v pomnilniku. 253 00:10:30,790 --> 00:10:34,320 Torej, jaz ne grem v pripravi teh vrste številk, toliko več, 254 00:10:34,320 --> 00:10:38,970 Jaz sem samo abstraktna to stran malo bolj prijazna s samo puščicami. 255 00:10:38,970 --> 00:10:42,060 >> Z drugimi besedami, če je kazalec, dobro, kaj je to samo pripravi, dobesedno, 256 00:10:42,060 --> 00:10:45,430 kot kazalec, puščico od samega za nekaj drugega, 257 00:10:45,430 --> 00:10:48,280 in ne skrbi preveč, več o tem pretirane teh naslovov 258 00:10:48,280 --> 00:10:49,910 ki je, še enkrat, sem si izmislil anyway. 259 00:10:49,910 --> 00:10:52,680 Ampak bomo videli te naslove, Včasih, ko razhroščevanje kode. 260 00:10:52,680 --> 00:10:56,450 >> Zdaj medtem, ta program tu določa, seveda, 261 00:10:56,450 --> 00:10:58,720 da je problem s primerjavo teh dveh nizov. 262 00:10:58,720 --> 00:11:00,260 Vendar smo naleteli na drugo težavo. 263 00:11:00,260 --> 00:11:03,180 To je bilo iz kopije programiranje zadnji čas, 264 00:11:03,180 --> 00:11:06,880 , pri katerem sem bil težaven, da izkoristijo samo prvi znak v nizu. 265 00:11:06,880 --> 00:11:09,620 Toda kaj je simptom smo videli zadnji čas, ko 266 00:11:09,620 --> 00:11:14,150 Vtipkali v vrednosti, kot so Gabe z malimi črkami, za s, 267 00:11:14,150 --> 00:11:19,310 potem dodeljena ov v t, kot v tretji liniji tam, 268 00:11:19,310 --> 00:11:22,900 in potem sem se potrudil, da izkoristiti t nosilec 0? 269 00:11:22,900 --> 00:11:25,950 Kaj je bil učinek spreminjanje t nosilec 0 tukaj? 270 00:11:25,950 --> 00:11:27,150 >> OBČINSTVO: Spremenil s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Ja, Spremenila sem s, kot tudi. 272 00:11:29,360 --> 00:11:31,050 Kajti to, kar se je v resnici dogajalo? 273 00:11:31,050 --> 00:11:34,130 No, da vidim, če sem lahko očistite do te slike, kot sledi. 274 00:11:34,130 --> 00:11:41,390 >> Ce je, še enkrat, beseda g, A, B, E, poševnica nazaj, 0, in s 275 00:11:41,390 --> 00:11:44,084 bomo nadaljevali risbo v škatli tukaj, ampak nič več naslovov. 276 00:11:44,084 --> 00:11:45,250 Nehajmo izdelavo stvari. 277 00:11:45,250 --> 00:11:47,510 Reciva, narisati sliko poenostaviti svet. 278 00:11:47,510 --> 00:11:52,640 >> Ko Izjavljam t z godalnim t, da ustvarja ta kos pomnilnika. 279 00:11:52,640 --> 00:11:55,850 Square zgodi, da bo 32 bitov v večini računalnikov. 280 00:11:55,850 --> 00:11:59,530 V bistvu, če ste že kdaj slišali Računalnik, ki ima 32-bitni arhitekturi, 281 00:11:59,530 --> 00:12:03,000 res fancy, rekoč, da je samo pomeni, da se uporablja 32-bitne naslove. 282 00:12:03,000 --> 00:12:05,370 In kot tehnična stran, Če ste se kdaj spraševali 283 00:12:05,370 --> 00:12:09,630 zakaj starejši računalniki, če ste dejansko poskušala juho jih gor z veliko RAM-a, 284 00:12:09,630 --> 00:12:12,360 lahko le največ štirih gigabajtov pomnilnika RAM, 285 00:12:12,360 --> 00:12:14,860 dobro, da je zato, ker, dobesedno, vaš stari računalnik lahko le 286 00:12:14,860 --> 00:12:17,250 šteje tako visoka kot 4 milijarde evrov, 4 milijarde bajtov, 287 00:12:17,250 --> 00:12:20,590 zato, ker je bil z uporabo 32-bitne številke za naslove. 288 00:12:20,590 --> 00:12:23,260 >> Toda v vsakem primeru, v tem Na primer, zgodba je veliko enostavnejša. 289 00:12:23,260 --> 00:12:27,250 t je samo še en kazalec, ali res char zvezda, aka niz. 290 00:12:27,250 --> 00:12:30,860 In kako želim, da posodobi to sliko zdaj s to drugo vrstico kode, 291 00:12:30,860 --> 00:12:31,950 piko, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Ko sem naredil niz t enak e podpičjem, kako to sliko spremenilo? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ja? 295 00:12:38,000 --> 00:12:38,916 >> OBČINSTVO: [neslišno]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Ja. 298 00:12:42,020 --> 00:12:42,600 Točno tako. 299 00:12:42,600 --> 00:12:45,620 Pravkar sem dal puščico iz t polje na istem naslovu, 300 00:12:45,620 --> 00:12:47,570 Enako prva črka v dal. 301 00:12:47,570 --> 00:12:50,850 Ali tehnično, če je to moški so še vedno na 0x1, 302 00:12:50,850 --> 00:12:53,052 to je, kot da sem imel 0x1 in 0x1 tukaj tukaj. 303 00:12:53,052 --> 00:12:54,760 Ampak še enkrat, koga briga o naslovih? 304 00:12:54,760 --> 00:12:56,345 To je samo ideja, da je zdaj pomembno. 305 00:12:56,345 --> 00:12:57,720 Torej, to je tisto, kar se dogaja tukaj. 306 00:12:57,720 --> 00:13:02,690 Torej, seveda, če nimate t konzole 0, ki je matrika zapis, 307 00:13:02,690 --> 00:13:05,650 od course-- in odkrito povedano, je videti kot da je matrika tukaj, 308 00:13:05,650 --> 00:13:07,340 zdaj pa je to čudno. 309 00:13:07,340 --> 00:13:11,160 Vedo, da je programski jezik, C, vam ponuja to funkcijo, 310 00:13:11,160 --> 00:13:14,650 pri čemer, čeprav t kazalec, ali e je kazalec, 311 00:13:14,650 --> 00:13:18,050 lahko še vedno uporabljate, da je seznanjen, udobno square bracket 312 00:13:18,050 --> 00:13:22,520 zapis, da gredo na prvi element, ali drugi element, ali kateri koli element 313 00:13:22,520 --> 00:13:26,130 da je ta kazalec kaže da, ker je verjetno, da 314 00:13:26,130 --> 00:13:29,410 je, kot v tem primeru, kaže na neko paleto. 315 00:13:29,410 --> 00:13:30,340 >> Torej, kako popraviti to? 316 00:13:30,340 --> 00:13:33,660 Odkrito povedano, to je, če je dobil malo prepričljivo na prvi pogled. 317 00:13:33,660 --> 00:13:35,340 Ampak tukaj je novo in izboljšano različico. 318 00:13:35,340 --> 00:13:37,460 >> Torej, najprej, jaz dobivam znebite knjižnici CS50, 319 00:13:37,460 --> 00:13:41,170 samo, da odkrijete, da je S je dejansko char zvezda, le sinonim. 320 00:13:41,170 --> 00:13:43,540 In t je tudi char zvezda. 321 00:13:43,540 --> 00:13:48,290 Toda, kaj se dogaja na desna stran od te črte 322 00:13:48,290 --> 00:13:49,970 kjer je t dodeljena vrednost? 323 00:13:49,970 --> 00:13:50,790 >> Kaj je malloc? 324 00:13:50,790 --> 00:13:51,630 Kaj je strlen? 325 00:13:51,630 --> 00:13:52,547 Kaj je sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Zakaj za vraga pa je to linija videti tako zapleteno? 327 00:13:54,380 --> 00:13:55,713 Kaj pa počne na visoki ravni? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Kaj je to shranjevanje t? 330 00:13:57,440 --> 00:13:58,646 Ja? 331 00:13:58,646 --> 00:14:01,104 OBČINSTVO: To je dodeljevanje določeno količino pomnilnika. 332 00:14:01,104 --> 00:14:03,032 To je za shranjevanje, mislim, črke [neslišno]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan: Popolna. 334 00:14:04,032 --> 00:14:04,540 Popolna. 335 00:14:04,540 --> 00:14:06,650 To je dodeljevanje nekaterih Količina pomnilnika 336 00:14:06,650 --> 00:14:08,940 za shranjevanje, domnevno prihodnje pisma. 337 00:14:08,940 --> 00:14:11,310 In zlasti, malloc Zato se vrača, kaj? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> OBČINSTVO: Vračanje [neslišno]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Točno tako. 341 00:14:15,850 --> 00:14:18,850 Vračanje naslov spominom, , ki je fancy način rekel, 342 00:14:18,850 --> 00:14:21,640 vrne naslov Prvi bajt tega spomina. 343 00:14:21,640 --> 00:14:25,460 Dolžnost mi je, da se spomnimo koliko pomnilnika sem dejansko 344 00:14:25,460 --> 00:14:27,140 dodeliti ali prosil za malloc. 345 00:14:27,140 --> 00:14:28,384 >> Zdaj, koliko je to? 346 00:14:28,384 --> 00:14:30,550 No, čeprav je Veliko oklepajih tukaj 347 00:14:30,550 --> 00:14:32,970 malloc traja samo en argument. 348 00:14:32,970 --> 00:14:37,250 In jaz sem z navedbo strlen S, tako da dobimo mi toliko zlogov, kot so v s, 349 00:14:37,250 --> 00:14:37,800 toda dodate enega. 350 00:14:37,800 --> 00:14:38,300 Zakaj? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ja? 353 00:14:39,530 --> 00:14:40,840 >> OBČINSTVO: Nagibnica 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Točno tako. 355 00:14:41,840 --> 00:14:43,423 Moramo narediti malo gospodinjstvo. 356 00:14:43,423 --> 00:14:45,970 Zato, ker tam je poševnica nazaj 0, da bomo bolje zapomnil. 357 00:14:45,970 --> 00:14:47,310 V nasprotnem primeru bomo ustvariti niz, ki 358 00:14:47,310 --> 00:14:49,170 nima nobenega posebnega terminator. 359 00:14:49,170 --> 00:14:52,640 >> Medtem, samo, da je super anal, imam sizeof (char), 360 00:14:52,640 --> 00:14:55,730 samo v primeru, nekdo teče MY koda ni na CS50 aparata, 361 00:14:55,730 --> 00:14:58,220 vendar morda drugačen računalnik Vsega skupaj, kjer znakov 362 00:14:58,220 --> 00:15:01,470 so eden bajt, po dogovoru, ampak dve zlogov, ali nekaj večjega od tega. 363 00:15:01,470 --> 00:15:04,490 To je samo, da je super, super nenaklonjen do napak. 364 00:15:04,490 --> 00:15:06,940 Čeprav v resnici je najverjetneje bo 1. 365 00:15:06,940 --> 00:15:11,490 >> Zdaj, medtem, grem naprej in kopiranje Niz, t bracket i je enak t kotnik s. 366 00:15:11,490 --> 00:15:14,962 In bom odložil na prejšnji teden je izvorno kodo, da vidim, kaj se dogaja. 367 00:15:14,962 --> 00:15:17,670 Toda ključ takeaway in Razlog, da sem dal kodo zdaj v zeleni, 368 00:15:17,670 --> 00:15:22,520 je zaradi tega zelo zadnje vrstice, t bracket 0 enaka toupper, 369 00:15:22,520 --> 00:15:25,230 ima učinek Izkoristiti ki niz? 370 00:15:25,230 --> 00:15:26,960 t in / ali y? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Da je zadnja vrstica kode. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Samo t, ker tisto, kar je zgodilo tokrat, 375 00:15:35,560 --> 00:15:41,500 če sem nekoliko razveljavite to zadnji korak, kaj se je zgodilo, ko sem poklical malloc, 376 00:15:41,500 --> 00:15:45,380 V bistvu sem dobil kos pomnilnika da je enake velikosti kot original, 377 00:15:45,380 --> 00:15:47,020 ker to je aritmetična sem. 378 00:15:47,020 --> 00:15:50,920 Jaz shranjevanje v t naslov navedene kos pomnilnika. 379 00:15:50,920 --> 00:15:53,370 Čeprav to izgleda lepo in lepa, lepo in prazno, 380 00:15:53,370 --> 00:15:56,882 Realnost je pa, kaj bova da kliče, smeti vrednosti tukaj. 381 00:15:56,882 --> 00:15:59,340 Da je kos pomnilnika morda zelo pa so bili uporabljeni pred, 382 00:15:59,340 --> 00:16:00,940 nekaj sekund, pred nekaj minutami. 383 00:16:00,940 --> 00:16:04,410 Tako da bi bilo absolutno število ali črke tam, samo po naključju. 384 00:16:04,410 --> 00:16:08,580 Ampak oni niso veljavni, dokler nisem Sam zapolnijo ta kos pomnilnika 385 00:16:08,580 --> 00:16:12,510 z dejanskimi znakov, kot sem narediti, da je za zanko tam. 386 00:16:12,510 --> 00:16:13,180 Vse v redu? 387 00:16:13,180 --> 00:16:16,180 >> Torej sedaj, višek Ti trije primeri 388 00:16:16,180 --> 00:16:20,730 da so bili na videz razdeljena zadnji čas, ta primer Swap, ta funkcija 389 00:16:20,730 --> 00:16:23,670 delal v smislu da je zamenjal a in b. 390 00:16:23,670 --> 00:16:25,620 Ampak to ni delovalo v kakšnem drugem smislu? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ja? 393 00:16:28,614 --> 00:16:29,612 >> OBČINSTVO: [neslišno]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Točno tako. 396 00:16:36,700 --> 00:16:39,530 Če bi bil, da pokličete to funkcijo iz another-- primer, 397 00:16:39,530 --> 00:16:42,870 od funkcije, kot glavni, če Moram spremenljivo, X in Y, kot I 398 00:16:42,870 --> 00:16:46,160 naredil prejšnji teden, ista številka, in sem mimo v x in y 399 00:16:46,160 --> 00:16:49,860 Menjaj, nato pa pokličite Swap-- to, Seveda, je pravilna različica 400 00:16:49,860 --> 00:16:52,220 je tisto, kar smo na tem, da vidimo-- ni delovalo. 401 00:16:52,220 --> 00:16:53,770 Torej, kaj je fix? 402 00:16:53,770 --> 00:16:56,850 >> No, samo, da je Jasno, pusti me naprej 403 00:16:56,850 --> 00:17:05,450 in-- dajte mi eno drugo tukaj in si oglejte če ti lahko pokažejo zadnji, ki 404 00:17:05,450 --> 00:17:12,464 bo noter-- da vidimo, če najdem to resnično fast-- OK, [neslišno]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, to je to. 407 00:17:19,240 --> 00:17:21,000 Torej prezreti ukazov sem samo tipkanje. 408 00:17:21,000 --> 00:17:23,780 Želim, da bi jih poiskali na last minute Primer 409 00:17:23,780 --> 00:17:27,960 iz zadnjega časa, ki se zdaj imenuje no Swap. 410 00:17:27,960 --> 00:17:30,200 >> Torej ni Swap je, če smo končali zadnji čas, 411 00:17:30,200 --> 00:17:32,930 pri čemer sem inicializiran x 1 in Y 2. 412 00:17:32,930 --> 00:17:35,840 Nato sem poklical Menjaj, ki poteka v 1. in 2.. 413 00:17:35,840 --> 00:17:37,930 In potem je ta funkcija delal v nekem smislu, 414 00:17:37,930 --> 00:17:40,750 vendar ni imela trajno vpliva na x in y. 415 00:17:40,750 --> 00:17:45,430 Torej vprašanje na dlani pa je, kako zdaj bomo dejansko rešili ta problem? 416 00:17:45,430 --> 00:17:47,820 Kaj je rešitev na dlani? 417 00:17:47,820 --> 00:17:53,150 >> No, v swap.c, ki je novo danes opazili nekaj razlik. 418 00:17:53,150 --> 00:17:54,700 X in Y sta enaka. 419 00:17:54,700 --> 00:17:57,250 Toda kaj je jasno razlikujejo glede linije 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Kaj je novega tam, če se spomnite kar je bilo videti kot sekundo? 422 00:18:01,715 --> 00:18:02,565 >> OBČINSTVO: [neslišno]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Ja. 424 00:18:03,440 --> 00:18:06,680 Torej ampersands nov kos sintakse ne le v tem programu, 425 00:18:06,680 --> 00:18:08,560 ampak tudi na splošno v CS50. 426 00:18:08,560 --> 00:18:10,680 Do danes, mislim, da ne smo videli nobene primere 427 00:18:10,680 --> 00:18:14,070 ali res govoril o njih v katerem koli detajl, razen, morda, preemptively 428 00:18:14,070 --> 00:18:16,467 v oddelku, ampersand takole. 429 00:18:16,467 --> 00:18:19,300 No, izkazalo se je ampersand je eden zadnjih kosov nove sintakse 430 00:18:19,300 --> 00:18:20,174 bomo naučili. 431 00:18:20,174 --> 00:18:23,500 Vse to pomeni, naslov neke spremenljivke. 432 00:18:23,500 --> 00:18:25,070 Na kateri naslov pa x živi? 433 00:18:25,070 --> 00:18:26,510 Toda kaj, naslov pa y živi? 434 00:18:26,510 --> 00:18:28,700 Ker če Temeljni problem, preden 435 00:18:28,700 --> 00:18:32,970 je pa smo opravili, da sta x in y kot je izvodov, kar si resnično želite storiti 436 00:18:32,970 --> 00:18:38,780 je zagotoviti Menjaj s podobno zakladu zemljevid, ki vodi do mesta, kjer x in y dejansko 437 00:18:38,780 --> 00:18:41,910 v RAM, tako da Swap lahko sledili temu zemljevid 438 00:18:41,910 --> 00:18:47,760 in iti kamorkoli x ali y označuje mesto in spreminjanje dejanske vrednosti 1 in 2 439 00:18:47,760 --> 00:18:48,270 tam. 440 00:18:48,270 --> 00:18:50,710 >> Torej Swap mora tudi nekoliko spremeniti. 441 00:18:50,710 --> 00:18:53,760 In na prvi pogled se to lahko zdi malo podobna char zvezda. 442 00:18:53,760 --> 00:18:54,850 In res je. 443 00:18:54,850 --> 00:18:59,635 Tako da je kazalec na kakšne vrste podatkov, temelji na tem izpostavil dela? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Torej je int. 446 00:19:01,620 --> 00:19:04,880 >> Torej ni več int to je naslov int. 447 00:19:04,880 --> 00:19:07,910 In podobno, se b zdaj dogaja da je naslov int. 448 00:19:07,910 --> 00:19:12,470 Torej, ko sem zdaj poklical Menjaj iz Main, Ne grem, da bi zamenjali 1 in 2. 449 00:19:12,470 --> 00:19:15,540 Bom dal to všeč Ox-nekaj in Ox-nekaj, 450 00:19:15,540 --> 00:19:19,820 dveh naslovov, ki bodo vodile Swap na njihovih dejanskih mestih 451 00:19:19,820 --> 00:19:21,310 v spomin na mojem računalniku. 452 00:19:21,310 --> 00:19:25,580 >> Torej, zdaj, moj preostali izvajanje se mora spremeniti tad. 453 00:19:25,580 --> 00:19:28,650 Kaj je zdaj očitno drugačna v teh treh vrstic kode? 454 00:19:28,650 --> 00:19:31,350 Tam te preklete zvezde vse nad krajem, v redu? 455 00:19:31,350 --> 00:19:33,014 Torej, kaj se tukaj dogaja? 456 00:19:33,014 --> 00:19:33,514 Ja? 457 00:19:33,514 --> 00:19:35,055 >> OBČINSTVO: Očitno [neslišno]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Točno tako. 460 00:19:37,990 --> 00:19:41,560 Torej v tem context-- in to ni bilo najboljša odločitev, design, seveda, 461 00:19:41,560 --> 00:19:42,530 pred leti. 462 00:19:42,530 --> 00:19:45,110 V tem primeru, ko imate le zvezdo, 463 00:19:45,110 --> 00:19:48,240 in nimate podatkovni tip, kot int, takoj na levi, 464 00:19:48,240 --> 00:19:53,146 Namesto imate enačaj, je jasno, v zvezi s tem, ko praviš, zvezda, 465 00:19:53,146 --> 00:19:56,980 kar pomeni, da gre za naslov, ki je v. 466 00:19:56,980 --> 00:19:58,870 Sledite zemljevid zaklada, tako rekoč. 467 00:19:58,870 --> 00:20:01,720 >> In medtem, v skladu 37, to pomeni isto stvar. 468 00:20:01,720 --> 00:20:05,460 Pojdi na naslov a, in dal kaj tam? 469 00:20:05,460 --> 00:20:09,520 Vse, kar je v lokacija, ki določa, b. 470 00:20:09,520 --> 00:20:10,980 Z drugimi besedami, pojdite na b. 471 00:20:10,980 --> 00:20:12,130 Spravi te vrednosti. 472 00:20:12,130 --> 00:20:15,620 Pojdi na in, na enak podpisati, operator naloga, 473 00:20:15,620 --> 00:20:17,010 dal, da je vrednost tam. 474 00:20:17,010 --> 00:20:19,272 >> Podobno, int temp je samo int. 475 00:20:19,272 --> 00:20:20,730 Nič ni treba spremeniti zaradi temp. 476 00:20:20,730 --> 00:20:24,810 To je samo rezervna stekla iz Annenberg za malo mleka ali pomarančnega soka. 477 00:20:24,810 --> 00:20:27,630 Vendar mi treba povedati, pojdite na b. 478 00:20:27,630 --> 00:20:31,449 Pojdite na ta kraj in dal vrednost temp tam. 479 00:20:31,449 --> 00:20:32,490 Torej, kaj se je zgodilo potem? 480 00:20:32,490 --> 00:20:36,540 Ko sem dejansko poklical Menjaj ta čas, če ta prvi pladenj tukaj predstavlja Main, 481 00:20:36,540 --> 00:20:42,270 ta drugi pladenj predstavlja Menjaj, ko I mimo ampersand x in y ampersand 482 00:20:42,270 --> 00:20:47,150 od Main Menjaj, samo da bo jasno, kaj je to kup okvir za sprejemanje? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ja? 485 00:20:49,200 --> 00:20:50,180 >> OBČINSTVO: [neslišno]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Točno tako. 487 00:20:51,180 --> 00:20:53,129 Naslov x in naslov y. 488 00:20:53,129 --> 00:20:55,170 In lahko si misliš o teh kot poštnih naslovov. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street in 35 Oxford Street, in ti 490 00:20:58,772 --> 00:21:01,230 želite premakniti dve stavbi da so na teh lokacijah. 491 00:21:01,230 --> 00:21:04,680 >> To je nekako smešno idejo, ampak to je vse, kar mislimo z naslovom. 492 00:21:04,680 --> 00:21:07,000 Kje na svetu se lahko boste našli tiste dve ints? 493 00:21:07,000 --> 00:21:09,470 Kje na svetu lahko storite najti tiste dve stavbi? 494 00:21:09,470 --> 00:21:15,170 Torej, če na koncu, po vsem tem času sem iti v današnjem izvorno kodo in pripravijo 495 00:21:15,170 --> 00:21:22,110 Swap in rok ./swap, končno, za Prvič, ko bomo dejansko videli, da 496 00:21:22,110 --> 00:21:25,330 moje vrednote imajo dejansko uspešno zamenjala. 497 00:21:25,330 --> 00:21:30,860 In zdaj, bomo lahko celo zaznamek o tem, recimo, GDB. 498 00:21:30,860 --> 00:21:32,740 >> Zato naj gredo v isto datoteko. 499 00:21:32,740 --> 00:21:35,010 Dovolite mi, da gredo naprej in zagon gdb za ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 In zdaj, Swap, jaz grem naprej in nastavite točko lomljenja na Majni. 502 00:21:40,547 --> 00:21:42,630 In zdaj bom šel naprej in zagon programa. 503 00:21:42,630 --> 00:21:45,810 In zdaj vidimo svojo kodo začasno ustavljeno na tej liniji. 504 00:21:45,810 --> 00:21:48,330 >> Če grem naprej in print x, kaj naj jaz vidim tukaj? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 To je vprašanje. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Ponovim? 509 00:21:51,530 --> 00:21:52,295 >> OBČINSTVO: [neslišno]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Torej naključnih števil, morda. 511 00:21:53,910 --> 00:21:56,010 Mogoče sem imel srečo, in to je lepo in preprosto, kot 0. 512 00:21:56,010 --> 00:21:57,230 Toda morda je nekaj naključnih števil. 513 00:21:57,230 --> 00:21:58,090 V tem primeru, sem srečen. 514 00:21:58,090 --> 00:21:59,030 Samo se zgodi, da bo 0. 515 00:21:59,030 --> 00:22:00,780 Ampak to je res sreča, saj ne, dokler sem 516 00:22:00,780 --> 00:22:06,280 tip zraven, potem pa print x ima ta vrstica kode, vrstica 19 je, usmrčen. 517 00:22:06,280 --> 00:22:10,942 >> Medtem, če sem tip zraven še enkrat, in Zdaj natisnete y, bom videl 2. 518 00:22:10,942 --> 00:22:13,900 Zdaj, če sem tip zraven, da se bo malo zmedeno, ker zdaj, 519 00:22:13,900 --> 00:22:17,250 printf se dogaja, da se pojavi na zaslon, kot je to storila. x je 1. 520 00:22:17,250 --> 00:22:18,606 >> Naredimo to še enkrat. 521 00:22:18,606 --> 00:22:20,480 In zdaj, tukaj, kjer stvari postanejo zanimive. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Preden kličem Menjaj ali celo korak vanj, vzemiva malo pokukati. 524 00:22:26,580 --> 00:22:28,980 x je spet, 1. 525 00:22:28,980 --> 00:22:33,240 Y je, seveda, hitro Prečistil preverite, 2, tako da ni težko tam. 526 00:22:33,240 --> 00:22:35,740 Toda kaj je ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Odgovor, to je nekako funky iskal. 529 00:22:39,350 --> 00:22:43,500 Vendar int zvezda v oklepaju je samo GDP na način rekel, da je to naslov. 530 00:22:43,500 --> 00:22:48,290 To ni int, da je kazalec na int ali drugače znana kot naslov. 531 00:22:48,290 --> 00:22:49,742 >> Kaj je to noro stvar? 532 00:22:49,742 --> 00:22:51,825 Še nikoli nismo videli kaj prav tako pred tem. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Torej je to naslov v moj računalnik je Spomin, kjer x zgodi, da živijo. 535 00:22:58,120 --> 00:22:59,040 To je Ox-nekaj. 536 00:22:59,040 --> 00:23:01,290 In to je, odkrito povedano, zakaj Sem začel risati puščic, 537 00:23:01,290 --> 00:23:03,340 namesto številk ker je res mar 538 00:23:03,340 --> 00:23:06,890 da je vaša int na posebno naslov, ki je tako velik. 539 00:23:06,890 --> 00:23:12,160 Toda bffff0c4, to so vsi Pravzaprav šestnajstiških številk, 540 00:23:12,160 --> 00:23:13,720 ki so 0 do f. 541 00:23:13,720 --> 00:23:16,590 >> Torej ne bomo bivali tudi Dokler o tem, kaj te stvari so. 542 00:23:16,590 --> 00:23:19,400 Ampak, če sem izpisal y, Seveda, sem videl 2. 543 00:23:19,400 --> 00:23:22,440 Vendar ampersand y, vidim ta naslov. 544 00:23:22,440 --> 00:23:26,527 In obvestilo, za radovedne, kako daleč narazen sta x in y? 545 00:23:26,527 --> 00:23:27,985 Lahko prezreti najbolj naslova. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Štiri bajte. 548 00:23:29,920 --> 00:23:33,510 In da je v skladu z našimi prej, trdijo, da je int, kako velik? 549 00:23:33,510 --> 00:23:34,130 Štiri bajte. 550 00:23:34,130 --> 00:23:37,420 , Tako da izgleda kot da je vse v oblogo navzgor lepo, kot si morda upam, v spomin. 551 00:23:37,420 --> 00:23:40,010 >> Torej, zdaj, kaj je samo hitro naprej na koncu te zgodbe. 552 00:23:40,010 --> 00:23:43,290 Pojdimo naprej in tip korak, da se potopite v funkciji Swap. 553 00:23:43,290 --> 00:23:46,880 Zdaj opazil, če sem tip, to je enak naslov x. 554 00:23:46,880 --> 00:23:52,130 Če sem tipa B, je enaka na naslov y. 555 00:23:52,130 --> 00:23:57,020 Torej, kaj naj vidim, če sem pravijo, pojdite na naslov, ki je? 556 00:23:57,020 --> 00:23:58,120 Torej tiskanje zvezda. 557 00:23:58,120 --> 00:24:00,130 Tako zvezda pomeni iti tja, v tem kontekstu. 558 00:24:00,130 --> 00:24:02,730 Ampersand pomeni, kaj je naslov. 559 00:24:02,730 --> 00:24:05,000 Torej zvezda sredstvo 1. 560 00:24:05,000 --> 00:24:09,590 In print zvezda b mi daje 2. 561 00:24:09,590 --> 00:24:15,750 >> In mi prevzame, za trenutek, da vsaj kodo, ki 562 00:24:15,750 --> 00:24:18,950 nadaljuje izvršiti zdaj lahko obrazloženo skozi ta način. 563 00:24:18,950 --> 00:24:21,150 Vendar bomo ponovno to idejo kmalu. 564 00:24:21,150 --> 00:24:23,850 Tako da je ta različica Swap Zdaj je pravilna in omogoča 565 00:24:23,850 --> 00:24:26,650 nam, da bi zamenjali to posebno vrsto podatkov. 566 00:24:26,650 --> 00:24:29,120 >> Torej, vsa vprašanja pa na Swap? 567 00:24:29,120 --> 00:24:29,890 Na zvezdo? 568 00:24:29,890 --> 00:24:30,690 Na naslov? 569 00:24:30,690 --> 00:24:33,270 In videli boste, z problem nastaviti 4, vrsta, 570 00:24:33,270 --> 00:24:37,310 ampak problem nastaviti 5, zagotovo, kako ti stvari, ki so koristne in dobili še veliko več 571 00:24:37,310 --> 00:24:39,584 udobno z njimi, kot rezultat. 572 00:24:39,584 --> 00:24:40,430 Sploh kaj? 573 00:24:40,430 --> 00:24:40,930 V redu. 574 00:24:40,930 --> 00:24:44,350 Torej malloc je, še enkrat, ta funkcija da samo razporeja spomin, spomin 575 00:24:44,350 --> 00:24:45,330 dodelitev. 576 00:24:45,330 --> 00:24:47,024 In zakaj je to koristno? 577 00:24:47,024 --> 00:24:48,940 No, ves ta čas, ste uporabljali malloc. 578 00:24:48,940 --> 00:24:52,230 Če menite, da je sedaj, kako getString dela, verjetno pa je 579 00:24:52,230 --> 00:24:56,140 spraševal nekoga za kos spomin, kadarkoli tipe uporabnikov niz 580 00:24:56,140 --> 00:24:59,040 leta, saj je prav gotovo ni vedel, kot osebje CS50, 581 00:24:59,040 --> 00:25:02,710 kako velik ti strune, da ljudje se dogaja, da tip lahko. 582 00:25:02,710 --> 00:25:07,910 >> Torej, prvič, začnite lupine nazaj, kako deluje CS50 knjižnica, 583 00:25:07,910 --> 00:25:10,990 s pomočjo nekaj primerov ki nas bo pripeljalo tja. 584 00:25:10,990 --> 00:25:15,300 Torej, če sem odprla gedit in odpirajo scanf 0, 585 00:25:15,300 --> 00:25:17,055 bomo videli naslednjo kodo. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, na voljo na spletni strani za danes ima relativno malo vrstic kode 588 00:25:23,530 --> 00:25:25,351 tukaj, 14 s 20. 589 00:25:25,351 --> 00:25:26,600 In poglejmo, kaj dela. 590 00:25:26,600 --> 00:25:28,920 Izjavlja, int, imenovano x. 591 00:25:28,920 --> 00:25:30,850 Pravi nekaj podobnega, število prosim. 592 00:25:30,850 --> 00:25:33,940 In zdaj je pravi scanf% i, in x. 593 00:25:33,940 --> 00:25:35,620 Torej, tam je kup novih stvari tam. 594 00:25:35,620 --> 00:25:38,420 >> Ampak scanf lahko nekako mislim od kot nasprotje printf. 595 00:25:38,420 --> 00:25:40,090 printf seveda izpiše na zaslonu. 596 00:25:40,090 --> 00:25:44,410 scanf nekako skandiranje od uporabnikov Nekaj ​​tipkovnica je on ali ona tipkal. 597 00:25:44,410 --> 00:25:46,550 >> % I je tako kot printf. 598 00:25:46,550 --> 00:25:49,410 To pomeni, da pričakujemo uporabniku, da tip int. 599 00:25:49,410 --> 00:25:52,820 In zdaj, zakaj misliš, da sem lahko poteka scanf & X? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Če je namen v življenju scanf je, da bi dobili nekaj od uporabnika, 602 00:25:57,770 --> 00:26:02,480 kaj je pomen to poteka, in x, zdaj? 603 00:26:02,480 --> 00:26:02,980 Ja? 604 00:26:02,980 --> 00:26:03,896 >> OBČINSTVO: [neslišno]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Točno tako. 607 00:26:06,540 --> 00:26:12,900 Karkoli, človek, vnesite, svoj vhod se bo shranjeni na tej lokaciji. 608 00:26:12,900 --> 00:26:17,660 To ne zadostuje, se spomni, da samo preide v x, ker smo že videli, 609 00:26:17,660 --> 00:26:21,630 kadar koli se boste peljali le surovo spremenljivko kot notr, do neke druge funkcije, 610 00:26:21,630 --> 00:26:25,640 seveda, lahko spremeni, da spremenljiv, vendar ne za stalno. 611 00:26:25,640 --> 00:26:27,360 Ne more imeti vpliva na Majni. 612 00:26:27,360 --> 00:26:29,420 To se lahko spremeni samo svojo lokalno kopijo. 613 00:26:29,420 --> 00:26:32,560 Ampak, če namesto tega pa ne daj mi dejansko int, 614 00:26:32,560 --> 00:26:36,640 vendar mi daje navodila da int, sem zdaj, da scanf, 615 00:26:36,640 --> 00:26:41,050 zagotovo ne morem sklepati, da obravnavati in dal nekaj tam 616 00:26:41,050 --> 00:26:43,280 tako imate dostop do nje, kot tudi. 617 00:26:43,280 --> 00:26:45,120 >> Torej, ko sem teči ta program, pa poglejmo. 618 00:26:45,120 --> 00:26:49,660 Naredite scanf 0 dot poševnica, scanf 0. 619 00:26:49,660 --> 00:26:54,030 In če bom zdaj vnesite številko kot 50, hvala za 50 let. 620 00:26:54,030 --> 00:26:58,150 Če bom sedaj vtipkajte številko, kot je negativna 1, za negativno 1. 621 00:26:58,150 --> 00:27:04,200 Sedaj vnesite številko kot 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Zakaj me je moj program prezreti? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 No, ker preprosto sem povedal je pričakovati, da bo le int. 625 00:27:09,880 --> 00:27:10,380 V redu. 626 00:27:10,380 --> 00:27:11,630 Torej, to je ena verzija tega. 627 00:27:11,630 --> 00:27:16,600 Vzemimo stvari gor zarezo in Predlagam, da to ni dobro. 628 00:27:16,600 --> 00:27:20,530 In tu se skriva zelo preprost primer kako lahko začnemo pisanje kode 629 00:27:20,530 --> 00:27:24,450 da lahko drugi ljudje izkoriščajo ali kompromise, ki jih počne slabe stvari. 630 00:27:24,450 --> 00:27:28,336 Torej linija 16, tako podobna v duhu, da pred, 631 00:27:28,336 --> 00:27:29,960 ampak ne bom ga razglasi int tokrat. 632 00:27:29,960 --> 00:27:32,970 Jaz sem ga razglasi zoglenel zvezdo, aka niz. 633 00:27:32,970 --> 00:27:35,190 >> Toda kaj to v resnici pomeni? 634 00:27:35,190 --> 00:27:38,790 Torej, če ne podate address-- in Jih bom samovoljno, buffer, 635 00:27:38,790 --> 00:27:43,370 ampak jaz bi poklical je to, da je simple-- in potem sem to narediti, razloži mi, 636 00:27:43,370 --> 00:27:48,630 če bi lahko, glede na prejšnje logika, kaj je scanf počne v vrstico 18, 637 00:27:48,630 --> 00:27:55,000 če prelaz% s in pufra, ki je naslov? 638 00:27:55,000 --> 00:27:58,210 Kaj je scanf, če se prijavite popolnoma enaka logika kot različica 0, 639 00:27:58,210 --> 00:28:00,640 dogaja, da poskušajo narediti tukaj, ko uporabnik vnese nekaj v? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ja? 642 00:28:03,409 --> 00:28:04,407 >> OBČINSTVO: [neslišno]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Točno tako. 645 00:28:08,890 --> 00:28:11,577 Scanf, ki jih logika prej, bo trajalo niz 646 00:28:11,577 --> 00:28:13,410 da človeško natipkane noter-- je sedaj niz, 647 00:28:13,410 --> 00:28:15,790 to ni več, verjetno, če je on ali ona cooperates-- 648 00:28:15,790 --> 00:28:19,310 in to se dogaja, da poskušajo dal, da Niz v spomin na kateri koli naslov 649 00:28:19,310 --> 00:28:20,340 buffer določa. 650 00:28:20,340 --> 00:28:23,870 In to je super, ker pufra je res mišljeno, da bo naslov. 651 00:28:23,870 --> 00:28:30,470 >> Ampak Trdim ta program je buggy v Zelo resen način, ker tisto, kar je vrednost 652 00:28:30,470 --> 00:28:31,330 buffer privzeto? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Kaj sem inicializiran v? 655 00:28:34,790 --> 00:28:35,770 Kaj kos pomnilnika? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Imam ne, kajne? 658 00:28:38,620 --> 00:28:42,265 >> Torej, čeprav sem namenila char zvezda, ki je ni več poklical s, 659 00:28:42,265 --> 00:28:48,030 to je namesto tega pozval, buffer-- tako dajmo pripraviti ime spremenljivke 660 00:28:48,030 --> 00:28:53,380 zdaj kot buffer-- če nimam imenovano getString ali malloc tukaj, 661 00:28:53,380 --> 00:28:56,030 da dejansko pomeni, da buffer je le nekaj smeti vrednost. 662 00:28:56,030 --> 00:28:57,030 >> Kaj to pomeni? 663 00:28:57,030 --> 00:29:00,220 To pomeni, da sem povedal scanf pričakovati niz od uporabnika. 664 00:29:00,220 --> 00:29:01,300 In veste kaj? 665 00:29:01,300 --> 00:29:03,883 Ne glede na to, kar se kaže da-- in rišem vprašaj, 666 00:29:03,883 --> 00:29:07,060 ampak v resnici gre, da bi nekaj podobnega OX1, 2, 3, kajne? 667 00:29:07,060 --> 00:29:10,730 To je nekaj lažne vrednosti, ki so pravkar zgodi, da bo tam od prej. 668 00:29:10,730 --> 00:29:13,440 Torej, povedano drugače, to je kot da buffer je le 669 00:29:13,440 --> 00:29:16,180 kaže, da nekaj v spomin. 670 00:29:16,180 --> 00:29:17,610 Nimam pojma, kaj. 671 00:29:17,610 --> 00:29:24,130 >> Torej, če sem tip v Gabe zdaj gre prizadevanje, da bi g-A-B-E / 0 tam. 672 00:29:24,130 --> 00:29:25,530 A kdo ve, kaj je to? 673 00:29:25,530 --> 00:29:27,480 In v preteklosti, koli Čas, ki smo jih skušali dotakniti 674 00:29:27,480 --> 00:29:29,770 spomin, ki ne pripadajo nam, kaj se je zgodilo? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Ali skoraj vsak čas. 677 00:29:32,870 --> 00:29:34,310 Segmentacije krivda, kajne? 678 00:29:34,310 --> 00:29:37,829 >> Ta puščica, nimam pojma, kje je kazalno. to je samo nekaj naključno vrednost. 679 00:29:37,829 --> 00:29:40,370 In seveda, če si razlagajo naključno vrednost kot naslov, 680 00:29:40,370 --> 00:29:42,610 boš šel na nekaj naključno destinacija. 681 00:29:42,610 --> 00:29:46,810 Torej Gabe morda celo crash moj program v tem primeru tukaj. 682 00:29:46,810 --> 00:29:50,600 >> Torej, kaj lahko storimo, da je to skoraj tako slabo? 683 00:29:50,600 --> 00:29:52,660 Da je to tretja in Zadnji primer scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ta različica je boljša v kakšnem smislu? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Če ste zadovoljni s Prejšnja problem, to je bolje. 688 00:30:01,400 --> 00:30:02,250 Zakaj? 689 00:30:02,250 --> 00:30:03,250 >> OBČINSTVO: [neslišno]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Dobro. 692 00:30:07,110 --> 00:30:09,970 Tako da je ta primer linije 16 Bolje je, v smislu 693 00:30:09,970 --> 00:30:12,030 da smo izrecno dodelitvi nekaj pomnilnika. 694 00:30:12,030 --> 00:30:14,190 Mi ne uporabljate malloc, smo s pomočjo teden 2 695 00:30:14,190 --> 00:30:16,060 Pristop pravkar razglasitvi niz. 696 00:30:16,060 --> 00:30:18,130 In ko smo že povedal, da je niz je le nabor znakov, 697 00:30:18,130 --> 00:30:19,690 tako da je to povsem legitimno. 698 00:30:19,690 --> 00:30:22,910 Ampak to je, seveda, kot je opazite, fiksne velikosti, 16. 699 00:30:22,910 --> 00:30:25,440 >> Tako da je ta program popolnoma varno, če sem tip 700 00:30:25,440 --> 00:30:29,760 v kito en znak, dvomestna strune, 15 nizov znakov. 701 00:30:29,760 --> 00:30:34,970 Toda takoj, ko začnem tipkati 16, 17, 18, 1000 nizi znakov, 702 00:30:34,970 --> 00:30:37,390 če je ta niz bo končalo? 703 00:30:37,390 --> 00:30:39,570 To se dogaja, da se na koncu deloma tukaj. 704 00:30:39,570 --> 00:30:42,820 Potem pa kdo ve kaj še je za mejami 705 00:30:42,820 --> 00:30:44,270 te zlasti niz? 706 00:30:44,270 --> 00:30:48,015 >> To je, kot da imam razglasila 16 škatel tukaj. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Torej, namesto da potegnili vseh 16, se bomo Pretvarjaj se, da sem se sestavi 16. 709 00:30:52,690 --> 00:30:56,540 Ampak, če sem nato poskusite prebrati niz To je veliko več, kot 50 znakov, 710 00:30:56,540 --> 00:31:01,270 Jaz bom za začetek dajanje a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 In to je verjetno nekateri drugi pomnilnik odsek 712 00:31:04,916 --> 00:31:06,790 da, še enkrat, lahko povzroči moj program zruši, 713 00:31:06,790 --> 00:31:10,600 ker si nisem prosil za kaj več kot le 16 bajtov. 714 00:31:10,600 --> 00:31:12,260 >> Torej, koga briga? 715 00:31:12,260 --> 00:31:13,880 No, tukaj je knjižnica CS50. 716 00:31:13,880 --> 00:31:17,220 In večina je to le kot navodilih up vrhu. 717 00:31:17,220 --> 00:31:21,670 Knjižnica CS50, ves ta čas, je imel to vrstico v vrstici 52. 718 00:31:21,670 --> 00:31:23,680 Videli smo typedef, ali boste videli typedef 719 00:31:23,680 --> 00:31:27,930 v pset 4, ki samo ustvarja Sinonim katerim lahko znak zvezdica več 720 00:31:27,930 --> 00:31:29,290 preprosto besedilu niz. 721 00:31:29,290 --> 00:31:31,540 Torej to je eden Nekaj ​​kolesa usposabljanje 722 00:31:31,540 --> 00:31:34,120 smo na skrivaj uporablja pod pokrovom. 723 00:31:34,120 --> 00:31:36,490 >> Medtem, tukaj je funkcija, getchar. 724 00:31:36,490 --> 00:31:38,190 Zdaj je očitno, da ni telo za to. 725 00:31:38,190 --> 00:31:40,273 In v resnici, če obdržim drsenje, jaz pravzaprav ne 726 00:31:40,273 --> 00:31:42,080 vidim nobenih izvedb teh funkcij. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Kot preverjanje razumnosti, zakaj je to? 729 00:31:45,516 --> 00:31:46,795 >> OBČINSTVO: [neslišno]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Ja. 731 00:31:47,670 --> 00:31:48,950 Torej je ta datoteka glave. 732 00:31:48,950 --> 00:31:52,520 In header datoteke vsebujejo prototipov, plus nekatere druge stvari, kot se zdi, 733 00:31:52,520 --> 00:31:53,780 kot typedefs. 734 00:31:53,780 --> 00:31:56,910 Toda v CS50.c, ki smo jih Nikoli vam ga je dal dokončni, 735 00:31:56,910 --> 00:32:02,100 vendar je bil v CS50 aparata vse ta čas, globoko v svojih mapah, 736 00:32:02,100 --> 00:32:04,990 opazite, da je celotna kup funkcij tukaj. 737 00:32:04,990 --> 00:32:06,720 >> V resnici pa se pomaknite navzdol. 738 00:32:06,720 --> 00:32:08,810 Pojdimo prezreti večina od njih, za zdaj. 739 00:32:08,810 --> 00:32:12,670 Vendar se pomaknite navzdol do getInt in videli, kako getInt deluje. 740 00:32:12,670 --> 00:32:13,890 Torej, tukaj je getInt. 741 00:32:13,890 --> 00:32:17,727 In če si kdaj res bilo mar, kako priti int deluje, tukaj je njegova dokumentacija. 742 00:32:17,727 --> 00:32:19,560 In med stvarmi pravi, je to vam pove 743 00:32:19,560 --> 00:32:21,340 kaj se stopnje vrednosti, se lahko vrne. 744 00:32:21,340 --> 00:32:24,400 To je v bistvu negativen 2 milijardi pozitivnega 2 milijardi, vzemi ali pusti. 745 00:32:24,400 --> 00:32:26,420 >> In izkazalo se je, vse to čas, čeprav smo jih nikoli 746 00:32:26,420 --> 00:32:28,570 bi morali preveriti za to, če gre kaj narobe, 747 00:32:28,570 --> 00:32:30,680 Izkazalo se je, da so vsi Tokrat getInt ima 748 00:32:30,680 --> 00:32:33,600 oglaša posebna konstanta, ni nič, 749 00:32:33,600 --> 00:32:36,760 ampak int_max, ki je Konvencija le za programerja. 750 00:32:36,760 --> 00:32:38,846 To tukaj pomeni, posebno vrednost. 751 00:32:38,846 --> 00:32:41,470 Poskrbite, da preverite, ali je to, samo če gre kaj narobe. 752 00:32:41,470 --> 00:32:43,261 Vendar smo se nikoli ne moti s tem do danes, 753 00:32:43,261 --> 00:32:45,200 ker je tudi to je mišljeno, da poenostavi. 754 00:32:45,200 --> 00:32:46,950 >> Toda kako getInt se izvajajo? 755 00:32:46,950 --> 00:32:48,450 No, ena, je potrebno nobenih argumentov. 756 00:32:48,450 --> 00:32:49,390 Vemo, da je. 757 00:32:49,390 --> 00:32:50,820 Se vrne int. 758 00:32:50,820 --> 00:32:51,950 Vemo, da je. 759 00:32:51,950 --> 00:32:54,460 Torej, kako to deluje pod pokrovom? 760 00:32:54,460 --> 00:32:58,290 >> Torej je očitno neskončno zanke, vsaj videz enega. 761 00:32:58,290 --> 00:33:00,290 Opazimo, da smo s pomočjo getString. 762 00:33:00,290 --> 00:33:04,000 Torej, to je zanimivo. getInt poziva naša lastna funkcija, getString. 763 00:33:04,000 --> 00:33:05,645 In zdaj, zakaj bi se to zgodilo? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Zakaj sem pa defenzivno tukaj v skladu 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Kaj bi se lahko zgodilo v skladu 164, samo da bo jasno? 768 00:33:15,639 --> 00:33:16,930 To je odgovor enak kot prej. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Lahko samo iz spomina. 771 00:33:20,089 --> 00:33:23,130 Gre kaj narobe z getString, imamo, da lahko, da zmorem. 772 00:33:23,130 --> 00:33:27,070 In razlog, da se ne vrne null, je da, tehnično, null kazalec. 773 00:33:27,070 --> 00:33:29,120 getInt mora vrniti int. 774 00:33:29,120 --> 00:33:31,060 Tako sem samovoljno odločila, da v bistvu, 775 00:33:31,060 --> 00:33:34,600 da 2 milijardi, gor ali dol, se bo biti posebno vrednost, da ne morem nikoli 776 00:33:34,600 --> 00:33:35,970 dejansko dobili od uporabnika. 777 00:33:35,970 --> 00:33:39,930 To je samo ena vrednost bom za odpadke, ki zastopa kodo napake. 778 00:33:39,930 --> 00:33:41,540 >> Torej sedaj, se stvari malo fancy. 779 00:33:41,540 --> 00:33:44,670 In to ni čisto isto funkcijo kot prej, vendar je zelo podobna. 780 00:33:44,670 --> 00:33:50,120 Tako obvestilo, izjavljam tu, v skladu 172, tako int n in char c. 781 00:33:50,120 --> 00:33:53,600 In potem sem uporabljati to funky linije, sscanf, kar se je izkazalo 782 00:33:53,600 --> 00:33:55,990 ne išče niz iz tipkovnice. 783 00:33:55,990 --> 00:33:59,226 Stoji obstoječi niz, ki Uporabnik že vnesli. 784 00:33:59,226 --> 00:34:02,100 Zato sem že pozval getString, ki pomeni, da imajo niz v spominu. 785 00:34:02,100 --> 00:34:05,020 sscanf je tisto, kar bi pokličete funkcijo razčlenjevanju. 786 00:34:05,020 --> 00:34:07,760 Videti je na vrvici sem vnesli v, po znakih, 787 00:34:07,760 --> 00:34:09,250 in naredi nekaj koristnega. 788 00:34:09,250 --> 00:34:10,969 Ta niz je shranjena v liniji. 789 00:34:10,969 --> 00:34:13,560 In vem, da lahko le tako, da greste nazaj gor in rekel, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Klical sem ga, ne s tem čas, ampak linijo. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> In zdaj je to malo drugače. 793 00:34:18,080 --> 00:34:22,480 Vendar to dejansko pomeni, zaradi bomo nekoliko mahati z rokami na danes, 794 00:34:22,480 --> 00:34:26,070 da smo za preverjanje vidim, če uporabnik vtipka 795 00:34:26,070 --> 00:34:29,909 in int in morda še en znak. 796 00:34:29,909 --> 00:34:33,610 Če uporabnik vtipka notr, to je dogaja se shranijo v n, ker sem 797 00:34:33,610 --> 00:34:36,739 poteka to po naslovu, nov trik, ki smo jih videli danes. 798 00:34:36,739 --> 00:34:41,570 Če Vtipkali tudi v kot 123x, da x 799 00:34:41,570 --> 00:34:45,060 se bo končalo Pismo iz znakov c. 800 00:34:45,060 --> 00:34:48,739 >> Zdaj se je izkazalo, da je sscanf mi bo povedal, inteligentno, 801 00:34:48,739 --> 00:34:54,750 koliko spremenljivk je sscanf Uspešno sposobni izpolniti. 802 00:34:54,750 --> 00:34:58,770 Torej s to logiko, če funkcija Jaz izvajanje je getInt, 803 00:34:58,770 --> 00:35:00,900 vendar sem preverjanje, potencialno, za uporabnika 804 00:35:00,900 --> 00:35:04,190 , da so vnesli v notr sledi nekaj drugega, 805 00:35:04,190 --> 00:35:08,580 Kaj hočem sscanf je vrne vrednost resnično biti? 806 00:35:08,580 --> 00:35:10,950 Če je namen, da bi dobili samo int od uporabnika? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Torej, če sscanf donosi 2, kaj to pomeni? 809 00:35:19,300 --> 00:35:21,660 Uporabnik vtipka nekaj podobnega, dobesedno, 810 00:35:21,660 --> 00:35:24,770 123x, ki je samo nesmisel. 811 00:35:24,770 --> 00:35:27,490 To je prišlo do napake, in Želim, da preverite to. 812 00:35:27,490 --> 00:35:32,960 >> Torej, če uporabnik vnese to, s ta logika, kaj sscanf vrniti, 813 00:35:32,960 --> 00:35:33,740 bi rekel? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Tako se dogaja, da se vrnete 2, saj 123 je šel noter, 816 00:35:39,130 --> 00:35:41,580 in x se bo končalo tukaj. 817 00:35:41,580 --> 00:35:43,970 Ampak jaz ne želim x vas bo napolnil. 818 00:35:43,970 --> 00:35:48,580 Želim sscanf le uspelo polnjenje prvi njenih spremenljivk. 819 00:35:48,580 --> 00:35:52,490 In da je, zakaj sem sscanf želijo vrniti 1. 820 00:35:52,490 --> 00:35:55,750 >> In če je to malo nad glavo za trenutek, da je popolnoma v redu. 821 00:35:55,750 --> 00:36:00,030 Zavedaj se, čeprav, da je eden od Vrednosti getInt in getString 822 00:36:00,030 --> 00:36:03,630 je, da delamo vraga Veliko napak preverjanje, kot je ta, da 823 00:36:03,630 --> 00:36:07,130 da je do danes, lahko precej tip ničesar na tipkovnici, 824 00:36:07,130 --> 00:36:08,490 in ga bomo ujeli. 825 00:36:08,490 --> 00:36:10,592 In prav gotovo, osebje, zagotovo ne bo 826 00:36:10,592 --> 00:36:13,300 lahko vir napake v vašem Program, ker smo pri obrambnih 827 00:36:13,300 --> 00:36:16,270 preverjanje za vse neumne stvari, ki jih lahko uporabnik stori, 828 00:36:16,270 --> 00:36:18,900 kot tipkanje niz, ko si res želela int. 829 00:36:18,900 --> 00:36:21,350 Torej za sedaj-- pridemo nazaj na to, preden long-- 830 00:36:21,350 --> 00:36:23,710 vendar ves ta čas, getString in getInt imajo 831 00:36:23,710 --> 00:36:29,950 bil pod pokrovom z uporabo tega Osnovna ideja naslovov pomnilnika. 832 00:36:29,950 --> 00:36:32,580 >> Torej, zdaj, naredimo stvari malo bolj uporabniku prijazen. 833 00:36:32,580 --> 00:36:38,740 Kot se morda spomniš, od Binky zadnji enkrat bom vprašal, če se bo moja miška tako sodelovati-- 834 00:36:38,740 --> 00:36:42,560 smo imeli to kodo, ki odkrito povedano, je precej nesmiselno. 835 00:36:42,560 --> 00:36:45,330 Ta koda doseže nič koristna, vendar pa je bil primer 836 00:36:45,330 --> 00:36:48,330 da profesor Parlante uporablja za predstavljajo 837 00:36:48,330 --> 00:36:51,840 kaj se je dogajalo v program, ki vključuje spomin. 838 00:36:51,840 --> 00:36:54,850 >> Torej, kaj je to Prepričati Zgodba super kratko. 839 00:36:54,850 --> 00:36:58,720 Ti prvi dve vrstici, v Angleški, pa kaj bi rekli? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Samo v razumno človeško, toda nekoliko tehnični pogoji, bo zabodel. 842 00:37:05,430 --> 00:37:06,346 OBČINSTVO: [neslišno]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: OK, ti ustanovitvi naslove za vaše x in y spremenljivk. 845 00:37:11,080 --> 00:37:15,520 Ne povsem, saj sta x in y ne spremenljivke v tradicionalnem smislu. 846 00:37:15,520 --> 00:37:18,054 sta x in y naslovi ali bo shranil naslov. 847 00:37:18,054 --> 00:37:19,220 Torej, poskusimo še enkrat. 848 00:37:19,220 --> 00:37:21,010 Ni slab začetek, čeprav. 849 00:37:21,010 --> 00:37:21,510 Ja? 850 00:37:21,510 --> 00:37:22,426 >> OBČINSTVO: [neslišno]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Dobro. 853 00:37:24,840 --> 00:37:26,173 Mislim, da je malo čistejši. 854 00:37:26,173 --> 00:37:28,630 Razglasitvi dveh kazalcev, dve celi števili. 855 00:37:28,630 --> 00:37:30,150 In smo jim kliče x in y. 856 00:37:30,150 --> 00:37:32,790 Ali pa, če smo bili, da pripravi To so slike, še enkrat, 857 00:37:32,790 --> 00:37:36,410 opozarjajo, preprosto, da vse delamo s tem prvo vrstico 858 00:37:36,410 --> 00:37:39,690 je risba polje, kot je ta, z nekaj smeti vrednost v tem, 859 00:37:39,690 --> 00:37:41,920 in kliče x, in nato drugo polje, kot je ta, 860 00:37:41,920 --> 00:37:43,880 z nekaj smeti vrednostjo v njem, ga kliče y. 861 00:37:43,880 --> 00:37:45,810 Mi smo razglasila dva kazalci, ki na koncu 862 00:37:45,810 --> 00:37:47,860 bo shranil naslov int. 863 00:37:47,860 --> 00:37:49,170 Tako, da je vse tam. 864 00:37:49,170 --> 00:37:53,290 >> Torej, ko Binky je to storil, glina samo pogledal takole. 865 00:37:53,290 --> 00:37:55,350 In Nick nekako zaokrožila puščice, 866 00:37:55,350 --> 00:37:57,590 kot da oni ne kaže nikamor še zlasti, ker oni so samo 867 00:37:57,590 --> 00:37:58,250 smetarska vrednosti. 868 00:37:58,250 --> 00:38:01,670 Oni niso izrecno inicializiran kjerkoli v posebej. 869 00:38:01,670 --> 00:38:03,980 >> Zdaj naslednja vrstica koda, odpoklic, to je bilo. 870 00:38:03,980 --> 00:38:07,510 Tako da v razumno uporabniku prijazen, vendar nekoliko tehnična angleščina, 871 00:38:07,510 --> 00:38:09,790 kaj je ta linija koda počne? 872 00:38:09,790 --> 00:38:10,391 Ja? 873 00:38:10,391 --> 00:38:11,333 >> OBČINSTVO: [neslišno]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Malan: Popolna. 876 00:38:13,950 --> 00:38:17,016 To je dodelitev kos spomin, da je velikost notr. 877 00:38:17,016 --> 00:38:18,140 In to je pol odgovor. 878 00:38:18,140 --> 00:38:20,056 Odgovoril si pravico polovica izražanja. 879 00:38:20,056 --> 00:38:22,473 Kaj se dogaja na levi strani enačaja? 880 00:38:22,473 --> 00:38:22,972 Ja? 881 00:38:22,972 --> 00:38:24,814 OBČINSTVO: in daje je v spremenljivko x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: in daje je na spremenljivko x. 883 00:38:27,690 --> 00:38:31,650 Torej, da Rekapitulacija, desna stran razporeja dovolj pomnilnika za shranjevanje int. 884 00:38:31,650 --> 00:38:34,150 Vendar malloc posebej vrne naslov 885 00:38:34,150 --> 00:38:37,270 te kos pomnilnika, ki youve le spremembe dobi shranjena v x. 886 00:38:37,270 --> 00:38:42,560 >> Torej, kaj Nick storil zadnjič z Binky je je vlekel ta kazalec ven, glina, 887 00:38:42,560 --> 00:38:46,820 točko sedaj na beli kos pomnilnika da je enaka velikosti notr. 888 00:38:46,820 --> 00:38:49,360 In res, to je pomenilo, da predstavljajo štiri bajte. 889 00:38:49,360 --> 00:38:55,310 >> Sedaj, naslednja vrstica kode je to storil, zvezda x dobi 42. 890 00:38:55,310 --> 00:38:58,530 Torej 42 je enostavna za desna stran, smisel življenja. 891 00:38:58,530 --> 00:39:00,500 Leva stran, zvezda x pomeni kaj? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Tudi to bi lahko gone--, da je v redu. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> OBČINSTVO: V bistvu, pojdite na [neslišno] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Dobro. 897 00:39:07,750 --> 00:39:08,760 OBČINSTVO: [neslišno]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Točno tako. 899 00:39:09,760 --> 00:39:11,979 Leva stran pomeni, pojdite na x. 900 00:39:11,979 --> 00:39:12,520 x je naslov. 901 00:39:12,520 --> 00:39:15,520 To je kot 33 Oxford Street ali OX1. 902 00:39:15,520 --> 00:39:18,690 In zvezda x pomeni, da gre za obravnavati in dal kaj tam? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Torej res, da je točno to tisto, kar Nick storil. 905 00:39:21,290 --> 00:39:23,740 Začel je s stranske, v bistvu, duševno 906 00:39:23,740 --> 00:39:26,270 kaže s prstom x, po puščica 907 00:39:26,270 --> 00:39:30,670 na belem okvirčku na desni strani side, in dajanje številko 42 tam. 908 00:39:30,670 --> 00:39:34,120 Ampak potem se stvari malo nevarno, kajne? 909 00:39:34,120 --> 00:39:35,860 Binky je na tem, da izgubi glavo. 910 00:39:35,860 --> 00:39:39,465 >> Star y enaka 13, smolo, kaj pomeni? 911 00:39:39,465 --> 00:39:43,620 Torej zvezdic y pomeni iti na naslov v y. 912 00:39:43,620 --> 00:39:45,630 Toda kaj je naslov v y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 V redu, to je smeti vrednost, kajne? 915 00:39:49,440 --> 00:39:50,800 Sem jo narisal kot vprašajem. 916 00:39:50,800 --> 00:39:54,850 Nick jo narisal kot zvita puščico. 917 00:39:54,850 --> 00:39:59,600 In takoj, ko boste poskušali storiti zvezdicami y, rekoč tja, 918 00:39:59,600 --> 00:40:03,872 vendar ni zakonita naslov, to je nekaj lažne lokacije, 919 00:40:03,872 --> 00:40:05,080 Program bo crash. 920 00:40:05,080 --> 00:40:08,580 In Binky glava se dogaja za letenje off tukaj, kot je to storila. 921 00:40:08,580 --> 00:40:12,130 >> Torej, na koncu, s tem programom je samo ravno ven napako. 922 00:40:12,130 --> 00:40:13,540 To je bil program, buggy. 923 00:40:13,540 --> 00:40:14,760 In bi ga bilo treba popraviti. 924 00:40:14,760 --> 00:40:18,260 In edini način, res, da se določi bi bilo, na primer, ta vrstica, 925 00:40:18,260 --> 00:40:21,010 ki jih sploh ni dobil, da, ker Program strmoglavilo prezgodaj. 926 00:40:21,010 --> 00:40:26,170 Ampak, če smo bili, da popraviti to, kaj Učinek ne počne y enake x imate? 927 00:40:26,170 --> 00:40:30,010 No, v bistvu navaja y na ne glede na vrednost x je obrnjena. 928 00:40:30,010 --> 00:40:32,430 >> Torej, v Nickovi zgodbi, ali Binky zgodba, tako 929 00:40:32,430 --> 00:40:34,640 x in y so obrnjena bel kos pomnilnika, 930 00:40:34,640 --> 00:40:38,300 tako, da na koncu, ko te Ne zvezda y enaka 13 spet, 931 00:40:38,300 --> 00:40:43,080 končaš dajanje 13 v primerno lokacijo. 932 00:40:43,080 --> 00:40:47,640 Torej, vse te linije so popolnoma legitimna, razen ta, 933 00:40:47,640 --> 00:40:51,730 ko se je zgodilo pred vami y dejansko dodeli neko vrednost. 934 00:40:51,730 --> 00:40:54,290 >> Zdaj na srečo, vam ni morali razmišljati skozi vse 935 00:40:54,290 --> 00:40:56,560 tovrstnih vprašanj na svoje. 936 00:40:56,560 --> 00:40:59,310 Dovolite mi, da gredo naprej in odprite do terminala okno tukaj 937 00:40:59,310 --> 00:41:03,050 in odpirajo, za trenutek, super kratek program, ki 938 00:41:03,050 --> 00:41:04,360 Prav tako je nekako nesmiselno. 939 00:41:04,360 --> 00:41:05,152 To je grdo. 940 00:41:05,152 --> 00:41:06,610 To se ne doseže nič uporabnega. 941 00:41:06,610 --> 00:41:10,180 Ampak to ne dokaže vprašanja pomnilnika, tako da je lahko pogled. 942 00:41:10,180 --> 00:41:11,830 >> Main, super enostavna. 943 00:41:11,830 --> 00:41:14,830 To očitno kliče funkcijo, f, in nato vrne 0. 944 00:41:14,830 --> 00:41:16,310 To je nekako težko pokvari tega. 945 00:41:16,310 --> 00:41:18,540 Torej Main je precej dobro, tako daleč. 946 00:41:18,540 --> 00:41:20,100 >> Torej f je problematično. 947 00:41:20,100 --> 00:41:22,120 In ravno ni dal veliko napor v to poimenovanje 948 00:41:22,120 --> 00:41:23,990 sem, da bo poudarek na kodo. 949 00:41:23,990 --> 00:41:25,740 f ima dve vrstici. 950 00:41:25,740 --> 00:41:27,610 In poglejmo, kaj se zdaj dogaja. 951 00:41:27,610 --> 00:41:29,840 Torej, na eni strani tu-- in dovolite mi, da 952 00:41:29,840 --> 00:41:32,680 to v skladu s prejšnjo Primer-- na eni strani, 953 00:41:32,680 --> 00:41:35,830 leva je to, kar v angleščini? 954 00:41:35,830 --> 00:41:36,493 To je-- 955 00:41:36,493 --> 00:41:37,701 OBČINSTVO: Ustvarjanje kazalec. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Ustvarjanje kazalec za notr in kliče je x. 957 00:41:40,830 --> 00:41:43,789 Torej, to je ustvariti eno od teh polj Držim risanje na zaslonu na dotik. 958 00:41:43,789 --> 00:41:45,913 In zdaj, na desni strani stran, malloc, seveda, 959 00:41:45,913 --> 00:41:47,420 se dodelijo kos pomnilnika. 960 00:41:47,420 --> 00:41:49,989 In samo zato, da bo jasno, kako pomnilnika je to očitno 961 00:41:49,989 --> 00:41:52,030 dodelitvijo, če vas le nekakšen math tukaj? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Torej, to je 40 bajtov. 964 00:41:54,040 --> 00:41:57,400 In vem, da samo zato, ker vem, int na CS50 aparata, vsaj 965 00:41:57,400 --> 00:41:58,060 je štiri bajte. 966 00:41:58,060 --> 00:41:59,610 Torej 10-krat 4 je 40. 967 00:41:59,610 --> 00:42:04,924 Torej, to je shranjevanje x, naslov prvega od 40 ints da 968 00:42:04,924 --> 00:42:07,340 so bili dodeljeni prostor nazaj, nazaj, nazaj, na hrbtni strani. 969 00:42:07,340 --> 00:42:08,470 >> In to je tisto, kar je ključnega pomena zaradi funkcije malloc. 970 00:42:08,470 --> 00:42:11,261 To ne bo malo pomnilnika tu, malo tu, malo tukaj. 971 00:42:11,261 --> 00:42:14,220 To vam daje en kos pomnilnika, contiguously, od poslovnih 972 00:42:14,220 --> 00:42:15,240 sistem. 973 00:42:15,240 --> 00:42:18,500 >> Kaj je zdaj to, x bracket 10 enaka 0? 974 00:42:18,500 --> 00:42:19,470 Samovoljno vrstica kode. 975 00:42:19,470 --> 00:42:21,100 To se ne doseže nič uporabnega. 976 00:42:21,100 --> 00:42:26,128 Zanimivo pa je, saj x nosilec 10--? 977 00:42:26,128 --> 00:42:26,628 Ja? 978 00:42:26,628 --> 00:42:27,912 >> OBČINSTVO: [neslišno]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x bracket 10 ni nujno, da je nična. 980 00:42:30,500 --> 00:42:35,070 Podrobnosti null šele prihaja v poštev z vrvicami, na koncu niza. 981 00:42:35,070 --> 00:42:36,700 Ampak dobra misel. 982 00:42:36,700 --> 00:42:39,615 >> Kako velika je ta matrika, čeprav čeprav sem namenila 40 bajtov? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 To je od 0 do devetih, kajne? 985 00:42:43,690 --> 00:42:45,120 To je 10 ints, skupaj. 986 00:42:45,120 --> 00:42:48,790 40 bajtov, ampak 10 ints, indeksirane 0 s 0. 987 00:42:48,790 --> 00:42:50,930 >> Torej, kaj je to x nosilec 10? 988 00:42:50,930 --> 00:42:53,090 To je pravzaprav nekaj neznano vrednost smeti. 989 00:42:53,090 --> 00:42:54,780 To je spomin, ki ne pripadajo meni. 990 00:42:54,780 --> 00:42:59,650 Ne bi dotikal Številka 41, 42, 43, 44 bajt. 991 00:42:59,650 --> 00:43:01,420 Jaz sem nekoliko pretirana. 992 00:43:01,420 --> 00:43:04,490 >> In res, če sem teči ta Program, bi bilo zelo dobro sesuje. 993 00:43:04,490 --> 00:43:05,790 Ampak včasih, bomo imeli srečo. 994 00:43:05,790 --> 00:43:07,706 In tako, samo da dokaže to-- in odkrito, 995 00:43:07,706 --> 00:43:11,000 nikoli ne veš, pred vami Ne tem-- pa vodijo to. 996 00:43:11,000 --> 00:43:12,480 To dejansko ni crash. 997 00:43:12,480 --> 00:43:15,032 >> Ampak, če sem to spremenili, za primer, da bi izgledal kot 1000, 998 00:43:15,032 --> 00:43:16,740 da bi se to res namerno, pa poglejmo 999 00:43:16,740 --> 00:43:18,710 če lahko dobim crash tokrat. 1000 00:43:18,710 --> 00:43:20,070 OK, da ne crash. 1001 00:43:20,070 --> 00:43:22,600 Kako približno 100.000? 1002 00:43:22,600 --> 00:43:25,000 Naj ga remake, in zdaj ga zaženite. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Fuj. 1005 00:43:25,960 --> 00:43:26,460 V redu. 1006 00:43:26,460 --> 00:43:29,090 Torej, očitno, še enkrat, ti segmenti pomnilnika, tako rekoč 1007 00:43:29,090 --> 00:43:32,660 so razmeroma velika, tako da bomo lahko priti spet in spet srečen. 1008 00:43:32,660 --> 00:43:36,510 Ampak na koncu, ko boste dobili smešno in res daleč ven na zaslonu, 1009 00:43:36,510 --> 00:43:39,120 se dotaknete spomin, da res, res ne pripada tebi. 1010 00:43:39,120 --> 00:43:40,870 >> Vendar odkrito povedano, to vrst hroščev se dogaja 1011 00:43:40,870 --> 00:43:43,020 da je težje in težje ugotoviti sami. 1012 00:43:43,020 --> 00:43:47,880 Toda na srečo, kot programerji, imamo orodja, ki nam omogočajo, da to stori za nas. 1013 00:43:47,880 --> 00:43:50,140 Torej to je, morda, ena od najgrša programov, 1014 00:43:50,140 --> 00:43:52,060 še grši kot izhod GDB je. 1015 00:43:52,060 --> 00:43:55,670 Ampak to je vedno črto ali dva, ki so zelo koristni. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind je program, ki pomaga niste debug program, per se, 1017 00:44:00,310 --> 00:44:03,500 toda našli povezano s pomnilniške Težave, posebej. 1018 00:44:03,500 --> 00:44:07,590 To bo samodejno zagnala svojo kodo za ti in poglej za vsaj dve stvari. 1019 00:44:07,590 --> 00:44:10,680 One, si naredil nekaj naključna, kot spomin na dotik 1020 00:44:10,680 --> 00:44:11,980 da ne pripada tebi? 1021 00:44:11,980 --> 00:44:13,590 To vam bo pomagal najti primere. 1022 00:44:13,590 --> 00:44:15,710 >> In drugič, da vam bo pomagal boste našli nekaj, kar se imenuje 1023 00:44:15,710 --> 00:44:19,270 pomnilniške puščanje, ki jih imamo popolnoma prezrt, naivno, 1024 00:44:19,270 --> 00:44:21,380 za nekaj časa in blaženo. 1025 00:44:21,380 --> 00:44:23,140 Ampak se je izkazalo, vse ta čas, kadar je to 1026 00:44:23,140 --> 00:44:26,620 ste jih imenuje getString v toliko naših programov, 1027 00:44:26,620 --> 00:44:28,930 ste asking poslovanja Sistem za spomin, 1028 00:44:28,930 --> 00:44:32,070 vendar imate spomin od kdaj ga daje 1029 00:44:32,070 --> 00:44:36,169 nazaj, delaš unalloc, ali free, kot je pozval. 1030 00:44:36,169 --> 00:44:37,960 Ne, ker nikoli nismo vas prosimo, da to storijo. 1031 00:44:37,960 --> 00:44:41,250 >> Ampak vse to čas, programi pišete v C 1032 00:44:41,250 --> 00:44:43,800 so pušča spomin, prosi poslovanja 1033 00:44:43,800 --> 00:44:46,190 Sistem za bolj pomnilnik za godala in drugih malenkosti, 1034 00:44:46,190 --> 00:44:47,870 ampak nikoli ne odnesete nazaj. 1035 00:44:47,870 --> 00:44:50,080 In zdaj je to malo iz poenostavljanje, 1036 00:44:50,080 --> 00:44:53,550 ampak, če ste kdaj zagnati vaš Mac ali računalnik že nekaj časa, otvoritev 1037 00:44:53,550 --> 00:44:55,790 Veliko programov, morda zapiranje programov, 1038 00:44:55,790 --> 00:44:57,795 in čeprav si Računalnik ni strmoglavilo, 1039 00:44:57,795 --> 00:45:01,690 to je že tako veliko počasnejši, kot da je to res 1040 00:45:01,690 --> 00:45:04,290 z veliko pomnilnika ali sredstev, čeprav 1041 00:45:04,290 --> 00:45:06,070 če nisi niti pritiskom na tipkovnico, 1042 00:45:06,070 --> 00:45:10,430 da bi bilo-- vendar ne zmeraj-- bi je, da so programi delate 1043 00:45:10,430 --> 00:45:11,920 imajo sami spomin razpoka. 1044 00:45:11,920 --> 00:45:15,645 In vodijo prosi OS za več in več pomnilnika, vendar pozabljamo na to, 1045 00:45:15,645 --> 00:45:18,470 dejansko ne uporabljajo, vendar Zato ob spomin stran 1046 00:45:18,470 --> 00:45:20,500 iz drugih programov, ki bi to želeli. 1047 00:45:20,500 --> 00:45:23,940 , Tako da je skupna razlaga. 1048 00:45:23,940 --> 00:45:25,940 Zdaj tukaj je, kjer je Valgrind izhod je popolnoma 1049 00:45:25,940 --> 00:45:29,290 odvratne do tistih manj in bolj udobno podobni. 1050 00:45:29,290 --> 00:45:32,690 Ampak zanimivo stvar je tukaj gor. 1051 00:45:32,690 --> 00:45:37,060 To mi je povedal neveljavno pisati o Velikost štiri zgodi v tem programu, 1052 00:45:37,060 --> 00:45:40,640 zlasti na liniji 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Če grem na linijo 21, hm, je res je neveljaven write velikosti štiri. 1054 00:45:45,450 --> 00:45:46,250 Zakaj velikost štiri? 1055 00:45:46,250 --> 00:45:49,500 No, to number-- in lahko anything-- je int. 1056 00:45:49,500 --> 00:45:50,450 Torej, to je štiri bajte. 1057 00:45:50,450 --> 00:45:52,550 Torej bom dal štiri bajte če ne pripadajo. 1058 00:45:52,550 --> 00:45:55,080 To je tisto, Valgrind pravzaprav mi povedal. 1059 00:45:55,080 --> 00:45:57,600 Poleg tega bo tudi to povej mi, kot bomo videli, 1060 00:45:57,600 --> 00:46:01,490 kot zaženete to v prihodnjem pset, če in ko ste ušli spomin, ki ga sicer 1061 00:46:01,490 --> 00:46:05,300 Imam, ker sem poklical malloc, vendar imam dejansko ne 1062 00:46:05,300 --> 00:46:08,010 imenuje, v tem primeru, brez, katerih bomo sčasoma videli 1063 00:46:08,010 --> 00:46:09,830 je nasprotje funkcije malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Torej, zdaj, mislim, končno zgled. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Torej, to je malo več Skrivnosten, vendar je morda 1068 00:46:16,690 --> 00:46:19,180 Največji razlog, da bodite previdni s spominom, 1069 00:46:19,180 --> 00:46:24,490 in razlog, da mnogi programi in / ali spletnih strežnikov, tudi na ta dan, 1070 00:46:24,490 --> 00:46:28,200 prevzemal slabih fantov nekje na internetu, ki so nekako 1071 00:46:28,200 --> 00:46:33,390 pošiljanje lažnih paketov s strežnikom poskuša ogroziti svoje račune, 1072 00:46:33,390 --> 00:46:36,420 ali pa svoje podatke, ali pa samo običajno prevzame stroj. 1073 00:46:36,420 --> 00:46:38,910 Prekoračitev medpomnilnika, kot ime pove, sredstva 1074 00:46:38,910 --> 00:46:40,740 prepolno ne int, ampak varovalo. 1075 00:46:40,740 --> 00:46:43,490 In buffer je samo fancy način bi rekel, da je kup pomnilnika. 1076 00:46:43,490 --> 00:46:46,710 >> In res, sem poklical niz pred buffer, namesto s. 1077 00:46:46,710 --> 00:46:49,234 Ker če je buffer, kot v smislu, YouTube, 1078 00:46:49,234 --> 00:46:52,400 ali kadarkoli gledate video, ste morda videli besedo buffering, 1079 00:46:52,400 --> 00:46:53,040 pika, pika, pika. 1080 00:46:53,040 --> 00:46:54,240 To je zelo nadležno. 1081 00:46:54,240 --> 00:46:55,990 In to samo pomeni, da vaš video predvajalnik 1082 00:46:55,990 --> 00:46:58,710 poskuša prenesti veliko bajtov, veliko bajtov 1083 00:46:58,710 --> 00:47:00,170 iz videa na internetu. 1084 00:47:00,170 --> 00:47:02,920 Ampak to je počasna, tako da poskuša prenesti kup njih 1085 00:47:02,920 --> 00:47:06,430 zapolniti pufer, vsebnik, tako da imate dovolj bajte, da lahko potem 1086 00:47:06,430 --> 00:47:09,174 vam pokažem video, brez premori ves čas. 1087 00:47:09,174 --> 00:47:11,340 Ampak se je izkazalo, da lahko ima varovalo za tako velik. 1088 00:47:11,340 --> 00:47:15,710 Vendar poskusite dati toliko podatkov je, in zelo slabe stvari se lahko zgodi. 1089 00:47:15,710 --> 00:47:22,780 Torej za primer si oglejmo ta zadnji teaser za primer. 1090 00:47:22,780 --> 00:47:24,720 To je še en program, da, na prvi pogled, 1091 00:47:24,720 --> 00:47:26,540 ne naredi ničesar super uporabne. 1092 00:47:26,540 --> 00:47:29,590 Ima glavno funkcijo ki zahteva, da je funkcija, f. 1093 00:47:29,590 --> 00:47:36,640 In da je funkcija f, tu ima char niz, ki se imenuje c, velikosti 12. 1094 00:47:36,640 --> 00:47:39,340 In potem je z uporabo tega Nova funkcija imenuje strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Izkazalo se je, da je s to preprosto, preprosta vrstica kode, le dve vrstici, 1097 00:47:45,190 --> 00:47:49,130 smo naredili svoj celoten program, in zato je moj celoten računalnik, 1098 00:47:49,130 --> 00:47:54,000 in moj uporabniški račun, in moje trdo voziti potencialno ranljiva za vsakogar 1099 00:47:54,000 --> 00:47:58,170 kdo ve, in je dovolj dober, da delujejo ta program z določeno ukazno vrstico 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Z drugimi besedami, če je ta slab človek postavlja znotraj argvargv [1], ki jih vnesete 1102 00:48:03,400 --> 00:48:08,750 na tipkovnici zelo posebej oblikovana niz, ne abc, 123, toda v bistvu 1103 00:48:08,750 --> 00:48:15,180 binarnih simbolov izvršljiv koda, program, ki je on ali ona je zapisal, 1104 00:48:15,180 --> 00:48:19,190 s tem preprostim programom, ki je Predstavnik tisoče programov 1105 00:48:19,190 --> 00:48:23,610 , ki so prav tako ranljivi, si trditi, on ali ona lahko dokončno izbrišete vse 1106 00:48:23,610 --> 00:48:26,680 datoteke na mojem trdem disku, dobite utripa poziv, tako da je on ali ona lahko 1107 00:48:26,680 --> 00:48:30,170 vpisovati ukaze na svoje, email vse datoteke zase. 1108 00:48:30,170 --> 00:48:34,660 Vse, kar lahko storim, je ali ona lahko storite s to kodo. 1109 00:48:34,660 --> 00:48:36,575 >> Ne bomo povsem rešila to še. 1110 00:48:36,575 --> 00:48:38,700 In v resnici gre za vključuje malo sliko 1111 00:48:38,700 --> 00:48:41,470 kot je ta, ki bomo kmalu razumeti vse bolje. 1112 00:48:41,470 --> 00:48:44,480 Ampak za danes, pa se konča kaj je, upajmo, nekoliko bolj 1113 00:48:44,480 --> 00:48:48,360 Razumljivo XKCD šala, dokler ne bomo spet naslednjič. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 V redu. 1116 00:48:51,600 --> 00:48:53,446 Se vidimo v sredo. 1117 00:48:53,446 --> 00:48:54,754 >> [Predvajanje glasbe] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: In zdaj, globoko misli, ki jih Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Spomin je kot skok v kup zlatimi listi na nedeljsko popoldne. 1121 00:49:04,770 --> 00:49:09,000 Veter piha, premetavala vaš lase-- oh, pogrešam dnevi when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Smeh] 1124 00:49:12,650 --> 00:49:13,750