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