1 00:00:00,000 --> 00:00:10,970 >> [Predvajanja glasbe] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan V redu. 3 00:00:12,536 --> 00:00:13,392 >> [SMEH] 4 00:00:13,392 --> 00:00:14,240 >> Dobrodošel nazaj. 5 00:00:14,240 --> 00:00:14,990 To je CS50. 6 00:00:14,990 --> 00:00:16,890 In to konec petih teden. 7 00:00:16,890 --> 00:00:20,020 In do sedaj, smo precej jemala za samoumevno, da obstaja 8 00:00:20,020 --> 00:00:23,480 obstaja ta prevajalnik, Zvoka, ki ste se sklicuje na podlagi tega 9 00:00:23,480 --> 00:00:27,100 drugo orodje, imenovano Poskrbite, da nekako čudežno pretvori izvorno kodo 10 00:00:27,100 --> 00:00:31,350 v objektni kodi, ničel in enic da je vaš računalnik CPU, centralno 11 00:00:31,350 --> 00:00:33,410 procesna enota, dejansko razume. 12 00:00:33,410 --> 00:00:36,770 Vendar se izkaže, da je številka, ki je dogaja pod pokrovom v 13 00:00:36,770 --> 00:00:38,690 med vhodom in izhodom. 14 00:00:38,690 --> 00:00:41,800 >> In bi rad predlagal, da meso da v malo bolj podrobno v 15 00:00:41,800 --> 00:00:45,130 Ti štirje koraki, je nekaj, kar ti predobdelavo, kaj 16 00:00:45,130 --> 00:00:48,300 imenujemo združevanje, kar smo videli, nekaj, kar se imenuje montažo in 17 00:00:48,300 --> 00:00:49,420 nekaj, kar se imenuje povezovanje. 18 00:00:49,420 --> 00:00:53,270 Torej, do sedaj, v nekaterih naših Programi, ki smo jih imeli oster vključuje. 19 00:00:53,270 --> 00:00:56,650 Pred kratkim smo imeli nekaj ostrih definira konstant. 20 00:00:56,650 --> 00:01:00,660 Tako se izkaže, da tiste stvari, ki imajo predpono razpršitve simbol ali 21 00:01:00,660 --> 00:01:04,150 Simbol funt, so pre-procesor direktive. 22 00:01:04,150 --> 00:01:07,960 To je samo fancy način rekel, da je vrstica kode, ki je dejansko 23 00:01:07,960 --> 00:01:12,280 pretvori v nekaj drugega, preden Računalnik celo poskušali spremeniti svoje 24 00:01:12,280 --> 00:01:13,800 Program v ničel in enic. 25 00:01:13,800 --> 00:01:19,000 >> Na primer, oster vključuje standarda I / O. H, precej preprosto pomeni iti 26 00:01:19,000 --> 00:01:24,010 naprej, zgrabite vsebino datotek stdio.h in jih prilepite tam. 27 00:01:24,010 --> 00:01:25,880 Torej brez ničle in enice na še te točke. 28 00:01:25,880 --> 00:01:27,470 To je res samo zamenjavo. 29 00:01:27,470 --> 00:01:30,790 In to je storil v času tako imenovane faza predobdelavo, ko 30 00:01:30,790 --> 00:01:34,230 dejansko vozijo Jek ali posebej Da v večini primerov. 31 00:01:34,230 --> 00:01:36,950 Torej, vse to se je dogajalo Prvi samodejno doslej. 32 00:01:36,950 --> 00:01:38,800 >> Sledi priprava korak. 33 00:01:38,800 --> 00:01:40,920 Vendar so nam poenostavljeno kompilacija. 34 00:01:40,920 --> 00:01:45,060 Prevajali programa v resnici pomeni, da vzemi od nekaj podobnega C, 35 00:01:45,060 --> 00:01:48,430 Izvorna koda smo bili pisno, navzdol za nekaj, kar se imenuje zbor. 36 00:01:48,430 --> 00:01:52,900 Jezik zbor je na nižji ravni jezik, ki je, na srečo, ne bomo 37 00:01:52,900 --> 00:01:55,480 so veliko priložnost napisati ta semester. 38 00:01:55,480 --> 00:01:59,100 Ampak to je na najnižji ravni v Občutek, da ste dobesedno začnete pisati 39 00:01:59,100 --> 00:02:04,270 dodajajo ali odvzemajo in množijo in obremenitev iz spomina in shranite v spomin, 40 00:02:04,270 --> 00:02:08,259 Zelo osnovna navodila, da računalnik, Pod pokrovom motorja, 41 00:02:08,259 --> 00:02:09,639 dejansko razume. 42 00:02:09,639 --> 00:02:14,930 >> Končno, montaža nesramno jezik na ničel in enic, ki smo bili 43 00:02:14,930 --> 00:02:16,190 opisovanju doslej. 44 00:02:16,190 --> 00:02:19,270 In res zadnjič, da je tako imenovani povezovanje fazo, ki bomo 45 00:02:19,270 --> 00:02:22,360 glej vsak trenutek, ki združuje vaše ničle in enice z ničlami ​​in 46 00:02:22,360 --> 00:02:24,870 tisti drugi ljudje pred ki ste jih ustvarili. 47 00:02:24,870 --> 00:02:26,660 >> Tako da je to super preprost program. 48 00:02:26,660 --> 00:02:27,560 Bilo je iz tedna 1. 49 00:02:27,560 --> 00:02:29,610 Prav tako je dejal, Hello World, na zaslonu. 50 00:02:29,610 --> 00:02:30,920 To smo tekel skozi Jek. 51 00:02:30,920 --> 00:02:33,200 Ali smo tekel je skozi Znamka ki je potekal Jek. 52 00:02:33,200 --> 00:02:36,170 In outputted takrat, kadar nekateri ničle in enice. 53 00:02:36,170 --> 00:02:38,100 Vendar se izkaže, da je vmesni korak. 54 00:02:38,100 --> 00:02:40,460 Če grem tja - ups, ni rad bi ga videl še. 55 00:02:40,460 --> 00:02:44,800 Če grem tukaj v mojo naprave in sem odprla hello.c, tukaj 56 00:02:44,800 --> 00:02:46,160 je, da je isti program. 57 00:02:46,160 --> 00:02:48,600 In kaj bom naredil v mojem terminalu okno, tukaj se bom 58 00:02:48,600 --> 00:02:51,430 teči Jek namesto Znamka, ki avtomatizira vse štiri 59 00:02:51,430 --> 00:02:52,870 omenjeni koraki za nas. 60 00:02:52,870 --> 00:02:58,620 In bom naredil Jek-S in potem hello.c in nato enter. 61 00:02:58,620 --> 00:03:00,590 >> In dobim utripa hitro enkrat, kar je dobro. 62 00:03:00,590 --> 00:03:05,280 In zdaj v nekoliko večjem oknu Grem odpreti gedit tukaj. 63 00:03:05,280 --> 00:03:09,610 In jaz bom odpreti datoteko, da, Izkazalo se je, se imenuje hello.s to 64 00:03:09,610 --> 00:03:11,870 vsebuje to zbirni jezik Sem prej omenil. 65 00:03:11,870 --> 00:03:15,060 In to je tisto, kar se imenuje skupščina jezik, dokaj nizka stopnja 66 00:03:15,060 --> 00:03:18,470 navodila, ki vam Intel CPU ali karkoli že je, da je notri 67 00:03:18,470 --> 00:03:19,350 razume. 68 00:03:19,350 --> 00:03:24,480 In mov je za potezo. Razpis je namenjen kliče, funkcijo zelo nizki ravni. 69 00:03:24,480 --> 00:03:26,380 sub je za odštevanje. 70 00:03:26,380 --> 00:03:30,370 >> Torej, če imate posebno CPU v notranjosti vašega računalnika, zaradi česar je 71 00:03:30,370 --> 00:03:34,300 različni, v primerjavi z drugimi procesorjev na trg, ki je navodila za to 72 00:03:34,300 --> 00:03:39,460 razume in pogosto, kako učinkovit je je, kako hitro je pri izvajanju del 73 00:03:39,460 --> 00:03:40,380 teh navodil. 74 00:03:40,380 --> 00:03:45,150 Zdaj več o tem, si lahko Naslednja Fall CS61 na šoli. 75 00:03:45,150 --> 00:03:48,170 Ampak tukaj smo, na primer, nekaj identifikatorje, ki bi zgledal seznanjeni. 76 00:03:48,170 --> 00:03:50,150 hello.c je ime programa. 77 00:03:50,150 --> 00:03:51,070 >> . Besedilo - 78 00:03:51,070 --> 00:03:54,190 ni veliko zanimanja ni šele zdaj, opozarjajo, da besedilo 79 00:03:54,190 --> 00:03:59,190 Segment, kot v ponedeljek, je, če v Pomnilnik vaš program dejansko konča. 80 00:03:59,190 --> 00:04:01,330 Tako da je vsaj nejasno ni znano. 81 00:04:01,330 --> 00:04:03,730 Pri tem je seveda omenjena naše glavno funkcijo. 82 00:04:03,730 --> 00:04:07,220 Drsenje navzdol, ti se nanašajo na stvari ti registri, zelo majhne kose 83 00:04:07,220 --> 00:04:09,190 spomin znotraj vašega dejanskega CPU. 84 00:04:09,190 --> 00:04:12,930 In če sem se pomaknite navzdol celo še vidim neko 85 00:04:12,930 --> 00:04:14,240 posredna omemba ASCII. 86 00:04:14,240 --> 00:04:17,120 In tam, res je, da niz Pozdravljeni, vejica, svet. 87 00:04:17,120 --> 00:04:20,079 >> Tako da skrajšam zgodbo, je bilo to dogaja za vami, samodejno, 88 00:04:20,079 --> 00:04:22,140 Pod pokrovom vsem tem času. 89 00:04:22,140 --> 00:04:26,450 In kaj je bilo v resnici dogaja, ko ste teči Jek, ali z 90 00:04:26,450 --> 00:04:29,150 Poskrbite, da ste najprej dobili, iz izvorne kode, 91 00:04:29,150 --> 00:04:30,700 tako imenovani zbirni jezik. 92 00:04:30,700 --> 00:04:35,210 Potem je Jek pretvarjanjem te skupščine jezik do ničel in enic. 93 00:04:35,210 --> 00:04:38,340 In to je stran, ki smo začeli naša razprava v tednu 0 o - 94 00:04:38,340 --> 00:04:39,840 in nato teden 1 naprej. 95 00:04:39,840 --> 00:04:44,030 In potem končno, tisti ničle in enice so v kombinaciji z ničle in enice 96 00:04:44,030 --> 00:04:47,190 od teh knjižnic smo bili ob za samoumevne, kot so Standard I / O ali 97 00:04:47,190 --> 00:04:50,010 Niz knjižnica ali celo CS50 knjižnica. 98 00:04:50,010 --> 00:04:54,200 >> Torej slikati to sliko več vizualno, imamo hello.c. 99 00:04:54,200 --> 00:04:57,220 In to seveda uporablja printf deluje reči, zdravo svet. 100 00:04:57,220 --> 00:05:01,810 Korak kompilacija odnese navzdol da datoteka smo pravkar videli hello.s, čeprav 101 00:05:01,810 --> 00:05:04,290 čeprav to je tipično črta Za vas samodejno. 102 00:05:04,290 --> 00:05:06,050 Ampak to je koda montaža v srednjem koraku. 103 00:05:06,050 --> 00:05:09,750 In potem, ko smo sestavite sklop jezik, tako rekoč, da je, ko ste 104 00:05:09,750 --> 00:05:10,830 dobili tiste ničle in enice. 105 00:05:10,830 --> 00:05:13,920 Tako smo v povečani dejansko danes na kar smo jemali za samoumevno, 106 00:05:13,920 --> 00:05:16,430 pomeni dogaja izvorno kodo do ugovora kodo. 107 00:05:16,430 --> 00:05:18,850 >> Ampak na koncu, zdaj, ista slika - dajmo se posloviš prenesejo 108 00:05:18,850 --> 00:05:20,020 leva stran. 109 00:05:20,020 --> 00:05:22,880 In ne pozabite, da na vrhu ni Omenil sem stdio.h. 110 00:05:22,880 --> 00:05:25,030 To je datoteka, ki smo vključeni v skoraj vseh 111 00:05:25,030 --> 00:05:26,250 Programi, ki smo jih napisali. 112 00:05:26,250 --> 00:05:28,830 In to je datoteka, katere vsebina se prilepili kopija, 113 00:05:28,830 --> 00:05:30,350 učinkovito vrhu kodo. 114 00:05:30,350 --> 00:05:34,170 Ampak se je izkazalo, da je na računalniku Sistem nekje, tam je menda 115 00:05:34,170 --> 00:05:39,150 stdio.c datoteke, da je nekdo napisal leta nazaj, da izvaja vse 116 00:05:39,150 --> 00:05:41,870 Naloge, ki so bile razglašene v stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Zdaj v resnici je to verjetno ni na vaš Mac ali osebni računalnik, ali celo v 118 00:05:45,465 --> 00:05:47,660 CS50 aparat surovo kodo C. 119 00:05:47,660 --> 00:05:52,710 Nekdo je že zbrani in vključeni . O datoteko za objektni kodi ali. 120 00:05:52,710 --> 00:05:56,020 datoteke, ki se nanaša na skupni knjižnici , ki je bil predhodno nameščen in 121 00:05:56,020 --> 00:05:57,240 predhodno pripravijo za vas. 122 00:05:57,240 --> 00:06:01,950 Recimo, da je dejansko obstaja na našem računalniku stdio.c vzporedno 123 00:06:01,950 --> 00:06:02,650 z Jek. 124 00:06:02,650 --> 00:06:04,960 Kodo, ki je sestavljen in sestavljeni. 125 00:06:04,960 --> 00:06:09,200 stdio.c je koda, ki se zbirajo in sestavljeni tako, da prav ta zadnja 126 00:06:09,200 --> 00:06:13,730 korak, tukaj moramo nekako povezave, tako rekoč, vaši ničle in enice 127 00:06:13,730 --> 00:06:18,430 s svojo ničel in enic v enem preprost program, ki je navsezadnje 128 00:06:18,430 --> 00:06:20,540 imenovana le Pozdravljeni. 129 00:06:20,540 --> 00:06:23,340 >> Tako, da je vse od magije, ki je se je dogajalo doslej. 130 00:06:23,340 --> 00:06:26,430 In bo še naprej ti Postopki za odobreno, vendar zavedaš 131 00:06:26,430 --> 00:06:28,750 tam je veliko sočnih podrobnosti dogaja tukaj spodaj. 132 00:06:28,750 --> 00:06:31,920 In to je tisto, kar naredi vaše računalnik z Intel notranjosti 133 00:06:31,920 --> 00:06:33,940 predvsem različni. 134 00:06:33,940 --> 00:06:37,020 >> Torej na tej opombi, če bi želeli Pridružite se nam na kosilo v petek, to go 135 00:06:37,020 --> 00:06:41,570 na običajnem mestu cs50.net/rsvp, 13:15 ta petek. 136 00:06:41,570 --> 00:06:43,400 In zdaj nekaj objav. 137 00:06:43,400 --> 00:06:44,670 Tako da imamo nekaj dobrih novic. 138 00:06:44,670 --> 00:06:45,970 In imamo slabe novice. 139 00:06:45,970 --> 00:06:47,260 Začnite z dobrimi novicami tukaj. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Stoka] 142 00:06:54,510 --> 00:06:54,710 >> Vse je v redu. 143 00:06:54,710 --> 00:06:56,670 No, to je tehnično praznik, tako to ni tako veliko darilo od nas. 144 00:06:56,670 --> 00:06:58,030 Ampak potem slaba novica seveda. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Stoka] 147 00:07:01,880 --> 00:07:03,530 >> Veliko časa sem preživel na teh animacij. 148 00:07:03,530 --> 00:07:04,690 >> [SMEH] 149 00:07:04,690 --> 00:07:07,000 >> Tam se bo zasedanje pregled ta prihaja v ponedeljek. 150 00:07:07,000 --> 00:07:08,340 To se dogaja, da se ob 05:30. 151 00:07:08,340 --> 00:07:11,210 Mi vas bo spomnil vseh teh podrobnosti po elektronski pošti na tečaj je 152 00:07:11,210 --> 00:07:13,470 Spletna stran v samo nekaj dni časa. 153 00:07:13,470 --> 00:07:16,610 To bo posnet in na voljo kmalu zatem. 154 00:07:16,610 --> 00:07:19,200 Torej, če ne morete narediti, da je ponedeljek noč slot, ne skrbite. 155 00:07:19,200 --> 00:07:22,270 Oddelki to prihaja teden bo tudi osredotočiti na pregledu za kviz. 156 00:07:22,270 --> 00:07:25,670 Če je vaš oddelek je v ponedeljek, ki je res univerza počitnice, bomo 157 00:07:25,670 --> 00:07:26,920 Še vedno sestajajo v oddelku. 158 00:07:26,920 --> 00:07:28,890 Če ste preprosto ne more, da oddelek, saj boste 159 00:07:28,890 --> 00:07:29,860 proč, da je v redu. 160 00:07:29,860 --> 00:07:33,710 Udeležite se v nedeljo ali torek odsek ali tune-v razdelek Jasona, ki je 161 00:07:33,710 --> 00:07:35,110 na voljo na spletu. 162 00:07:35,110 --> 00:07:37,490 >> Torej, bolj slabe novice. 163 00:07:37,490 --> 00:07:41,960 Torej, v skladu z učnim načrtom, imamo predavanje naslednji petek. 164 00:07:41,960 --> 00:07:43,690 Ampak dobra novica - 165 00:07:43,690 --> 00:07:44,860 jasno je, da sem porabil preveč časa za to. 166 00:07:44,860 --> 00:07:45,280 >> [SMEH] 167 00:07:45,280 --> 00:07:47,140 >> Poleg predavanj v petek bomo preklicati. 168 00:07:47,140 --> 00:07:50,590 Tako da bo darilo za nas, tako da boste lahko res lepo predaha v 169 00:07:50,590 --> 00:07:52,990 med tem tednu do dveh tednov od tod. 170 00:07:52,990 --> 00:07:57,460 Tako da ni predavanja naslednji teden, samo majhen mali kviz, za katere si je treba 171 00:07:57,460 --> 00:07:59,030 postaja vedno bolj navdušena. 172 00:07:59,030 --> 00:08:03,870 >> Torej, kaj je zdaj pa našo pozornost nekaj, kar je res bolj vizualna 173 00:08:03,870 --> 00:08:06,990 in bolj razburljivo in določiti stopnjo za to, kar se dogaja, da se na obzorju 174 00:08:06,990 --> 00:08:08,420 V samo nekaj tednov časa. 175 00:08:08,420 --> 00:08:12,160 Po prvem kvizu, bomo pa osredotočiti naših problemskih sklopov v drugo 176 00:08:12,160 --> 00:08:16,710 domena poseben problem, da od forenzika ali varnostnih bolj na splošno. 177 00:08:16,710 --> 00:08:19,550 >> V bistvu, tradicija s tem problemom Niz je zame eden 178 00:08:19,550 --> 00:08:24,850 poučevanje kolegi ali CAS hoditi po kampus ob nekaj fotografij 179 00:08:24,850 --> 00:08:29,450 razpoznavna, vendar brez očitnih ljudi, krajev ali stvari, potem vsako leto sem 180 00:08:29,450 --> 00:08:34,520 nekako uspelo, da izbrišete ali poškodujete digitalne pomnilniške kartice 181 00:08:34,520 --> 00:08:35,720 da je znotraj našega fotoaparata. 182 00:08:35,720 --> 00:08:36,860 Ampak nič posebnega. 183 00:08:36,860 --> 00:08:39,200 Lahko grem naprej in priključite da v mojem računalniku. 184 00:08:39,200 --> 00:08:43,010 Lahko bi forenzične podobo tega, da govoriti, s kopiranjem ničle in 185 00:08:43,010 --> 00:08:46,830 tisti off te pomnilniško kartico, bodisi njegova SD kartico ali kartico Compact Flash ali 186 00:08:46,830 --> 00:08:48,100 karkoli ste seznanjeni s. 187 00:08:48,100 --> 00:08:49,300 In potem bomo lahko predali da ven. 188 00:08:49,300 --> 00:08:53,190 >> In tako izziv, med drugim stvari za vas, bo za pisanje 189 00:08:53,190 --> 00:08:58,630 C koda, ki okreva cel kup JPEG za mano in pokazala se bo 190 00:08:58,630 --> 00:09:00,190 tisti ljudje, kraji ali stvari. 191 00:09:00,190 --> 00:09:03,340 In bomo tudi govorili, da ta problem nastavljena in v dneh, ki prihajajo, o 192 00:09:03,340 --> 00:09:04,440 Grafika je bolj na splošno. 193 00:09:04,440 --> 00:09:06,140 Mi smo jih uporabljali, tečaj, za izbruhnejo. 194 00:09:06,140 --> 00:09:09,080 Vendar ste nekako samoumevno obstaja ti pojmi na visoki ravni 195 00:09:09,080 --> 00:09:10,680 kvadratkov in ovala. 196 00:09:10,680 --> 00:09:12,450 Ampak pod pokrovom obstajajo pik. 197 00:09:12,450 --> 00:09:14,370 In ste morali začeti razmišljanja o njih. 198 00:09:14,370 --> 00:09:18,800 Ali boste za p-set 4 razmišljati o razliki med vašim opeke, kako 199 00:09:18,800 --> 00:09:21,990 Hitro ste se žoga letela čez zaslon za izbruhnejo. 200 00:09:21,990 --> 00:09:24,830 Tako da je ta pojem pike na zaslonu, ki je 201 00:09:24,830 --> 00:09:26,290 pridejo v poštev že. 202 00:09:26,290 --> 00:09:29,430 >> Kaj zdaj vidiš, čeprav je kaj prideš na računalniškem zaslonu. 203 00:09:29,430 --> 00:09:33,680 Če ste kdaj gledali nekaj dobrega ali slab TV, odds so precej 204 00:09:33,680 --> 00:09:36,280 zdravljenje občinstvo kot technophobes , ki v resnici ne 205 00:09:36,280 --> 00:09:37,630 vem veliko o računalništvu. 206 00:09:37,630 --> 00:09:40,840 In tako je zelo enostaven za policijo detektiv reči, lahko 207 00:09:40,840 --> 00:09:41,710 poskrbel, da za mene? 208 00:09:41,710 --> 00:09:42,710 Ali okrepiti, kajne? 209 00:09:42,710 --> 00:09:45,550 Okrepiti je kot buzz besedo Najbolj vsaka predstava povezan kriminal. 210 00:09:45,550 --> 00:09:49,240 In realnost je, če ste vzeli zelo zamegljena slika osumljenca početje 211 00:09:49,240 --> 00:09:51,620 nekaj slabega, ne moreš samo poveča. 212 00:09:51,620 --> 00:09:53,080 Ne morete povečati neskončno. 213 00:09:53,080 --> 00:09:56,350 Ne morete videti v sijočimi od nekdo oči, ki so se zavezali, da 214 00:09:56,350 --> 00:09:59,860 Zlasti kriminal, kljub Prevalenca tega na TV. 215 00:09:59,860 --> 00:10:04,110 >> In tako s tem pa motivirati, da prihajajoči problem določijo s pogled na 216 00:10:04,110 --> 00:10:05,765 nekateri kažejo s katero boste seznanjeni. 217 00:10:05,765 --> 00:10:06,500 >> [Predvajanje videa] 218 00:10:06,500 --> 00:10:07,835 >> -V redu. 219 00:10:07,835 --> 00:10:09,956 Zdaj pa bi dobili dober pogled na vas. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> Jo-Drži. 222 00:10:17,766 --> 00:10:18,658 Teči nazaj. 223 00:10:18,658 --> 00:10:19,550 >> -Čakaj malo. 224 00:10:19,550 --> 00:10:21,580 Pojdi desno. 225 00:10:21,580 --> 00:10:21,800 >> -Tukaj je. 226 00:10:21,800 --> 00:10:22,690 Zamrzne, da. 227 00:10:22,690 --> 00:10:23,692 >> -Cel zaslon. 228 00:10:23,692 --> 00:10:23,846 >> -V redu. 229 00:10:23,846 --> 00:10:24,154 Zamrzne, da. 230 00:10:24,154 --> 00:10:25,140 >> -Privijte na to, bo ya? 231 00:10:25,140 --> 00:10:27,090 >> -Vektor na navedenem tipu z zadnje kolo. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom tukaj na tem mestu. 233 00:10:29,730 --> 00:10:33,700 >> -S pravo opremo, posnel se lahko poveča in oster. 234 00:10:33,700 --> 00:10:34,490 >> Kaj je to? 235 00:10:34,490 --> 00:10:35,870 >> -To je program za izboljšanje. 236 00:10:35,870 --> 00:10:36,793 >> -Ali lahko jasno, da se vse? 237 00:10:36,793 --> 00:10:38,560 >> -Ne vem. 238 00:10:38,560 --> 00:10:39,090 Dajmo ga izboljšali. 239 00:10:39,090 --> 00:10:41,690 >> -Stopnjevati oddelek-6. 240 00:10:41,690 --> 00:10:43,510 >> -I povečala podrobnosti in - 241 00:10:43,510 --> 00:10:44,456 >> -Mislim, da je dovolj, da se poveča. 242 00:10:44,456 --> 00:10:45,402 Ga spustite na mojem zaslonu. 243 00:10:45,402 --> 00:10:47,300 >> -Povečati odsev v očeh. 244 00:10:47,300 --> 00:10:49,330 >> -Naj teče skozi to video opremo. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, lahko poveča to? 246 00:10:50,340 --> 00:10:52,320 >> -Drži. 247 00:10:52,320 --> 00:10:54,290 >> So-Sedaj sem se vrnil delajo podlagi tega razmisleka. 248 00:10:54,290 --> 00:10:55,560 >> -Nekdo je refleksija. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Tam je odraz od moškega obraza. 251 00:10:57,940 --> 00:10:58,860 >> -Refleksija. 252 00:10:58,860 --> 00:10:59,710 >> -Tam je refleksija. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom v na ogledalu. 254 00:11:00,900 --> 00:11:03,500 >> -Lahko vidim odsev. 255 00:11:03,500 --> 00:11:04,700 >> -Ali lahko izboljšali podobo od tukaj? 256 00:11:04,700 --> 00:11:05,700 >> -Ga lahko poveča tukaj? 257 00:11:05,700 --> 00:11:06,500 >> -Lahko ga izboljšali? 258 00:11:06,500 --> 00:11:07,380 >> -Lahko ga izboljšali? 259 00:11:07,380 --> 00:11:08,190 >> -Se lahko poveča to? 260 00:11:08,190 --> 00:11:08,940 >> -Lahko ga izboljšali? 261 00:11:08,940 --> 00:11:10,280 >> -Počakaj trenutek, bom okrepitev. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom na na vrata. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [SMEH] 266 00:11:13,197 --> 00:11:14,360 >> -Pojdi noter 267 00:11:14,360 --> 00:11:15,100 >> -Čakaj, ustavi. 268 00:11:15,100 --> 00:11:15,740 >> -Nehaj. 269 00:11:15,740 --> 00:11:16,290 >> Jo-premor. 270 00:11:16,290 --> 00:11:19,390 >> -Zavrti za 75 stopinj okrog vertikalni prosim. 271 00:11:19,390 --> 00:11:19,886 >> [SMEH] 272 00:11:19,886 --> 00:11:24,350 >> -Stop in nazaj na delu o vratih znova. 273 00:11:24,350 --> 00:11:26,330 >> -Imam sliko ojačevalec da lahko bitne slike? 274 00:11:26,330 --> 00:11:28,990 >> Mogoče bomo lahko uporabite Pradeep Sen Metoda videti v oknih. 275 00:11:28,990 --> 00:11:30,680 >> -Ta programska oprema je stanje tehnike. 276 00:11:30,680 --> 00:11:31,676 >> -Vrednost ikona je izklopljen. 277 00:11:31,676 --> 00:11:34,166 >> -S pravo kombinacijo algoritmov. 278 00:11:34,166 --> 00:11:38,399 >> -Vzel je osvetlitev algoritmov Naslednja raven in da jih lahko uporabijo za 279 00:11:38,399 --> 00:11:38,648 izboljšanje tega fotografijo. 280 00:11:38,648 --> 00:11:42,050 >> -Lock naprej in povečati z-osi. 281 00:11:42,050 --> 00:11:42,760 >> -Stopnjevati. 282 00:11:42,760 --> 00:11:43,060 >> -Stopnjevati. 283 00:11:43,060 --> 00:11:43,760 >> -Stopnjevati. 284 00:11:43,760 --> 00:11:45,010 >> -Freeze in okrepiti. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END predvajanje videa] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Torej Problem Set 5 je tisto, kar nas čaka tam. 288 00:11:51,470 --> 00:11:55,260 Tako da bomo kmalu dobili boljše razumevanje o tem, kdaj in zakaj lahko 289 00:11:55,260 --> 00:11:57,300 in naše ni mogoče povečati na ta način. 290 00:11:57,300 --> 00:12:00,090 Ampak najprej, kaj je vrniti našo pozornost nekatere od gradnikov bomo 291 00:12:00,090 --> 00:12:02,250 morajo biti sposobni povedati to zgodbo. 292 00:12:02,250 --> 00:12:05,580 >> Tako opozarjajo, da smo narisal to sliko Ponedeljek in malo prejšnji teden. 293 00:12:05,580 --> 00:12:09,970 In to opisuje postavitev stvari v spominu računalnika, ko 294 00:12:09,970 --> 00:12:11,000 teče nekaj program. 295 00:12:11,000 --> 00:12:14,310 Tech segmentu do vrha, odpoklic nanaša dejanskim ničel in enic 296 00:12:14,310 --> 00:12:16,000 da sestavite svoj program. 297 00:12:16,000 --> 00:12:19,340 Tam spodaj, da nekateri inicializiran ali nezačeto podatki, ki se običajno 298 00:12:19,340 --> 00:12:22,910 se nanaša na stvari, kot so konstante ali strune ali globalne spremenljivke, ki imajo 299 00:12:22,910 --> 00:12:24,200 bil najavljen. 300 00:12:24,200 --> 00:12:26,500 Tam je kup, ampak bomo prišli nazaj, da v nekaj. 301 00:12:26,500 --> 00:12:27,410 >> In potem je tu še kup. 302 00:12:27,410 --> 00:12:30,660 Podobno kot kup pladnjev v kavarno, to je, če spomin dobi 303 00:12:30,660 --> 00:12:33,610 večplastna in večplastna kadarkoli vam kaj v programu? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Kaj je sklad za uporabo? 306 00:12:37,730 --> 00:12:39,320 >> Ja? 307 00:12:39,320 --> 00:12:40,000 >> Pokličite funkcije. 308 00:12:40,000 --> 00:12:42,890 Vsak čas pokličete funkcijo, to je dati IVer pomnilnika za njene 309 00:12:42,890 --> 00:12:45,020 lokalne spremenljivke ali njene parametre. 310 00:12:45,020 --> 00:12:48,810 In slikovno, vidimo, da je z vsakim zaporedne funkcija imenuje, ko 311 00:12:48,810 --> 00:12:52,520 klici B klici C D klice, ki jih se opira na kupu. 312 00:12:52,520 --> 00:12:55,630 In v vsako od teh rezine pomnilnik je v bistvu enotna obseg 313 00:12:55,630 --> 00:12:58,590 za to funkcijo, ki je seveda je problematično, če želite ročno 314 00:12:58,590 --> 00:13:01,850 iz ene funkcije na drugo kos podatkov, ki jo želite 315 00:13:01,850 --> 00:13:03,500 mutirajo ali spremeniti. 316 00:13:03,500 --> 00:13:08,060 >> Torej, kaj je naša rešitev, ki omogoča Funkcija za en kup zastopa 317 00:13:08,060 --> 00:13:11,390 okvir spremeniti spomin znotraj druge dimnika okvirja? 318 00:13:11,390 --> 00:13:14,590 Kako narediti teh dveh govoriti drug z drugim? 319 00:13:14,590 --> 00:13:18,510 Tako s pomočjo kazalcev ali naslovov, ki je spet le opisujejo kjer 320 00:13:18,510 --> 00:13:22,280 spomin, ki ga način specifična Številka ugriz, zlasti 321 00:13:22,280 --> 00:13:23,830 vrednost je mogoče najti. 322 00:13:23,830 --> 00:13:26,860 Torej spomnim zadnjič, ko smo tudi nadaljevali zgodbo in pogledal 323 00:13:26,860 --> 00:13:28,280 dokaj buggy programa. 324 00:13:28,280 --> 00:13:32,900 In ta program Otroški voziček za nekatere Razlogi, najbolj zaskrbljujoče je eden 325 00:13:32,900 --> 00:13:34,620 ker ne preverite, kaj? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, to ne uspe, da preverite vložek. 328 00:13:40,450 --> 00:13:41,870 Oprostite? 329 00:13:41,870 --> 00:13:43,880 >> Če je več kot 12 znakov. 330 00:13:43,880 --> 00:13:47,260 Tako zelo pametno, ko kliče memcopy, ki je, kot že ime pove, samo 331 00:13:47,260 --> 00:13:50,630 kopije pomnilnika od drugega argumenta v prvi argument. 332 00:13:50,630 --> 00:13:54,730 Tretji argument, zelo pametno, je preveriti, da se prepričajte, da ne boste 333 00:13:54,730 --> 00:13:59,400 kopirali več kot v tem primeru, dolžino v baru, število znakov, 334 00:13:59,400 --> 00:14:03,810 v okolici, ki je to matrika C. Ampak problem je, da tisto, kar 335 00:14:03,810 --> 00:14:07,230 če C sama po sebi ni dovolj velika zmogel? 336 00:14:07,230 --> 00:14:09,900 Boste kopirali število zlogov, da ste bili dani. 337 00:14:09,900 --> 00:14:13,040 Toda kaj dejansko imajo več zlogov, kot ga imajo prostor za? 338 00:14:13,040 --> 00:14:16,770 >> No, ta program zelo neumno samo slepo nadaljuje, da se ne glede na to je 339 00:14:16,770 --> 00:14:20,650 dana, zdravo backslash je 0 super, če je niz kratkih 340 00:14:20,650 --> 00:14:22,040 Dovolj, kot pet znakov. 341 00:14:22,040 --> 00:14:26,470 Ampak, če je to dejansko 12 znakov ali 1200 znakov, smo videli zadnjič 342 00:14:26,470 --> 00:14:29,380 da greš samo v celoti prepisati pomnilnika, ki 343 00:14:29,380 --> 00:14:30,470 ne pripada tebi. 344 00:14:30,470 --> 00:14:34,390 In v najslabšem primeru, če prepisati, da rdeči del je, da se imenuje 345 00:14:34,390 --> 00:14:35,380 povratni naslov - 346 00:14:35,380 --> 00:14:38,370 to je samo, če je računalnik samodejno, za vas, za 347 00:14:38,370 --> 00:14:43,130 prizori, tucks stran 32-bitna vrednost, ki ga spominja na to, kar naslov bi moral 348 00:14:43,130 --> 00:14:47,080 vrniti, ko foo to drugo funkcijo, poteka izvršitve. 349 00:14:47,080 --> 00:14:49,320 To je Prezla razpoloženje na katerega se vrne. 350 00:14:49,320 --> 00:14:52,490 Če prepisati, da je potencialno če si slab, lahko bi 351 00:14:52,490 --> 00:14:54,750 lahko prevzame nekdo računalnik. 352 00:14:54,750 --> 00:14:58,020 In boste prav gotovo crash v večini primerov. 353 00:14:58,020 --> 00:15:01,690 >> Zdaj se je ta problem še poslabšalo le ko smo začeli govoriti o spominu 354 00:15:01,690 --> 00:15:03,010 Upravljanje bolj na splošno. 355 00:15:03,010 --> 00:15:07,150 In malloc za dodeljevanje pomnilnika, je funkcije, ki jih lahko uporabite za dodelitev 356 00:15:07,150 --> 00:15:11,260 spomin, ko ne vemo vnaprej da bomo morda potrebovali nekaj. 357 00:15:11,260 --> 00:15:13,960 Tako, na primer, če grem nazaj na napravi tukaj. 358 00:15:13,960 --> 00:15:21,010 In sem odprla iz zadnjega časa hello2.c, spomni ta program tukaj, ki je izgledal 359 00:15:21,010 --> 00:15:23,500 Malo kaj takega, le tri linije - 360 00:15:23,500 --> 00:15:27,940 navesti svoje ime, nato pa niz, ime, Na levi strani je enaka getstring. 361 00:15:27,940 --> 00:15:29,690 In potem smo ga natisnite, ime uporabnika. 362 00:15:29,690 --> 00:15:31,170 >> Torej je bil to zelo preprost program. 363 00:15:31,170 --> 00:15:34,870 Da bo jasno, mi gredo naprej in se zdravo-2. 364 00:15:34,870 --> 00:15:36,680 Jaz bom naredil dot poševnica zdravo-2. 365 00:15:36,680 --> 00:15:37,750 Svoje ime - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Pozdravljeni, David. 369 00:15:39,540 --> 00:15:41,060 Zdi se, da deluje v redu. 370 00:15:41,060 --> 00:15:43,140 Toda, kaj se v resnici dogaja Pod pokrovom tukaj? 371 00:15:43,140 --> 00:15:44,670 Najprej si lupine nazaj nekaj plasti. 372 00:15:44,670 --> 00:15:48,380 Niz je le sinonim smo jih spoznal za kaj? 373 00:15:48,380 --> 00:15:49,110 Char zvezda. 374 00:15:49,110 --> 00:15:52,740 Torej, da bi bilo malo bolj arcane ampak bolj tehnično pravilno, da se ta 375 00:15:52,740 --> 00:15:55,570 je znak zvezda, kar pomeni, da ime, ja, je spremenljiva. 376 00:15:55,570 --> 00:15:59,920 Ampak kaj ime trgovine je naslov char, ki meni malo čudno 377 00:15:59,920 --> 00:16:01,050 ker se bom vrnil niz. 378 00:16:01,050 --> 00:16:03,580 Grem nazaj več znakov ni znak. 379 00:16:03,580 --> 00:16:07,400 >> Seveda pa morate najprej le Naslov char je, da se spomnimo, kjer 380 00:16:07,400 --> 00:16:08,870 celoten niz je zato, ker zakaj? 381 00:16:08,870 --> 00:16:12,700 Kako si ugotoviti, kje konec Niz je vedeti začetek? 382 00:16:12,700 --> 00:16:13,630 Nagibnica nič. 383 00:16:13,630 --> 00:16:17,260 Torej, s tema dvema indicev vam razbrati Pred začetkom in koncem 384 00:16:17,260 --> 00:16:20,280 vsak niz so, v kolikor si ustrezno oblikovane s tem nična 385 00:16:20,280 --> 00:16:22,110 terminator, ki backslash nič. 386 00:16:22,110 --> 00:16:24,520 >> Toda to kliče getstring. 387 00:16:24,520 --> 00:16:28,020 In izkazalo se je, da getstring Ves ta čas je bil nekako 388 00:16:28,020 --> 00:16:28,820 varanje za nas. 389 00:16:28,820 --> 00:16:32,460 To je počel to dela, da se prepričate, pridobivanje niz od uporabnika. 390 00:16:32,460 --> 00:16:34,580 Ampak kje je ta spomin je prihajate? 391 00:16:34,580 --> 00:16:38,440 Če se vrnemo na sliki tu uporabljajo opredelitve iz pravkar 392 00:16:38,440 --> 00:16:42,610 Trenutek nazaj, da je sklad, kjer spomin gre, ko se funkcije imenujejo, 393 00:16:42,610 --> 00:16:45,370 po tej logiki, ko pokličete getstring, in potem sem tipa v 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Vnašanje, pri čemer je D-A-V-I-D nagibnica nič shranjene na podlagi 395 00:16:50,900 --> 00:16:53,480 Zgodba nas smo povedali daleč? 396 00:16:53,480 --> 00:16:55,190 >> Zdi se, da je v dimnik, kajne? 397 00:16:55,190 --> 00:16:58,120 Ko pokličete dobili niz dobite malo rezino spomin na kupu. 398 00:16:58,120 --> 00:17:01,630 Tako da Razumno, da D--V-I-D Nagibnica nič se shrani 399 00:17:01,630 --> 00:17:02,770 tam na kupu. 400 00:17:02,770 --> 00:17:07,680 Toda počakaj malo, getstring donose da niz, tako rekoč, kar pomeni, 401 00:17:07,680 --> 00:17:11,700 je pladenj iz jedilnice je vzletelo stack. 402 00:17:11,700 --> 00:17:14,560 In mi je rekel zadnjič, da v najkrajšem možnem funkcija vrne in vas vzel 403 00:17:14,560 --> 00:17:20,109 pladenj, tako rekoč, off stack, kar lahko sklepate o ostankih 404 00:17:20,109 --> 00:17:21,819 da je spomin? 405 00:17:21,819 --> 00:17:25,160 Nekako sem jih redrew kot vprašaji ker so dejansko postala 406 00:17:25,160 --> 00:17:26,250 neznane vrednosti. 407 00:17:26,250 --> 00:17:29,500 Jih je mogoče ponovno uporabiti, ko nekateri Naslednja funkcija se imenuje. 408 00:17:29,500 --> 00:17:31,870 >> Z drugimi besedami, če se zgodi za shranjevanje - 409 00:17:31,870 --> 00:17:34,350 Pritegnil bom hiter sliko tukaj na kupu. 410 00:17:34,350 --> 00:17:38,690 Če se zgodi, da se pripravi na dno moje segmenta pomnilnika in bomo rekli, 411 00:17:38,690 --> 00:17:42,230 da je to mesto spomina z glavnim in morda arg c in zaseda 412 00:17:42,230 --> 00:17:46,790 arg proti in vse ostalo v programu, ko je getstring imenuje, 413 00:17:46,790 --> 00:17:51,120 predvidoma getstring dobi kos pomnilnika tukaj. 414 00:17:51,120 --> 00:17:53,940 Potem D-A-V-I-D nekako konča v to funkcijo. 415 00:17:53,940 --> 00:17:55,320 In jaz bom poenostavljam. 416 00:17:55,320 --> 00:18:00,050 Vendar predpostavimo, da je njena D-A-V-I-D backslash nič. 417 00:18:00,050 --> 00:18:03,500 Torej so to mnogi bajtov se uporabljajo v Okvir za getstring. 418 00:18:03,500 --> 00:18:08,270 >> Toda takoj, ko getstring donose, smo je dejal zadnji čas, da se ta spomin preko 419 00:18:08,270 --> 00:18:11,340 tu vse začne - woops! - 420 00:18:11,340 --> 00:18:14,270 Vse postane dejansko izbrisani. 421 00:18:14,270 --> 00:18:17,220 In lahko si to sedaj vprašanje znamke, ker kdo ve 422 00:18:17,220 --> 00:18:18,720 kaj se dogaja, da postanejo te spomin. 423 00:18:18,720 --> 00:18:22,130 Pravzaprav sem zelo pogosto imenujemo funkcije razen getstring. 424 00:18:22,130 --> 00:18:24,750 In takoj, ko sem poklical nekatere druge Funkcija kot getstring, morda ne v 425 00:18:24,750 --> 00:18:28,860 ta program smo pravkar pogledal ob toda nekatere druge, zagotovo nekatere druge 426 00:18:28,860 --> 00:18:34,180 funkcija morda na koncu dana to naslednji spot v dimnika. 427 00:18:34,180 --> 00:18:39,410 >> Zato ne more biti, da getstring trgovin D-A-V-I-D na sklad ker bi 428 00:18:39,410 --> 00:18:41,040 takoj izgubijo dostop do njega. 429 00:18:41,040 --> 00:18:43,720 Vendar vemo, da so getstring Samo vrne kaj? 430 00:18:43,720 --> 00:18:47,220 To se ne vračajo me šest znakov. 431 00:18:47,220 --> 00:18:51,090 Kaj je resnično vrača ni zaključimo zadnjič? 432 00:18:51,090 --> 00:18:52,480 Naslov prvega. 433 00:18:52,480 --> 00:18:56,650 Tako nekako, ko si poklical getstring, to je dodeljevanje kos pomnilnika 434 00:18:56,650 --> 00:18:59,620 niz, ki uporabnikom tip in nato vrnejo naslov njo. 435 00:18:59,620 --> 00:19:02,930 In izkazalo se je, da če želite, da deluje dodeliti pomnilnika v to 436 00:19:02,930 --> 00:19:08,390 pot in se vrniti na osebo, ki se imenuje ki delujejo, naslov 437 00:19:08,390 --> 00:19:11,870 da je kos pomnilnika, morate nujno ne more dati v sklad na 438 00:19:11,870 --> 00:19:14,750 dno, saj je le funkcionalno dogaja, da ne postane tvoja zelo 439 00:19:14,750 --> 00:19:17,800 hitro, tako da boste verjetno lahko uganiti, kjer bomo verjetno bo, da ga vržejo 440 00:19:17,800 --> 00:19:20,130 Namesto, ti kup. 441 00:19:20,130 --> 00:19:25,290 >> Torej med dnom vaš spomin je Postavitev in vrh tvoj spomin je 442 00:19:25,290 --> 00:19:26,820 Postavitev je cel kup segmentov. 443 00:19:26,820 --> 00:19:29,270 Ena je sklad, in prav nad njo je kup. 444 00:19:29,270 --> 00:19:33,680 In kup je le drugačen kos pomnilnika, ki je ne uporablja za funkcije 445 00:19:33,680 --> 00:19:34,770 ko si klical. 446 00:19:34,770 --> 00:19:38,100 To se uporablja za dolgoročnejši spomin, če hočeš eno funkcijo, da zgrabite nekatere 447 00:19:38,100 --> 00:19:42,700 spomin in biti sposoben, da visi na njem ne da bi izgubili nadzor nad njim. 448 00:19:42,700 --> 00:19:45,550 >> Zdaj si lahko morda takoj glej, da to ni 449 00:19:45,550 --> 00:19:48,060 nujno popoln videz. 450 00:19:48,060 --> 00:19:51,350 Kot je vaš program dodeljen spomin na sklad, ali pokličete bolj in 451 00:19:51,350 --> 00:19:55,540 več funkcij, ali so ti nameni spomin na kup s funkcije malloc off kot 452 00:19:55,540 --> 00:20:00,690 getstring počne, kar jasno Zdi se, da je neizogibna težava? 453 00:20:00,690 --> 00:20:00,860 >> Prav. 454 00:20:00,860 --> 00:20:03,150 Kot da te puščice obrnjena drug proti drugemu 455 00:20:03,150 --> 00:20:04,380 ne bode tudi. 456 00:20:04,380 --> 00:20:08,630 In res smo lahko zelo hitro crash Program v vsakem več načinov. 457 00:20:08,630 --> 00:20:12,050 V bistvu, mislim, da bi morali to storili pomotoma enkrat. 458 00:20:12,050 --> 00:20:14,020 Ali pa, če ne, dajmo namerno zdaj. 459 00:20:14,020 --> 00:20:21,330 Dovolite mi, da gredo naprej in pisati zelo hitro Program se imenuje dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 In zdaj se bom tukaj v in Ne oster vključujejo stdio.h. 461 00:20:26,730 --> 00:20:32,620 Oglejmo razglasi funkcija foo traja nobenih argumentov, kar je 462 00:20:32,620 --> 00:20:34,040 označena tudi s praznino. 463 00:20:34,040 --> 00:20:37,830 >> In edina stvar, foo bo naredil, je klic foo, ki verjetno ne 464 00:20:37,830 --> 00:20:39,100 najpametnejša ideja, ampak tako je bilo. 465 00:20:39,100 --> 00:20:40,490 Ent glavni neveljavne. 466 00:20:40,490 --> 00:20:45,270 Zdaj je edina stvar, glavno se dogaja storiti je, da pokličete foo kot dobro. 467 00:20:45,270 --> 00:20:51,050 In samo za brcne, jaz grem naprej tu in reči printf "Pozdravljeni, iz 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Torej, če nisem naredil nobene napake, Naredite dontdothis dot poševnice. 471 00:21:00,160 --> 00:21:01,960 In kaj je to v večjem oknu - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Daj no. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Ojoj. 477 00:21:11,890 --> 00:21:13,100 Zdi se, da lahko to storite. 478 00:21:13,100 --> 00:21:15,190 Prekleto. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Počakaj. 481 00:21:16,580 --> 00:21:17,370 Stati. 482 00:21:17,370 --> 00:21:18,270 Sva - 483 00:21:18,270 --> 00:21:20,110 Nismo ga uporabljate z Naredi. 484 00:21:20,110 --> 00:21:22,050 >> [Vzdihi] 485 00:21:22,050 --> 00:21:25,110 >> Vem, ampak mislim, da mi šele izbrisati to. 486 00:21:25,110 --> 00:21:28,410 Uh, ja. 487 00:21:28,410 --> 00:21:30,660 Prekleto. 488 00:21:30,660 --> 00:21:32,640 Rešili ta Rob. 489 00:21:32,640 --> 00:21:34,678 Kaj je? 490 00:21:34,678 --> 00:21:35,928 To je zelo preprosto. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, smo se obrnili optimizacijo off. 493 00:21:47,360 --> 00:21:48,970 OK, stand adijo. 494 00:21:48,970 --> 00:21:49,950 Zdaj se počutim bolje. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Vse je v redu. 497 00:21:51,780 --> 00:21:53,430 >> Torej, kaj je to prevedem - 498 00:21:53,430 --> 00:21:55,880 Naredite si dontdothis. 499 00:21:55,880 --> 00:22:00,090 Morda boste morali preimenovati to dothis.c čez nekaj trenutkov. 500 00:22:00,090 --> 00:22:00,710 Takole. 501 00:22:00,710 --> 00:22:01,240 Hvala. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Torej dejstvo, da sem bil tiskanje kaj se je pravzaprav šele 504 00:22:05,480 --> 00:22:08,150 upočasnjuje postopek, s katerim bomo bi dosegli, da točka. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Fuj! 507 00:22:08,870 --> 00:22:11,180 >> Torej, kaj se dejansko dogaja? 508 00:22:11,180 --> 00:22:14,440 Razlog je, tako kot prahi, je storiti ničesar glede prispevkov in 509 00:22:14,440 --> 00:22:17,270 izhod kaže, da je počasnejši, ker ste morali napisati znake 510 00:22:17,270 --> 00:22:18,600 zaslon, ima za premikanje. 511 00:22:18,600 --> 00:22:21,720 Tako da skrajšam zgodbo, sem imel dejansko se je zgodilo tako nestrpni, bi morali 512 00:22:21,720 --> 00:22:23,260 to videli končni rezultat tudi. 513 00:22:23,260 --> 00:22:26,220 Zdaj, ko sem peljal od print-ups, bomo videli takoj. 514 00:22:26,220 --> 00:22:28,410 Torej, zakaj se to dogaja. 515 00:22:28,410 --> 00:22:31,300 No, preprosto razlaga seveda je, da foo verjetno ne bi 516 00:22:31,300 --> 00:22:32,500 se sama kliče. 517 00:22:32,500 --> 00:22:34,470 >> Sedaj na splošno, to je rekurzija. 518 00:22:34,470 --> 00:22:36,970 In smo mislili, da nekaj tednov Pred rekurzivni je dobro. 519 00:22:36,970 --> 00:22:40,330 Rekurzija je to čarobna način izražanje sebe super jedrnato. 520 00:22:40,330 --> 00:22:41,400 In to preprosto deluje. 521 00:22:41,400 --> 00:22:45,060 Vendar je ključna značilnost vseh rekurzivne programe smo govorili 522 00:22:45,060 --> 00:22:48,260 okoli in pogledal na doslej, ki je bila, da so imeli kaj? 523 00:22:48,260 --> 00:22:52,610 Osnovna ureditev, ki je nekaj težko kodirane zgodi, da omenjeni v nekaterih primerih 524 00:22:52,610 --> 00:22:56,210 ne kliči foo, kar je jasno ne v tem primeru. 525 00:22:56,210 --> 00:22:58,920 >> Torej, kaj se v resnici dogaja v smislu te slike? 526 00:22:58,920 --> 00:23:01,790 No, ko je glavna zahteva foo, da dobi svoj kos pomnilnika. 527 00:23:01,790 --> 00:23:04,150 Ko foo foo poziva, da postane rezina spomina. 528 00:23:04,150 --> 00:23:06,430 Ko foo foo zahteva, da dobi svoj kos. 529 00:23:06,430 --> 00:23:07,080 To postane rezino. 530 00:23:07,080 --> 00:23:08,120 To postane rezino. 531 00:23:08,120 --> 00:23:09,460 Ker foo se nikoli ne vrne. 532 00:23:09,460 --> 00:23:12,160 Mi nikoli ne izbriše eno od tistih okvirji iz dimnika. 533 00:23:12,160 --> 00:23:15,930 Torej smo piha skozi kup, ni omenjam, kdo ve kaj drugega, in 534 00:23:15,930 --> 00:23:19,600 smo prekoračila naših ti segment pomnilnika. 535 00:23:19,600 --> 00:23:21,790 Napaka iti segmentacija napačen. 536 00:23:21,790 --> 00:23:24,110 >> Torej rešitve ni očitno ne počni tega. 537 00:23:24,110 --> 00:23:28,830 Vendar večje posledice je to, da, ni nujno nekaj omejitev, 538 00:23:28,830 --> 00:23:32,470 tudi če je ne dobro opredeljene, o tem, kako številne funkcije, ki jih lahko pokličete na 539 00:23:32,470 --> 00:23:34,970 Program, kolikokrat funkcija sama lahko pokličete. 540 00:23:34,970 --> 00:23:38,430 Torej, čeprav smo pridigajo rekurzijo kot je to potencialno čarobna stvar 541 00:23:38,430 --> 00:23:41,870 Pred nekaj tedni za SIGMA funkcijo, in ko bomo dobili podatke 542 00:23:41,870 --> 00:23:45,270 strukture in CS50, boste videli drugo aplikacije za to, da je ni 543 00:23:45,270 --> 00:23:46,500 nujno najboljša stvar. 544 00:23:46,500 --> 00:23:50,070 Ker če sama funkcija zahteva, se zahteva, tudi če je baza 545 00:23:50,070 --> 00:23:54,860 primeru, če ne udaril, da je osnovni primer za 1.000 klicev ali 10.000 klicev, ki jih 546 00:23:54,860 --> 00:23:58,800 da je čas, ste morda zmanjka prostora na svoj tako imenovani dimnik ter zadeti 547 00:23:58,800 --> 00:24:00,400 nekateri drugi segmenti pomnilnika. 548 00:24:00,400 --> 00:24:03,950 Tako da tudi to je oblika kompromis med eleganco ter med 549 00:24:03,950 --> 00:24:06,920 Robustnost vaša zlasti izvajanje. 550 00:24:06,920 --> 00:24:10,780 >> Torej obstaja še druga negativna ali en kavelj za kar smo 551 00:24:10,780 --> 00:24:11,720 počeli doslej. 552 00:24:11,720 --> 00:24:12,980 Ko sem poklical getstring - 553 00:24:12,980 --> 00:24:15,120 Naj gredo nazaj v Hello-2. 554 00:24:15,120 --> 00:24:18,170 Obvestilo, da kličem getstring, ki se vrača naslov. 555 00:24:18,170 --> 00:24:20,730 In trdimo, da je danes naslov Iz kup. 556 00:24:20,730 --> 00:24:24,480 In zdaj sem tiskanje niz na tem naslovu. 557 00:24:24,480 --> 00:24:27,000 Ampak mi nikoli pozval nasproti getstring. 558 00:24:27,000 --> 00:24:30,850 Nikoli nismo imeli, da calll funkcijo kot ungetstring, kjer si roko nazaj 559 00:24:30,850 --> 00:24:31,610 da spomin. 560 00:24:31,610 --> 00:24:33,250 Vendar odkrito povedano mi verjetno bi morala biti. 561 00:24:33,250 --> 00:24:37,390 Ker, če smo ostali sprašuje računalnik za spomin, in sicer s pomočjo nekoga, kot je 562 00:24:37,390 --> 00:24:40,830 getstring vendar ga ni nikoli vrnila, zagotovo , ki je preveč nedvomno povzročila 563 00:24:40,830 --> 00:24:42,970 Težave s katerimi smo zmanjkalo pomnilnika. 564 00:24:42,970 --> 00:24:46,140 >> In v resnici, lahko iščemo ti težave z novo orodje, katerega uporaba 565 00:24:46,140 --> 00:24:47,640 je malce skrivnosten na vrsto. 566 00:24:47,640 --> 00:24:50,960 Ampak naj gredo naprej in pljuskanje na zaslonu v nekaj trenutkov. 567 00:24:50,960 --> 00:24:56,940 Jaz grem naprej in zagon Valgrind s parametrom S prvim ukazom 568 00:24:56,940 --> 00:25:00,260 Argument linija je ime tega programa zdravo-2. 569 00:25:00,260 --> 00:25:02,650 In na žalost je to proizvodnja je atrociously 570 00:25:02,650 --> 00:25:04,290 kompleksna brez pravega razloga. 571 00:25:04,290 --> 00:25:06,280 Tako vidimo vso to zmešnjavo. 572 00:25:06,280 --> 00:25:07,530 David je navedeno moje ime. 573 00:25:07,530 --> 00:25:09,760 Torej, to je program, dejansko deluje. 574 00:25:09,760 --> 00:25:11,180 In zdaj smo dobili ta rezultat. 575 00:25:11,180 --> 00:25:13,400 >> Torej Valgrind je podoben v duhu GDB. 576 00:25:13,400 --> 00:25:14,950 To ni iskanje in odpravljanje napak po sebi. 577 00:25:14,950 --> 00:25:16,270 Ampak to je spomin skladiščnik. 578 00:25:16,270 --> 00:25:20,140 To je program, ki bo teči vaš programirati, in vam povem, če si vprašal 579 00:25:20,140 --> 00:25:23,860 Računalnik za spomin in nikoli ne preda nazaj, kar pomeni, da imate 580 00:25:23,860 --> 00:25:24,570 pomnilnika. 581 00:25:24,570 --> 00:25:26,240 In spomin razpoka ponavadi slabo. 582 00:25:26,240 --> 00:25:29,120 In ti se uporabniki računalnikov so Verjetno menilo, da to, ali imate 583 00:25:29,120 --> 00:25:30,300 Mac ali PC. 584 00:25:30,300 --> 00:25:33,730 Ste že kdaj uporabljali računalnik medtem ko je rebooted in ne v več 585 00:25:33,730 --> 00:25:36,820 dni, ali pa ste pravkar dobil veliko programov teče, in prekleto stvar 586 00:25:36,820 --> 00:25:42,360 upočasni za brušenje zaustaviti ali vsaj to je zelo moteč za uporabo, saj 587 00:25:42,360 --> 00:25:44,350 vse, kar je pravkar dobil zelo počasi. 588 00:25:44,350 --> 00:25:46,260 >> Zdaj lahko poljubno število razlogov. 589 00:25:46,260 --> 00:25:49,600 To bi lahko neskončno zanko, napaka v Koda nekoga, ali, bolj preprosto, da 590 00:25:49,600 --> 00:25:53,250 lahko pomeni, da ste z uporabo več spomin, ali poskuša, kot je vaša 591 00:25:53,250 --> 00:25:54,920 Računalnik dejansko ima. 592 00:25:54,920 --> 00:25:57,770 In morda je napaka v nekem programu ki vodijo prosi za spomin. 593 00:25:57,770 --> 00:26:02,480 Brskalniki za let, je bila znana po to zahtevajo več in več pomnilnika 594 00:26:02,480 --> 00:26:03,870 ampak nikoli ne predajo nazaj. 595 00:26:03,870 --> 00:26:07,220 Seveda, če imate samo omejeno količino pomnilnika, ne morete zahtevati 596 00:26:07,220 --> 00:26:09,990 neskončno veliko časa za nekaj tega pomnilnika. 597 00:26:09,990 --> 00:26:13,070 >> In tako kar vidite tukaj, čeprav spet izhod Valgrind je 598 00:26:13,070 --> 00:26:17,490 nepotrebnem zapletena, da pogled na Prvič, to je zanimiv del. 599 00:26:17,490 --> 00:26:18,890 Kopica - 600 00:26:18,890 --> 00:26:20,060 v uporabi pri izhodu. 601 00:26:20,060 --> 00:26:22,810 Torej, tukaj je, koliko pomnilnika je v uporabi v kup na 602 00:26:22,810 --> 00:26:24,300 Čas moj program izstopilo - 603 00:26:24,300 --> 00:26:27,280 navidezno šest zlogov v enem bloku. 604 00:26:27,280 --> 00:26:28,710 Torej bom pomahati moje roke na kakšen blok. 605 00:26:28,710 --> 00:26:31,270 Pomislite na to je samo kos, več Tehnična beseda za kos. 606 00:26:31,270 --> 00:26:33,140 Ampak šest zlogov - 607 00:26:33,140 --> 00:26:36,870 kaj so šest zlogov, da so še vedno v uporabi? 608 00:26:36,870 --> 00:26:37,390 >> Točno tako. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D nagibnica nič, pet črka Ime plus null terminator. 610 00:26:41,520 --> 00:26:46,350 Torej Valgrind ta program opazila, da sem prosil za šest bajtov, očitno, ga 611 00:26:46,350 --> 00:26:48,950 način getstring, vendar nikoli jih dal nazaj. 612 00:26:48,950 --> 00:26:52,030 In v resnici, to ne bi bilo tako očitno, če moj program ne tri 613 00:26:52,030 --> 00:26:53,590 linije, ampak to je 300 vrstic. 614 00:26:53,590 --> 00:26:56,920 Tako bomo lahko dejansko dal drug ukaz Argument linijo za Valgrind za 615 00:26:56,920 --> 00:26:58,290 bi bilo bolj zgovorni. 616 00:26:58,290 --> 00:26:59,760 To je malce nadležno, da se spomnimo. 617 00:26:59,760 --> 00:27:01,580 Ampak, če jaz - 618 00:27:01,580 --> 00:27:01,930 poglejmo. 619 00:27:01,930 --> 00:27:03,540 Pušča - 620 00:27:03,540 --> 00:27:05,030 Je bilo uhajanje - 621 00:27:05,030 --> 00:27:07,580 tudi jaz se ne spomnim kaj je to off roko. 622 00:27:07,580 --> 00:27:08,550 >> - Uhajanje-ček enak poln. 623 00:27:08,550 --> 00:27:10,180 Ja, hvala. 624 00:27:10,180 --> 00:27:12,520 - Uhajanje-ček enak poln. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Isti program teče. 627 00:27:14,940 --> 00:27:16,180 Ponovno vnesite Davida. 628 00:27:16,180 --> 00:27:17,660 Zdaj vidim malo več podrobnosti. 629 00:27:17,660 --> 00:27:20,890 Vendar pod povzetka kopice, ki je enak štiri - ah, 630 00:27:20,890 --> 00:27:22,120 To je res super. 631 00:27:22,120 --> 00:27:25,460 Sedaj Valgrind je dejansko iščejo malo težje v mojo kodo. 632 00:27:25,460 --> 00:27:29,580 In to je rekel, da je očitno, malloc na liniji - 633 00:27:29,580 --> 00:27:30,580 smo pomanjšati. 634 00:27:30,580 --> 00:27:31,980 Na linija - 635 00:27:31,980 --> 00:27:32,930 ne bomo videli, kaj linija je. 636 00:27:32,930 --> 00:27:35,110 Ampak malloc je prvi krivec. 637 00:27:35,110 --> 00:27:38,630 Tam je blog v funkcije malloc. 638 00:27:38,630 --> 00:27:39,810 >> Vse v redu? 639 00:27:39,810 --> 00:27:40,450 OK, ne. 640 00:27:40,450 --> 00:27:40,940 Kajne? 641 00:27:40,940 --> 00:27:42,520 Poklical sem getstring. 642 00:27:42,520 --> 00:27:44,460 getstring očitno kliče malloc. 643 00:27:44,460 --> 00:27:47,800 Torej, kaj vrstica kode je očitno kriv za ob 644 00:27:47,800 --> 00:27:49,050 dodeljena ta spomin? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Denimo, da kdor je napisal malloc je že dovolj dolgo, da je 647 00:27:55,540 --> 00:27:56,390 ni njihova krivda. 648 00:27:56,390 --> 00:27:57,520 Tako da je verjetno moja. 649 00:27:57,520 --> 00:28:02,000 getstring v cs50.c - tako, da je datoteko nekje na računalniku - 650 00:28:02,000 --> 00:28:05,210 v skladu 286 izgleda krivec. 651 00:28:05,210 --> 00:28:08,140 Predpostavimo, da je bilo CS50 približno za dostojno količino časa, tako da 652 00:28:08,140 --> 00:28:09,720 tudi mi, so nezmotljivi. 653 00:28:09,720 --> 00:28:14,080 In tako je to verjetno ni v getstring da leži napako, ampak v 654 00:28:14,080 --> 00:28:17,810 Zdravo-2.c vrstica 18. 655 00:28:17,810 --> 00:28:20,670 >> Torej, kaj si oglejte kaj je bilo, da je linija 18. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Nekako ta vrstica ni nujno vozičkom po sebi, vendar je razlog 658 00:28:27,130 --> 00:28:28,630 za ta spomin razpoka. 659 00:28:28,630 --> 00:28:32,140 Tako zelo preprosto, kaj bi intuitivno je rešitev tukaj? 660 00:28:32,140 --> 00:28:34,710 Če smo prosi za spomin, niso nikoli se vrača, in da izgleda 661 00:28:34,710 --> 00:28:37,940 problem, ker se sčasoma moj računalnik Morda je zmanjkalo pomnilnika, lahko upočasnijo 662 00:28:37,940 --> 00:28:42,110 navzdol, se lahko zgodijo slabe stvari, no, kaj je preprosta intuitivna rešitev? 663 00:28:42,110 --> 00:28:43,140 Dajte ga nazaj. 664 00:28:43,140 --> 00:28:44,770 >> Kako boste sprostili, da je spomin? 665 00:28:44,770 --> 00:28:49,970 No, na srečo je precej preprost samo reči prostega ime. 666 00:28:49,970 --> 00:28:51,260 In nikoli nismo storili že prej. 667 00:28:51,260 --> 00:28:55,890 Vendar pa lahko v bistvu zamislite brezplačno, kot nasprotje funkcije malloc. 668 00:28:55,890 --> 00:28:58,030 prost je nasprotje dodeljevanju pomnilnika. 669 00:28:58,030 --> 00:28:59,540 Torej, zdaj naj prevedem to. 670 00:28:59,540 --> 00:29:02,050 Naredite Hello-2. 671 00:29:02,050 --> 00:29:04,620 Dovolite mi, da jo ponovno zaženite. Zdravo-2 David. 672 00:29:04,620 --> 00:29:07,290 Tako se zdi, da deluje v na povsem enak način. 673 00:29:07,290 --> 00:29:11,180 Ampak, če se vrnem v Valgrind in ponovno zagnati da isti ukaz na moje novo 674 00:29:11,180 --> 00:29:14,720 pripravijo program tipkanje v mojem imenu kot prej - 675 00:29:14,720 --> 00:29:15,370 lepo. 676 00:29:15,370 --> 00:29:16,760 Kopica povzetek - 677 00:29:16,760 --> 00:29:17,740 v uporabi pri izstopu - 678 00:29:17,740 --> 00:29:19,370 nič bajtov nič blokih. 679 00:29:19,370 --> 00:29:21,840 In to je super lepo, vse kopičijo bloki so bili osvobojeni. 680 00:29:21,840 --> 00:29:23,480 Ni mogoče uhajanje. 681 00:29:23,480 --> 00:29:27,200 >> Torej prihaja, ne z Težava Set 4, vendar Problem Set 5, forenziki 682 00:29:27,200 --> 00:29:30,740 in naprej, bo to tudi postal Ukrep pravilnosti vašega 683 00:29:30,740 --> 00:29:33,630 Program, ali imate ali nimajo spomin razpoka. 684 00:29:33,630 --> 00:29:36,900 Ampak na srečo, ne samo, da lahko argumentira prek njih intuitivno, ki 685 00:29:36,900 --> 00:29:40,430 je verjetno, enostaven za manjše programe vendar težje za večje programe, 686 00:29:40,430 --> 00:29:43,860 Valgrind, za tiste večjih programov, vam lahko pomagajo ugotoviti 687 00:29:43,860 --> 00:29:45,360 Poseben problem. 688 00:29:45,360 --> 00:29:47,500 >> Toda obstaja še ena težava ki se lahko pojavijo. 689 00:29:47,500 --> 00:29:51,245 Dovolite mi, da to datoteko odprli tukaj, ki je, spet nekoliko preprost primer. 690 00:29:51,245 --> 00:29:53,760 Vendar naj se osredotoči na tisto, ta program ne. 691 00:29:53,760 --> 00:29:55,190 To se imenuje memory.c. 692 00:29:55,190 --> 00:29:58,380 Bomo objavili kasneje danes zip današnje izvorne kode. 693 00:29:58,380 --> 00:30:01,610 In opazil, da imam funkcijo imenovano f, ki traja nobenih argumentov in 694 00:30:01,610 --> 00:30:02,800 vrne ničesar. 695 00:30:02,800 --> 00:30:07,240 V skladu 20, sem očitno razglasitvi kazalec na int in to x kliče. 696 00:30:07,240 --> 00:30:09,570 Jaz sem dodeljevanje je donos vrednost funkcije malloc. 697 00:30:09,570 --> 00:30:14,590 In samo, da bo jasno, koliko bajtov am Jaz verjetno dobili nazaj od funkcije malloc 698 00:30:14,590 --> 00:30:17,080 v tej situaciji? 699 00:30:17,080 --> 00:30:18,040 >> Verjetno 40. 700 00:30:18,040 --> 00:30:18,840 Kje ste dobili, da je iz? 701 00:30:18,840 --> 00:30:22,410 No, če se spomnimo, da je int pogosto 4 bajte, vsaj v 702 00:30:22,410 --> 00:30:25,110 Naprava, 10 krat 4 je očitno 40. 703 00:30:25,110 --> 00:30:28,920 Torej je malloc vrnjena naslov kos spomina in shranjevanje, da 704 00:30:28,920 --> 00:30:30,800 končno obravnavo v x. 705 00:30:30,800 --> 00:30:32,570 Torej, da bo jasno, kaj potem se dogaja? 706 00:30:32,570 --> 00:30:34,990 No, naj preklopiti nazaj na naši sliki tukaj. 707 00:30:34,990 --> 00:30:38,150 Dovolite mi, ne samo potegniti dna računalnika spomin, naj gredo naprej in 708 00:30:38,150 --> 00:30:42,990 sestaviti celoten pravokotnik, predstavlja vse moje RAM-a. 709 00:30:42,990 --> 00:30:44,790 >> Bomo rekli, da sklad je na dnu. 710 00:30:44,790 --> 00:30:47,010 In tam je odsek besedila v se nezačeto podatkov. 711 00:30:47,010 --> 00:30:49,880 Ampak grem na abstraktno tistih druge stvari stran kot pika, dot dot. 712 00:30:49,880 --> 00:30:53,470 Grem, da se na to sklicuje kot kup na vrhu. 713 00:30:53,470 --> 00:30:57,070 Nato na dnu te slike, da predstavlja glavni, bom 714 00:30:57,070 --> 00:30:59,880 da ga rezine spomin na kupu. 715 00:30:59,880 --> 00:31:03,150 Za f, bom dal to rezino spomina na kupu. 716 00:31:03,150 --> 00:31:05,140 Zdaj moram posvetovati moj Izvorna koda znova. 717 00:31:05,140 --> 00:31:07,170 Kakšne so lokalne spremenljivke za glavne? 718 00:31:07,170 --> 00:31:10,710 Očitno nič, tako da je rezina učinkovito prazna ali sploh ne tako velika 719 00:31:10,710 --> 00:31:11,600 kot sem jo sestavi. 720 00:31:11,600 --> 00:31:15,730 Toda v f, imam lokalno spremenljivko, ki se imenuje x. 721 00:31:15,730 --> 00:31:20,410 Tako da sem šel naprej in da f kos pomnilnika, je x kliče. 722 00:31:20,410 --> 00:31:24,680 >> In zdaj malloc 10 krat 4, Torej funkcije malloc 40, kjer je to 723 00:31:24,680 --> 00:31:25,430 spomin prihajate? 724 00:31:25,430 --> 00:31:27,530 Mi smo ne sestavijo sliko Pred všeč. 725 00:31:27,530 --> 00:31:31,140 Vendar pa domnevam, da je to dejansko prihajajo iz tukaj, tako da ena, 726 00:31:31,140 --> 00:31:33,170 dva, tri, štiri, pet. 727 00:31:33,170 --> 00:31:34,680 In zdaj moram 40 od ​​teh. 728 00:31:34,680 --> 00:31:37,540 Torej bom naredil piko, dot, pika predlagati da obstaja še več pomnilnika 729 00:31:37,540 --> 00:31:39,350 vračali iz kup. 730 00:31:39,350 --> 00:31:40,710 Zdaj, kaj je naslov? 731 00:31:40,710 --> 00:31:42,620 Oglejmo izbrati naše samovoljno obravnavati kot vedno - 732 00:31:42,620 --> 00:31:46,310 Ox123, čeprav je verjetno, da bo da je nekaj povsem drugega. 733 00:31:46,310 --> 00:31:50,420 To je naslov prvega bajt pri spomin, da vas prosim za malloc. 734 00:31:50,420 --> 00:31:53,630 >> Torej, na kratko, enkrat liniji 20 izvaja, kaj je dobesedno 735 00:31:53,630 --> 00:31:57,170 shranjeni v X tukaj? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 In Ox je nezanimivo. 739 00:32:01,550 --> 00:32:03,200 To samo pomeni, tukaj je šestnajstiško število. 740 00:32:03,200 --> 00:32:06,490 Toda kaj je ključno je, da tisto, kar sem trgovino in x, ki je lokalna spremenljivka. 741 00:32:06,490 --> 00:32:10,260 Toda njegova vrsta podatkov, še enkrat, je naslov notr. 742 00:32:10,260 --> 00:32:12,710 No, jaz grem za shranjevanje Ox123. 743 00:32:12,710 --> 00:32:16,610 Ampak še enkrat, če je to malo preveč zapleteno nepotrebnem, če sem se pomaknete 744 00:32:16,610 --> 00:32:21,490 nazaj, smo lahko abstraktno to stran precej razumno in le, da je x 745 00:32:21,490 --> 00:32:23,910 kazalec na ta kos pomnilnika. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Zdaj je vprašanje na dlani je naslednja: - 748 00:32:26,230 --> 00:32:29,910 linija 21, se je izkazalo, je buggy. 749 00:32:29,910 --> 00:32:31,160 Zakaj? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Oprostite? 752 00:32:36,930 --> 00:32:38,640 To nima - 753 00:32:38,640 --> 00:32:40,390 pravijo, da še enkrat. 754 00:32:40,390 --> 00:32:41,240 No, to ni zastonj. 755 00:32:41,240 --> 00:32:42,350 Tako da je drugi pa. 756 00:32:42,350 --> 00:32:45,000 Torej je ena pa posebej v vrstici 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Točno tako. 759 00:32:50,040 --> 00:32:54,980 Ta preprosta vrstica kode je samo buffer overflow, varovalni prekoračitve. 760 00:32:54,980 --> 00:32:57,050 Varovalni pomeni samo kos pomnilnika. 761 00:32:57,050 --> 00:33:01,520 Ampak da kos pomnilnika z velikostjo 10, 10 cela števila, kar pomeni, če smo 762 00:33:01,520 --> 00:33:05,350 Indeks vanjo pomočjo skladenjsko sladkorja za matrične zapisu kvadrat 763 00:33:05,350 --> 00:33:09,220 nosilci, boste imeli dostop do x kotnik 0 x nosilec 1 x, 764 00:33:09,220 --> 00:33:10,390 Nosilec pika, dot, pika. 765 00:33:10,390 --> 00:33:13,270 x nosilec 9 je ena največjih. 766 00:33:13,270 --> 00:33:17,680 Torej, če naredim x nosilec 10, kjer je Jaz sem pravzaprav dogaja v spominu? 767 00:33:17,680 --> 00:33:19,120 >> No, če imam 10 int - 768 00:33:19,120 --> 00:33:21,070 kaj je dejansko pripravijo vse od teh tukaj. 769 00:33:21,070 --> 00:33:22,700 To je bila prva pet. 770 00:33:22,700 --> 00:33:24,660 Tukaj je pet drugih ints. 771 00:33:24,660 --> 00:33:29,580 Torej x nosilec 0 je tukaj. x nosilec 1 je tukaj. x nosilec 9 je tukaj. x nosilec 772 00:33:29,580 --> 00:33:37,960 10 je tukaj, kar pomeni, da sem povedal, v skladu 21, računalnik naj 773 00:33:37,960 --> 00:33:39,400 Številka kje? 774 00:33:39,400 --> 00:33:42,010 Številka 0, kje? 775 00:33:42,010 --> 00:33:43,380 No, to je 0, ja. 776 00:33:43,380 --> 00:33:45,460 Ampak samo dejstvo, da je njena 0 je nekako naključje. 777 00:33:45,460 --> 00:33:47,140 To je lahko število 50, za vse nas skrbi. 778 00:33:47,140 --> 00:33:50,480 Vendar se trudimo, da bi ga pri x nosilca 10, ki je, če je to 779 00:33:50,480 --> 00:33:53,700 Vprašanje znamka je sestavljena, ki ni dobra stvar. 780 00:33:53,700 --> 00:33:57,070 Ta program bi lahko zelo dobro crash kot rezultat. 781 00:33:57,070 --> 00:33:59,400 >> Zdaj pa gremo naprej in videli, če je to je res, kaj se zgodi. 782 00:33:59,400 --> 00:34:02,600 Naredite spomin, saj datoteka se imenuje memory.c. 783 00:34:02,600 --> 00:34:05,950 Pojdimo naprej in zagon programski spomin. 784 00:34:05,950 --> 00:34:08,239 Torej imamo srečo, pravzaprav se zdi. 785 00:34:08,239 --> 00:34:09,340 Srečo imamo. 786 00:34:09,340 --> 00:34:11,060 Ampak, da vidimo, če smo zdaj teče Valgrind. 787 00:34:11,060 --> 00:34:14,170 Na prvi pogled se morda moj program Zdi se, da je popolnoma pravilna. 788 00:34:14,170 --> 00:34:18,010 Ampak naj teče Valgrind z - Uhajanje-ček enak poln spomin. 789 00:34:18,010 --> 00:34:20,110 >> In zdaj, ko sem teči ta - 790 00:34:20,110 --> 00:34:21,030 zanimivo. 791 00:34:21,030 --> 00:34:26,800 Neveljavna napisati velikosti 4 na linija 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Linija 21 memory.c je katera? 793 00:34:29,284 --> 00:34:30,340 Oh, zanimivo. 794 00:34:30,340 --> 00:34:31,080 Toda počakaj. 795 00:34:31,080 --> 00:34:32,389 Velikost 4, kaj je to nanaša? 796 00:34:32,389 --> 00:34:34,969 Sem samo, da je eden napisal, vendar je v velikosti 4. 797 00:34:34,969 --> 00:34:36,889 Zakaj je 4? 798 00:34:36,889 --> 00:34:39,280 To je zato, ker je int, ki je, spet, štiri bajte. 799 00:34:39,280 --> 00:34:42,510 Torej Valgrind našel napako, da sem, Že pogled na mojo kodo, ni. 800 00:34:42,510 --> 00:34:45,040 In morda vaš TF bi ali ne bi. 801 00:34:45,040 --> 00:34:48,469 Toda kaj, Valgrind zagotovo ugotovila, da smo naredili napako tam, čeprav 802 00:34:48,469 --> 00:34:52,719 čeprav imamo srečo, in računalnik odločil, eh, ne bom crash 803 00:34:52,719 --> 00:34:57,470 samo zato, ker si se dotaknil en bajt, en int je vredno spomina, ki ga ni 804 00:34:57,470 --> 00:34:58,550 dejansko sama. 805 00:34:58,550 --> 00:35:00,380 >> No, kaj je buggy tukaj. 806 00:35:00,380 --> 00:35:01,180 Naslov - 807 00:35:01,180 --> 00:35:03,190 To je noro videti naslov v šestnajstiškem. 808 00:35:03,190 --> 00:35:06,890 To samo pomeni, da nekje v kupu je nič bajtov bloka velikosti 40. 809 00:35:06,890 --> 00:35:07,620 je dodeljen. 810 00:35:07,620 --> 00:35:10,610 Dovolite mi, da povečate ven in videli, če To je malo bolj koristno. 811 00:35:10,610 --> 00:35:11,410 Zanimivo. 812 00:35:11,410 --> 00:35:15,600 40 bajtov se dokončno izgubil v izgube zapis 1 od 1. 813 00:35:15,600 --> 00:35:17,840 Again, več besede kot je koristno tukaj. 814 00:35:17,840 --> 00:35:21,350 Ampak temelji na poudarjenih linij, če bi jaz verjetno osredotočiti moja 815 00:35:21,350 --> 00:35:24,070 pozornosti za drugo napako? 816 00:35:24,070 --> 00:35:26,570 Izgleda linijo 20 memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Torej, če se vrnemo na liniji 20, ki je tisti, ki ste odkrili prej. 818 00:35:30,990 --> 00:35:33,030 In to ni nujno buggy. 819 00:35:33,030 --> 00:35:35,160 Vendar smo to obrnilo njegove učinke. 820 00:35:35,160 --> 00:35:38,790 Torej, kako popraviti vsaj ena od teh napak? 821 00:35:38,790 --> 00:35:42,240 Kaj lahko storim po vrstici 21? 822 00:35:42,240 --> 00:35:47,110 Kar sem lahko storil brez x, tako da se vračati ta pomnilnik. 823 00:35:47,110 --> 00:35:49,230 In kako popraviti to napako? 824 00:35:49,230 --> 00:35:52,120 Jaz bi definitivno šel ne dlje kot 0. 825 00:35:52,120 --> 00:35:53,670 Torej, kaj mi poskusite ponovno zagnati to. 826 00:35:53,670 --> 00:35:56,080 Oprostite, definitivno šel ne dlje kot 9. 827 00:35:56,080 --> 00:35:57,510 Naredite spomin. 828 00:35:57,510 --> 00:36:00,650 Naj se ponovi Valgrind v večjem oknu. 829 00:36:00,650 --> 00:36:01,580 In zdaj poglej. 830 00:36:01,580 --> 00:36:02,250 Lepo. 831 00:36:02,250 --> 00:36:03,270 Vse kopičijo bloki so bili osvobojeni. 832 00:36:03,270 --> 00:36:04,270 Ni mogoče uhajanje. 833 00:36:04,270 --> 00:36:07,520 In tam zgoraj tukaj, ni omembe več od neveljavnih desno. 834 00:36:07,520 --> 00:36:09,820 >> Samo da bi dobili pohlepni, in naj vidim, če en dokaz 835 00:36:09,820 --> 00:36:11,050 ne gre kot je bilo predvideno - 836 00:36:11,050 --> 00:36:12,560 Nisem dobil srečen trenutek nazaj. 837 00:36:12,560 --> 00:36:15,530 In dejstvo, da je to 0 je morda nepotrebnem zavajajoče. 838 00:36:15,530 --> 00:36:20,650 Reciva, ne 50, nekoliko arbitrarno število, znamka spomin dot poševnica spomin - 839 00:36:20,650 --> 00:36:21,410 Še vedno posreči. 840 00:36:21,410 --> 00:36:22,510 Nič treskav. 841 00:36:22,510 --> 00:36:26,150 Recimo, da sem naredil nekaj res neumno, in jaz 100. 842 00:36:26,150 --> 00:36:30,360 Dovolite mi, da remake spomin, dot slash spomin - 843 00:36:30,360 --> 00:36:31,075 spet imaš srečo. 844 00:36:31,075 --> 00:36:32,800 Kaj pa 1000? 845 00:36:32,800 --> 00:36:35,370 ints zunaj, v grobem, , kjer bi moral biti? 846 00:36:35,370 --> 00:36:37,410 Naredite spomin - 847 00:36:37,410 --> 00:36:38,570 prekleto. 848 00:36:38,570 --> 00:36:39,920 >> [SMEH] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Naj ne zafrkava več. 851 00:36:43,920 --> 00:36:45,120 Ponovitev spomin. 852 00:36:45,120 --> 00:36:45,840 Takole. 853 00:36:45,840 --> 00:36:46,410 Vse je v redu. 854 00:36:46,410 --> 00:36:52,500 Torej, očitno si indeks 100.000 ints tam, kjer bi si bila v 855 00:36:52,500 --> 00:36:54,410 spomin, slabe stvari se dogajajo. 856 00:36:54,410 --> 00:36:56,430 To je torej očitno ni trdo, hitro pravilo. 857 00:36:56,430 --> 00:36:58,190 Bil sem nekako s sojenja in napake, da bi dobili tam. 858 00:36:58,190 --> 00:37:02,230 Ampak to je zato, ker skrajšam zgodbo, pomnilnik računalnika je razdeljen tudi 859 00:37:02,230 --> 00:37:03,580 v teh stvareh imenovano segmente. 860 00:37:03,580 --> 00:37:07,260 Včasih, računalnik dejansko je dal malo več pomnilnika 861 00:37:07,260 --> 00:37:08,400 kot jo zahteva. 862 00:37:08,400 --> 00:37:12,170 Ampak za učinkovitost, to je samo lažje zaslužiti več pomnilnika, vendar vam povem le, 863 00:37:12,170 --> 00:37:13,780 da ste dobili del njega. 864 00:37:13,780 --> 00:37:16,370 >> In če imate srečo včasih, Zato boste morda lahko na dotik 865 00:37:16,370 --> 00:37:17,795 spomin, ki ne pripada vam. 866 00:37:17,795 --> 00:37:21,860 Imate nobenega jamstva, da je tisto, kar vrednost si dal tam bo ostal, ker 867 00:37:21,860 --> 00:37:25,080 računalnik še vedno misli, da je ne vi, ampak to ni nujno, da bo 868 00:37:25,080 --> 00:37:29,910 udaril drugega segmenta pomnilnika v računalnik in povzročijo napako kot 869 00:37:29,910 --> 00:37:31,710 tale tukaj. 870 00:37:31,710 --> 00:37:32,060 Vse je v redu. 871 00:37:32,060 --> 00:37:37,240 Vsa vprašanja potem na spomin? 872 00:37:37,240 --> 00:37:37,590 >> Vse je v redu. 873 00:37:37,590 --> 00:37:40,610 Oglejmo si oglejte tukaj in nato, ob Nekaj ​​smo jih jemljemo 874 00:37:40,610 --> 00:37:48,361 dodeli za kar nekaj časa, kar je v tej datoteki, imenovano cs50.h. 875 00:37:48,361 --> 00:37:49,420 Torej je to datoteka. 876 00:37:49,420 --> 00:37:51,130 To je samo cel kup za pripombe do vrha. 877 00:37:51,130 --> 00:37:53,900 In morda si gledal to, če si podrezal okoli na napravi. 878 00:37:53,900 --> 00:37:57,000 Vendar se izkaže, da ves čas, ko smo se uporabljajo za uporabo kot niz 879 00:37:57,000 --> 00:38:01,130 sinonim, sredstvo, s katerim smo prijavljeni , ki je bil sinonim s tem 880 00:38:01,130 --> 00:38:03,990 Ključna beseda typedef za opredelitev tipa. 881 00:38:03,990 --> 00:38:07,500 In smo v bistvu pravi, da obesil sinonim za char zvezdico. 882 00:38:07,500 --> 00:38:11,190 Da so sredstva, s katerimi sklad ustvaril te kolesa za usposabljanje, znane kot 883 00:38:11,190 --> 00:38:12,040 niz. 884 00:38:12,040 --> 00:38:14,830 >> Zdaj tukaj je samo prototip za getchar. 885 00:38:14,830 --> 00:38:17,350 Smo lahko videli prej, vendar je to res kaj počne. getchar 886 00:38:17,350 --> 00:38:19,070 bo nobenih argumentov, vrne znak. 887 00:38:19,070 --> 00:38:21,340 getdouble traja nobenih argumentov, vrne dvojno. 888 00:38:21,340 --> 00:38:24,440 getfloat je brez argumentov in vrne plovec, in tako naprej. 889 00:38:24,440 --> 00:38:27,270 getint je tukaj. getlonglong je tukaj. 890 00:38:27,270 --> 00:38:28,820 In getstring je tukaj. 891 00:38:28,820 --> 00:38:29,420 In to je to. 892 00:38:29,420 --> 00:38:33,080 Ta vijolična linija je ena preprocesor Direktiva zaradi 893 00:38:33,080 --> 00:38:35,550 hashtag na začetku tega. 894 00:38:35,550 --> 00:38:35,870 >> Vse je v redu. 895 00:38:35,870 --> 00:38:38,380 Torej, zdaj me spustili v cs50.c. 896 00:38:38,380 --> 00:38:40,400 In mi ne bo govoril predolgo na tem. 897 00:38:40,400 --> 00:38:43,280 Ampak, da vam pogled kaj je se dogaja vse to 898 00:38:43,280 --> 00:38:46,434 Čas, pusti me, da - 899 00:38:46,434 --> 00:38:48,250 naredimo getchar. 900 00:38:48,250 --> 00:38:51,050 Torej getchar je večinoma komentarjev. 901 00:38:51,050 --> 00:38:52,060 Ampak izgleda takole. 902 00:38:52,060 --> 00:38:54,800 To je torej dejansko funkcija getchar, da smo bili 903 00:38:54,800 --> 00:38:56,055 ob samoumevnega obstaja. 904 00:38:56,055 --> 00:38:59,370 In čeprav nismo tega uporabil pogosto, če sploh kdaj, to je vsaj 905 00:38:59,370 --> 00:39:00,470 dokaj preprost. 906 00:39:00,470 --> 00:39:02,580 Torej je vredno vzeti Hiter pogled na tukaj. 907 00:39:02,580 --> 00:39:06,540 >> Torej getchar ima neskončno zanko, namenoma tako očitno. 908 00:39:06,540 --> 00:39:10,050 Nato poziva - in to je nekako Lepo ponovna uporaba kode mi sami napisal. 909 00:39:10,050 --> 00:39:11,220 Poziva getstring. 910 00:39:11,220 --> 00:39:12,460 Ker kaj počne pomeni, da se zna? 911 00:39:12,460 --> 00:39:14,730 No, morda pa tudi poskušali dobiti celotna vrstica besedila od uporabnika in 912 00:39:14,730 --> 00:39:16,940 potem pa poglej na enem od teh znakov. 913 00:39:16,940 --> 00:39:19,170 V skladu 60, tukaj je malo malo za preverjanje razumnosti. 914 00:39:19,170 --> 00:39:21,610 Če getstring vrne null, naj ne nadaljuje. 915 00:39:21,610 --> 00:39:22,820 Nekaj ​​je šlo narobe. 916 00:39:22,820 --> 00:39:28,120 >> Zdaj je to nekoliko nadležno, vendar konvencionalno v C. char max verjetno 917 00:39:28,120 --> 00:39:29,960 predstavlja, kaj šele ki temelji na svoje ime? 918 00:39:29,960 --> 00:39:31,670 To je konstantna. 919 00:39:31,670 --> 00:39:36,040 To je kot številski vrednosti Največji znak lahko predstavljajo z 920 00:39:36,040 --> 00:39:40,370 en ugriz, kar je verjetno število 255, ki je največje število, ki ga 921 00:39:40,370 --> 00:39:42,720 predstavlja osem bitov, začenši od nič. 922 00:39:42,720 --> 00:39:47,460 Tako sem to uporabiti v tej funkciji, ko pisanje te kode, samo zato, ker 923 00:39:47,460 --> 00:39:51,753 če gre kaj narobe v getchar vendar njen cilj v življenju je, da se vrnete 924 00:39:51,753 --> 00:39:54,830 char, morate nekako mogli opozori, da uporabnik tega 925 00:39:54,830 --> 00:39:55,840 Nekaj ​​je šlo narobe. 926 00:39:55,840 --> 00:39:56,970 Ne moremo se vrniti nično. 927 00:39:56,970 --> 00:39:58,480 Izkaže se, da je nična kazalec. 928 00:39:58,480 --> 00:40:01,030 In spet, getchar ima Za vrnitev znak. 929 00:40:01,030 --> 00:40:04,760 >> Torej konvencija, če gre kaj narobe, ti, programer, ali 930 00:40:04,760 --> 00:40:08,160 V tem primeru mi s knjižnico, sem imel Samo odločiti samovoljno, če 931 00:40:08,160 --> 00:40:12,230 gre kaj narobe, bom vrne število 255, ki je resnično 932 00:40:12,230 --> 00:40:17,240 pomeni, da ni mogoče, uporabnik ne more tip lik, ki ga zastopa 933 00:40:17,240 --> 00:40:21,410 številka 255, ker smo imeli ukrasti kot ti divjega vrednosti do 934 00:40:21,410 --> 00:40:23,410 predstavljajo problem. 935 00:40:23,410 --> 00:40:27,010 Zdaj pa se izkaže, da narava 255 ni nekaj, kar lahko tip na 936 00:40:27,010 --> 00:40:28,380 tipkovnico, tako da to ni nič takega. 937 00:40:28,380 --> 00:40:30,910 Uporabnik ne opazi, da Sem ukradli ta znak. 938 00:40:30,910 --> 00:40:34,620 Ampak, če ste kdaj videli v man strani na računalniški sistem, nekateri sklic 939 00:40:34,620 --> 00:40:38,560 vsi pokrovčki konstanta, kot je ta, ki pravi, v primerih napak, ta konstanta se lahko 940 00:40:38,560 --> 00:40:42,720 treba vrniti, to je vse, nekaj ljudi pa Pred leti se je samovoljno odločil, da 941 00:40:42,720 --> 00:40:45,680 vrne to posebno vrednost in je stalnica v primeru pokličite 942 00:40:45,680 --> 00:40:46,840 gre kaj narobe. 943 00:40:46,840 --> 00:40:48,580 >> Zdaj se zgodi čarovnija tukaj. 944 00:40:48,580 --> 00:40:52,600 Najprej sem razglasitvi v skladu 67. dva znaka, C1 in C2. 945 00:40:52,600 --> 00:40:57,080 In potem se v skladu 68., tam je dejansko vrstica kode, ki je spominja 946 00:40:57,080 --> 00:41:01,140 naš prijatelj printf, saj je pa imajo odstotkov Cs v narekovajih. 947 00:41:01,140 --> 00:41:06,490 Ampak obvestilo, kaj se dogaja tukaj. sscanf pomeni niz skeniranje - 948 00:41:06,490 --> 00:41:11,690 pomeni skeniranje formatiran string, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Kaj to pomeni? 950 00:41:12,590 --> 00:41:16,310 To pomeni, da preide na sscanf niz. 951 00:41:16,310 --> 00:41:18,420 In line je karkoli uporabnik vnese palcev 952 00:41:18,420 --> 00:41:23,520 Podaš na sscanf oblikovnega niza, kot to, da pove, kaj so scanf 953 00:41:23,520 --> 00:41:25,870 si upal uporabnik vtipka 954 00:41:25,870 --> 00:41:29,730 Nato se boste peljali, v naslovih dveh kose pomnilnika, v tem primeru, 955 00:41:29,730 --> 00:41:31,150 ker imam dve ogradi. 956 00:41:31,150 --> 00:41:34,610 Zato bom, tako da ima naslov C1 in C2 naslov. 957 00:41:34,610 --> 00:41:37,700 >> In spomni, da daš funkcija naslov neke spremenljivke, kaj je 958 00:41:37,700 --> 00:41:38,950 posledice? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Kaj lahko storite, da funkcija kot rezultat od kar daje naslov 961 00:41:45,050 --> 00:41:48,170 spremenljivka, v nasprotju z spremenljivka sama? 962 00:41:48,170 --> 00:41:49,450 To se lahko spremeni, kajne? 963 00:41:49,450 --> 00:41:53,250 Če ste imeli nekoga karto za fizično naslov, lahko gredo tja in stori 964 00:41:53,250 --> 00:41:54,750 karkoli hočejo na tem naslovu. 965 00:41:54,750 --> 00:41:55,800 Isto idejo tukaj. 966 00:41:55,800 --> 00:41:59,950 Če se peljemo proti sscanf, naslov dveh kose pomnilnika, tudi ti drobni 967 00:41:59,950 --> 00:42:03,585 majhne kose pomnilnika, C1 in C2, vendar smo ji povedal naslov njimi, 968 00:42:03,585 --> 00:42:05,170 sscanf ga lahko spremenite. 969 00:42:05,170 --> 00:42:08,530 >> Torej namen sscanf v življenju, če beremo Stran človek, je, da se glasi, kaj 970 00:42:08,530 --> 00:42:13,420 Uporabnik vnesli, upanje za uporabnika, vnesli v lik in morda 971 00:42:13,420 --> 00:42:16,470 drug znak, in ne glede uporabnik vnesli, prvi znak gre 972 00:42:16,470 --> 00:42:19,310 tod drugo število gre tukaj. 973 00:42:19,310 --> 00:42:22,470 Zdaj pa je to, in bi jo kot prahi Samo to vedo iz dokumentacije, 974 00:42:22,470 --> 00:42:25,570 Dejstvo, da sem dal prazen prostor tam pomeni le, da mi ni mar, če 975 00:42:25,570 --> 00:42:28,440 uporabnik zadene preslednico nekaj krat, preden on ali ona prevzame 976 00:42:28,440 --> 00:42:30,400 lik, bom ignorirati vsak prazen prostor. 977 00:42:30,400 --> 00:42:32,510 Tako da, vem iz dokumentacijo. 978 00:42:32,510 --> 00:42:36,570 >> Dejstvo, da je drugi% c sledi prazen prostor dejansko 979 00:42:36,570 --> 00:42:37,410 namerno. 980 00:42:37,410 --> 00:42:41,190 Rad bi lahko zazna, če uporabnik zajebali ali niso sodelovale. 981 00:42:41,190 --> 00:42:45,630 Tako da sem upal, da Vtipkali le v enem značaja, zato sem upal, 982 00:42:45,630 --> 00:42:50,640 da sscanf je samo še, da se vrnete vrednost 1, ker, spet, če sem prebral 983 00:42:50,640 --> 00:42:55,400 dokumentacijo, sscanf je namen v življenje je, da se vrnete na število 984 00:42:55,400 --> 00:42:59,170 spremenljivke, ki so bile napolnjene s prispevki uporabnikov. 985 00:42:59,170 --> 00:43:02,270 >> Opravil sem v dveh spremenljivkah naslovi, C1 in C2. 986 00:43:02,270 --> 00:43:06,420 Upam pa, da je le eden od jih ubili zato, ker če sscanf 987 00:43:06,420 --> 00:43:11,130 vrne 2, kar je verjetno posledice logično? 988 00:43:11,130 --> 00:43:14,600 Da je uporabnik ne daj mi eno karakter, kot sem mu povedal, ali ona. 989 00:43:14,600 --> 00:43:17,860 Verjetno so vnesli na Najmanj dva znaka. 990 00:43:17,860 --> 00:43:22,430 Torej, če se namesto ni imel drugi % C, sem imela enega, ki 991 00:43:22,430 --> 00:43:25,370 Iskreno bi bilo bolj intuitivno Pristop, mislim, da je prvi pogled, 992 00:43:25,370 --> 00:43:30,220 vam ne bodo mogli odkriti če je bil uporabnik, ki vam daje več 993 00:43:30,220 --> 00:43:31,780 vhod, kot si dejansko želel. 994 00:43:31,780 --> 00:43:34,100 Torej, to je implicitna oblika za preverjanje napak. 995 00:43:34,100 --> 00:43:35,640 >> Ampak obvestilo, kaj delam tukaj. 996 00:43:35,640 --> 00:43:39,970 Ko sem prepričan, da mi je uporabnik dal eno lik, sem osvobodil črto, gre 997 00:43:39,970 --> 00:43:44,450 nasprotno getstring, kar uporablja malloc, nato pa se bom vrnil 998 00:43:44,450 --> 00:43:51,030 C1, znak, da sem upal uporabniku na voljo in samo pod pogojem. 999 00:43:51,030 --> 00:43:54,680 Samo tako hitro zagledali, vendar vsa vprašanja o getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Vrnili se bomo z nekaterimi drugimi. 1002 00:43:59,590 --> 00:44:03,770 >> No, naj gredo naprej in to - Predvidevam sedaj, samo da bi motivirali naše 1003 00:44:03,770 --> 00:44:08,910 Razprava na teden plus čas, to je datoteka z imenom structs.h. 1004 00:44:08,910 --> 00:44:11,440 In spet, to je samo okus nekaj, kar je pred nami. 1005 00:44:11,440 --> 00:44:13,090 Ampak obvestilo, da je veliko za ta komentar. 1006 00:44:13,090 --> 00:44:17,440 Naj izpostaviti le Zanimiv del za zdaj. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 tam je to isto ključno besedo znova. 1009 00:44:19,700 --> 00:44:23,100 typedef bomo uporabili prijaviti niz kot posebno vrsto podatkov. 1010 00:44:23,100 --> 00:44:27,490 Lahko uporabite typedef ustvariti povsem novo tipi podatkov, ki niso obstajale, ko 1011 00:44:27,490 --> 00:44:28,570 C je izumil. 1012 00:44:28,570 --> 00:44:32,520 Na primer, int prihaja s C. char prihaja z dvojno C. prihaja s C. Ampak 1013 00:44:32,520 --> 00:44:34,000 ni pojem študenta. 1014 00:44:34,000 --> 00:44:37,230 In vendar bi bilo zelo koristno, da sposoben napisati program, ki shranjuje 1015 00:44:37,230 --> 00:44:40,440 v spremenljivko, študentske številka, njihovo ime, in njihova hiša. 1016 00:44:40,440 --> 00:44:42,890 Z drugimi besedami, tri kose podatkov, kot int in 1017 00:44:42,890 --> 00:44:44,420 Niz in drugi niz. 1018 00:44:44,420 --> 00:44:48,220 >> Z typedef, kar je precej močna O tem in o ključnih sturct za 1019 00:44:48,220 --> 00:44:53,660 strukture, ti, programer v letu 2013, dejansko lahko določite sami 1020 00:44:53,660 --> 00:44:57,530 tipi podatkov, ki niso obstajale let Pred ampak da bo ustrezala vašim namene. 1021 00:44:57,530 --> 00:45:01,910 In tako tukaj, v vrsticah 13 do 19, smo razglasitvi nove vrste podatkov, kot so 1022 00:45:01,910 --> 00:45:04,320 int, vendar je študent kliče. 1023 00:45:04,320 --> 00:45:09,310 In znotraj te spremenljivke bo tri stvari - int, string, 1024 00:45:09,310 --> 00:45:09,930 in niz. 1025 00:45:09,930 --> 00:45:13,040 Torej si lahko zamislite, kaj je res zgodilo, čeprav to 1026 00:45:13,040 --> 00:45:17,160 malo poenostavitve za danes, Študent se v bistvu dogaja 1027 00:45:17,160 --> 00:45:19,450 da izgleda nekako takole. 1028 00:45:19,450 --> 00:45:22,580 Njena bo kos Pomnilnik z ID, ime 1029 00:45:22,580 --> 00:45:25,580 polje in hiša polje. 1030 00:45:25,580 --> 00:45:30,670 In bomo lahko uporabljali te kose spomin in dostop do njih, kot sledi. 1031 00:45:30,670 --> 00:45:38,870 >> Če grem v struct0.c, tukaj je relativno dolgo, vendar po 1032 00:45:38,870 --> 00:45:42,630 vzorec kode, ki uporablja to nov trik. 1033 00:45:42,630 --> 00:45:45,790 Torej, najprej, kaj me opozoril do zanimivih delov do vrha. 1034 00:45:45,790 --> 00:45:49,670 Sharp opredeljuje učence 3, izjavlja stalne pozvali študente in zakoniti 1035 00:45:49,670 --> 00:45:53,450 je poljubno število 3, samo tako da imam tri učence, ki uporabljajo 1036 00:45:53,450 --> 00:45:54,830 ta program, za zdaj. 1037 00:45:54,830 --> 00:45:55,960 Prihaja Main. 1038 00:45:55,960 --> 00:45:58,860 In obvestilo, kako izjavljam, matrika študentov? 1039 00:45:58,860 --> 00:46:00,480 No, jaz šele raba enako sintakso. 1040 00:46:00,480 --> 00:46:02,110 Beseda študent je seveda novo. 1041 00:46:02,110 --> 00:46:04,790 Ampak študent, razred, nosilec študentov. 1042 00:46:04,790 --> 00:46:06,720 >> Torej, žal pa je veliko ponovne uporabe izrazov tukaj. 1043 00:46:06,720 --> 00:46:07,660 To je samo številka. 1044 00:46:07,660 --> 00:46:09,040 Torej, to je, kot pravi, tri. 1045 00:46:09,040 --> 00:46:11,430 Razred je samo tisto, kar hočem poklicati spremenljivko. 1046 00:46:11,430 --> 00:46:12,840 Jaz bi lahko študenti poklicati. 1047 00:46:12,840 --> 00:46:15,880 A razred, to ni class objektno usmerjen Java nekakšen način. 1048 00:46:15,880 --> 00:46:17,220 To je samo razred učencev. 1049 00:46:17,220 --> 00:46:20,590 In podatkovni tip vsakega elementa V tem polju je študent. 1050 00:46:20,590 --> 00:46:23,040 Tako da to je malo drugačna in od rekel nekaj 1051 00:46:23,040 --> 00:46:25,250 kot je ta, da je samo - 1052 00:46:25,250 --> 00:46:29,500 Pravim, da mi tri učence in klic, da matrično razred. 1053 00:46:29,500 --> 00:46:29,800 >> Vse je v redu. 1054 00:46:29,800 --> 00:46:30,680 Zdaj tukaj je štiri zanke. 1055 00:46:30,680 --> 00:46:33,480 Ta tip je znano - Ponovil od nič na do tri. 1056 00:46:33,480 --> 00:46:35,160 In tukaj je nov del sintakse. 1057 00:46:35,160 --> 00:46:37,710 Program me bo poziv, človeka, da ga študent 1058 00:46:37,710 --> 00:46:39,200 ID, ki je int. 1059 00:46:39,200 --> 00:46:44,650 In tukaj je sintakso, s katero lahko shranite nekaj v ID polju na 1060 00:46:44,650 --> 00:46:48,630 lokacija razred nosilec I. Tako Ta sintaksa ni nova. 1061 00:46:48,630 --> 00:46:51,450 To samo pomeni, da mi osma učenec v razredu. 1062 00:46:51,450 --> 00:46:52,940 Toda ta simbol je nova. 1063 00:46:52,940 --> 00:46:56,320 Do sedaj smo ni mogoče uporabiti piko, vsaj v kodo, kot je ta. 1064 00:46:56,320 --> 00:47:01,490 To pomeni, pojdite na struct znan kot študent, in dal nekaj tam. 1065 00:47:01,490 --> 00:47:05,670 Podobno tudi novo vrstico, 31, gredo naprej in dal vse, kar uporabnik vnese 1066 00:47:05,670 --> 00:47:10,530 za ime, tu in kaj delajo za Hiša, ista stvar, pojdi naprej in 1067 00:47:10,530 --> 00:47:13,230 ga dal v. hišo. 1068 00:47:13,230 --> 00:47:15,955 >> Torej, kaj je ta program na koncu naredil? 1069 00:47:15,955 --> 00:47:17,220 Ogledate si lahko malo teaser tam. 1070 00:47:17,220 --> 00:47:24,780 Dovolite mi, da gredo naprej in ne bo konstrukti 0 dot slash struct 0, študenta ID 1, 1071 00:47:24,780 --> 00:47:28,250 pravi David Mather, študent ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, študent ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 in edina stvar ta program naredil, ki je ravno povsem samovoljno, je 1075 00:47:38,380 --> 00:47:40,980 Želel sem narediti nekaj, s temi podatki, Zdaj, ko sem nas je naučila, kako 1076 00:47:40,980 --> 00:47:43,450 uporabite konstrukti, je samo sem imel ta dodatna zanka tukaj. 1077 00:47:43,450 --> 00:47:45,260 Ponovil sem nad paleto študentov. 1078 00:47:45,260 --> 00:47:49,170 Včasih sem naše, morda zdaj znano prijatelja Niz primerjati, stircomp za 1079 00:47:49,170 --> 00:47:53,780 Preverjanje je 8. študentska hiša enako Mather? 1080 00:47:53,780 --> 00:47:56,760 In če je tako, samo natisniti nekaj samovoljno všeč, ja, res je. 1081 00:47:56,760 --> 00:47:59,430 Ampak še enkrat, samo mi dali priložnosti za uporabo in ponovno uporabo in 1082 00:47:59,430 --> 00:48:02,270 ponovno uporabo te nove dot zapis. 1083 00:48:02,270 --> 00:48:03,250 >> Torej, koga briga, kajne? 1084 00:48:03,250 --> 00:48:06,270 Prihaja s študentskim programa nekoliko arbitrarna, vendar se izkaže, 1085 00:48:06,270 --> 00:48:09,800 da lahko naredimo uporabne stvari z ta, na primer na naslednji način. 1086 00:48:09,800 --> 00:48:14,600 To je veliko bolj zapletena struct v C. je dobil ducat ali več polj, 1087 00:48:14,600 --> 00:48:15,880 Nekoliko cryptically imenom. 1088 00:48:15,880 --> 00:48:20,110 Ampak, če ste že kdaj slišali za grafiko format se imenuje bitna, BMP, je 1089 00:48:20,110 --> 00:48:22,830 Izkazalo se je, da bitmap format precej Izgleda, da je to. 1090 00:48:22,830 --> 00:48:24,200 To je neumno malo Smiley face. 1091 00:48:24,200 --> 00:48:27,840 To je majhna slika, ki sem jih v povečani na zelo velika, tako da lahko vidim vsak 1092 00:48:27,840 --> 00:48:30,410 posameznih pik ali pik. 1093 00:48:30,410 --> 00:48:33,800 Zdaj pa se je izkazalo, da lahko predstavljajo črna pika z, recimo, številko 0.. 1094 00:48:33,800 --> 00:48:35,520 In bela pika s številko 1. 1095 00:48:35,520 --> 00:48:39,140 >> Torej, z drugimi besedami, če želite narisati Nasmejan obraz in shranite sliko v 1096 00:48:39,140 --> 00:48:42,680 Računalnik je dovolj za shranjevanje ničel in tisti, ki izgledajo kot to, kje, 1097 00:48:42,680 --> 00:48:45,250 še enkrat, pa so bela in ničle so črni. 1098 00:48:45,250 --> 00:48:48,290 In skupaj, če ste dejansko imajo prepasajo enic in ničel, imate 1099 00:48:48,290 --> 00:48:51,030 mrežo točk, in če določajo jih ven, imaš luštna 1100 00:48:51,030 --> 00:48:52,560 Malo Smiley face. 1101 00:48:52,560 --> 00:48:58,150 Zdaj, bitna format, BMP, je učinkovito, da je pod pokrovom motorja, 1102 00:48:58,150 --> 00:49:00,970 vendar z več pik SOT, da lahko dejansko predstavljajo barve. 1103 00:49:00,970 --> 00:49:05,170 >> Toda, če imate bolj zapletene formate, kot so BMP in JPEG in GIF 1104 00:49:05,170 --> 00:49:09,360 s katerim si boste seznanjeni tisti, Datoteke ponavadi ne samo na disku 1105 00:49:09,360 --> 00:49:13,760 imajo ničel in enic za pik, vendar imajo nekatere metapodatke, kot tudi - 1106 00:49:13,760 --> 00:49:16,960 meta v smislu, da ni res Podatki vendar je koristno imeti. 1107 00:49:16,960 --> 00:49:21,370 Torej ta polja so tukaj kar pomeni, in bomo to videli bolj podrobno v P-set v 1108 00:49:21,370 --> 00:49:25,810 5, da pred ničle in enice, ki predstavljajo pik v sliki, 1109 00:49:25,810 --> 00:49:29,110 tam je kup metapodatkov, kot so velikost slike in 1110 00:49:29,110 --> 00:49:30,250 širina slike. 1111 00:49:30,250 --> 00:49:32,910 In opazil sem skubljenje off nekaj samovoljno stvari tukaj - 1112 00:49:32,910 --> 00:49:34,260 širina in višina. 1113 00:49:34,260 --> 00:49:36,160 Število bit in še nekatere druge stvari. 1114 00:49:36,160 --> 00:49:37,840 Torej, obstaja nekaj metapodatkov v datoteki. 1115 00:49:37,840 --> 00:49:41,470 >> Ampak z razumevanjem, kako so datoteke, ki jih se na ta način, lahko dejansko 1116 00:49:41,470 --> 00:49:45,890 potem manipulirajo podobe, izterja slike iz diska, velikost slike. 1117 00:49:45,890 --> 00:49:47,560 Ampak ne moreš nujno povečati njihovo. 1118 00:49:47,560 --> 00:49:48,480 Potreboval sem fotografijo. 1119 00:49:48,480 --> 00:49:52,840 Tako sem šel nazaj na RJ tukaj, ki ste videli Na zaslonu se kar nekaj časa nazaj. 1120 00:49:52,840 --> 00:49:57,160 In če sem odprla Keynote tukaj, to je kaj se zgodi, če poskusite za povečavo in 1121 00:49:57,160 --> 00:49:59,380 povečati RJ. 1122 00:49:59,380 --> 00:50:01,480 On ne postaja nič bolj res. 1123 00:50:01,480 --> 00:50:06,240 Zdaj Keynote je nekako zabrisane je malo, samo da bi zatajili 1124 00:50:06,240 --> 00:50:11,040 Dejstvo, da RJ ne dobi posebno okrepljeno ko povečate palca 1125 00:50:11,040 --> 00:50:13,310 In če to storite na ta način, glej kvadratke? 1126 00:50:13,310 --> 00:50:15,490 Ja, lahko zagotovo videli kvadratki na projektorju. 1127 00:50:15,490 --> 00:50:17,690 >> To je tisto, kar dobiš, ko poveča. 1128 00:50:17,690 --> 00:50:22,570 Ampak v razumevanju, kako naša RJ ali Smeško se izvaja nam bo dovolil 1129 00:50:22,570 --> 00:50:24,950 dejansko napisati kodo, ki manipulira te stvari. 1130 00:50:24,950 --> 00:50:29,970 In mislil sem, da bom na koncu na to opombo, s 55 sekund poveča to je, 1131 00:50:29,970 --> 00:50:31,230 Sem upal, recimo precej zavajajoče. 1132 00:50:31,230 --> 00:50:32,990 >> [Predvajanje videa] 1133 00:50:32,990 --> 00:50:34,790 >> -Laže. 1134 00:50:34,790 --> 00:50:38,310 O čem, ne vem. 1135 00:50:38,310 --> 00:50:41,200 >> -Torej, kaj vemo? 1136 00:50:41,200 --> 00:50:45,280 >> -To je ob 9:15 Ray Santoya je bil na bankomatu. 1137 00:50:45,280 --> 00:50:47,830 >> Torej vprašanje je, kaj je delal na 09:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Streljanje devet milimetrov V nekaj. 1139 00:50:50,750 --> 00:50:52,615 Morda je videl ostrostrelca. 1140 00:50:52,615 --> 00:50:54,760 >> -Ali pa je delal z njim. 1141 00:50:54,760 --> 00:50:56,120 >> -Počakajte. 1142 00:50:56,120 --> 00:50:57,450 Pojdi nazaj eno. 1143 00:50:57,450 --> 00:50:58,700 >> -Kaj vidiš? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> Prinesi svoj obraz gor, celozaslonski način. 1146 00:51:09,490 --> 00:51:09,790 >> -Njegova očala. 1147 00:51:09,790 --> 00:51:11,040 >> -Tam je refleksija. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -To je Neuvitas baseball ekipa. 1150 00:51:23,520 --> 00:51:24,530 To je njihov logo. 1151 00:51:24,530 --> 00:51:27,040 >> In govoril je, da kdor je nosil to jakno. 1152 00:51:27,040 --> 00:51:27,530 >> [END predvajanje videa] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: To bo Problem je Set 5. 1154 00:51:29,180 --> 00:51:30,720 Vam bomo videli naslednji teden. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Na naslednjem CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Črički Pojoči] 1157 00:51:39,240 --> 00:51:41,270 >> [Predvajanja glasbe]