1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [SEMAJNO 5] 2 00:00:02,760 --> 00:00:04,760 [Davido J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Jen CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Virino] Li mensogas; pri kio, mi ne scias. 5 00:00:17,780 --> 00:00:20,300 [Viro] Do kion ni scias? 6 00:00:20,300 --> 00:00:24,120 [Virino] Tio, je 9:15, Ray Santoya estis ĉe la ATM. 7 00:00:24,120 --> 00:00:27,420 [Viro] Do la demando estas, kio li faras je 9:16? 8 00:00:27,420 --> 00:00:29,980 [Virino] Pafado la 9 mm ĉe io. 9 00:00:29,980 --> 00:00:31,900 Eble li vidis la francotirador. 10 00:00:31,900 --> 00:00:34,000 [Viro] Aŭ li laboris kun li. 11 00:00:34,000 --> 00:00:36,330 [Virino] Atendu. Reiru unu. 12 00:00:36,330 --> 00:00:38,330 [Viro] Kion vi vidas? 13 00:00:38,330 --> 00:00:44,520 [♫ Suspenseful muziko ♫] 14 00:00:44,520 --> 00:00:48,320 [Virino] Alportu sian vizagxon supren. Plena ekrano. 15 00:00:48,320 --> 00:00:51,230 [Viro] Lia okulvitroj. >> Jen reflekto. 16 00:00:51,230 --> 00:01:00,810 [♫ Suspenseful muziko ♫] 17 00:01:00,810 --> 00:01:03,580 [Viro] Tio estas la Nuevita la basbalo teamo. Tio estas ilia logo. 18 00:01:03,580 --> 00:01:07,790 [Virino] Kaj li parolas al kiu ajn estas vestita ke jako. 19 00:01:07,790 --> 00:01:13,730 >> [Davido Malan] Do, ĉi tiu estas CS50 semajno 5, kaj hodiaŭ ni ruinigi iom de televido kaj kino por vi. 20 00:01:13,730 --> 00:01:16,170 Do kiam ajn vi rigardas show kiel ĉi tiu tie, 21 00:01:16,170 --> 00:01:19,910 kaj la policanoj diri "Ĉu vi povas purigi ke ĝis?" aŭ "Enhance," 22 00:01:19,910 --> 00:01:21,900 ne estas plibonigi en la reala mondo. 23 00:01:21,900 --> 00:01:25,220 Fakte, kion vi vere get estas iom io tiamaniere. 24 00:01:25,220 --> 00:01:27,570 Mi tiris supren unu el la personaro fotoj de la paĝo. 25 00:01:27,570 --> 00:01:30,980 Tiu estas programo nomata Photoshop. Ĉi tiu estas 1 el 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 el 3 Bowdens reale, hodiaŭ, ĉar ni havas sinjorino Bowden tie tiel, kun Rob kaj Paul. 27 00:01:36,300 --> 00:01:41,950 Sed ĉi tie estas Rob en la ekrano, kaj se ni zoom en sur tiu ekbrilo li ĉiam havis en sia okulo, 28 00:01:41,950 --> 00:01:47,600 kion vi efektive vidas estas tio kio vi vidas estas kion vi ricevos. 29 00:01:47,600 --> 00:01:51,690 Tiu estas "plibonigitaj," do "CSI" havas iom malbone. 30 00:01:51,690 --> 00:01:55,190 Estas unu alia klipo, se ni povas repreni sur "CSI" malmulta tempo. 31 00:01:55,190 --> 00:01:58,500 Ĉi tiu estas bela frazo paroli nun se vi volas 32 00:01:58,500 --> 00:02:10,280 soni teknika kun viaj amikoj kiam, vere, vi diris absolute nenion. 33 00:02:10,280 --> 00:02:12,970 >> [Viro] Dum semajnoj mi estis esploranta la Cabby Killer murdoj 34 00:02:12,970 --> 00:02:15,360 kun iu mórbida fascino. 35 00:02:15,360 --> 00:02:17,160 [Virino # 1] Tio estas en reala tempo. 36 00:02:17,160 --> 00:02:22,930 [Virino # 2] Mi krei GUI interfaco uzante Visual Basic, vidi se mi povas spuri IP-adreso. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Do audio el sync flanken, kreante GUI interfaco uzante Visual Basic 38 00:02:29,570 --> 00:02:31,820 spuri IP-adreso estas kompleta sensencaĵo. 39 00:02:31,820 --> 00:02:33,840 Ĉi tiuj tagoj vi ne uzus Visual Basic, 40 00:02:33,840 --> 00:02:38,920 ne necesas por la GUI, kaj IP-adreso estis teknike preciza termino. 41 00:02:38,920 --> 00:02:41,730 Observu do okulon el ĉi tiuj, kaj unu el miaj preferitaj: 42 00:02:41,730 --> 00:02:45,070 Ĉi tiu estas iom pli arcano, ĉar vi bezonas scii alian lingvon. 43 00:02:45,070 --> 00:02:47,860 Jen lingvo nomita Objective-C, kiu estas superaro de C. 44 00:02:47,860 --> 00:02:51,960 Kiu signifas ke estas C plus iuj aldonaj funkcioj, inter ili objekteman programadon. 45 00:02:51,960 --> 00:02:55,070 Kaj jen estas la lingvo kiu Apple popularigis por iOS programado. 46 00:02:55,070 --> 00:02:58,760 Kaj tial jen klipo de malsama show aro, el "Nombroj" 47 00:02:58,760 --> 00:03:02,450 ke se vi efektive aspektas tre sur via TiVo kaj paŭzo ĉe la dekstra momento, 48 00:03:02,450 --> 00:03:07,700 vi vidos, ke kion ili rigardas ne sufiĉe kio estas priskribita. 49 00:03:07,700 --> 00:03:11,170 Kaj lasu min provi malsaman audio konektilon tie kaj vidi se ni ne povas 50 00:03:11,170 --> 00:03:13,780 teni la audio sinkronigita ĉi tiu tempo. 51 00:03:13,780 --> 00:03:20,530 Mi donas al vi "Nombroj". 52 00:03:20,530 --> 00:03:23,240 >> [Viro # 1] Ĝi estas 32-bita IPv4 adreso. 53 00:03:23,240 --> 00:03:38,930 [Viro # 2] IP, tio estas la interreto. >> Privata reto. Estas Anita privata reto. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okay. Ĉi tiu estas Objective-C, kaj ĝi estas por iu knabo la kolorigo programo, 55 00:03:43,810 --> 00:03:51,140 kiel vi povas eble konkludi de la nomo de la variablo tie. 56 00:03:51,140 --> 00:03:54,410 Tiel ke, tiam, estis "Nombroj". Do hodiaŭ kaj ĉi-semajne ni prezentas 57 00:03:54,410 --> 00:03:57,740 iom de la mondo de forensics kaj la kunteksto en la problemoj sekve. 58 00:03:57,740 --> 00:04:00,590 Hodiaŭ estos mallongigita prelego ĉar ekzistas speciala okazaĵo ĉi tien 59 00:04:00,590 --> 00:04:05,530 poste, do ni devos preni travidi, kaj tease ambaŭ studentoj kaj gepatroj egale hodiaŭ 60 00:04:05,530 --> 00:04:07,420 kun iuj el la aĵoj kiuj estas sur la horizonto. 61 00:04:07,420 --> 00:04:12,240 Inter ili, ekde lundo, vi havos kelkajn pli samklasanoj. 62 00:04:12,240 --> 00:04:16,050 EdX, Harvard kaj MITS nova linio iniciato por malfermitaj courseware 63 00:04:16,050 --> 00:04:19,120 kaj pli, ĵetas sur Harvard kampuso lundon. 64 00:04:19,120 --> 00:04:21,490 Kio signifas veni lundon vi havos - ekde lasta grafo, 65 00:04:21,490 --> 00:04:26,210 86.000 pliaj samklasanoj estos post kune kun CS50 la prelegoj 66 00:04:26,210 --> 00:04:29,170 kaj sekcioj kaj walkthroughs kaj problemo aroj. 67 00:04:29,170 --> 00:04:32,350 Kaj kiel parto de tiu, vi fariĝos membroj de la inaŭgura klaso de 68 00:04:32,350 --> 00:04:35,090 CS50 kaj nun CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Kiel parto de tio, nun, rimarkas ke estos iuj upsides tiel. 70 00:04:39,310 --> 00:04:43,790 Varbi por tio, por la amasa kvanto de lernantoj, 71 00:04:43,790 --> 00:04:47,180 sufiĉas diri ke kvankam ni havas 108 TFs kaj CAS, 72 00:04:47,180 --> 00:04:50,790 Ne tute bona studento / instruisto rilatumo iam ni batis 80.000 aliaj studentoj. 73 00:04:50,790 --> 00:04:52,850 Do ni ne estos grading tiom da problemo aroj permane. 74 00:04:52,850 --> 00:04:55,920 Do enkondukis ĉi tiun semajnon en la problemo aro estos CS50 Jaque, 75 00:04:55,920 --> 00:04:58,450 kiu iras al esti komandlinio utileco en la aparaton 76 00:04:58,450 --> 00:05:01,200 ke vi ricevos kiam vi ĝisdatigas ĝin poste ĉi semajnfino, 77 00:05:01,200 --> 00:05:03,200 kaj vi povos kuri komando, kontrolu 50, 78 00:05:03,200 --> 00:05:06,500 en via propra pset, kaj vi ricevos iom da sugestoj pri tio, ĉu via programo estas 79 00:05:06,500 --> 00:05:11,160 ĝentila aŭ malĝusta laŭ diversaj dezajno especificaciones ke ni havigis. 80 00:05:11,160 --> 00:05:13,580 Do pli en tiu kaj la problemo aro specifo kaj 81 00:05:13,580 --> 00:05:17,240 la CS50x samklasanoj estos uzante ĉi tiel. 82 00:05:17,240 --> 00:05:19,230 >> Do problemo aro 4 estas ĉion pri forensics. 83 00:05:19,230 --> 00:05:21,940 Kaj ĉi tiu peco estis inspirita de iu reala vivo stuff, 84 00:05:21,940 --> 00:05:24,620 per kiam mi estis en postdiploma lernejo, mi internigita por tempo kun 85 00:05:24,620 --> 00:05:28,650 la Middlesex County la prokuroro Oficejo faras jura laboro 86 00:05:28,650 --> 00:05:31,650 kun lia ĉefa jura esploristo, kaj kion tiu sumiĝis 87 00:05:31,650 --> 00:05:35,260 estas, mi kredas ke mi menciis kelkajn semajno pasinta, estas la Meso ŝtato polico aŭ aliaj 88 00:05:35,260 --> 00:05:39,000 would envenis, ili delasus ekstere aĵojn kiel malmolaj diskoj kaj KD kaj disketoj 89 00:05:39,000 --> 00:05:42,340 kaj similaj, kaj tiam la celo de la forensics oficejo estis konstati ĉu 90 00:05:42,340 --> 00:05:44,600 estis aŭ ne estis pruvo de iu tipo. 91 00:05:44,600 --> 00:05:48,010 Ĉi tiu estis la Specialaj Esploroj Unueco, tiel estis blanka kolumo krimo, 92 00:05:48,010 --> 00:05:52,350 estis pli tumulti ia krimoj, 93 00:05:52,350 --> 00:05:55,990 ion engaĝante ia ciferecaj komunikiloj; rezultas ke ne, ke multaj homoj 94 00:05:55,990 --> 00:05:59,370 skribi retmesaĝon dirante "Mi faris tion." 95 00:05:59,370 --> 00:06:03,290 Do tre ofte tiuj forensics serĉoj ne deturnis tiun tutan multe da frukto; 96 00:06:03,290 --> 00:06:05,850 Sed kelkfoje homoj skribus tiajn retpoŝtojn. 97 00:06:05,850 --> 00:06:08,490 Do kelkfoje la penadoj estis rekompencita. 98 00:06:08,490 --> 00:06:14,420 >> Sed por konduki ĝis ĉi jura pset, ni estos enkonduki en pset 4 iom de grafikaĵoj. 99 00:06:14,420 --> 00:06:18,260 Do vi probable prenos ĉi tiujn aĵojn por koncedis, JPEG-oj, gifs kaj similaj tiuj tagoj, 100 00:06:18,260 --> 00:06:21,640 sed se vi vere pensas pri ĝi, bildo, multe kiel Rob vizaĝon, 101 00:06:21,640 --> 00:06:24,430 povus esti modelita kiel vico de punktoj, aŭ rastrumeroj. 102 00:06:24,430 --> 00:06:26,680 Nun, en la kazo de Rob vizaĝon, estas ĉiaj koloroj, 103 00:06:26,680 --> 00:06:29,940 kaj ni komencis vidi la individuo dots, otherwide konata kiel rastrumeroj, 104 00:06:29,940 --> 00:06:31,610 iam ni komencis zoom in 105 00:06:31,610 --> 00:06:35,590 Sed se ni simpligi la mondo iom, kaj ĝuste diri ke ĉi tie estas Rob 106 00:06:35,590 --> 00:06:40,560 en nigra kaj blanka, nu, por reprezenti nigraj kaj blankaj ni povas simple uzi duuma. 107 00:06:40,560 --> 00:06:44,960 Kaj se ni tuj uzi duuma, 1 aŭ 0, oni povas esprimi ĉi sama bildo 108 00:06:44,960 --> 00:06:51,970 de Rob la ridetanta vizaĝo kun ĉi ŝablono de bitoj: 11000011 reprezentas 109 00:06:51,970 --> 00:06:55,160 blanka, blanka, nigra, nigra, nigra, nigra, blanka blankaj. 110 00:06:55,160 --> 00:06:59,290 Kaj tiel ĝi ne estas grandega salto do komenci paroli pri pitoreskaj fotoj. 111 00:06:59,290 --> 00:07:01,920 Tion, kion vi vidus en Facebook aŭ preni kun cifereca fotilo, 112 00:07:01,920 --> 00:07:04,730 sed, certe, kiam temas pri koloroj, vi bezonas pli bitoj. 113 00:07:04,730 --> 00:07:08,470 Kaj sufiĉe komuna en la mondo de fotoj estas uzi ne 1-bita koloro, 114 00:07:08,470 --> 00:07:12,730 kiel ĉi tio sugestas, sed 24-bita koloro, kie vi reale preni milionojn da koloroj. 115 00:07:12,730 --> 00:07:15,430 Do kiel en la kazo kiam ni zoomed en sur Rob de kudrilo, 116 00:07:15,430 --> 00:07:19,270 kiu estis ajna nombro da malsamaj bunta ebloj. 117 00:07:19,270 --> 00:07:22,260 >> Do ni enkonduki tion en problemo aro 4 tiel kiel en la walkthrough, 118 00:07:22,260 --> 00:07:27,050 kiu estos hodiaux je 3:30 anstataŭ la kutima 2:30 pro la vendreda prelego tie. 119 00:07:27,050 --> 00:07:29,930 Sed la video estos interrete, kiel kutime, morgaŭ. 120 00:07:29,930 --> 00:07:31,880 Ni ankaŭ enkonduki vin al alia formato de dosiero. 121 00:07:31,880 --> 00:07:34,150 Do tiu estas intence signifis por serĉi intimidante unue, 122 00:07:34,150 --> 00:07:38,980 sed ĉi tiu estas nur iuj dokumentado por C struct. 123 00:07:38,980 --> 00:07:42,280 Rezultas ke Microsoft, jaroj, helpis popularigi ĉi tiu formato, 124 00:07:42,280 --> 00:07:46,630 nomata bitmap formato, BMP, kaj tio estis la super-simpla, 125 00:07:46,630 --> 00:07:50,390 bunta grafikaj formato kiu estis uzita por sufiĉe tempo 126 00:07:50,390 --> 00:07:53,640 kaj kelkfoje eĉ por wallpapers sur labortabloj. 127 00:07:53,640 --> 00:07:57,410 Se vi pensas reen al Vindozo XP kaj la montetoj kaj blua ĉielo, 128 00:07:57,410 --> 00:08:00,660 kiu estis tipe BMP, aŭ bitmap bildo, kaj bitmaps 129 00:08:00,660 --> 00:08:03,340 estas amuza por ni ĉar ili havas iom pli komplekseco. 130 00:08:03,340 --> 00:08:05,640 Ne tute tiel simpla kiel tiu krado de 0-aj kaj 1-oj; 131 00:08:05,640 --> 00:08:10,680 anstataŭ, vi havas aferojn kiel header komence de dosiero. 132 00:08:10,680 --> 00:08:15,520 Do alivorte, ene. Bmp dosiero estas tuta amaso de 0-aj kaj 1-oj, 133 00:08:15,520 --> 00:08:18,070 sed ekzistas iuj pliaj 0-aj kaj 1-oj en tie. 134 00:08:18,070 --> 00:08:21,450 Kaj ĝi rezultas ke kion ni probable memkompreneble dum jaroj, 135 00:08:21,450 --> 00:08:27,040 formatoj kiel. doc aŭ. XLS aŭ. mp3 aŭ. mp4, 136 00:08:27,040 --> 00:08:29,910 kion ajn la dosiero formatojn ke vi estas familiara kun. 137 00:08:29,910 --> 00:08:31,900 Nu, kion signifas tio eĉ signifas, esti formato? 138 00:08:31,900 --> 00:08:35,740 Ĉar fine de la tago, ĉiuj ĉi tiuj dosieroj ni uzas havi nur 0 kaj 1 estas la 139 00:08:35,740 --> 00:08:39,950 kaj eble tiujn 0-aj kaj 1-oj reprezentas a, b, c, tra ASCII aŭ similaj, 140 00:08:39,950 --> 00:08:42,030 sed tra la fino de la tago, estas nur 0 kaj 1 estas la. 141 00:08:42,030 --> 00:08:45,300 >> Do homoj nur foje decidas elpensi novan formaton 142 00:08:45,300 --> 00:08:49,420 kie normigi kion ŝablonoj de bitoj efektive volas diri. 143 00:08:49,420 --> 00:08:52,790 Kaj en ĉi tiu kazo tie, la homoj kiuj desegnis la bitmap formato 144 00:08:52,790 --> 00:08:58,260 diris ke je la unua bajto en bitmap dosiero, kiel skribata kompensi 0, tie, 145 00:08:58,260 --> 00:09:02,320 tie tuj estos iuj cryptically nomata variablo nomis bfType, 146 00:09:02,320 --> 00:09:06,510 kiu nur staras por bitmap dosiero tipo; kio tipo de bitmap dosieron ĉi estas. 147 00:09:06,510 --> 00:09:10,780 Vi povas konkludi, eble, de la dua vico ke kompensi 2, bajto numero 2, 148 00:09:10,780 --> 00:09:15,980 havas modelon de 0-aj kaj 1-oj kiu reprezentas kio? 149 00:09:15,980 --> 00:09:18,320 La grandeco de iu, kaj ĝi iras de tie. 150 00:09:18,320 --> 00:09:20,660 Do en problemo aro 4, vi devas piediri tra kelkaj el tiuj aferoj. 151 00:09:20,660 --> 00:09:24,480 >> Ni ne finos zorgado pri cxiuj el ili, sed rimarkas ĝin komencas akiri interesajn 152 00:09:24,480 --> 00:09:30,780 ĉirkaŭ linio aŭ bajto 54, rgbtBlue, Verda kaj ruĝa. 153 00:09:30,780 --> 00:09:35,280 Se vi iam aŭdis la akronimo RGB, ruĝa verda blua, ĉi tiu estas referenco al tiu. 154 00:09:35,280 --> 00:09:37,840 Ĉar ĝi rezultas vi povas pentri ĉiujn kolorojn de la ĉielarko 155 00:09:37,840 --> 00:09:41,580 kun iu kombino de ruĝa kaj blua kaj verda. 156 00:09:41,580 --> 00:09:46,560 Kaj, fakte, la gepatroj en la ĉambron povus memori iuj de la plej fruaj proyectores. 157 00:09:46,560 --> 00:09:49,360 Tiuj tagoj, vi simple vidas 1 brila lumo venas el lenso. 158 00:09:49,360 --> 00:09:52,870 Sed tie en la tago, vi havis la ruĝa lenso, la blua lenso, kaj la verda lenso 159 00:09:52,870 --> 00:09:56,620 kaj ili kune celas la ekrano kaj formis pitoreskan bildon. 160 00:09:56,620 --> 00:09:59,590 Kaj tre ofte mezo lernejoj kaj mezlernejoj havus tiujn lensoj 161 00:09:59,590 --> 00:10:02,680 ĉiam tiel iomete Askew, do vi estis ia vidante duobla aŭ triobla bildoj, 162 00:10:02,680 --> 00:10:07,500 sed tio estis la ideo. Vi havis ruĝan kaj verdan kaj bluan lumon pentrado. 163 00:10:07,500 --> 00:10:09,570 Kaj tiu sama principo estas uzata en komputiloj. 164 00:10:09,570 --> 00:10:12,000 >> Do inter la defioj, do, por vi en problemo starigis 4 165 00:10:12,000 --> 00:10:16,080 tuj estos kelkaj aferoj; unu estas vere regrandigi bildon. 166 00:10:16,080 --> 00:10:18,050 Preni en ŝablono de 0-aj kaj 1-oj, 167 00:10:18,050 --> 00:10:22,840 elŝeligi kion pecoj de 0-aj kaj 1-oj reprezentas kio en strukturo kiel ĉi tiu, 168 00:10:22,840 --> 00:10:26,800 kaj poste kalkuli kiom repliki la rastrumeroj: la ruĝaj, la bluso, la verduloj 169 00:10:26,800 --> 00:10:32,460 interne por ke kiam bildo aspektas kiel ĉi komence, povus aspekti kiel ĉi anstataŭ post tio. 170 00:10:32,460 --> 00:10:35,590 Inter la aliaj defioj, tro, tuj estos ke vi estos transdonita 171 00:10:35,590 --> 00:10:38,900 a jura bildo de reala dosiero el cifereca fotilo 172 00:10:38,900 --> 00:10:42,410 kaj en tiu ĉambro, iam, estis tuta amaso de fotoj. 173 00:10:42,410 --> 00:10:47,030 La problemo estas, ni hazarde viŝitaj aŭ havis la bildon koruptita iel. 174 00:10:47,030 --> 00:10:51,040 Malbona aĵoj okazas kun ciferecaj fotiloj, kaj tiel ni rapide kopiis ĉiujn 0-aj kaj 1-oj 175 00:10:51,040 --> 00:10:55,410 ekstere de tiu karto por vi, savis ilin ĉiujn en 1 granda dosiero kaj poste ni transdonos ilin al vi 176 00:10:55,410 --> 00:11:00,000 en problemo starigis 4 tiel, ke vi povas skribi programon en C kun kiu rekuperi 177 00:11:00,000 --> 00:11:02,660 ĉiuj el tiuj JPEG-oj, ideale. 178 00:11:02,660 --> 00:11:06,280 Kaj ĝi rezultas ke JPEG-oj, kvankam ili estas iom de kompleksa arkivo formato, 179 00:11:06,280 --> 00:11:09,580 ili estas multe pli kompleksa ol tiu ridetanta vizaĝo tie. 180 00:11:09,580 --> 00:11:14,320 Rezultas, ke ĉiu JPEG komenciĝas per la sama ŝablonoj de 0-aj kaj 1-oj. 181 00:11:14,320 --> 00:11:18,820 Do uzante dum buklo aŭ por buklo aŭ similaj, 182 00:11:18,820 --> 00:11:22,350 vi povas persisti dum la tuta 0-aj kaj 1-oj en ĉi jura bildo 183 00:11:22,350 --> 00:11:26,670 kaj ĉiufoje kiam vi vidas la specialajn modelon ke tio difinita en la problemo aro de specifo, 184 00:11:26,670 --> 00:11:29,770 vi povas supozi, "Ho, jen, kun tre alta probablo, 185 00:11:29,770 --> 00:11:33,520 la komenco de JPEG, 'kaj tuj kiam vi trovas la sama mastro, 186 00:11:33,520 --> 00:11:36,050 iu nombro da bajtoj aŭ kilobajtoj aŭ megabajtoj poste, 187 00:11:36,050 --> 00:11:40,550 vi povas supozi, 'Ooh! Jen dua JPEG, la foton mi prenis post la unua. 188 00:11:40,550 --> 00:11:44,720 Lasu min ĉesi legi tiun unuan dosiero, komenci skribi ĉi nova. ' 189 00:11:44,720 --> 00:11:49,980 Kaj la rezulto de via programo por pset 4 tuj estos kiel multaj kiel 50 JPEG-oj. 190 00:11:49,980 --> 00:11:52,400 Kaj se ĝi ne estas 50 JPEG-oj, vi havas iom de ciklo. 191 00:11:52,400 --> 00:11:55,580 Se vi havas malfinia nombro de JPEG-oj, vi havas malfinia ciklo. 192 00:11:55,580 --> 00:11:58,280 Por ke ankaux estos sufiĉe komuna afero. 193 00:11:58,280 --> 00:12:00,280 Tio kio estas sur la horizonto. 194 00:12:00,280 --> 00:12:03,740 >> Kvizo 0, malantaŭ ni. Realigi, per mia retpoŝto, kiu nevarie ekzistas homoj 195 00:12:03,740 --> 00:12:06,820 kiu estas ambaŭ feliĉaj, ia neŭtrala, kaj malĝoja ĉirkaŭ kvizo 0 tempo. 196 00:12:06,820 --> 00:12:10,160 Kaj bonvolu alveni al mi, la estro TFs, Zamyla, via propra TF 197 00:12:10,160 --> 00:12:14,120 aŭ unu el la CAS ke vi scias se vi ŝatus diskuti kiel aĵoj iris. 198 00:12:14,120 --> 00:12:16,460 >> Do por impresi la gepatroj tie en la ĉambron, 199 00:12:16,460 --> 00:12:23,990 kio estas la CS50 biblioteko? Bonan laboron. 200 00:12:23,990 --> 00:12:32,280 Kio estas la CS50 biblioteko? Yeah? [Studenta respondoj, nekomprenebla] 201 00:12:32,280 --> 00:12:35,730 >> Konsentite, bona. Do ĝi estas prewritten aro de kodo, ke ni, la dungitaro, skribis, 202 00:12:35,730 --> 00:12:38,460 ni ofertas al vi, por havigi iujn komunajn funcionalidades. 203 00:12:38,460 --> 00:12:42,290 Plenigos like min ĉenon; get mi int, ĉiuj de la funkcioj kiuj estas listigitaj ĉi tie. 204 00:12:42,290 --> 00:12:45,260 Komencante nun, ni komencos vere preni tiujn trejnado radoj malproksime. 205 00:12:45,260 --> 00:12:48,230 Do ni tuj komencos por forpreni de "ĉeno" de vi, 206 00:12:48,230 --> 00:12:52,790 kiu, revokon, estis nur sinonimo por kio reala datumtipo? char *. 207 00:12:52,790 --> 00:12:57,020 Do por gepatroj, ke estis probable - tio estas bona, do char * ni komencos vidi 208 00:12:57,020 --> 00:13:00,810 sur la ekrano des pli kiam ni remove "ĉeno" de nia vortotrezoro, 209 00:13:00,810 --> 00:13:02,760 almenaŭ kiam temas pri fakte skribi kodon. 210 00:13:02,760 --> 00:13:06,240 Simile, ni ĉesas uzi iujn el tiuj funkcioj tiel, 211 00:13:06,240 --> 00:13:08,390 ĉar niaj programoj tuj akiri pli kompleksa 212 00:13:08,390 --> 00:13:11,370 anstataŭ nur skribi programojn kiuj sidas tie kun prompto palpebrumante, 213 00:13:11,370 --> 00:13:13,580 atendante la uzanto tajpas ion in 214 00:13:13,580 --> 00:13:15,220 Vi ricevos vian enigoj de aliloke. 215 00:13:15,220 --> 00:13:18,720 Ekzemple, vi ricevos ilin el serio de bitoj en la loka malmola disko. 216 00:13:18,720 --> 00:13:23,340 Vi anstataŭe preni ilin en la estonteco de retkonekto, iuj afiŝinto ie. 217 00:13:23,340 --> 00:13:27,460 Do ni senŝeligi reen ĉi tavolo por la unua fojo, kaj elsxiros la CS50 aparaton 218 00:13:27,460 --> 00:13:32,300 kaj ĉi tiu dosiero nomata CS50.h, kiu vi estas akra kiel dum semajnoj. 219 00:13:32,300 --> 00:13:34,380 >> Sed ni reale vidi kio estas ene de ĉi. 220 00:13:34,380 --> 00:13:38,250 Do la supro de la dosiero en bluo estas nur aro aro da komentoj, 221 00:13:38,250 --> 00:13:41,340 garantio informoj kaj licencoj. Tio estas speco de komuna paradigmo 222 00:13:41,340 --> 00:13:44,600 en programaro, ĉar multe da programaro tiuj tagoj estas kion nomas "malfermita fonto", 223 00:13:44,600 --> 00:13:46,940 kio signifas, ke iu skribis la kodon 224 00:13:46,940 --> 00:13:50,060 kaj faris ĝin libere disponebla, ne nur kuri kaj uzi, 225 00:13:50,060 --> 00:13:53,660 sed fakte legis kaj ŝanĝi kaj integri en vian propran laboron. 226 00:13:53,660 --> 00:13:55,790 Do jen kio vi uzis, liberajn programarojn, 227 00:13:55,790 --> 00:13:58,030 kvankam en tre malgranda formo. 228 00:13:58,030 --> 00:14:01,860 Se mi rulumu malsupren preter la komentoj, kvankam, ni komencas vidi iujn pli familiara aĵoj. 229 00:14:01,860 --> 00:14:08,090 Do rimarki supre tie, ke la CS50.h dosieron inkludas tuta amaso de header files. 230 00:14:08,090 --> 00:14:11,160 Nun, la plejparto de tiuj ni ne vidis antaŭe, sed unu estas 231 00:14:11,160 --> 00:14:15,640 familiara; kiu el tiuj ni vidis, kvankam mallonge, tiel malproksime? 232 00:14:15,640 --> 00:14:18,720 Yeah, normo bibliotekoj. Stdlib.h havas malloc, 233 00:14:18,720 --> 00:14:21,590 do iam ni komencis paroli pri dinamika memoro atribuo, 234 00:14:21,590 --> 00:14:24,960 kiuj ni revenos al proksima semajno tiel, ni komencis inkluzive tiu dosiero. 235 00:14:24,960 --> 00:14:29,660 Ĝi rezultas ke bool kaj veraj kaj falsaj ne reale ekzistas en C, per, 236 00:14:29,660 --> 00:14:32,460 se vi ne inkluzivas tiun dosieron ĉi tie. 237 00:14:32,460 --> 00:14:35,770 Do ni, dum semajnoj, estis inkluditaj normo bool.h 238 00:14:35,770 --> 00:14:39,020 por ke vi povas uzi la nocio de bool, vera aŭ malvera. 239 00:14:39,020 --> 00:14:41,830 Sen tio, vi devus ordigi de fake ĝin kaj uzi int 240 00:14:41,830 --> 00:14:45,920 kaj nur arbitre supozas ke 0 estas malvera kaj 1 estas vera. 241 00:14:45,920 --> 00:14:49,980 >> Nun, se ni rulumu malsupren plu, jen nia difino de kordoj. 242 00:14:49,980 --> 00:14:54,820 Rezultas, kiel ni diris antaŭe, ke kie ĉi * estas ne vere gravas. 243 00:14:54,820 --> 00:14:56,750 Vi povas eĉ havi spacon cxirkauxe. 244 00:14:56,750 --> 00:15:01,550 Ni, ĉi semestro, ili promocias ĝin kiel tiun por fari certe ke la * devas vidi kun la tipo. 245 00:15:01,550 --> 00:15:05,370 Sed realigi, kiel komuna, se ne iom pli komuna, estas meti ĝin tie 246 00:15:05,370 --> 00:15:07,480 sed funkcie estas la sama afero. 247 00:15:07,480 --> 00:15:11,070 Sed nun, se ni legas malsupren pliaj, ni rigardu diru GetInt, 248 00:15:11,070 --> 00:15:15,350 ĉar ni uzas tion, eble, antaux io ajn alia ĉi semestro. 249 00:15:15,350 --> 00:15:19,620 Kaj jen GetInt. Tio estas kio? 250 00:15:19,620 --> 00:15:24,650 Ĉi tiu estas la prototipo. Tiom ofte, ni metis prototipoj en la suproj de nia. C dosieroj, 251 00:15:24,650 --> 00:15:28,190 sed vi povas ankaŭ meti prototipoj en header files,. h dosieroj, 252 00:15:28,190 --> 00:15:32,110 kiel ĉi tiu tie, tiel ke kiam vi skribas iujn funkciojn 253 00:15:32,110 --> 00:15:36,790 ke vi volas ke aliaj homoj por povi uzi, kiu estas ĝuste la kazo kun la CS50 biblioteko, 254 00:15:36,790 --> 00:15:40,900 vi ne nur apliki vian funkcioj en iu kiel CS50.c, 255 00:15:40,900 --> 00:15:46,720 vi ankaŭ metis la prototipoj ne je la supro de tiu dosiero, sed al la supro de kapdosiero, 256 00:15:46,720 --> 00:15:50,810 tiam tiu kapdosiero estas kio amikoj kaj kolegoj inkludi, 257 00:15:50,810 --> 00:15:52,800 kun akraj inkludi en siajn proprajn kodo. 258 00:15:52,800 --> 00:15:55,440 Do ĉio ĉi momento vi estis inkluditaj ĉiuj tiuj prototipoj 259 00:15:55,440 --> 00:15:59,870 efektive ĉe la supro de via dosiero, sed per vojo de ĉi akra inkluzivas meĥanismo 260 00:15:59,870 --> 00:16:03,320 kiu esence kopioj kaj pastes ĉi dosieron en via propra. 261 00:16:03,320 --> 00:16:06,400 Nun, jen iuj sufiĉe detala dokumentado. 262 00:16:06,400 --> 00:16:08,880 >> Ni preskaux memkompreneble, ke GetInt gets an int, 263 00:16:08,880 --> 00:16:10,740 sed ĝi rezultas ekzistas iu angulo kazoj, ĉu ne? 264 00:16:10,740 --> 00:16:14,320 Kio se la uzanto tajpas en numero kiu estas multe tro granda? 265 00:16:14,320 --> 00:16:17,350 Al quintillion, ke tute ne povas persvadi ene de int? 266 00:16:17,350 --> 00:16:21,180 Kio estas la atendata konduto? Nu, ideale, estas antaŭvidebla. 267 00:16:21,180 --> 00:16:23,460 Do en ĉi tiu kazo, se vi vere legis la fajna impreso, 268 00:16:23,460 --> 00:16:27,850 vi vidos, ke se la linio ne povas legi, ĉi revenas INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Ni neniam parolis pri tio, sed bazita sur ĝia majuskloj, 270 00:16:30,800 --> 00:16:33,030 kio ĝi estas, probable? 271 00:16:33,030 --> 00:16:36,610 Ĝi estas konstanta, do ĝi estas iu speciala konstanta ke tio probable deklaris 272 00:16:36,610 --> 00:16:39,460 en unu el tiuj header files tio pli alten en la dosiero, 273 00:16:39,460 --> 00:16:43,400 kaj INT_MAX estas probable io kiel, krude, 2 miliardoj. 274 00:16:43,400 --> 00:16:48,160 La ideo estas ke ĉar ni bezonas iel signifas, ke io estis malbone, 275 00:16:48,160 --> 00:16:51,090 ni, jes, havi 4 miliardoj ciferoj je nia dispono, 276 00:16:51,090 --> 00:16:53,980 negativa 2 miliardoj plu supren al 2 miliardoj, donu aŭ preni. 277 00:16:53,980 --> 00:16:58,030 Nu, kio estas komuna en programado estas vi ŝtelas nur unu el tiuj numeroj. 278 00:16:58,030 --> 00:17:02,250 Eble 0, eble 2 milionoj, eble negativa 2 miliardoj. 279 00:17:02,250 --> 00:17:06,720 Do vi pasigas unu el viaj eblaj valoroj por ke vi povas fari al la mondo 280 00:17:06,720 --> 00:17:10,089 ke se iu iras malbone, mi revenos ĉi tiu super-granda valoro. 281 00:17:10,089 --> 00:17:13,329 Sed vi ne volas ke la uzanto tajpas ion críptico kiel "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 de vere grandaj numeron, kie vi ĝeneraligi anstataŭe kiel konstanto. 283 00:17:17,079 --> 00:17:19,380 Do vere, se vi estas anal la lastaj semajnoj, 284 00:17:19,380 --> 00:17:23,800 aùton vi nomas GetInt, vi devus esti kontrolanta per se kondiĉo. 285 00:17:23,800 --> 00:17:27,109 Ĉu la uzanto entajpu INT_MAX, aŭ pli specife, 286 00:17:27,109 --> 00:17:29,900 faris GetInt reveno INT_MAX? Ĉar se ĝi faris, 287 00:17:29,900 --> 00:17:35,140 ke reale signifas ne tajpu ĝin; ion misokazis en ĉi tiu kazo. 288 00:17:35,140 --> 00:17:38,970 Do ĉi tiu estas kion ĝenerale konata kiel "gardostaranto" valoro, kiu ĵus signifas speciala. 289 00:17:38,970 --> 00:17:41,020 >> Nu, ni nun turnu en la. C dosierojn. 290 00:17:41,020 --> 00:17:44,500 La C-dosiero ekzistis en la aparaton dum iu tempo, 291 00:17:44,500 --> 00:17:47,540 kaj, fakte, la aparaton havas ĝin precompiled por vi 292 00:17:47,540 --> 00:17:49,720 en tiu afero ni nomas "celkodo," 293 00:17:49,720 --> 00:17:52,940 sed ĝuste ne gravas al vi kie estas ĉar la sistemo sciu, 294 00:17:52,940 --> 00:17:54,780 en ĉi tiu kazo, kie ĝi estas, la aparaton. 295 00:17:54,780 --> 00:18:00,620 Sed ni rulumu malsupren nun GetInt, kaj vidi kiel GetInt estis laborante ĉiuj ĉi tempo. 296 00:18:00,620 --> 00:18:02,380 Do jen ni havas similajn komentojn de antaŭe. 297 00:18:02,380 --> 00:18:04,930 Lasu min zomi en nur la kodo parton, 298 00:18:04,930 --> 00:18:07,410 kaj kion ni havas por GetInt estas jeno. 299 00:18:07,410 --> 00:18:12,770 Ĝi prenas neniun eniro kaj ĝi redonas int, dum (vera), do ni havas intenca senfina ciklo 300 00:18:12,770 --> 00:18:16,560 sed, supozeble, ni rompos el cxi tiu iel, aŭ reveni de interne ĉi. 301 00:18:16,560 --> 00:18:19,890 Do ni vidu kiel tio funkcias. Nu, ni ŝajnas esti uzante GetString 302 00:18:19,890 --> 00:18:22,550 en ĉi tiu unua linio ene de la ciklo, 166. 303 00:18:22,550 --> 00:18:25,320 Tio estas nun bona praktiko ĉar sub kiaj cirkonstancoj 304 00:18:25,320 --> 00:18:30,820 povus GetString reveni ĉi speciala ŝlosilvorto, NULL? 305 00:18:30,820 --> 00:18:38,460 Se iu iras malbone. Kio povus erari kiam vi nomas iun kiel GetString? 306 00:18:38,460 --> 00:18:42,550 Yeah? [Studenta respondo, nekomprenebla] >> Jes. Do eble malloc malsukcesas. 307 00:18:42,550 --> 00:18:45,310 Ie sub la kapuĉo GetString alvokas malloc, 308 00:18:45,310 --> 00:18:48,210 kiu allocates memoro, kiu lasas la komputilo vendejo 309 00:18:48,210 --> 00:18:50,950 ĉiuj signoj, ke la uzanto tajpas en la klavaro. 310 00:18:50,950 --> 00:18:53,270 Kaj supozu ke la uzanto devis tuta multan liberan tempon 311 00:18:53,270 --> 00:18:56,470 kaj tajpita pli, ekzemple, ol 2 miliardoj gravuloj. 312 00:18:56,470 --> 00:18:59,600 Pli signoj ol la komputilo eĉ havas RAM. 313 00:18:59,600 --> 00:19:02,350 Nu, GetString devas esti kapabla por signifi ke al vi, 314 00:19:02,350 --> 00:19:05,650 eĉ se tiu estas super, super nekomuna angulo kazo. 315 00:19:05,650 --> 00:19:08,490 Ĝi devas iel povos trakti tion, kaj tiel GetString, 316 00:19:08,490 --> 00:19:11,850 se ni iros tien kaj legis liajn dokumentado, ĝi, fakte, revenu NULL. 317 00:19:11,850 --> 00:19:16,150 Nun se GetString maltrafas per reveni NULL, GetInt tuj malsukcesos 318 00:19:16,150 --> 00:19:19,370 per reveni INT_MAX, ĝuste kiel gardostaranto. 319 00:19:19,370 --> 00:19:22,650 Ĉi tiuj estas nur homaj konvencioj. La sola maniero vi scius ĉi tiu estas la kazo 320 00:19:22,650 --> 00:19:24,840 estas per legi la dokumentadon. 321 00:19:24,840 --> 00:19:28,200 Do ni rulu suben ĝis kie la int estas fakte GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Do se mi rulumu malsupren iom pli, en linio 170 ni havas komenton supre tiuj linioj. 323 00:19:34,220 --> 00:19:38,470 Do ni deklaras, en 172, la int n kaj char c, kaj tiam tiu nova funkcio 324 00:19:38,470 --> 00:19:41,870 kiu iuj el vi stumblis trans antaŭe, sed sscanf. 325 00:19:41,870 --> 00:19:44,190 Tiu signifas ĉenon scan f. 326 00:19:44,190 --> 00:19:48,580 En aliaj vortoj, donu al mi ĉenon kaj mi skani gxin por pecoj de informo de intereso. 327 00:19:48,580 --> 00:19:53,820 Do kion tio signifas? Nu, supozu, ke mi tajpas en, laŭvorte, 1 2 3 ĉe la klavaro, 328 00:19:53,820 --> 00:19:59,730 kaj poste batis eniri. Kio estas la datumtipo de 1 2 3 kiam revenis por GetString? 329 00:19:59,730 --> 00:20:05,010 Estas evidente ĉenon, ĉu ne? Mi havas ĉenon, do 1 2 3 estas vere "1 2 3" 330 00:20:05,010 --> 00:20:07,260 kun la \ 0 je la fino de ĝi. Tio ne estas int. 331 00:20:07,260 --> 00:20:10,420 Tio ne estas nombro. Ĝi aspektas kiel numero sed ĝi ne estas vere. 332 00:20:10,420 --> 00:20:14,680 Do kion signifas GetInt devas fari? Ĝi devas skani ke kordoj maldekstre dekstren, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, kaj iel konverti ĝin al reala entjero. 334 00:20:19,010 --> 00:20:21,010 Nun, vi povus malkovri kiel fari tion. 335 00:20:21,010 --> 00:20:24,240 Se vi pensas reen al pset 2, vi supozeble ricevis iom komforta 336 00:20:24,240 --> 00:20:26,810 kun Cezaro aŭ Vigenère tiel vi povas persisti dum ĉenon, 337 00:20:26,810 --> 00:20:29,800 vi povas konverti signoj al ints kun fosilo. Tio estas tuta kvanto de laboro. 338 00:20:29,800 --> 00:20:32,800 Kial ne nomi funkcion kiel sscanf kiu faras, ke por vi? 339 00:20:32,800 --> 00:20:37,520 Do sscanf atendas argumenton, en ĉi tiu kazo nomata linio, kiu estas ĉeno. 340 00:20:37,520 --> 00:20:41,310 Vi do precizigi, en citilojn, tre simila al printf, 341 00:20:41,310 --> 00:20:44,960 Kion vi atendis vidi en ĉi tiu ĉeno? 342 00:20:44,960 --> 00:20:52,980 Kion mi diras jen, mi atendas vidi dekuma nombro kaj eble karaktero. 343 00:20:52,980 --> 00:20:54,990 Kaj ni vidos kial ĉi tiu estas la kazo en nur momento. 344 00:20:54,990 --> 00:20:58,440 Ĝi rezultas ke tiu skribmaniero estas nun memoras stuff 345 00:20:58,440 --> 00:21:00,840 ni komencis paroli pri iom pli antaŭ semajno. 346 00:21:00,840 --> 00:21:05,430 >> Kio estas & n kaj ktp faras por ni ĉi tie? [Studenta respondoj, nekomprenebla] 347 00:21:05,430 --> 00:21:07,610 >> Jes. Oni donas al mi la adreson de n kaj adreso de c. 348 00:21:07,610 --> 00:21:10,440 Nun, kial estas tiu grava? Nu, vi scias ke kun funkcioj en C 349 00:21:10,440 --> 00:21:13,440 vi povas ĉiam resendas valoron aŭ ne valoro tute ne. 350 00:21:13,440 --> 00:21:16,630 Vi povas reveni al int, ĉeno, kaleŝego, a char, kiom. 351 00:21:16,630 --> 00:21:21,150 Aŭ vi povas reveni malplena, sed vi nur povas reveni 1 afero maksimume. 352 00:21:21,150 --> 00:21:26,100 Sed ĉi tie ni volas sscanf reveni mi eble oni int, dekuma nombro, 353 00:21:26,100 --> 00:21:29,240 kaj ankaŭ char, kaj mi klarigos kial la signo en momento. 354 00:21:29,240 --> 00:21:34,250 Do vi efektive volas f reveni 2 aĵoj; tio estas nur ne eblas en C. 355 00:21:34,250 --> 00:21:38,460 Do vi povas labori ĉirkaŭ tiu pasante en 2 adresoj, 356 00:21:38,460 --> 00:21:43,710 ĉar tuj kiam vi transdonos funkcio 2 adresoj, kio povas tiu funkcio faras kun ili? 357 00:21:43,710 --> 00:21:49,880 Ĝi povas skribi al tiuj adresoj. Vi povas uzi la * operacio kaj "iru tien" al ĉiu el tiuj adresoj. 358 00:21:49,880 --> 00:21:54,320 Estas iel ĉi backdoor mekanismo, sed tre komuna por ŝanĝi la valorojn de variabloj 359 00:21:54,320 --> 00:21:58,020 en pli ol nur 1 lokon, en ĉi tiu kazo 2. 360 00:21:58,020 --> 00:22:04,590 Nun, rimarki Mi kontrolanta por == to1, kaj poste reveni n se tio, fakte, taksi al vera. 361 00:22:04,590 --> 00:22:09,340 Do kio okazas? Nu, teknike, ĉiuj ni vere volas okazi en GetInt estas ĉi. 362 00:22:09,340 --> 00:22:12,340 Ni volas analizi, por tiel diri, ni deziras legi la kordo 363 00:22:12,340 --> 00:22:16,210 "1 2 3" kaj se ĝi ŝajnas ke estas pluraj tie, 364 00:22:16,210 --> 00:22:21,360 kion ni diras al sscanf fari estas meti tiun numeron, 1 2 3, en ĉi tiu variablo n por mi. 365 00:22:21,360 --> 00:22:26,060 Kial, do, faris mi havas ĉi tiel? 366 00:22:26,060 --> 00:22:33,750 Kio estas la rolo de la ankaŭ dirante sscanf, vi povus ankaŭ preni karaktero tie. 367 00:22:33,750 --> 00:22:36,890 [Studenta parolante, nekomprenebla] >> Ne - dekuma punkto povus funkcii. 368 00:22:36,890 --> 00:22:40,650 Ni tenu kiu pensis dum momento. Kion alian? 369 00:22:40,650 --> 00:22:42,570 [Studento, nekomprenebla] >> Do, bona penso, ĝi povus esti la NULL karaktero. 370 00:22:42,570 --> 00:22:44,970 Ĝi fakte ne estas, en ĉi tiu kazo. Yeah? [Studento, nekomprenebla] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Aŭ, lasu min ĝeneraligi eĉ pli. 372 00:22:47,100 --> 00:22:49,670 La% c tie estas nur por eraro-kontrolanta. 373 00:22:49,670 --> 00:22:52,510 Ni ne volas tie esti karaktero post la numeron, 374 00:22:52,510 --> 00:22:54,980 sed kion tiu permesas al mi fari estas la jenaj: 375 00:22:54,980 --> 00:23:01,270 Ĝi rezultas ke sscanf, krom stoki valorojn en n kaj c, en ĉi tiu ekzemplo tie ĉi, 376 00:23:01,270 --> 00:23:08,170 kio ankaŭ ne estas denove la nombro de variabloj metis valoroj in 377 00:23:08,170 --> 00:23:13,330 Do, se vi nur tajpi en 1 2 3, tiam nur la% d tuj kongruas 378 00:23:13,330 --> 00:23:18,830 kaj nur n gets stokita kun valoro kiel 1 2 3 kaj nenio gets metis en c; 379 00:23:18,830 --> 00:23:20,870 c restas rubo valoron, por tiel diri. 380 00:23:20,870 --> 00:23:23,550 Rubo ĉar ĝi neniam estis inicializado kiel iu valoro. 381 00:23:23,550 --> 00:23:29,390 Do en tiu kazo, sscanf revenas 1, ĉar mi popolita unu el tiuj indikoj, 382 00:23:29,390 --> 00:23:33,650 en kies kazo, granda. Mi havas int, do mi liberigi la linion liberigi ĝis la memoro 383 00:23:33,650 --> 00:23:37,150 ke GetString efektive asignitaj, kaj poste mi revenos n. 384 00:23:37,150 --> 00:23:42,210 Alian, se vi iam scivolis kie tiu reprovi deklaro devenas, venas de dekstre tie. 385 00:23:42,210 --> 00:23:45,770 Se, kontraŭe, mi tajpas en 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 nur iuj hazardaj vico de teksto, sscanf tuj vidos, 387 00:23:48,640 --> 00:23:51,500 ooh, numero, ooh, numero, ooh, numero, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Kaj tuj metis la 1 2 3 en n. 389 00:23:54,190 --> 00:23:59,970 Ĝi tuj metis la f en c, kaj tiam revenu 2. 390 00:23:59,970 --> 00:24:02,980 Do ni havas, simple uzante la baza difino de scanf la konduto, 391 00:24:02,980 --> 00:24:06,170 tre simpla maniero - nu, kompleksaj unuavide, sed fine de la tago, 392 00:24:06,170 --> 00:24:11,460 sufiĉe simpla mekanismo de diri, estas tie int, kaj se jes, estas ke la sola afero kiun mi trovis? 393 00:24:11,460 --> 00:24:14,950 Kaj la blanka spaco ĉi tie estas intenca. Se vi legis la dokumentaron por sscanf, 394 00:24:14,950 --> 00:24:18,690 rakontas al vi, ke se vi inkludas pecon de blanka spaco je la komenco aŭ la fino, 395 00:24:18,690 --> 00:24:24,990 sscanf tro permesos al la uzanto, ial ajn bati spacebar 1 2 3, kaj kiu estos prava. 396 00:24:24,990 --> 00:24:28,310 Ĝi ne krias al la uzanto nur ĉar ili batis la spacebar komence aŭ la fino, 397 00:24:28,310 --> 00:24:32,160 kiu estas nur iom pli uzantamika. 398 00:24:32,160 --> 00:24:34,160 >> Demandojn, tiam, sur GetInts? Yeah? 399 00:24:34,160 --> 00:24:36,820 [Studenta demando, nekomprenebla] 400 00:24:36,820 --> 00:24:40,740 >> Bona demando. Kio se vi simple tajpis en char, kiel f, kaj sukceson eniri 401 00:24:40,740 --> 00:24:47,830 sen iam tajpas 1 2 3; kion vi opinias la konduto de ĉi tiu linio de kodo devus tiam esti? 402 00:24:47,830 --> 00:24:50,500 Do sscanf povas kovri tion, ĉar en tiu kazo, 403 00:24:50,500 --> 00:24:56,280 ĝi ne iras por plenigi n aŭ c; ĝi tuj anstataŭ reveni 0. 404 00:24:56,280 --> 00:25:01,540 En tiu kazo, mi ankaŭ kaptante ke scenaro, ĉar la atendata valoro mi volas estas 1. 405 00:25:01,540 --> 00:25:07,310 Mi nur volas 1, kaj nur 1 afero plenigxu. Bona demando. Aliaj? 406 00:25:07,310 --> 00:25:09,610 >> Bone, do ni ne estas iri tra ĉiuj funkcioj en ĉi tie, 407 00:25:09,610 --> 00:25:11,820 sed kiu ŝajnas esti, eble, de cetera intereso 408 00:25:11,820 --> 00:25:14,530 estas GetString ĉar ĝi rezultas ke GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong ĉiuj liberigas multajn siajn funkciojn al GetString. 410 00:25:19,490 --> 00:25:22,860 Do ni rigardu kiel li estas implementado tie. 411 00:25:22,860 --> 00:25:27,040 Ĉi tiu aspektas iom kompleksaj sed uzas la saman fundamentojn 412 00:25:27,040 --> 00:25:29,680 ke ni komencis paroli pri pasintsemajne. Do en GetString, 413 00:25:29,680 --> 00:25:32,670 kiu prenas neniun argumenton kiel por la malplena tien, 414 00:25:32,670 --> 00:25:37,110 kaj denove ĉenon, do mi deklaras ĉeno nomata buffer. 415 00:25:37,110 --> 00:25:39,670 Mi ne vere scias kion tio okazas al esti uzita por ankoraŭ, sed ni vidos. 416 00:25:39,670 --> 00:25:42,950 Looks like kapablo estas, implicite, 0; ne tute certas kie ĉi iras. 417 00:25:42,950 --> 00:25:44,920 Ne certas kion n tuj uzi por ankoraŭ. 418 00:25:44,920 --> 00:25:47,860 Sed nun ĝi estas ricevas iom pli interesa, do en linio 243, 419 00:25:47,860 --> 00:25:51,760 ni deklaru int c, ĉi tiu estas speco de stulta detalo. 420 00:25:51,760 --> 00:25:58,080 A char estas 8 bitoj, kaj 8 bitoj povas stoki kiom malsamaj valoroj? 421 00:25:58,080 --> 00:26:03,310 256. La problemo estas, se vi volas havi 256 malsamaj karakteroj ASCII, 422 00:26:03,310 --> 00:26:06,210 kio estas, se vi opinias dorso, kaj ĉi ne estas io por enmemorigi. 423 00:26:06,210 --> 00:26:09,100 Sed se vi pensas al tiu granda ASCII abako ni havis semajnoj, 424 00:26:09,100 --> 00:26:13,780 tie estis, en tiu kazo, 128 aŭ 256 ASCII signojn. 425 00:26:13,780 --> 00:26:16,220 Ni uzis ĉiujn la mastroj de 0-aj kaj 1 OKAZAS. 426 00:26:16,220 --> 00:26:19,410 Tio estas problemo se oni volas povi detekti eraron. 427 00:26:19,410 --> 00:26:23,290 Ĉar se vi jam uzis 256 valoroj por via karakteroj, 428 00:26:23,290 --> 00:26:26,390 vi ne vere planas antaŭe, ĉar nun vi ne havas maniero diri, 429 00:26:26,390 --> 00:26:29,750 "Ĉi tiu ne estas legit karaktero; ĉi estas kelkaj eraraj mesaĝo." 430 00:26:29,750 --> 00:26:32,430 Do kio estas la mondo faras estas, ili uzas la venonta plej granda valoro, 431 00:26:32,430 --> 00:26:35,790 io kiel int por ke vi havas freneza nombro de bitoj, 432 00:26:35,790 --> 00:26:39,610 32 por 4 miliardoj eblaj valoroj, tiel ke vi povas simple fini uzante, 433 00:26:39,610 --> 00:26:44,800 esence, 257 el ili, 1 el kiuj havas iun specialan signifon kiel eraro. 434 00:26:44,800 --> 00:26:49,190 >> Do ni vidu kiel tio funkcias. En linio 246, mi havas ĉi granda dum buklo 435 00:26:49,190 --> 00:26:54,530 kiu vokas fgetc; f signifo dosiero, getc, kaj tiam stdin. 436 00:26:54,530 --> 00:26:59,030 Rezultas ĉi estas nur la plej preciza maniero diri "legi enigo de la klavaro." 437 00:26:59,030 --> 00:27:02,730 Norma enigo per klavaro, cxefeligo signifas ekrano, 438 00:27:02,730 --> 00:27:06,920 kaj normo eraro, kiun ni vidas en pset 4, signifas la ekrano, 439 00:27:06,920 --> 00:27:09,670 sed speciala parto de la ekrano, por ke ĝi ne conflated 440 00:27:09,670 --> 00:27:13,760 kun reala eligo ke vi intencis presi, sed pli en kiuj en la estonteco. 441 00:27:13,760 --> 00:27:19,430 Do fgetc simple signifas legis unu signo de la klavaro, kaj stoki ĝin kie? 442 00:27:19,430 --> 00:27:24,000 Stoki ĝin en c, kaj tiam kontrolu, do mi simple uzante iu bulea konjunkcioj tie, 443 00:27:24,000 --> 00:27:28,430 kontroli ke ne egala \ n, tiel la uzanto batis eniri. 444 00:27:28,430 --> 00:27:31,510 Ni volas halti ĉe tiu punkto, fino de la ciklo, kaj ni ankaŭ volas kontroli 445 00:27:31,510 --> 00:27:36,170 por la speciala konstanta, EOF, kiu se vi konas aŭ diveni - kio faras ĝi staras por? 446 00:27:36,170 --> 00:27:39,860 Fino de dosiero. Do ĉi tiu estas speco de sensenca, ĉar se mi tajpas en la klavaro, 447 00:27:39,860 --> 00:27:41,900 tie estas vere neniu dosiero implikita en ĉi tiu, 448 00:27:41,900 --> 00:27:44,330 sed ĉi tiu estas nur ordigi de la ĝenerala termino uzata por signifi 449 00:27:44,330 --> 00:27:50,320 ke nenio alia venas el la homa la fingroj. EOF. Fino de dosiero. 450 00:27:50,320 --> 00:27:52,600 Kiel flanken, se vi iam batis kontrolo d je via klavaro, 451 00:27:52,600 --> 00:27:54,680 ne por ke vi havus ankoraux; vi batis kontrolo c. 452 00:27:54,680 --> 00:27:57,920 Sed kontrolo d sendas ĉi speciala konstanta nomita EOF. 453 00:27:57,920 --> 00:28:03,100 >> Do nun ni nur havas iom dinamika memoro atribuo. 454 00:28:03,100 --> 00:28:06,460 Do se n + 1> kapablo, nun mi klarigos n. 455 00:28:06,460 --> 00:28:09,380 n estas ĝuste kiom da bajtoj estas nuntempe en la buffer, 456 00:28:09,380 --> 00:28:11,970 la kordo, ke vi nuntempe konstruas el la uzanto. 457 00:28:11,970 --> 00:28:16,240 Se vi havas pli karakteroj en via buffer ol vi havas kapablon en la buffer, 458 00:28:16,240 --> 00:28:20,760 intuicie, kion ni bezonas por fari do estas atribui pli kapablo. 459 00:28:20,760 --> 00:28:24,490 Mi tuj skim super iu de la aritmetika tie 460 00:28:24,490 --> 00:28:26,900 kaj enfokusigi nur en tiu funkcio ĉi tie. 461 00:28:26,900 --> 00:28:29,170 Vi scias, kio malloc estas, aŭ almenaŭ ĝenerale konata. 462 00:28:29,170 --> 00:28:32,380 Prenu guess kion realloc faras. [Studenta respondo, nekomprenebla] 463 00:28:32,380 --> 00:28:35,690 >> Jes. Kaj ĝi estas ne tute aldonante memoro; ĝi reallocates memoro kiel sekvas: 464 00:28:35,690 --> 00:28:40,530 Se tie estas ankoraŭ ĉambron ĉe la fino de la ŝnuro por doni al vi pli de tiu memoro 465 00:28:40,530 --> 00:28:43,370 ol origine donas al vi, tiam vi ricevos tiu plia memoro. 466 00:28:43,370 --> 00:28:46,640 Do vi povas simple meti la ĉenojn gravuloj malantaŭo al malantaŭo al malantaŭo al malantaŭo. 467 00:28:46,640 --> 00:28:49,290 Sed se tio ne estas la kazo, ĉar vi atendis tro longe 468 00:28:49,290 --> 00:28:51,700 kaj iu hazarda atingis plopped en memoro tie, sed ekzistas ekstra 469 00:28:51,700 --> 00:28:56,480 memoro cxi tie, ke estas bone. Realloc tuj faros la tuta peza ŝarĝo por vi, 470 00:28:56,480 --> 00:28:58,810 movi la kordo vi legis en la tiel malproksime de ĉi tie, 471 00:28:58,810 --> 00:29:02,550 metis ĝin tie, kaj tiam donas al vi iom pli ponteto en tiu punkto. 472 00:29:02,550 --> 00:29:05,610 Do kun ondo de la mano, mi diru ke kion GetString faras 473 00:29:05,610 --> 00:29:09,540 Estas ĝi estas startanta kun malgranda buffer, eble 1 sola karaktero, 474 00:29:09,540 --> 00:29:12,300 kaj se la uzanto tajpas en 2 karakteroj, GetString finas 475 00:29:12,300 --> 00:29:15,210 nomante realloc kaj diras, 'Ooh, 1 karaktero ne sufiĉis. 476 00:29:15,210 --> 00:29:18,480 Donu al mi 2 signojn. ' Tiam, se vi legis tra la logiko de la ciklo, 477 00:29:18,480 --> 00:29:21,070 ĝi tuj diros, 'Ooh, la uzanto tajpas en 3 signoj. 478 00:29:21,070 --> 00:29:25,690 Donu al mi nun ne 2 sed 4 karakteroj, tiam donu al mi 8, tiam donu al mi 16 kaj 32. " 479 00:29:25,690 --> 00:29:28,180 La fakto, ke mi duobligante la kapablo ĉiufoje 480 00:29:28,180 --> 00:29:30,320 signifas ke la bufro ne tuj kreski malrapide. 481 00:29:30,320 --> 00:29:35,870 Ĝi tuj kreski super rapida, kaj kio povus esti la avantaĝo de tiu? 482 00:29:35,870 --> 00:29:38,540 Kial mi dubli la grandecon de la bufro, kvankam la uzanto 483 00:29:38,540 --> 00:29:41,450 Eble nur bezonas 1 aldona karaktero de la klavaro? 484 00:29:41,450 --> 00:29:44,830 [Studenta respondo, nekomprenebla]. >> Kio estas tio? 485 00:29:44,830 --> 00:29:46,750 Ekzakte. Vi ne devas kreski kiel ofte. 486 00:29:46,750 --> 00:29:48,870 Kaj tiu estas nur speco de - you're hedging vian vetas tie. 487 00:29:48,870 --> 00:29:54,150 La ideo estas ke vi ne volas nomi realloc multe, ĉar ĝi emas esti malrapida. 488 00:29:54,150 --> 00:29:56,840 Ajn vi petos la mastruma sistemo por memoro, kiel vi baldaŭ vidos 489 00:29:56,840 --> 00:30:00,620 en futura problemo aro, ĝi emas preni iom da tempo. 490 00:30:00,620 --> 00:30:04,980 Do ŝparajn tiu kvanto de tempo, eĉ se vi malŝparas iu spaco, emas esti bona afero. 491 00:30:04,980 --> 00:30:07,250 >> Sed se ni legas tra la fina parto de GetString tie, 492 00:30:07,250 --> 00:30:10,880 kaj denove, komprenante ĉiun linion ĉi tie ne estas tiel grava hodiaŭ. 493 00:30:10,880 --> 00:30:14,830 Sed rimarki ke ĝi eventuale nomas malloc denove, kaj ĝi allocates 494 00:30:14,830 --> 00:30:16,980 precize kiel multaj bitokoj kiel ĝi bezonas por la kordo 495 00:30:16,980 --> 00:30:21,620 kaj poste ĵetas for nomante libera, la troe granda buffer, 496 00:30:21,620 --> 00:30:23,510 se ja got duobliĝis tro da fojoj. 497 00:30:23,510 --> 00:30:25,970 Unuvorte, tiu estas kiel GetString estis laborante ĉiuj ĉi tempo. 498 00:30:25,970 --> 00:30:30,100 Ĉiuj faras estas legi unu signo samtempe denove kaj denove kaj denove 499 00:30:30,100 --> 00:30:37,930 kaj ĉiufoje ĝi bezonas plian memoron, ĝi petas la mastruma sistemo por ĝin nomi realloc. 500 00:30:37,930 --> 00:30:41,660 Demandojn? Bone. 501 00:30:41,660 --> 00:30:45,220 >> Atako. Nun ke ni komprenas punteros, aŭ almenaŭ 502 00:30:45,220 --> 00:30:47,560 estas pli familiara kun indikoj, 503 00:30:47,560 --> 00:30:50,020 ni pripensu, kiel la tuta mondo komenciĝas en collapse 504 00:30:50,020 --> 00:30:53,160 se vi ne sufiĉe protekti kontraŭ adversarial uzantoj, 505 00:30:53,160 --> 00:30:55,180 homoj kiuj klopodas pirati en vian sistemon. 506 00:30:55,180 --> 00:31:00,260 Homoj kiuj provas ŝteli vian programaron per circumventing iuj registriĝo kodo 507 00:31:00,260 --> 00:31:02,150 ke ili povu alie devas tajpi in 508 00:31:02,150 --> 00:31:04,860 Rigardu ĉi tiu ekzemplo tie ĉi, kiu estas nur C-kodo 509 00:31:04,860 --> 00:31:07,920 kiu havas funkcion ĉefa en la fundo, kiu nomas funkcio foo, 510 00:31:07,920 --> 00:31:12,100 kaj kio ĝi pasas al foo? [Studenta] Sola argumento. 511 00:31:12,100 --> 00:31:15,660 >> Single argumento. Do argv [1], kio signifas la unuan vorton de la uzanto tajpas 512 00:31:15,660 --> 00:31:19,150 en la komanda linio post a.out aŭ kion ajn la programo estas nomata. 513 00:31:19,150 --> 00:31:24,920 Do foo, sur la supro, prenas en char *, sed char * estas simple kion? 514 00:31:24,920 --> 00:31:28,860 Linio. Estas nenio nova tie ĉi, kaj tiu linio estas arbitre nomi trinkejo. 515 00:31:28,860 --> 00:31:36,090 En ĉi tiu linio tie, char c [12], en speco de duon-teknika angla, kio ĉi tiu linio faras? 516 00:31:36,090 --> 00:31:40,640 Tabelo de -? Karakteroj. Donu al mi aron de 12 signoj. 517 00:31:40,640 --> 00:31:44,970 Do ni povus nomi tiun buffer. Ĝi estas teknike nomitaj c, sed oni buffer en programado 518 00:31:44,970 --> 00:31:47,890 nur signifas aron da spaco kiun vi povas meti iujn aĵojn in 519 00:31:47,890 --> 00:31:49,940 >> Tiam laste, memcpy, ni ne uzas antaŭe. 520 00:31:49,940 --> 00:31:52,380 Sed vi povas verŝajne diveni kion ĝi faras. Ĝi kopias memoro. 521 00:31:52,380 --> 00:31:58,790 Kion ĝi faras? Nu, ŝajne kopias trinkejo, lia eniro, en c, 522 00:31:58,790 --> 00:32:03,420 sed nur ĝis la longo de trinkejo. 523 00:32:03,420 --> 00:32:07,440 Sed estas cimo tie. 524 00:32:07,440 --> 00:32:14,500 Konsentite, tiel teknike ni vere faras strlen (stango) x sizeof (char), tio estas ĝusta. 525 00:32:14,500 --> 00:32:17,920 Sed en la plej malbona kazo tie, ni supozu, ke that's - tiel, bone. 526 00:32:17,920 --> 00:32:23,760 Tiam ekzistas 2 cimojn. Do sizeof (char), gravas, ni faros tiun iom pli larĝa. 527 00:32:23,760 --> 00:32:28,860 Do nun ekzistas ankoraŭ cimon, kiu estas kiu? 528 00:32:28,860 --> 00:32:31,630 [Studenta respondo, nekomprenebla] >> Kontroli kion? Konsentite, do ni devas kontroli 529 00:32:31,630 --> 00:32:35,010 por NULL, ĉar malbonaj aĵoj okazas kiam via puntero estas NULL, 530 00:32:35,010 --> 00:32:38,490 Ĉar vi povus fini tuj tie, kaj vi ne devus iam esti tuj nula 531 00:32:38,490 --> 00:32:40,890 per dereferencing ĝin per la * operatoro. 532 00:32:40,890 --> 00:32:45,250 Do tio estas bona, kaj kion ajn ni faras? Logike tie estas difekto tie ankaŭ. 533 00:32:45,250 --> 00:32:47,650 [Studenta respondo, nekomprenebla] 534 00:32:47,650 --> 00:32:51,340 >> Do kontrolu se argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Konsentite, do estas 3 erarojn en ĉi tiu programo tie. 536 00:32:54,130 --> 00:33:00,080 Ni ne kontrolas, se la uzanto reale tajpitaj en nenio en argv [1], bona. 537 00:33:00,080 --> 00:33:02,240 Do kio estas la tria cimo? Yeah? 538 00:33:02,240 --> 00:33:04,420 [Studenta respondo, nekomprenebla] >> Bona. 539 00:33:04,420 --> 00:33:09,590 Do ni kontrolis unu scenejo. Ni implice kontrolis ne kopii pli memoro 540 00:33:09,590 --> 00:33:12,800 ol estus superi la longo de trinkejo. 541 00:33:12,800 --> 00:33:15,720 Do se la ŝnuro al la uzanto tajpas en estas 10 signojn longa, 542 00:33:15,720 --> 00:33:18,260 ĉi diras, 'Nur kopii 10 signojn.' 543 00:33:18,260 --> 00:33:21,140 Kaj tio estas bone, sed kio se la uzanto tajpas en vorto ĉe la prompto 544 00:33:21,140 --> 00:33:29,360 kiel 20 karaktero vorton; ĉi tio estas, dirante kopion 20 signojn el trinkejo en kio? 545 00:33:29,360 --> 00:33:32,840 c, alie konata kiel nia buffer, kiu signifas simple skribis datumoj 546 00:33:32,840 --> 00:33:35,950 al 8 bajto lokojn kiujn vi ne posedas, 547 00:33:35,950 --> 00:33:38,320 kaj vi ne posedas ilin en la senco ke vi neniam destinis ilin. 548 00:33:38,320 --> 00:33:41,190 Do ĉi tiu estas kion ĝenerale konata kiel la buffer overflow atako, 549 00:33:41,190 --> 00:33:46,650 aŭ buffer invadita atako, kaj ĝi estas atako en la senco ke se la uzanto 550 00:33:46,650 --> 00:33:50,650 aŭ la programo ke tio nomante vian funkcio faras ĉi malice, 551 00:33:50,650 --> 00:33:53,780 kio efektive okazas sekva povus esti sufiĉe malbona. 552 00:33:53,780 --> 00:33:55,690 >> Ni rigardu tiun bildon tie. 553 00:33:55,690 --> 00:33:59,070 Tiu pentraĵo reprezentas vian pilo de memoro. 554 00:33:59,070 --> 00:34:01,050 Kaj memoru, ke ĉiufoje kiam vi vokas funkcio, 555 00:34:01,050 --> 00:34:04,520 vi ricevas tiun iom kadro sur la pilo kaj poste alia kaj poste alia kaj poste alia. 556 00:34:04,520 --> 00:34:07,250 Kaj ĝis nun ni nur speco de abstraída tiuj for kiel rektanguloj 557 00:34:07,250 --> 00:34:09,380 ĉu tie sur la tabulo aŭ en la ekrano tie. 558 00:34:09,380 --> 00:34:12,219 Sed se ni zomi en unu el tiuj rektanguloj, 559 00:34:12,219 --> 00:34:16,460 kiam vi nomas funkcio foo, rezultas ke estas pli sur la stako 560 00:34:16,460 --> 00:34:18,739 ene de tiu kadro kaj ke rektangulo 561 00:34:18,739 --> 00:34:23,370 ol nur x kaj y kaj a kaj b, kiel ni faris parolas interŝanĝa. 562 00:34:23,370 --> 00:34:25,949 Rezultas, ke estas kelkaj suba nivelo detaloj, 563 00:34:25,949 --> 00:34:27,780 inter ili revenos adreso. 564 00:34:27,780 --> 00:34:33,020 Do rezultas kiam ĉefa nomas foo, ĉefa devas informi foo 565 00:34:33,020 --> 00:34:36,760 kio ĉefa La adreso estas en la komputilo memoro. 566 00:34:36,760 --> 00:34:40,659 Ĉar alie, kiam foo estas farita ekzekuti, kiel en ĉi tiu kazo ĉi tie, 567 00:34:40,659 --> 00:34:43,790 kiam vi atingos ĉi tiu apude frizita streĉa fine de foo, 568 00:34:43,790 --> 00:34:48,860 kiel la heck ne foo scias kie kontrolo de la programo supozas iri? 569 00:34:48,860 --> 00:34:52,460 Rezultas ke la respondo al tiu demando estas en tiu ruĝa rektangulo ĉi tie. 570 00:34:52,460 --> 00:34:56,130 Ĉi tio reprezentas pointer, kaj lin tuŝas al la komputilo por stoki, provizore, 571 00:34:56,130 --> 00:35:00,250 en la tiel nomata stako la adreson de ĉefa tiel ke apenaŭ foo estas farita ekzekuti, 572 00:35:00,250 --> 00:35:04,110 la komputilo scias kie kaj kio linio en ĉefa reiri al. 573 00:35:04,110 --> 00:35:06,900 Savita kadro puntero raportu simile al ĉi tio. 574 00:35:06,900 --> 00:35:09,620 Char * trinkejo tie reprezentas kio? 575 00:35:09,620 --> 00:35:14,740 Nu, nun ĉi blua segmento jen foo la kadro, kio estas trinkejo? 576 00:35:14,740 --> 00:35:18,300 Okay, do trinkejo estas nur la argumento al la foo funkcio. 577 00:35:18,300 --> 00:35:20,720 >> Do nun ni estas ree en la konata pentraĵo. 578 00:35:20,720 --> 00:35:22,960 Estas pli aĵoj kaj pli distroj en la ekrano 579 00:35:22,960 --> 00:35:27,490 sed tiu lumo blua segmento estas kion ni estis desegni sur la chalkboard por iu kiel interŝanĝa. 580 00:35:27,490 --> 00:35:31,890 Tio estas la kadro por foo kaj la sola afero en ĝi nun estas trinkejo, 581 00:35:31,890 --> 00:35:34,630 kio estas ĉi tiu parametro. 582 00:35:34,630 --> 00:35:39,840 Sed kio alia devus esti en la pilo, laŭ tiu kodo tie? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Do ni devus vidi ankaŭ 12 kvadratoj de memoro, 584 00:35:44,280 --> 00:35:46,260 asignitaj al variablo nomata c. 585 00:35:46,260 --> 00:35:48,340 Kaj efektive ni ja havas ke sur la ekrano. 586 00:35:48,340 --> 00:35:51,650 La plejsupro tie estas c [0], kaj tiam la aŭtoro de ĉi tiu diagramo 587 00:35:51,650 --> 00:35:55,130 ne tedis desegnante ĉiuj kvadratoj sed estas ja 12 tie 588 00:35:55,130 --> 00:36:00,120 ĉar se vi rigardas la fundo pravas, c [11], se vi rakontos de 0, estas la 12 tiaj bajtoj. 589 00:36:00,120 --> 00:36:06,190 Sed jen la problemo: En kiu direkto estas c kreskanta? 590 00:36:06,190 --> 00:36:10,390 Ia supro malsupren, ĉu ne? Se ĝi komenciĝas ĉe la supro kaj kreskas al la fundo, 591 00:36:10,390 --> 00:36:13,480 ne aspektas kiel ni lasis nin multe ponteto tie tute ne. 592 00:36:13,480 --> 00:36:15,320 Ni speco de pentris mem en angulon, 593 00:36:15,320 --> 00:36:20,210 kaj ke c [11] estas rekte kontraŭ stango, kiu estas dekstre kontraux pilo kadro pointer, 594 00:36:20,210 --> 00:36:23,800 kiu estas dekstre kontraux la reveno adreso; ne estas pli ĉambro. 595 00:36:23,800 --> 00:36:26,100 Do kio estas la implikaĵo, tiam, se vi ŝraŭbo supren, 596 00:36:26,100 --> 00:36:30,460 kaj vi provos legi 20 bitokoj en 12-bajton buffer? 597 00:36:30,460 --> 00:36:33,460 Kie estas tiuj 8 pliaj bitokoj tuj iros? 598 00:36:33,460 --> 00:36:36,370 Ene ĉio alia, iuj el kiuj estas super grava. 599 00:36:36,370 --> 00:36:40,480 Kaj la plej grava afero, potenciale, estas la ruĝa skatolo tie, reveno adreso. 600 00:36:40,480 --> 00:36:44,720 Ĉar supozas ke vi estas ĉu hazarde aŭ adversarially 601 00:36:44,720 --> 00:36:48,040 anstatauxigas tiuj 4 bajtoj, kiuj puntero adreson, 602 00:36:48,040 --> 00:36:53,190 ne nur kun rubo, sed kun numero kiu okazas reprezenti veran adreson en memoro? 603 00:36:53,190 --> 00:36:55,930 Kio estas la implicaiton, logike? 604 00:36:55,930 --> 00:36:59,080 [Studenta respondoj, nekomprenebla] >> Ekzakte. Kiam foo revenas 605 00:36:59,080 --> 00:37:03,560 kaj hits kiu frizita streĉa, la programo tuj procedi ne reveni al ĉefa, 606 00:37:03,560 --> 00:37:08,320 ĝi estas tuj revenos ajn adreso estas en tiu ruĝa skatolo. 607 00:37:08,320 --> 00:37:11,560 >> Nun, en la kazo de circumventing programaro registriĝo, 608 00:37:11,560 --> 00:37:14,400 kio estas la adreso ke tio esti denove estas la funkcio 609 00:37:14,400 --> 00:37:18,820 kiu kutime prenas nomata vi pagis por la programaro kaj inputted vian enskribo-kodon? 610 00:37:18,820 --> 00:37:23,160 Vi povus ordigi de lertaĵo la komputilo en ne tuj ĉi tie, sed anstataŭe, irante ĉi tien. 611 00:37:23,160 --> 00:37:27,950 Aŭ, se vi estas vere lerta, kontraŭulo povas reale tajpi en la klavaro, 612 00:37:27,950 --> 00:37:32,500 ekzemple, ne reala vorto, ne 20 signojn, sed supozas ke li aŭ ŝi 613 00:37:32,500 --> 00:37:36,200 tipoj en iuj karakteroj kiuj reprezentas kodo? 614 00:37:36,200 --> 00:37:38,860 Kaj ĝi ne tuj estos C kodon, ĝi tuj estos la karakteroj 615 00:37:38,860 --> 00:37:42,920 kiuj reprezentas duuma maŝino kodoj, 0-aj kaj 1-oj. 616 00:37:42,920 --> 00:37:46,740 Sed supozu ke ili estas sufiĉe lerta por fari tion, por iel almeti en la GetString prompto 617 00:37:46,740 --> 00:37:49,460 iu kiu esence kompilita kodo, 618 00:37:49,460 --> 00:37:56,900 kaj la lastaj 4 bitokoj anstatauxigas ke reveno adreson, kaj kion adreso ne ke enigo fari? 619 00:37:56,900 --> 00:38:01,860 Stokas en ĉi ruĝa rektangulo la adreso de la unua bitoko de la buffer. 620 00:38:01,860 --> 00:38:04,270 Do vi devas esti vere lerta, kaj ĉi tiu estas tre provo kaj eraro 621 00:38:04,270 --> 00:38:08,500 por malbonaj homoj tie ekstere, sed se vi povas kalkuli kiom granda ĉi buffer estas, 622 00:38:08,500 --> 00:38:12,170 tia, ke la lastaj bajtoj en la enigo kiun vi provizis al la programo 623 00:38:12,170 --> 00:38:15,970 okazi al esti ekvivalento al la adreso de la komenco de via buffer, 624 00:38:15,970 --> 00:38:22,270 vi povas fari ĉi tion. Se ni diras, kutime, saluton, kaj \ 0, tio estas kio finas en la buffer. 625 00:38:22,270 --> 00:38:27,860 Sed se ni estas pli saĝa, kaj ni plenigos ke buffer kun kio ni genéricamente nomas atako kodo, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Attack, atako, atako, atako, kie ĉi tiu estas nur iu kiu faras ion malbonan. 627 00:38:31,920 --> 00:38:35,190 Nu, kio okazas se vi estas vere lerta, vi povus fari tion: 628 00:38:35,190 --> 00:38:41,740 En la ruĝaj skatolo tie estas vico de nombroj: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Rimarku ke, kiu kongruas kun la numero kiu estas ĉe tie. 630 00:38:44,890 --> 00:38:47,280 Ĝi estas en inversa ordo, sed pli en tiu iu alia fojo. 631 00:38:47,280 --> 00:38:51,430 Rimarku ke tiu redono adreso estis intence ŝanĝita 632 00:38:51,430 --> 00:38:54,970 egali la adreso ĉi tien, ne la adreson de main. 633 00:38:54,970 --> 00:39:00,170 Do se la malbona ulo is super inteligenta, li aŭ ŝi tuj inkluzivi en tiu atako kodo 634 00:39:00,170 --> 00:39:02,890 iu kiel, 'Forigu ĉiujn uzanto-dosierojn.' 635 00:39:02,890 --> 00:39:06,320 Aŭ 'Kopiu la pasvortoj,' aŭ 'Krei konton ke mi povas ensaluti.' 636 00:39:06,320 --> 00:39:10,130 Ion ajn, kaj jen estas ambaŭ la danĝero kaj la potenco de C. 637 00:39:10,130 --> 00:39:12,900 Ĉar vi havas aliron al la memoro tra punteros 638 00:39:12,900 --> 00:39:15,950 kaj vi povas pro skribi ion vi volas en komputila memoro. 639 00:39:15,950 --> 00:39:19,290 Vi povas fari komputilon fari ion vi volas simple per 640 00:39:19,290 --> 00:39:22,780 esti ĝin salti ĉirkaŭ ene de lia propra memora spaco. 641 00:39:22,780 --> 00:39:27,230 Kaj tiel, ĝis la nuna tago, tiel multaj programoj kaj tiom da retejoj kiuj interkonsentis 642 00:39:27,230 --> 00:39:29,730 boli malsupren al homoj utiligante ĉi. 643 00:39:29,730 --> 00:39:32,510 Kaj ĉi eble ŝajnas kiel super-kompleksa atako, 644 00:39:32,510 --> 00:39:34,220 sed ne ĉiam komenci tiu vojo. 645 00:39:34,220 --> 00:39:36,770 >> La realaĵo estas, ke kio malbona popolo tipe fari estas, 646 00:39:36,770 --> 00:39:41,470 ĉu ĝi estas programo en komanda linio aŭ GUI programo aŭ retejo, 647 00:39:41,470 --> 00:39:43,290 estas vi ĵus ekhavigi sensencaĵo. 648 00:39:43,290 --> 00:39:46,940 Vi tajpas en vere granda vorto en la serĉo kampo kaj sukceson eniri, 649 00:39:46,940 --> 00:39:49,030 kaj vi atendos por vidi, ĉu la retejo frakasas. 650 00:39:49,030 --> 00:39:53,270 Aŭ vi atendos por vidi, ĉu la programo manifestiĝas iun eraron mesaĝo. 651 00:39:53,270 --> 00:39:55,480 Ĉar se vi ricevas bonŝanca, ĉar la malbona ulo, 652 00:39:55,480 --> 00:39:59,610 kaj vi provizis iom freneza enigo kiun frakasas la programo, 653 00:39:59,610 --> 00:40:02,280 kiu signifas la programisto ne anticipis vian malbonan konduton 654 00:40:02,280 --> 00:40:05,420 kio signifas ke vi povas probable, kun sufiĉe peno, 655 00:40:05,420 --> 00:40:09,870 sufiĉa provo kaj eraro, manieron fari pli precizan atakon. 656 00:40:09,870 --> 00:40:15,900 Do tiel parto de sekureco ne estas nur evitante tiujn atakojn en aro, sed detekti ilin 657 00:40:15,900 --> 00:40:20,250 kaj fakte rigardas protokolojn kaj vidante kion freneza enigoj ke homoj tajpita en vian retejon. 658 00:40:20,250 --> 00:40:26,040 Kio serĉo terminoj homoj tajpita en vian retejon kun la espero de superfluas iu bufro? 659 00:40:26,040 --> 00:40:28,900 Kaj jen la tuta abscesoj sur la simpla bazojn de kio estas tabelo, 660 00:40:28,900 --> 00:40:32,510 kaj kion ĝi signifas destini kaj uzi memoron? 661 00:40:32,510 --> 00:40:34,920 Kaj rilate al tio, ankaŭ, estas tio. 662 00:40:34,920 --> 00:40:37,520 >> Do ni nur rigardis interne de malmola disko ankoraŭ denove. 663 00:40:37,520 --> 00:40:40,190 Do vi memoras de unu-du semajnoj antaŭe, ke kiam vi treni dosieroj 664 00:40:40,190 --> 00:40:45,470 al viaj recicla bin aŭ rubo povas, kio okazas? 665 00:40:45,470 --> 00:40:47,850 [Studenta] Nenio. >> Jes, absolute nenion. Eventuale se vi kuros malalta 666 00:40:47,850 --> 00:40:51,370 sur durdisko, Windows aŭ Mac OS komencos forigi dosierojn por vi. 667 00:40:51,370 --> 00:40:53,670 Sed se vi treni ion tie, tiam ĝi ne estas tute sekura. 668 00:40:53,670 --> 00:40:56,550 Ĉiuj viaj roomate, amiko aŭ familiano devas fari estas duobla klaku, kaj voila. 669 00:40:56,550 --> 00:40:59,720 Jen ĉiuj Sketchy dosierojn kiujn vi provis forviŝi. 670 00:40:59,720 --> 00:41:02,840 Do la plimulto de ni almenaŭ scias, ke vi devas dekstre alklaku aŭ kontroli klaku 671 00:41:02,840 --> 00:41:05,320 kaj malplenaj la rubo, aŭ io simila. 672 00:41:05,320 --> 00:41:07,900 Sed eĉ tiam, ke ĝi ne sufiĉe trafus. 673 00:41:07,900 --> 00:41:11,340 Ĉar kio okazas kiam vi havas dosieron en via malmola disko 674 00:41:11,340 --> 00:41:14,590 kiu reprezentas iun vorton dokumenton aŭ iun JPEG? 675 00:41:14,590 --> 00:41:18,820 Kaj ĉi tio reprezentas vian malmolan diskon, kaj diru ĉi Sliver tie reprezentas tiun dosieron, 676 00:41:18,820 --> 00:41:21,640 kaj ĝi estas formita de tuta fasko de 0-aj kaj 1-oj. 677 00:41:21,640 --> 00:41:25,470 Kio okazas kiam vi ne nur treni tiu dosiero al la rubujo aŭ recicla bin, 678 00:41:25,470 --> 00:41:30,390 sed ankaŭ malplenigi ĝin? 679 00:41:30,390 --> 00:41:32,820 Speco de nenio. Ne absolute nenio nun. 680 00:41:32,820 --> 00:41:37,630 Nun estas nur nenio, ĉar iom io okazas en la formo de ĉi tiu tablo. 681 00:41:37,630 --> 00:41:41,170 Do tie estas ia datumbazo aŭ tablo interne de komputilo la memoro 682 00:41:41,170 --> 00:41:44,470 kiu esence havas 1 kolumnon por dosieroj nomoj, 683 00:41:44,470 --> 00:41:50,550 kaj 1 kolumnon por dosiero situo, kie povas esti tiu situo 123, nur hazarda nombro. 684 00:41:50,550 --> 00:41:58,270 Do ni povus havi ion kiel x.jpg, kaj situo 123. 685 00:41:58,270 --> 00:42:02,870 Kaj kio okazas tiam, kiam vi malplenigi vian rubon? 686 00:42:02,870 --> 00:42:06,720 Kiu iras for. Sed kion ne iras estas la 0-aj kaj 1-oj. 687 00:42:06,720 --> 00:42:09,690 >> Do kio do la ligo al pset 4? 688 00:42:09,690 --> 00:42:13,460 Nu, kun pset 4, nur ĉar ni hazarde viŝis 689 00:42:13,460 --> 00:42:15,890 la kompakta flash karton kiu havis ĉiuj el tiuj fotoj, 690 00:42:15,890 --> 00:42:18,710 aŭ simple ĉar per malbona sorto iĝis koruptita, 691 00:42:18,710 --> 00:42:21,170 ne signifas ke la 0-aj kaj 1-oj ne estas ankoraŭ tie. 692 00:42:21,170 --> 00:42:23,920 Eble kelkaj el ili estas perditaj pro io got koruptita 693 00:42:23,920 --> 00:42:26,530 en la senco ke iuj 0 La igis 1-aj kaj 1-oj igis 0-aj jaroj. 694 00:42:26,530 --> 00:42:30,460 Malbonaj aferoj povas okazi pro kalesxo programaro aŭ misa aparataro. 695 00:42:30,460 --> 00:42:33,510 Tamen multaj el tiuj bitoj, eble eĉ 100% de ili estas ankoraŭ tie, 696 00:42:33,510 --> 00:42:38,330 estas nur, ke la komputilo aŭ la ĉambro ne scias kie JPEG 1 Komencis 697 00:42:38,330 --> 00:42:41,660 kaj kie JPEG 2 komenciĝis, sed se vi, la programisto, 698 00:42:41,660 --> 00:42:45,800 scias, kun iom de savvy, kie tiuj JPEG-oj estas aŭ kion ili rigardas kiel, 699 00:42:45,800 --> 00:42:49,570 vi povas analizi la 0-aj kaj 1-aj kaj diru: Ooh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Vi povas skribi programon kun esence nur por aŭ dum buklo 701 00:42:52,830 --> 00:42:56,100 kiu rekuperas ĉiuj kaj ĉiu el tiuj dosieroj. 702 00:42:56,100 --> 00:42:59,360 Do la lecionon tiam, estas por komenci "sekure" viŝante vian dosieroj 703 00:42:59,360 --> 00:43:01,720 se vi volas eviti tiun aro. Jes? 704 00:43:01,720 --> 00:43:06,940 [Studenta demando, nekomprenebla] 705 00:43:06,940 --> 00:43:11,150 >> Ĉu pli memoro ol vi faris antaŭe - 706 00:43:11,150 --> 00:43:14,790 Ho! Bona demando. Do kial do post malplenigante la rubo, 707 00:43:14,790 --> 00:43:18,300 faras via komputilo diri al vi ke vi havas pli liberan spacon ol vi faris antaux? 708 00:43:18,300 --> 00:43:22,450 En Simple dirata, ĉar ĝi mensogas. Pli teknike, vi ja havas pli da spaco. 709 00:43:22,450 --> 00:43:26,720 Ĉar nun vi diris, vi povas meti aliajn aferojn kie tiu dosiero iam estis, 710 00:43:26,720 --> 00:43:28,930 sed tio ne signifas la bitoj tuj, 711 00:43:28,930 --> 00:43:33,070 kaj tio ne signifas la bitoj estas ŝanĝita ĉiujn 0 La, ekzemple, pro via protekto. 712 00:43:33,070 --> 00:43:37,520 Kontraste, se vi "sekure" viŝi dosierojn, aŭ fizike ekstermi la mekanismo, 713 00:43:37,520 --> 00:43:40,810 ke vere estas la ununura maniero, kelkfoje, ĉirkaŭ tiu. 714 00:43:40,810 --> 00:43:45,300 Do kial ni ne lasos en tiu duon-timigas noto, kaj ni vidos vin lunde. 715 00:43:45,300 --> 00:43:52,810 CS50.TV