1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Nedēļa 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Hārvarda] 3 00:00:04,860 --> 00:00:07,260 [Tas ir CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Tas ir CS50, Nedēļa 5. 5 00:00:09,740 --> 00:00:12,900 Šodien un šonedēļ, mēs ieviest mazliet pasaules kriminālistikas 6 00:00:12,900 --> 00:00:14,850 saistībā ar problēmu Set 4. 7 00:00:14,850 --> 00:00:18,480 Šodien būs saīsināts lekcija jo tur īpašs notikums šeit vēlāk. 8 00:00:18,480 --> 00:00:21,940 Tāpēc mēs veikt palūrēt, un kaitināt gan studentiem un vecākiem līdzīgi šodien 9 00:00:21,940 --> 00:00:24,600 ar dažiem no lietām, kas ir pie horizonta. 10 00:00:24,600 --> 00:00:29,050 >> Starp tiem, kas pirmdien, jums būs vēl dažus klasesbiedrus. 11 00:00:29,050 --> 00:00:32,980 EDX, Hārvardas un MIT jaunu tiešsaistes iniciatīva OpenCourseWare un vairāk, 12 00:00:32,980 --> 00:00:36,730 sāk ar Hārvardas universitātes pirmdien, kas nozīmē nāk pirmdiena 13 00:00:36,730 --> 00:00:40,930 Jums būs, kā pagājušajā skaits, 86.000 papildu klasesbiedrus 14 00:00:40,930 --> 00:00:43,680 Kurš būs pēc kopā ar CS50 lekcijām un iedaļās 15 00:00:43,680 --> 00:00:45,890 un walkthroughs un problēmu komplekti. 16 00:00:45,890 --> 00:00:51,870 Un kā daļa no šī, jūs kļūtu par inaugurācijas klases CS50 un tagad CS50x. 17 00:00:51,870 --> 00:00:56,150 Kā daļu no šo tagad, saprotam, ka būs daži upsides kā arī. 18 00:00:56,150 --> 00:01:00,620 Lai iegūtu gatavs, par masveida studentu skaita, 19 00:01:00,620 --> 00:01:03,820 pietiek pateikt, ka, lai gan mums ir 108 TFS un CAS, 20 00:01:03,820 --> 00:01:07,560 tas nav gluži labākais studentu un skolotāju proporcija, tiklīdz mēs hit 80.000 studentiem. 21 00:01:07,560 --> 00:01:09,830 Mēs nebrauksim, lai šķirošanas tik daudz problēmu kopas manuāli, 22 00:01:09,830 --> 00:01:13,050 tāpēc ieviesa šonedēļ problēmu kopumu būs CS50 Pārbaudīt, 23 00:01:13,050 --> 00:01:15,410 kas būs komandrindas lietderība ietvaros iekārtas 24 00:01:15,410 --> 00:01:17,880 ka jūs saņemsiet, kad jūs atjaunināt to vēlāk šajā nedēļas nogalē. 25 00:01:17,880 --> 00:01:21,030 Jūs varēsiet vadīt komandu, check50, par savu PSET, 26 00:01:21,030 --> 00:01:24,770 un jūs saņemsiet tūlītēju atgriezenisko saiti par to, vai jūsu programma ir pareiza vai nepareiza 27 00:01:24,770 --> 00:01:27,980 saskaņā ar dažādiem dizaina specifikācijām, kas mēs esam. 28 00:01:27,980 --> 00:01:30,310 Vairāk par to problēmu kopumu specifikācijai. 29 00:01:30,310 --> 00:01:34,220 Ar CS50x klasesbiedru tiks izmantojot to kā labi. 30 00:01:34,220 --> 00:01:36,170 >> Problēma Set 4 ir visu par kriminālistikas, 31 00:01:36,170 --> 00:01:38,630 un tas PSET bija tiešām iedvesmoja daži reālās dzīves sīkumi 32 00:01:38,630 --> 00:01:41,210 kad, kad es biju absolvents skolu es internēti uz brīdi 33 00:01:41,210 --> 00:01:45,270 ar MIDDLESEX County District Attorney birojs dara kriminālistikas darbu 34 00:01:45,270 --> 00:01:47,660 ar savu svina kriminālistikas pētnieks. 35 00:01:47,660 --> 00:01:50,280 Ko tas sasniedza, jo es domāju, ka es teicu pāris nedēļas agrāk, 36 00:01:50,280 --> 00:01:52,720 ir masa Valsts policija vai citi nāks, 37 00:01:52,720 --> 00:01:56,150 tie varētu samazināties pie lietas, piemēram, cietos diskus un kompaktdiskus un disketes un, piemēram, 38 00:01:56,150 --> 00:01:58,770 un tad par kriminālistikas biroja mērķis bija noskaidrot 39 00:01:58,770 --> 00:02:01,470 vai tur bija vai nebija pierādījumu par sava veida. 40 00:02:01,470 --> 00:02:04,730 Tas bija Īpašā izmeklēšanas dienests, tāpēc tas bija balto apkaklīšu noziegumiem. 41 00:02:04,730 --> 00:02:10,949 Tas bija vairāk nepatīkamas veida noziegumiem, kaut iesaistot kādu digitālo mediju. 42 00:02:10,949 --> 00:02:16,450 Izrādās, ka nav, ka daudzi cilvēki rakstīt e-pastu, sakot, "es to darīja." 43 00:02:16,450 --> 00:02:20,490 Tik bieži, šie kriminālistikas meklējumi neieradās visu, ka daudz augļu, 44 00:02:20,490 --> 00:02:22,820 bet dažreiz cilvēki varētu rakstīt šādas vēstules. 45 00:02:22,820 --> 00:02:25,240 Tāpēc dažreiz, centieni tika atalgoti. 46 00:02:25,240 --> 00:02:31,210 >> Bet novest līdz šim tiesu PSET, mēs būsim ieviešot pset4 mazliet grafika. 47 00:02:31,210 --> 00:02:35,410 Jūs, iespējams, ņemt šīs lietas par pašsaprotamām - JPEG, GIF un kā - šajās dienās. 48 00:02:35,410 --> 00:02:38,320 Bet, ja jūs patiešām domājat par to, attēlu, līdzīgi Rob sejā, 49 00:02:38,320 --> 00:02:41,270 varētu tikt veidota kā secību punktiem vai pikseļi. 50 00:02:41,270 --> 00:02:43,380 Attiecībā uz aplaupīt sejas, tur ir visi krāsu veidu, 51 00:02:43,380 --> 00:02:46,760 un mēs sākām redzēt atsevišķus punktus, kas pazīstama arī kā pikseļi, 52 00:02:46,760 --> 00:02:48,610 kad mēs sākām, lai tuvinātu collas 53 00:02:48,610 --> 00:02:54,660 Bet, ja mēs vienkāršotu pasauli mazliet un tikai saka, ka tas šeit ir Rob melnā un baltā krāsā, 54 00:02:54,660 --> 00:02:57,490 pārstāvēt melnā un baltā, mēs varam tikai izmantot bināro. 55 00:02:57,490 --> 00:03:01,660 Un, ja mēs spēsim izmantot bināro, 1 vai 0, mēs varam paust šo pašu attēlu 56 00:03:01,660 --> 00:03:06,140 gada Robs ir smaidīgas sejas ar šo modeli bitiem. 57 00:03:06,140 --> 00:03:12,100 11000011 pārstāv balts, balts, melns, melns, melns, melns, balts, balts. 58 00:03:12,100 --> 00:03:16,150 Un tāpēc tas nav milzīgs lēciens, tad sākt runāt par krāsainiem fotoattēliem, 59 00:03:16,150 --> 00:03:18,600 lietas, kas jūs redzēt uz Facebook vai veikt ar digitālo kameru. 60 00:03:18,600 --> 00:03:21,410 Bet, protams, ja runa ir par krāsām, jums ir nepieciešams vairāk bitu. 61 00:03:21,410 --> 00:03:25,690 Un diezgan izplatīta pasaulē fotogrāfijām ir izmantot ne 1-bitu krāsu, 62 00:03:25,690 --> 00:03:29,560 jo tas liecina, bet 24-bitu krāsu, kur jūs faktiski iegūt miljoniem krāsu. 63 00:03:29,560 --> 00:03:32,250 Tā kā gadījumā, ja mēs pietuvināto par Rob acīm, 64 00:03:32,250 --> 00:03:36,370 kas bija jebkurš skaits miljoniem dažādu krāsains iespējām. 65 00:03:36,370 --> 00:03:39,040 Tāpēc mēs ieviest to Problem Set 4, kā arī ar walkthrough, 66 00:03:39,040 --> 00:03:43,370 kas būs šodien, 03:30, nevis parasto 02:30 jo piektdienas lekciju šeit. 67 00:03:43,370 --> 00:03:46,620 Bet video būs online kā parasti rīt. 68 00:03:46,620 --> 00:03:48,820 >> Mēs arī jūs iepazīstināt ar citu faila formātu. 69 00:03:48,820 --> 00:03:51,270 Tas ir apzināti domāts, lai apskatīt iebiedēt sākumā, 70 00:03:51,270 --> 00:03:55,670 bet tas ir tikai daži dokumenti par C struct. 71 00:03:55,670 --> 00:03:58,940 Izrādās, ka Microsoft gadiem palīdzēja popularizēt šo formātu 72 00:03:58,940 --> 00:04:05,150 sauc bitkartes failu formātu, bmp, un tas bija super vienkārši, krāsains grafisko failu formātu 73 00:04:05,150 --> 00:04:10,150 kas tika izmantota jau ilgu laiku un reizēm vēl uz tapetes uz galddatoriem. 74 00:04:10,150 --> 00:04:14,760 Ja jūs domājat, atpakaļ uz Windows XP un pakalniem un zilas debesis, 75 00:04:14,760 --> 00:04:17,170 ka parasti bija bmp vai bitkartes attēlu. 76 00:04:17,170 --> 00:04:19,959 Bitkartes ir jautri mums, jo viņiem ir mazliet vairāk sarežģītību. 77 00:04:19,959 --> 00:04:22,610 Tas nav tik vienkārši, kā šo režģa 0s un 1s. 78 00:04:22,610 --> 00:04:27,510 Tā vietā, jums ir lietas, piemēram, galveni sākumā failu. 79 00:04:27,510 --> 00:04:31,990 Tātad, citiem vārdiem sakot, iekšpusē. Bmp faila ir viss ķekars 0s un 1s, 80 00:04:31,990 --> 00:04:34,910 bet tur ir dažas papildu 0s un 1s tur. 81 00:04:34,910 --> 00:04:38,220 Un izrādās, ka tas, ko mēs esam droši par pašsaprotamu gadus - 82 00:04:38,220 --> 00:04:45,170 failu formātus, piemēram,. doc vai. xls vai. MP3, MP4,. neatkarīgi failu formāti 83 00:04:45,170 --> 00:04:48,480 ka jūs esat iepazinušies ar - ko tas pat nozīmē būt faila formāts, 84 00:04:48,480 --> 00:04:52,480 jo beigās, dienā visi šie faili mēs tikko 0s un 1s. 85 00:04:52,480 --> 00:04:56,810 Un varbūt tiem 0s un 1s pārstāvēt ABC caur ASCII vai tamlīdzīgu 86 00:04:56,810 --> 00:04:58,820 bet beigās, dienā, tas joprojām tikai 0s un 1s. 87 00:04:58,820 --> 00:05:02,100 Tik cilvēki tikai reizēm nolemj izgudrot jaunu faila formātu 88 00:05:02,100 --> 00:05:06,420 kur viņi standartizēt kāda modeļus bitiem būs patiesībā nozīmē. 89 00:05:06,420 --> 00:05:09,220 Un šajā gadījumā šeit, ļaudīm, kas paredzēti bitkartes failu formātu 90 00:05:09,220 --> 00:05:15,620 teica, ka pašu pirmo baitu bitkartes failu, kas apzīmēts ar kompensēt 0 tur, 91 00:05:15,620 --> 00:05:18,940 tur būs daži cryptically nosaukts mainīgo sauc bfType, 92 00:05:18,940 --> 00:05:23,080 kas vienkārši stāv uz bitmap failu tipa, kāda veida bitkartes failu tas ir. 93 00:05:23,080 --> 00:05:27,700 Jūs varat secināt varbūt no otrās rindas, ka ofseta 2, baitu skaits 2 94 00:05:27,700 --> 00:05:33,740 ir modelis 0s un 1s kas parāda, ko? Lielums kaut ko. 95 00:05:33,740 --> 00:05:35,310 Un tā iet no turienes. 96 00:05:35,310 --> 00:05:37,410 Tātad Problem Set 4, jums tiks gāja caur kādu no šīm lietām. 97 00:05:37,410 --> 00:05:39,520 Mēs ne galu galā rūpējas par visiem tiem. 98 00:05:39,520 --> 00:05:47,510 Bet pamanāt, ka tas sāk iegūt interesantu aptuveni 54 baitu: rgbtBlue, zaļo un sarkano. 99 00:05:47,510 --> 00:05:52,110 Ja esat kādreiz dzirdējuši akronīms RGB - sarkans, zaļš, zils - tas ir atsauce uz kas 100 00:05:52,110 --> 00:05:54,610 jo izrādās jūs varat krāsu visu varavīksnes krāsās 101 00:05:54,610 --> 00:05:58,180 ar kādu kombināciju sarkanā un zilā un zaļā. 102 00:05:58,180 --> 00:06:03,320 Un patiesībā, vecāki telpā varētu atgādināt dažus no senākajiem projektoru. 103 00:06:03,320 --> 00:06:05,890 Šajās dienās, jūs vienkārši redzēt vienu spilgtu gaismu, kas nāk no lēcas, 104 00:06:05,890 --> 00:06:09,800 bet atpakaļ dienā jums bija sarkanā objektīvu, zilo objektīvs, un zaļo lēcu, 105 00:06:09,800 --> 00:06:13,380 un kopā viņi ir vērsts uz ekrānu un veido krāsainu attēlu. 106 00:06:13,380 --> 00:06:16,270 Un diezgan bieži, vidējā skolas un vidusskolas būtu šos lēcas 107 00:06:16,270 --> 00:06:19,720 kādreiz tik nedaudz šķībi, tāpēc jums bija sava veida redzes dubultošanās vai trīskāršā attēlus. 108 00:06:19,720 --> 00:06:24,100 Bet tas bija ideja. Jums bija sarkanā un zaļā un zilā gaisma krāsošana attēlu. 109 00:06:24,100 --> 00:06:26,590 Un tas pats princips tiek izmantots datoros. 110 00:06:26,590 --> 00:06:30,230 >> Tātad starp uzdevumiem, tad par jums problēma Komplektā 4 būs dažas lietas. 111 00:06:30,230 --> 00:06:34,800 Viens no tiem ir faktiski mainītu attēlu, lai ar daudziem 0s un 1s, 112 00:06:34,800 --> 00:06:40,200 skaitlis, kura gabalus 0s un 1s pārstāv kāda konstrukcijā, piemēram, tas, 113 00:06:40,200 --> 00:06:43,630 un tad izdomāt, kā atkārtot pikseļi - Sarkanās, blūza, zaļumi - 114 00:06:43,630 --> 00:06:46,660 iekšā tā, ka tad, kad attēls izskatās sākotnēji, 115 00:06:46,660 --> 00:06:49,210 tas varētu izskatīties šādi, nevis pēc tam. 116 00:06:49,210 --> 00:06:53,640 Starp citiem uzdevumiem ir pārāk būs, ka jums tiks nodota tiesu medicīnas attēlu 117 00:06:53,640 --> 00:06:56,030 faktisko failu no digitālo kameru. 118 00:06:56,030 --> 00:06:58,960 Un par šo kameru, reiz bija viss ķekars fotogrāfijas. 119 00:06:58,960 --> 00:07:03,760 Problēma ir, mēs nejauši izdzēsti vai bija attēla bojāts kaut kā. 120 00:07:03,760 --> 00:07:05,750 Sliktas lietas notiek ar digitālo kameru. 121 00:07:05,750 --> 00:07:09,150 Un tā mēs ātri nokopēt visu 0s un 1s nost šīs kartes jums, 122 00:07:09,150 --> 00:07:13,610 saglabāts tos visus vienā lielā failā, un tad mēs nodot tos jums Problēma Set 4 123 00:07:13,610 --> 00:07:19,320 lai jūs varētu uzrakstīt programmu C, ar kuru, lai atgūtu visus šos JPEG, ideāli. 124 00:07:19,320 --> 00:07:23,330 Un izrādās, ka JPEG, pat ja viņi nedaudz par sarežģītu faila formātā - 125 00:07:23,330 --> 00:07:26,360 viņi daudz sarežģītāka nekā šajā smaidošu seju šeit - 126 00:07:26,360 --> 00:07:31,160 izrādās, ka katrs JPEG sākas ar tiem pašiem modeļiem 0s un 1s. 127 00:07:31,160 --> 00:07:35,630 Tātad, izmantojot, visbeidzot, kamēr cilpa, vai cilpa vai līdzīgu, 128 00:07:35,630 --> 00:07:38,880 Jūs varat atkārtot pār visu 0s un 1s šajā kriminālistikas tēlu, 129 00:07:38,880 --> 00:07:43,150 un katru reizi, kad jūs redzēt īpašu modeli, kas ir definēta problēma noteiktā specifikāciju, 130 00:07:43,150 --> 00:07:47,880 Jūs varat pieņemt šeit ir, ar ļoti lielu varbūtību, sākums JPEG. 131 00:07:47,880 --> 00:07:51,230 Un tiklīdz jūs atradīsiet to pašu modeli kādu baitu skaits 132 00:07:51,230 --> 00:07:55,430 vai kilobaiti vai megabaiti vēlāk, jūs varat pieņemt šeit ir otrā JPEG, 133 00:07:55,430 --> 00:07:57,380 Foto Paņēmu aiz pirmā. 134 00:07:57,380 --> 00:08:01,370 Ļaujiet man apstāties lasot šo pirmo failu, sāciet rakstīt šo jaunu, 135 00:08:01,370 --> 00:08:06,310 un jūsu programma izeja pset4 būs tik daudz kā 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 Un, ja tas nav 50 JPEG, jums ir mazliet cilpu. 137 00:08:09,270 --> 00:08:12,490 Ja Jums ir bezgalīgs skaits JPEG, Jums ir bezgalīgs cilpa. 138 00:08:12,490 --> 00:08:14,910 Lai arī būs diezgan izplatīta lieta. 139 00:08:14,910 --> 00:08:16,600 Tātad tas, kas ir pie horizonta. 140 00:08:16,600 --> 00:08:21,310 >> Viktorīna 0 aiz mums, saproti uz manu e-pastu, ka vienmēr pastāv ļaudīm, kuri abi ir laimīgi, 141 00:08:21,310 --> 00:08:23,640 neitrāls, un skumji ap viktorīnā 0 Time. 142 00:08:23,640 --> 00:08:26,800 Un, lūdzu, vērsties pie manis, galvas TF Zamyla, savu TF, 143 00:08:26,800 --> 00:08:31,180 jeb viens no SI ka jūs zināt, ja jūs vēlētos, lai apspriestu, kā lietas gāja. 144 00:08:31,180 --> 00:08:35,539 >> Tātad, lai ieskaidrot vecākiem šeit telpā, kāda ir CS50 bibliotēka? 145 00:08:36,429 --> 00:08:40,390 [Smiekli] Labs darbs. 146 00:08:40,390 --> 00:08:48,340 Kas CS50 bibliotēka? Yeah. >> [Students] Tas iepriekš rakstiski kopa koda [dzirdams] 147 00:08:48,340 --> 00:08:49,750 Labi, labi. 148 00:08:49,750 --> 00:08:53,240 Tas ir iepriekš rakstiski kopa koda ka mēs darbinieki rakstīja, mēs piedāvājam Jums, 149 00:08:53,240 --> 00:08:55,030 kas nodrošina kādu kopīgu funkcionalitāti, 150 00:08:55,030 --> 00:08:59,020 sīkumi, piemēram, atnesiet man virkni, get me int - visas funkcijas, kas ir uzskaitītas šeit. 151 00:08:59,020 --> 00:09:02,260 >> Sākot no šī brīža, mēs sākam, lai patiesi ņemtu šos mācību riteņiem off. 152 00:09:02,260 --> 00:09:05,050 Mēs esam gatavojas sākt atņemt virkni no jums, 153 00:09:05,050 --> 00:09:08,870 kas atgādināt bija tikai sinonīms kāda faktiskā datu tips? >> [Vairāki studenti] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Vecākiem, kas, iespējams, bija [padara whooshing skaņa]. Tas ir labi. 155 00:09:12,730 --> 00:09:17,550 Char * mēs sāksim redzēt uz ekrāna visu vairāk, kā mēs noņemt virkne no mūsu leksikas, 156 00:09:17,550 --> 00:09:19,730 vismaz ja runa ir faktiski rakstot kodu. 157 00:09:19,730 --> 00:09:22,840 Tāpat, mēs pārtraukt izmantot kādu no šīm funkcijām tik daudz 158 00:09:22,840 --> 00:09:25,280 jo mūsu programmas ir gatavojas saņemt sarežģītākas. 159 00:09:25,280 --> 00:09:28,480 Nevis vienkārši uzrakstīt programmu, kas sēž tur ar ātru mirgo, 160 00:09:28,480 --> 00:09:31,870 gaida, lai lietotājs varētu rakstīt kaut ko, jūs saņemsiet savu ieguldījumu no citurienes. 161 00:09:31,870 --> 00:09:35,490 Piemēram, jūs saņemsiet tos no vairākiem bitiem uz vietējo cieto disku. 162 00:09:35,490 --> 00:09:38,580 Jūs tā vietā saņemt tos nākotnē no tīkla savienojumu, 163 00:09:38,580 --> 00:09:40,230 kādu mājas lapu kaut kur. 164 00:09:40,230 --> 00:09:44,110 >> Tāpēc pieņemsim Noņemiet šo slāni pirmo reizi un uzvilkt CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 un šo failu sauc cs50.h, kas jūs esat # ieskaitot nedēļas, 166 00:09:49,010 --> 00:09:51,140 bet pieņemsim patiesībā redzēt, kas ir iekšā šo. 167 00:09:51,140 --> 00:09:54,430 No lietas materiāliem zilā top ir tikai viss ķekars komentārus: 168 00:09:54,430 --> 00:09:57,050 garantijas informācija un licencēšanu. 169 00:09:57,050 --> 00:09:59,050 Tas ir sava veida kopīgu paradigmas programmatūru 170 00:09:59,050 --> 00:10:01,580 jo programmatūras daudz šajās dienās ir tas, ko sauc atvērtā koda, 171 00:10:01,580 --> 00:10:05,220 kas nozīmē, ka kāds ir uzrakstījis kodu un dara to brīvi pieejamu 172 00:10:05,220 --> 00:10:10,470 ne tikai vadīt un izmantot, bet faktiski lasīt un mainīt un integrēt savu darbu. 173 00:10:10,470 --> 00:10:14,660 Tātad tas, ko jūs esat, izmantojot, atvērtā koda programmatūru, lai arī ļoti maza formā. 174 00:10:14,660 --> 00:10:18,560 Ja es ritiniet uz leju pagātnes komentāriem, lai gan, mēs sāksim redzēt vēl daži pazīstami lietas. 175 00:10:18,560 --> 00:10:25,010 Paziņojums no augšas šeit, ka cs50.h fails ietver visu ķekars header failus. 176 00:10:25,010 --> 00:10:28,560 Lielākā daļa no šiem, mēs neesam redzējuši pirms, bet viens ir pazīstams. 177 00:10:28,560 --> 00:10:32,270 Kurš no šiem mēs esam redzējuši, kaut arī īsi, līdz šim? >> [Students] Standarta bibliotēka. 178 00:10:32,270 --> 00:10:35,810 Jā, standarta bibliotēka. stdlib.h ir malloc. 179 00:10:35,810 --> 00:10:38,320 Kad mēs sākām runāt par dinamisku atmiņas sadalījumu, 180 00:10:38,320 --> 00:10:41,650 kas mēs būsim atpakaļ uz nākamo nedēļu, kā arī, mēs sākām ieskaitot šo failu. 181 00:10:41,650 --> 00:10:46,640 Izrādās, ka loģiska un patiesa un viltus nav faktiski nepastāv C per se 182 00:10:46,640 --> 00:10:49,440 ja jūs iekļaut šo failu šeit. 183 00:10:49,440 --> 00:10:52,710 Mēs esam par nedēļu tika ieskaitot stdbool.h 184 00:10:52,710 --> 00:10:55,620 lai jūs varētu izmantot jēdzienu bool, patiess vai nepatiess. 185 00:10:55,620 --> 00:10:58,620 Bez tam, jums būtu sava veida viltus to un izmantot int 186 00:10:58,620 --> 00:11:02,610 un tikai patvaļīgi pieņemt, ka 0 ir nepatiess un 1 ir taisnība. 187 00:11:02,610 --> 00:11:07,150 Ja mēs ritinātu uz leju tālāk, šeit ir mūsu definīcija virknes. 188 00:11:07,150 --> 00:11:11,390 Izrādās, jo mēs esam teica pirms, ka, ja šī zvaigzne ir nav īsti jautājumu. 189 00:11:11,390 --> 00:11:13,720 Jūs pat varat būt vietas visapkārt. 190 00:11:13,720 --> 00:11:16,740 Mums šajā semestrī ir veicināt to, jo tas būtu skaidrs, 191 00:11:16,740 --> 00:11:18,620 ka zvaigzne ir saistīts ar veidu, 192 00:11:18,620 --> 00:11:21,700 bet saproti, kā bieži, ja ne mazliet biežāk, 193 00:11:21,700 --> 00:11:24,430 ir likt to tur, bet funkcionāli tas pats. 194 00:11:24,430 --> 00:11:27,720 Bet tagad, ja mēs lasām, kas tālāk, pieņemsim to apskatīt GetInt 195 00:11:27,720 --> 00:11:32,190 jo mēs izmantojām, ka varbūt pirmo pirms kaut kas cits šajā pusgadā. 196 00:11:32,190 --> 00:11:37,440 Šeit ir GetInt. Tas ir tas, ko? >> [Students] prototips. >> Tas ir tikai prototips. 197 00:11:37,440 --> 00:11:41,410 Bieži vien mēs esam prototipus pie mūsu galotnēm. C failus, 198 00:11:41,410 --> 00:11:46,690 bet jūs varat arī nodot prototipus header failus,. h failus, piemēram, šo vienu šeit 199 00:11:46,690 --> 00:11:50,840 lai tad, kad jūs uzrakstīt dažas funkcijas, ka jūs vēlaties citiem cilvēkiem, lai varētu izmantot, 200 00:11:50,840 --> 00:11:53,550 kas ir tieši gadījumā ar CS50 bibliotēku, 201 00:11:53,550 --> 00:11:57,040 Jūs ne tikai īstenot savas funkcijas kaut ko līdzīgu cs50.c, 202 00:11:57,040 --> 00:12:02,790 Jūs arī nodot prototipu nav augšpusē šo failu, bet augšpusē galvenes failu. 203 00:12:02,790 --> 00:12:07,170 Tad ka galvene fails ir kādi draugi un kolēģi arī 204 00:12:07,170 --> 00:12:09,760 ar # ietvert savā kodu. 205 00:12:09,760 --> 00:12:12,210 Tātad visu šo laiku, jūs esat bijis, ieskaitot visus šo prototipu, 206 00:12:12,210 --> 00:12:16,580 efektīvi augšpusē jūsu failu, bet ceļā uz to # ietvert mehānisms, 207 00:12:16,580 --> 00:12:20,070 kas būtībā kopijas un pastas šo failu savu. 208 00:12:20,070 --> 00:12:23,070 Šeit ir daži diezgan detalizētu dokumentāciju. 209 00:12:23,070 --> 00:12:25,640 Mēs esam diezgan daudz par pašsaprotamu, ka GetInt izpaužas int, 210 00:12:25,640 --> 00:12:27,640 bet izrādās ir daži stūra gadījumi. 211 00:12:27,640 --> 00:12:31,810 Ko darīt, ja lietotājs veidiem vairākās kas ir pārāk liels, quintillion, 212 00:12:31,810 --> 00:12:35,490 kas vienkārši nevar ielikt no int? Kāda ir paredzamā rīcība? 213 00:12:35,490 --> 00:12:38,020 Ideālā gadījumā tas ir prognozējama. 214 00:12:38,020 --> 00:12:40,280 Tātad šajā gadījumā, ja jūs faktiski lasīt smalka drukāt, 215 00:12:40,280 --> 00:12:44,500 jūs faktiski redzēt, ka, ja līnija nav iespējams izlasīt, šī atgriešanās INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Mēs nekad par to runāja, bet gan balstoties uz tās kapitalizāciju, kas tas ir iespējams? 217 00:12:48,320 --> 00:12:50,640 [Students] nemainīgs. >> Tas ir pastāvīgs. 218 00:12:50,640 --> 00:12:54,770 Tas ir sava īpaša nemainīga, ka ir iespējams, deklarēta vienā no šīm header failus 219 00:12:54,770 --> 00:13:00,090 tas ir atkarīgs no augstāka failā, un INT_MAX ir iespējams kaut kā aptuveni 2 miljardiem 220 00:13:00,090 --> 00:13:04,990 Ideja ir, ka tāpēc mums ir kaut kā neizsaka ka kaut kas nogāja greizi, 221 00:13:04,990 --> 00:13:10,700 mēs, jā, ir 4000000000 skaitļus mūsu rīcībā: -2 miljardus līdz 2 miljardiem, sniegt vai pieņemt. 222 00:13:10,700 --> 00:13:14,710 Nu, kāda ir izplatīta programmēšanas ir jums nozagt tikai vienu no šiem numuriem, 223 00:13:14,710 --> 00:13:18,920 varbūt 0, varbūt 2 miljardus, varbūt -2000000000, 224 00:13:18,920 --> 00:13:23,280 lai jūs pavadīt kādu no saviem iespējamo vērtību, lai jūs varētu izdarīt uz pasauli 225 00:13:23,280 --> 00:13:26,820 ka, ja kaut kas noiet greizi, es atgriezīšos šo super liels vērtību. 226 00:13:26,820 --> 00:13:31,030 Bet jūs nevēlaties lietotājs rakstīt kaut noslēpumains kā 234 ..., tiešām liels skaits. 227 00:13:31,030 --> 00:13:34,060 Jūs vispārināt to, nevis kā nemainīga. 228 00:13:34,060 --> 00:13:38,060 Tik tiešām, ja jūs to anālo pēdējo nedēļu, jebkurā laikā jūs sauc GetInt, 229 00:13:38,060 --> 00:13:42,900 Jums vajadzētu būt pārbaudot ja nosacījums darīja lietošanas veidu, kas INT_MAX, 230 00:13:42,900 --> 00:13:46,590 vai, precīzāk, to darīja GetInt atgriešanās INT_MAX, jo, ja tā notiktu, 231 00:13:46,590 --> 00:13:51,830 kas faktiski nozīmē, ka tie nav rakstīt to. Kaut kas nogāja greizi šajā lietā. 232 00:13:51,830 --> 00:13:56,080 Tātad tas ir tas, ko parasti sauc par pastiprinātas vērtība, kas nozīmē tikai to īpašu. 233 00:13:56,080 --> 00:13:58,120 >> Pieņemsim tagad pārvērsties. C failu. 234 00:13:58,120 --> 00:14:01,340 C fails pastāvējis ierīces kādu laiku. 235 00:14:01,340 --> 00:14:06,840 Un patiesībā, ierīce ir tas iepriekš apkopoti par jums vērā, ka lieta, ko mēs sauc objekta kodu, 236 00:14:06,840 --> 00:14:09,540 bet tas vienkārši nav svarīgi, lai jūs, ja tas ir tāpēc, ka sistēma zina 237 00:14:09,540 --> 00:14:11,730 Šajā gadījumā, ja tas ir: ierīce. 238 00:14:11,730 --> 00:14:17,400 Pieņemsim ritināt uz leju tagad, lai GetInt un redzēt, kā GetInt ir strādājusi visu šo laiku. 239 00:14:17,400 --> 00:14:19,460 Šeit mums ir līdzīgas komentārus pirms tam. 240 00:14:19,460 --> 00:14:21,660 Ļaujiet man tuvinātu tikai koda daļu. 241 00:14:21,660 --> 00:14:23,900 Un ko mēs esam par GetInt ir šādi. 242 00:14:23,900 --> 00:14:25,700 Tas aizņem nav ievadi. 243 00:14:25,700 --> 00:14:29,510 Tā atgriež int, kamēr (patiess), tāpēc mums ir apzinātu bezgalīgu cilpu, 244 00:14:29,510 --> 00:14:33,180 bet domājams mēs izkļūt no šīs kaut vai atgriezties no šī. 245 00:14:33,180 --> 00:14:34,870 >> Let 's redzēt, kā tas darbojas. 246 00:14:34,870 --> 00:14:39,240 Mēs šķiet, izmantojot GetString šajā pirmajā rindā iekšpusē cilpa, 166. 247 00:14:39,240 --> 00:14:43,780 Tagad tas ir laba prakse, jo kādos apstākļos varētu GetString atgriezties 248 00:14:43,780 --> 00:14:47,660 īpašais atslēgvārds NULL? >> [Students] Ja kaut kas noiet greizi. 249 00:14:47,660 --> 00:14:51,630 Ja kaut kas noiet greizi. Un ko varētu iet nepareizi, ja jūs zvanīt kaut kas līdzīgs GetString? 250 00:14:54,960 --> 00:14:57,640 Yeah. >> [Students] malloc neizdodas, lai dotu tai Ints. 251 00:14:57,640 --> 00:14:59,150 Yeah. Varbūt malloc neizdodas. 252 00:14:59,150 --> 00:15:03,190 Kaut kur zem motora pārsega, GetString zvana malloc, kas piešķir atmiņu, 253 00:15:03,190 --> 00:15:06,020 kas ļauj datoru veikalā visas rakstzīmes 254 00:15:06,020 --> 00:15:07,750 ka lietotājs uz klaviatūras. 255 00:15:07,750 --> 00:15:11,590 Un pieņemsim, lietotājs bija visai daudz brīva laika un drukāti vairāk, piemēram, 256 00:15:11,590 --> 00:15:16,160 nekā 2 miljardiem rakstzīmes, vairāk zīmēm nekā datora pat ir RAM. 257 00:15:16,160 --> 00:15:19,250 GetString ir jāspēj apliecina, ka ar jums. 258 00:15:19,250 --> 00:15:22,560 Pat ja tas ir super, super retāk stūra gadījumā, 259 00:15:22,560 --> 00:15:24,340 tas ir kaut jāspēj rīkoties ar šo, 260 00:15:24,340 --> 00:15:28,750 un tā GetString, ja mēs devāmies atpakaļ un lasīt tās dokumentāciju, tā faktiski atgriezties null. 261 00:15:28,750 --> 00:15:34,460 Tāpēc tagad, ja GetString neizdodas, atgriežoties null, GetInt gatavojas neveiksmei, atdodot INT_MAX 262 00:15:34,460 --> 00:15:37,690 tāpat kā Sentinel. Šie ir tikai cilvēka konvencijas. 263 00:15:37,690 --> 00:15:41,450 Vienīgais veids, kā jūs varētu zināt, tas ir gadījumā, ir rīdinga dokumentāciju. 264 00:15:41,450 --> 00:15:45,040 >> Pieņemsim ritiniet uz leju, kur int ir faktiski gotten. 265 00:15:45,040 --> 00:15:51,160 Ja es ritiniet uz leju mazliet tālāk, 170 līnijas, mums ir komentāru virs šīm līnijām. 266 00:15:51,160 --> 00:15:55,100 Mēs paziņojam 172 int, N un char, C, un tad šī jaunā funkcija, 267 00:15:55,100 --> 00:15:58,930 ko daži no jums ir stumbled pāri pirms, sscanf. 268 00:15:58,930 --> 00:16:00,870 Tas nozīmē stīgu scanf. 269 00:16:00,870 --> 00:16:05,700 Citiem vārdiem sakot, man stīgu un es skenēt to informācijas daļas interesi. 270 00:16:05,700 --> 00:16:07,360 Ko tas nozīmē? 271 00:16:07,360 --> 00:16:11,800 Pieņemsim, ka es rakstīt, burtiski, 123 pie klaviatūras un tad hit Enter. 272 00:16:11,800 --> 00:16:16,470 Kas ir datu tips no 123 kad atgriezās ar GetString? >> [Students] String. 273 00:16:16,470 --> 00:16:18,380 Tas acīmredzot virkne, labi? Man virkni. 274 00:16:18,380 --> 00:16:23,220 Tātad 123 ir patiesi, citēju-likt pēdiņas beigās, 123 ar \ 0 beigās tā. 275 00:16:23,220 --> 00:16:27,110 Tas nav int. Tas nav skaitlis. Tas izskatās numuru, bet tas nav reāli. 276 00:16:27,110 --> 00:16:29,080 Tātad, ko tas GetInt jādara? 277 00:16:29,080 --> 00:16:35,750 Tā ir skenēšanas, ka virkne no kreisās uz labo - 123 \ 0 - un kaut konvertēt uz faktisko skaitlim. 278 00:16:35,750 --> 00:16:37,850 Jūs varētu izdomāt, kā to izdarīt. 279 00:16:37,850 --> 00:16:41,450 Ja jūs domājat, atpakaļ uz pset2, jūs, iespējams, ieguvuši nedaudz apmierināti ar Cēzara 280 00:16:41,450 --> 00:16:44,820 vai Vigenere, lai jūs varētu atkārtot pār virkni, jūs varat pārvērst chars uz Ints. 281 00:16:44,820 --> 00:16:46,710 Bet heck, tas ir visai daudz darba. 282 00:16:46,710 --> 00:16:49,860 Kāpēc ne zvanu funkciju, piemēram sscanf ka tas, ka jums? 283 00:16:49,860 --> 00:16:54,230 Tātad sscanf sagaida arguments - šajā gadījumā sauc līnija, kas ir virkne. 284 00:16:54,230 --> 00:17:01,840 Jūs tad norādiet pēdiņās, ļoti līdzīgi printf, ko jūs gaidāt, lai redzētu šajā virknē. 285 00:17:01,840 --> 00:17:09,000 Un ko es saku šeit ir gaidāms kāds decimālskaitlis un varbūt raksturu. 286 00:17:09,000 --> 00:17:12,000 Un mēs redzēsim, kāpēc tas tā ir tikai brīdi. 287 00:17:12,000 --> 00:17:15,869 Un izrādās, ka šis apzīmējums ir tagad atgādina stuff mēs sākām runāt par 288 00:17:15,869 --> 00:17:17,619 nedaudz vairāk nekā pirms nedēļas. 289 00:17:17,619 --> 00:17:21,740 Kas ir & N un & c darot mums šeit? >> [Students] n adrese un c adrese. 290 00:17:21,740 --> 00:17:25,400 Yeah. Tas dod man adresi n un adrese c. Kāpēc ir tik svarīga? 291 00:17:25,400 --> 00:17:30,220 Jūs zināt, ka ar funkciju C, jūs vienmēr varat atgriezties vērtību vai nav vērtības. 292 00:17:30,220 --> 00:17:34,530 Jūs varat atgriezties int, virkne, pludiņa, char, neatkarīgi, vai jūs varat atgriezties tukšumu, 293 00:17:34,530 --> 00:17:38,030 bet jūs varat atgriezties tikai viena lieta maksimāli. 294 00:17:38,030 --> 00:17:42,760 Bet šeit mēs vēlamies sscanf atgriezties man varbūt int, decimālskaitlis, 295 00:17:42,760 --> 00:17:46,220 un arī palija, un es paskaidrošu, kāpēc CHAR brīdi. 296 00:17:46,220 --> 00:17:51,460 Jūs faktiski vēlaties sscanf atgriezties divas lietas, bet tas vienkārši nav iespējams C. 297 00:17:51,460 --> 00:17:55,200 Jūs varat strādāt ap ka, pieņemot divās adresēs 298 00:17:55,200 --> 00:17:57,370 jo tiklīdz jūs nodot funkciju divām adresēm, 299 00:17:57,370 --> 00:18:00,470 Ko var, ka funkciju darīt ar viņiem? >> [Students] Rakstiet uz šīm adresēm. 300 00:18:00,470 --> 00:18:02,010 Tā var rakstīt uz šīm adresēm. 301 00:18:02,010 --> 00:18:05,770 Jūs varat izmantot zvaigzne darbību un iet tur, katrai no šīm adresēm. 302 00:18:05,770 --> 00:18:11,260 Tas ir sava veida šīs muguras durvju mehānisms, bet ļoti bieži mainās vērtības mainīgo 303 00:18:11,260 --> 00:18:14,870 vairāk nekā tikai vienā vietā - šajā gadījumā divi. 304 00:18:14,870 --> 00:18:21,340 Tagad paziņojums es esmu pārbaudot 1 == un pēc tam atgriežas n ja tas patiesībā novērtē taisnība. 305 00:18:21,340 --> 00:18:26,170 Tātad, kas notiek? Tehniski visi mēs patiešām vēlamies, lai notiktu, GetInt tas ir. 306 00:18:26,170 --> 00:18:30,740 Mēs vēlamies, lai parsēt, tā sakot, mēs vēlamies, lai izlasītu string - citēju-likt pēdiņas beigās 123 - 307 00:18:30,740 --> 00:18:34,560 un ja izskatās, ka tur ir vairāki tur, ko mēs esam spēcīgi sscanf darīt 308 00:18:34,560 --> 00:18:38,190 ir nodot šo numuru - 123 - šajā mainīgo n par mani. 309 00:18:38,190 --> 00:18:42,090 Tātad, kāpēc tad es tiešām ir tas, kā arī? 310 00:18:42,090 --> 00:18:48,220 Kas ir par sscanf loma sakot, jūs varētu arī saņemt raksturs šeit? 311 00:18:48,220 --> 00:18:53,470 [Dzirdams studentu reaģēšanas] >> komatu faktiski varētu darboties. 312 00:18:53,470 --> 00:18:56,330 Pieņemsim turēt kas domāja par brīdi. Kas vēl? 313 00:18:56,330 --> 00:18:59,270 [Students] Tā varētu būt nulle. >> Laba doma. Tas varētu būt null raksturs. 314 00:18:59,270 --> 00:19:01,660 Tas tiešām nav šajā gadījumā. Yeah. >> [Students] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Vai ļaut man vispārināt vēl vairāk. 316 00:19:04,340 --> 00:19:06,640 % C tur ir tikai kļūdu labošanas. 317 00:19:06,640 --> 00:19:09,300 Mēs negribam, lai būtu varonis pēc skaita, 318 00:19:09,300 --> 00:19:11,870 bet ko tas man ļauj to darīt, ir šādi. 319 00:19:11,870 --> 00:19:18,210 Izrādās, ka sscanf papildus uzglabāšanai vērtības n un c šajā piemērā šeit, 320 00:19:18,210 --> 00:19:24,890 ko tas arī ir tas atgriež skaitu mainīgo tas likts vērtības iekšā 321 00:19:24,890 --> 00:19:30,260 Tātad, ja jūs tikai rakstīt 123, tad tikai% d gatavojas, lai atbilstu, 322 00:19:30,260 --> 00:19:33,880 un tikai n izpaužas uzglabā ar vērtību, piemēram, 123, 323 00:19:33,880 --> 00:19:35,640 un nekas izpaužas nodot c. 324 00:19:35,640 --> 00:19:37,620 C paliek atkritumu vērtība, tā teikt - 325 00:19:37,620 --> 00:19:40,730 atkritumu, jo tas nekad nav bijis inicializēts ar kādu vērtību. 326 00:19:40,730 --> 00:19:45,520 Tātad šajā gadījumā, sscanf atgriež 1, jo es apdzīvots 1 no tiem norādes, 327 00:19:45,520 --> 00:19:50,190 tādā gadījumā lieliski, man ir int tāpēc es atbrīvotu līniju, lai atbrīvotu atmiņu 328 00:19:50,190 --> 00:19:54,000 ka GetString faktiski piešķirti, un tad es atgriezties n, 329 00:19:54,000 --> 00:19:58,500 cits, ja jums kādreiz prātoju, kur tas Atkārtot paziņojums nāk no, tas nāk tieši no šīs vietas. 330 00:19:58,500 --> 00:20:04,390 Tātad, ja, tieši pretēji, es rakstīt 123foo - tikai daži izlases secību teksta - 331 00:20:04,390 --> 00:20:08,490 sscanf gatavojas redzēt numurs, numurs, numurs, F, 332 00:20:08,490 --> 00:20:16,410 un tas gatavojas nodot 123 n; tas gatavojas nodot F C un pēc tam atgriezties 2. 333 00:20:16,410 --> 00:20:20,640 Tātad mums ir, tikai izmantojot pamata definīciju sscanf uzvedību, ļoti vienkāršs veids - 334 00:20:20,640 --> 00:20:23,900 labi, komplekss pēc pirmā acu uzmetiena, bet beigās, dienā diezgan vienkāršs mehānisms - 335 00:20:23,900 --> 00:20:28,320 gada sakot tur int un, ja tā, ka vienīgā lieta, ka es atklāju? 336 00:20:28,320 --> 00:20:29,860 Un atstarpes šeit ir apzināta. 337 00:20:29,860 --> 00:20:34,000 Ja jūs lasīt dokumentāciju sscanf, tā stāsta, ka, ja jūs iekļaut kādu tukšumiem 338 00:20:34,000 --> 00:20:38,810 sākumā vai beigās, sscanf arī ļaus lietotājam, lai kāda iemesla dēļ, 339 00:20:38,810 --> 00:20:41,860 hit kosmosa bar 123 un ka būs likumīgs. 340 00:20:41,860 --> 00:20:44,150 Jums nav bļaut lietotājam tikai tāpēc, ka tie skāra starpdevējs 341 00:20:44,150 --> 00:20:48,640 sākumā vai beigās, kas ir tikai nedaudz vairāk lietotājam draudzīgu. 342 00:20:48,640 --> 00:20:52,300 >> Jebkādi jautājumi, tad par GetInt? Yeah. >> [Students] Ko darīt, ja jūs vienkārši ievietot char? 343 00:20:52,300 --> 00:20:54,030 Labs jautājums. 344 00:20:54,030 --> 00:20:59,890 Ko darīt, ja jūs vienkārši ierakstījāt char piemēram F un hit Enter, nekad rakstīt 123? 345 00:20:59,890 --> 00:21:02,420 Ko jūs domājat par šo līniju kodu uzvedība tad ir? 346 00:21:02,420 --> 00:21:04,730 [Dzirdams studentu reaģēšanas] 347 00:21:04,730 --> 00:21:08,790 Yeah, tāpēc sscanf varētu aptvert, ka pārāk, jo šādā gadījumā, tas nav gatavojas aizpildīt n vai c. 348 00:21:08,790 --> 00:21:15,310 Tas notiek, lai tā vietā atgriezties 0, tādā gadījumā es esmu arī iepatikusies, ka scenārijs 349 00:21:15,310 --> 00:21:18,750 jo paredzamā vērtība es gribu ir 1. 350 00:21:18,750 --> 00:21:22,000 Es tikai gribu vienu un tikai viena lieta, kas jāaizpilda. Labs jautājums. 351 00:21:22,000 --> 00:21:24,290 >> Citi? Labi. 352 00:21:24,290 --> 00:21:26,250 >> Pieņemsim nav iet caur visu, kas šeit funkcijām, 353 00:21:26,250 --> 00:21:29,500 bet viens, kas, šķiet, ir varbūt par atlikušo interese ir GetString 354 00:21:29,500 --> 00:21:32,790 jo izrādās, ka GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 visi punt daudz to funkcionalitāti GetString. 356 00:21:36,260 --> 00:21:39,750 Tātad, pieņemsim to apskatīt, kā viņš tiek īstenota šeit. 357 00:21:39,750 --> 00:21:43,630 Tas viens izskatās mazliet sarežģīti, bet tas izmanto tos pašus pamatus 358 00:21:43,630 --> 00:21:45,670 ka mēs sākām runāt par pagājušajā nedēļā. 359 00:21:45,670 --> 00:21:49,490 Jo GetString, kas aizņem ne argumentu kā vienu tukšumu šeit 360 00:21:49,490 --> 00:21:53,730 un tas atgriež virkni, es acīmredzot esmu deklarējot virkni sauc buferis. 361 00:21:53,730 --> 00:21:56,270 Man nav īsti zināt, ko tas notiek, lai izmantot vēl, bet mēs redzēsim. 362 00:21:56,270 --> 00:21:58,390 Izskatās jauda ir par 0 noklusējuma. 363 00:21:58,390 --> 00:22:01,350 Ne gluži pārliecināts, kur tas notiek, nav pārliecināti, ko n gatavojas izmantot vēl, 364 00:22:01,350 --> 00:22:03,590 bet tagad tas kļūst nedaudz vairāk interesants. 365 00:22:03,590 --> 00:22:06,520 243 līniju, mēs paziņojam int, c. 366 00:22:06,520 --> 00:22:08,800 Tas ir sava veida stulba detaļām. 367 00:22:08,800 --> 00:22:15,820 Char ir 8 biti, un 8 biti var uzglabāt cik atšķirīgas vērtības? >> [Students] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problēma ir, ja jūs vēlaties, lai ir 256 dažādas ASCII rakstzīmes, kas ir 369 00:22:20,730 --> 00:22:23,340 ja jūs domājat atpakaļ - un tas nav kaut iegaumēt. 370 00:22:23,340 --> 00:22:25,710 Bet, ja jūs domājat atpakaļ uz šo lielo ASCII topā mums bija nedēļas atpakaļ, 371 00:22:25,710 --> 00:22:30,600 tur bija šajā gadījumā 128 vai 256 ASCII rakstzīmes. 372 00:22:30,600 --> 00:22:32,940 Mēs izmantojām visus modeļus 0s un 1s augšu. 373 00:22:32,940 --> 00:22:36,210 Tas ir problēma, ja jūs vēlaties, lai varētu konstatēt kļūdas 374 00:22:36,210 --> 00:22:40,190 jo, ja jūs esat jau izmanto 256 vērtības jūsu rakstzīmes, 375 00:22:40,190 --> 00:22:43,050 Jums nav īsti plānot uz priekšu, jo tagad jums nav veids, kā pateikt, 376 00:22:43,050 --> 00:22:46,270 tas nav legit raksturs, tas ir daži kļūdaina ziņa. 377 00:22:46,270 --> 00:22:50,270 Tātad, ko pasaule dara ir tie izmanto nākamo lielāko vērtību, kaut kas līdzīgs int, 378 00:22:50,270 --> 00:22:54,720 tāpēc, ka jums ir traks bitu skaitu, 32, lai 4000000000 iespējamām vērtībām 379 00:22:54,720 --> 00:22:58,860 lai jūs varat vienkārši galu galā, izmantojot būtībā 257 tiem, 380 00:22:58,860 --> 00:23:01,720 1 no kuriem ir kāda īpaša nozīme kā kļūda. 381 00:23:01,720 --> 00:23:03,120 >> Tātad, pieņemsim redzēt, kā tas darbojas. 382 00:23:03,120 --> 00:23:07,760 246 rindā, man ir šī lielā kamēr cilpa, kas zvana fgetc, 383 00:23:07,760 --> 00:23:11,090 f nozīmē failu, tāpēc getc, un tad stdin. 384 00:23:11,090 --> 00:23:15,520 Izrādās tas ir tikai precīzāk veids kā pateikt lasīt ievadi no klaviatūras. 385 00:23:15,520 --> 00:23:19,300 Standarta patēriņš ir klaviatūra, standarta produkcija ir ekrāns, 386 00:23:19,300 --> 00:23:23,310 un standarta kļūda, ko mēs redzam pset4, nozīmē, ka ekrāna 387 00:23:23,310 --> 00:23:27,490 bet īpašu daļu no ekrāna, lai tas nav nesaista ar faktisko produkciju 388 00:23:27,490 --> 00:23:30,750 kas jums paredzēta drukāt. Bet vairāk par to nākotnē. 389 00:23:30,750 --> 00:23:34,440 Tik fgetc nozīmē tikai izlasīt vienu rakstzīmi no klaviatūras un uzglabāt to, kur? 390 00:23:34,440 --> 00:23:37,350 Uzglabāt to c. 391 00:23:37,350 --> 00:23:41,360 Un pēc tam pārbaudiet - tāpēc es esmu tikai izmantojot dažus Būla saikļi šeit - 392 00:23:41,360 --> 00:23:46,000 pārbaudiet, vai tas nav vienāds - \ n, tāpēc lietotājs ir skārusi Enter, mēs vēlamies apstāties šajā punktā, 393 00:23:46,000 --> 00:23:49,850 beigām cilpu - un mēs arī vēlamies, lai pārbaudītu īpašo pastāvīgu EOF, 394 00:23:49,850 --> 00:23:53,610 kas, ja jūs zināt vai uzminēt, ko tas kandidēt? >> [Students] faila beigas. >> Faila beigas. 395 00:23:53,610 --> 00:23:56,560 Tas ir sava veida muļķīgi, jo, ja es esmu mašīnrakstīšanu pie klaviatūras, 396 00:23:56,560 --> 00:23:58,870 tur tiešām nav failu iesaistīts šajā, 397 00:23:58,870 --> 00:24:01,150 bet tas ir tikai sava veida vispārējs termins, ko izmanto, lai apzīmētu 398 00:24:01,150 --> 00:24:04,220 ka nekas cits nāk no cilvēka pirkstiem. 399 00:24:04,220 --> 00:24:06,460 EOF - faila beigas. 400 00:24:06,460 --> 00:24:09,920 Kā malā, ja jūs esat kādreiz hit Control D pie klaviatūras, nevis, ka jums būtu vēl - 401 00:24:09,920 --> 00:24:15,230 Jūs esat hit vadība C - Kontroles D sūta šis īpašais konstante sauc EOF. 402 00:24:15,230 --> 00:24:19,850 Tāpēc tagad mums vienkārši ir dažas dinamisku atmiņas sadalījumu. 403 00:24:19,850 --> 00:24:23,440 >> Tātad, ja (n + 1> tilpums). Tagad es jums paskaidrot n. 404 00:24:23,440 --> 00:24:26,100 N ir tikai cik daudz baitu pašlaik buferī, 405 00:24:26,100 --> 00:24:28,620 virkne, kas jūs pašlaik veidojot no lietotāja. 406 00:24:28,620 --> 00:24:33,450 Ja jums ir vairāk rakstzīmes jūsu bufera nekā jums ir spējas buferi, 407 00:24:33,450 --> 00:24:37,410 intuitīvi kas mums jādara, tad ir piešķirt vairāk jaudas. 408 00:24:37,410 --> 00:24:43,330 Tāpēc es esmu gatavojas iziet vairāk nekā daži no aritmētiskā šeit un koncentrēties tikai uz šo funkciju šeit. 409 00:24:43,330 --> 00:24:46,070 Jūs zināt, ko malloc ir vai vismaz parasti pazīstams. 410 00:24:46,070 --> 00:24:48,970 Veikt uzminēt ko realloc dara. >> [Students] Pievieno atmiņu. 411 00:24:48,970 --> 00:24:52,920 Tas nav gluži pievienojot atmiņas. Tas pārvieto atmiņu šādi. 412 00:24:52,920 --> 00:24:57,220 Ja tur vēl iespējams beigās virknes, lai dotu jums vairāk, ka atmiņas 413 00:24:57,220 --> 00:25:00,000 nekā tas sākotnēji dod jums, tad jūs saņemsiet, ka papildu atmiņu. 414 00:25:00,000 --> 00:25:03,460 Tātad jūs varat vienkārši turēt liekot virknes varoņi atpakaļ atpakaļ atpakaļ atpakaļ. 415 00:25:03,460 --> 00:25:05,830 Bet, ja tas nav gadījums, jo jūs gaidīja pārāk ilgi 416 00:25:05,830 --> 00:25:07,940 un kaut izlases ieguva plopped atmiņā tur 417 00:25:07,940 --> 00:25:10,290 bet tur ir papildu atmiņas šeit lejā, tas ir labi. 418 00:25:10,290 --> 00:25:13,100 Realloc gatavojas darīt visu smago celšanas jums, 419 00:25:13,100 --> 00:25:16,750 pārvietot string esat lasījuši līdz šim no šīs vietas, nodot to uz leju tur, 420 00:25:16,750 --> 00:25:19,460 un tad jums vēl nedaudz skrejceļu tajā brīdī. 421 00:25:19,460 --> 00:25:22,550 >> Tātad ar viļņa rokas, ļaujiet man teikt, ka tas, ko GetString dara 422 00:25:22,550 --> 00:25:26,330 ir tas sāk ar mazu buferi, varbūt viena varoņa, 423 00:25:26,330 --> 00:25:30,820 un ja lietotājs veidiem divām zīmēm, GetString beidzas līdz zvanot realloc un saka 424 00:25:30,820 --> 00:25:33,150 viena rakstzīme nebija pietiekami, man divas zīmes. 425 00:25:33,150 --> 00:25:35,950 Tad, ja jums izlasīt loģikas cilpas, tas gatavojas teikt 426 00:25:35,950 --> 00:25:39,600 lietotājs drukāti 3 rakstzīmes, dāvā man tagad nav 2, bet 4 rakstzīmes, 427 00:25:39,600 --> 00:25:42,320 tad dod man 8, tad dod man 16 un 32. 428 00:25:42,320 --> 00:25:45,000 Fakts, ka es esmu Apjoma divkāršošana katru reizi 429 00:25:45,000 --> 00:25:48,570 nozīmē, ka bufera nav gatavojas augt lēnām, tas notiek, lai augt super ātri. 430 00:25:48,570 --> 00:25:51,380 Un ko varētu būt priekšrocība, ka? 431 00:25:51,380 --> 00:25:54,600 Kāpēc man divkāršojot bufera 432 00:25:54,600 --> 00:25:58,020 pat ja lietotājs var vienkārši vajag vienu papildus rakstzīmi no klaviatūras? 433 00:25:58,020 --> 00:26:01,750 [Dzirdams studentu reaģēšanas] >> Kas tas ir? >> [Students] Jums nav augt to tik bieži. 434 00:26:01,750 --> 00:26:03,300 Tieši tā. Jums nav augt to tik bieži. 435 00:26:03,300 --> 00:26:05,510 Un tas ir tikai sava veida jūs hedžēšanas savas likmes šeit, 436 00:26:05,510 --> 00:26:10,850 Ideja ir, ka jūs nevēlaties, lai izsauktu realloc daudz, jo tā mēdz būt lēns. 437 00:26:10,850 --> 00:26:12,910 Jebkurā laikā jūs lūgt operētājsistēmu atmiņu, 438 00:26:12,910 --> 00:26:16,990 kā jūs ātri redzēt, kas nākotnē problēma kopumu, tai ir tendence ņemt kādu laiku. 439 00:26:16,990 --> 00:26:20,010 Tādējādi samazinot šo laiku, pat ja jūs izšķērdēt dažas vietas, 440 00:26:20,010 --> 00:26:21,900 mēdz būt laba lieta. 441 00:26:21,900 --> 00:26:24,060 >> Bet, ja mēs lasām cauri pēdējo daļu GetString šeit - 442 00:26:24,060 --> 00:26:27,950 un atkal izprast katru rindiņu šeit nav tik svarīgi šodien - 443 00:26:27,950 --> 00:26:30,530 pamanāt, ka tas beidzot aicina malloc atkārtoti 444 00:26:30,530 --> 00:26:33,880 un tā piešķir tieši tik baitos, jo tai ir par virkni 445 00:26:33,880 --> 00:26:38,060 un tad met prom zvanot bez maksas no pārmērīgi lielu buferi 446 00:26:38,060 --> 00:26:40,080 ja tas tiešām got dubultojās pārāk daudz reižu. 447 00:26:40,080 --> 00:26:42,730 Tātad īsumā, tas ir kā GetString ir strādājusi visu šo laiku. 448 00:26:42,730 --> 00:26:47,060 Visiem tas ir lasīt vienu rakstzīmi laikā atkal un atkal un atkal, 449 00:26:47,060 --> 00:26:50,750 un katru reizi, ir vajadzīgas dažas papildu atmiņu, tā lūdz operētājsistēmu par to 450 00:26:50,750 --> 00:26:53,670 zvanot realloc. 451 00:26:53,670 --> 00:26:57,890 >> Kādi jautājumi? Labi. 452 00:26:57,890 --> 00:26:59,270 >> Uzbrukums. 453 00:26:59,270 --> 00:27:04,060 Tagad, kad mēs saprotam norādes vai vismaz arvien iepazinušies ar norādes, 454 00:27:04,060 --> 00:27:06,700 pieņemsim apsvērt, kā visa pasaule sāk sabrukt 455 00:27:06,700 --> 00:27:10,030 ja jums nav gluži aizstāvēt pret sacīkstes lietotājiem, 456 00:27:10,030 --> 00:27:11,850 cilvēki, kas cenšas kapāt jūsu sistēmā, 457 00:27:11,850 --> 00:27:16,890 cilvēki, kas cenšas nozagt jūsu programmatūru, apejot kādu reģistrācijas kodu 458 00:27:16,890 --> 00:27:19,090 ka viņi citādi varētu būt rakstīt collas 459 00:27:19,090 --> 00:27:22,990 >> Veikt apskatīt šo piemēru šeit, kas ir tikai C kodu, kas ir funkcija galvenais apakšā 460 00:27:22,990 --> 00:27:26,380 kas izsauc funkciju foo. Un ko tas iet uz foo? 461 00:27:26,380 --> 00:27:29,680 [Students] viena arguments. >> [Malan] viena arguments. 462 00:27:29,680 --> 00:27:33,450 Tātad argv [1], kas nozīmē pirmais vārds, kas lietotājs drukāti pie komandrindas 463 00:27:33,450 --> 00:27:36,360 Pēc a.out vai kāds programmu sauc. 464 00:27:36,360 --> 00:27:41,680 Tātad foo augšā veic, char *. Bet char * ir tieši tas, ko? >> [Students] virkne. 465 00:27:41,680 --> 00:27:43,350 [Malan] stīgu, tāpēc tur nekas jauns šeit. 466 00:27:43,350 --> 00:27:45,420 Ka virkne ir patvaļīgi tiek saukta bārs. 467 00:27:45,420 --> 00:27:51,430 Šajā rindā šeit, char c [12]; jo veida daļēji tehniskās angļu, kas ir šī līnija dara? 468 00:27:51,430 --> 00:27:55,220 [Students] masīvs - >> Array? >> [Students] Blondīne. >> Blondīne. 469 00:27:55,220 --> 00:27:58,870 Dodiet man masīvu 12 rakstzīmes. Lai mēs varētu nosaukt šo buferi. 470 00:27:58,870 --> 00:28:02,920 Tas ir tehniski sauc c, bet programmēšanas buferis tikai nozīmē ķekars vietas 471 00:28:02,920 --> 00:28:04,800 kas jums var likt dažus stuff iekšā 472 00:28:04,800 --> 00:28:07,940 Tad visbeidzot, memcpy mēs esam nav izmantota, bet jūs varat droši uzminēt, ko tā dara. 473 00:28:07,940 --> 00:28:10,480 Tā kopijas atmiņu. Ko tas dod? 474 00:28:10,480 --> 00:28:19,270 Tas acīmredzot kopē bārs, tās ieejas, uz C bet tikai līdz garumu joslas. 475 00:28:19,270 --> 00:28:24,930 Bet tur ir kļūda šeit. >> [Students] Jums nepieciešams sizeof raksturs. >> Labi. 476 00:28:24,930 --> 00:28:30,860 Tehniski mēs patiešām vajadzētu darīt, strlen (bar) * sizeof (char)). Tas ir pareizi. 477 00:28:30,860 --> 00:28:33,930 Bet sliktākajā gadījumā šeit, pieņemsim, ka That - 478 00:28:33,930 --> 00:28:35,950 Labi. Tad tur ir divi kļūdas. 479 00:28:35,950 --> 00:28:39,160 Tātad sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Veidosim šo mazliet plašāks. 481 00:28:41,290 --> 00:28:44,910 Tāpēc tagad tur ir vēl kļūda, kas ir tas, ko? >> [Dzirdams studentu reaģēšanas] 482 00:28:44,910 --> 00:28:46,990 Pārbaudiet par ko? >> [Students] Pārbaudīt NULL. 483 00:28:46,990 --> 00:28:50,270 Mums parasti būtu pārbaudot NULL jo sliktas lietas notiek 484 00:28:50,270 --> 00:28:53,200 ja jūsu rādītājs ir NULL, jo jūs varētu galu galā iet tur, 485 00:28:53,200 --> 00:28:57,630 un jums nav kādreiz ir iet uz NULL ar dereferencing to ar zvaigzni operatoru. 486 00:28:57,630 --> 00:29:01,050 Tātad tas ir labs. Un ko vēl mēs darām? Loģiski, tur plaisāt arī šeit. 487 00:29:01,050 --> 00:29:04,450 [Students] Pārbaudiet argc ir> = līdz 2. 488 00:29:04,450 --> 00:29:10,550 Lai pārbaudītu, vai argc ir> = 2. Labi, tā tur ir trīs kļūdas šajā programmā šeit. 489 00:29:10,550 --> 00:29:16,630 Mēs tagad pārbaudītu, ja lietotājs faktiski drukāti jebko ARGV [1]. Labi. 490 00:29:16,630 --> 00:29:20,950 Tātad, kāda ir trešā kļūda? Yeah. >> [Students] C var nebūt pietiekami lielas. 491 00:29:20,950 --> 00:29:23,320 Labi. Mēs pārbauda vienu scenāriju. 492 00:29:23,320 --> 00:29:29,520 Mēs netieši jāpārbauda nav kopēt vairāk atmiņas, nekā tas būtu ilgāks par bāru. 493 00:29:29,520 --> 00:29:32,510 Tātad, ja virkne lietotājs drukāti ir 10 rakstzīmes garš, 494 00:29:32,510 --> 00:29:36,020 tas ir saprotams tikai kopēt 10 rakstzīmes. Un tas ir labi. 495 00:29:36,020 --> 00:29:39,940 Bet ko tad, ja lietotājs drukāti vārdu uzvednē kā 20 rakstzīmju vārdu? 496 00:29:39,940 --> 00:29:44,900 Tas ir saprotams kopiju 20 rakstzīmes no bāra uz ko? 497 00:29:44,900 --> 00:29:49,750 C, citādi zināma kā mūsu buferis, kas nozīmē, ka jūs tikko rakstīja datus 498 00:29:49,750 --> 00:29:52,540 līdz 8 baitu vietām, kas jums nepieder, 499 00:29:52,540 --> 00:29:54,870 un jums nepieder viņiem tādā nozīmē, ka jūs nekad piešķirtā tos. 500 00:29:54,870 --> 00:30:00,370 Tātad tas ir tas, ko parasti sauc par bufera pārpildes uzbrukumu vai bufera pārtēriņš uzbrukumu. 501 00:30:00,370 --> 00:30:05,580 Un tas ir uzbrukums, kas nozīmē, ka, ja lietotājs vai programma, kas zvana savu funkciju 502 00:30:05,580 --> 00:30:10,490 to dara ļaunprātīgi, kas patiesībā notiek tālāk faktiski varēja būt diezgan slikti. 503 00:30:10,490 --> 00:30:12,450 >> Tāpēc pieņemsim to apskatīt šajā attēlā šeit. 504 00:30:12,450 --> 00:30:16,060 Šis attēls atspoguļo jūsu kaudze atmiņas. 505 00:30:16,060 --> 00:30:19,580 Atgādina, ka katru reizi, kad jūs zvanu funkciju jums šo maz rāmi kaudze 506 00:30:19,580 --> 00:30:21,520 un tad vēl un tad vēl un vēl. 507 00:30:21,520 --> 00:30:24,300 Un līdz šim, mēs esam tikai veida iegūtā šiem, kā taisnstūru 508 00:30:24,300 --> 00:30:26,290 nu uz klāja vai uz ekrāna šeit. 509 00:30:26,290 --> 00:30:30,580 Bet, ja mēs tuvinātu par vienu no šiem taisnstūriem, kad jūs izsauktu funkciju foo, 510 00:30:30,580 --> 00:30:35,880 izrādās, ka tur ir vairāk uz skursteņa iekšpusē ka rāmis šajā taisnstūrī 511 00:30:35,880 --> 00:30:40,060 nekā tikai x un y un a un b, tāpat mēs to runājam swap. 512 00:30:40,060 --> 00:30:44,410 Izrādās, ka tur ir daži zemāka līmeņa detaļas, starp tiem atpakaļadresi. 513 00:30:44,410 --> 00:30:49,550 Tātad izrādās, kad galvenais aicina foo, galvenais ir, lai informētu foo 514 00:30:49,550 --> 00:30:53,520 Kādi ir galvenie adrese ir datora atmiņā 515 00:30:53,520 --> 00:30:57,770 jo citādi, tiklīdz foo tiek darīts izpildes, kā šajā gadījumā šeit, 516 00:30:57,770 --> 00:31:00,830 kad jūs sasniedzat šo slēgto cirtaini lencēm beigās foo, 517 00:31:00,830 --> 00:31:05,310 kā heck tas foo zina, kur programmas kontroli vajadzēja doties? 518 00:31:05,310 --> 00:31:08,970 Izrādās, ka atbilde uz šo jautājumu ir šajā sarkanā taisnstūrī šeit. 519 00:31:08,970 --> 00:31:12,670 Tas ir rādītājs, un tas ir līdz ar datoru, lai īslaicīgi 520 00:31:12,670 --> 00:31:17,030 par tā saukto skursteņus no galvenā adresi, lai, tiklīdz foo tiek darīts izpildes, 521 00:31:17,030 --> 00:31:21,120 dators zina, kur un kādi līnija galvenais, lai dotos atpakaļ uz. 522 00:31:21,120 --> 00:31:23,940 Saglabāts Rāmis rādītājs attiecas līdzīgi šim. 523 00:31:23,940 --> 00:31:26,310 Char * bar šeit pārstāv, ko? 524 00:31:26,310 --> 00:31:31,350 Tagad šis zilais segments šeit ir Foo ir rāmis. Kas ir bārs? 525 00:31:31,570 --> 00:31:35,010 Josla ir tikai arguments foo funkciju. 526 00:31:35,010 --> 00:31:37,500 Tāpēc tagad mēs esam atpakaļ pie sava veida pazīstamo attēla. 527 00:31:37,500 --> 00:31:39,850 Tur ir vairāk stuff un vairāk traucējošos uz ekrāna, 528 00:31:39,850 --> 00:31:43,380 bet tas gaiši zils segments tieši ir tas, ko mēs esam balstoties uz tāfeles 529 00:31:43,380 --> 00:31:45,790 kaut ko līdzīgu swap. Tas ir rāmis foo. 530 00:31:45,790 --> 00:31:51,490 Un vienīgais, kas to jau tagad ir bārs, kas ir šis parametrs. 531 00:31:51,490 --> 00:31:55,220 Bet kas vēl būtu kaudze saskaņā ar šo kodu šeit? 532 00:31:55,220 --> 00:31:57,760 [Students] CHAR c [12]. >> [Malan] CHAR c [12]. 533 00:31:57,760 --> 00:32:02,810 Mums vajadzētu arī redzēt 12 no atmiņas kvadrātu piešķirtos mainīgo sauc c, 534 00:32:02,810 --> 00:32:04,970 un tiešām mums ir kas uz ekrāna. 535 00:32:04,970 --> 00:32:08,480 Ļoti top tur ir c [0], un tad autors šajā diagrammā 536 00:32:08,480 --> 00:32:11,850 nav apnikt zīmēšanas visi laukumi, bet tur tiešām ir 12 tur 537 00:32:11,850 --> 00:32:16,590 jo, ja paskatās labajā apakšējā, c [11], ja jūs rēķināties no 0 ir 12 šāda baitu. 538 00:32:16,590 --> 00:32:18,400 Bet šeit ir problēma. 539 00:32:18,400 --> 00:32:22,390 Kurā virzienā ir c aug? 540 00:32:22,390 --> 00:32:27,080 Kārtot augšas uz leju, ja tā sākas augšā un aug uz leju. 541 00:32:27,080 --> 00:32:30,110 Tas nav izskatās mēs atstājām sev daudz skrejceļa šeit vispār. 542 00:32:30,110 --> 00:32:32,090 Mēs esam veida krāsotas sevi stūrī, 543 00:32:32,090 --> 00:32:36,940 un ka c [11], ir tiesības uz augšu pret bāru, kas ir tiesības uz augšu pret Saglabātās Frame rādītājs, 544 00:32:36,940 --> 00:32:39,960 kas ir tiesības uz augšu pret atpakaļadresi. Tur ir ne vairāk istabu. 545 00:32:39,960 --> 00:32:42,810 Tātad, kāda ir saistība tad, ja jūs skrūvējamu augšu 546 00:32:42,810 --> 00:32:46,500 un jūs mēģināt lasījums 20 baiti uz 12 baitu buferī? 547 00:32:46,500 --> 00:32:50,060 Kur ir šie 8 papildu baiti gatavojas doties? >> [Students] Inside - 548 00:32:50,060 --> 00:32:53,200 Iekšā viss pārējais, no kuriem daži ir super svarīgi. 549 00:32:53,200 --> 00:32:57,260 Un pats svarīgākais, iespējams, ir sarkans lodziņš tur, atpakaļadresi, 550 00:32:57,260 --> 00:33:03,560 jo pieņemsim, ka jūs vai nu nejauši vai adversarially pārrakstīt šos 4 baiti, 551 00:33:03,560 --> 00:33:07,260 ka rādītājs adrese, ne tikai ar atkritumu, bet ar vairākiem 552 00:33:07,260 --> 00:33:09,810 kas notiek, lai pārstāvētu faktisko adresi atmiņā. 553 00:33:09,810 --> 00:33:13,880 Kas Ietekme, loģiski? >> [Students] funkcija gatavojas atgriezties uz citu vietu. 554 00:33:13,880 --> 00:33:15,250 Tieši tā. 555 00:33:15,250 --> 00:33:19,170 Kad foo atgriežas un hits, ka cirtaini lencēm, programma ir gatavojas turpināt 556 00:33:19,170 --> 00:33:25,060 neatgriezties galveno, tas notiek, lai atgrieztos kāds adrese ir šajā sarkanajā lodziņā. 557 00:33:25,060 --> 00:33:28,600 >> Attiecībā uz apiet programmatūras reģistrācijas, 558 00:33:28,600 --> 00:33:32,260 Ko darīt, ja adrese, kas ir atdoti to ir funkcija, kas parasti izpaužas sauc 559 00:33:32,260 --> 00:33:35,690 Pēc tam, kad esat samaksājis par programmatūru un ievadījis savu reģistrācijas kodu? 560 00:33:35,690 --> 00:33:39,870 Jūs varat kārtot triks datora vērā nevis iet šeit, bet gan iet uz augšu šeit. 561 00:33:39,870 --> 00:33:45,100 Vai, ja jūs patiešām gudrs, pretinieks var reāli ierakstīt pie klaviatūras, piemēram, 562 00:33:45,100 --> 00:33:50,690 nav faktisko vārdu, nevis 20 rakstzīmes, bet pieņemsim, ka viņš vai viņa tiešām veidi 563 00:33:50,690 --> 00:33:52,770 daži simboli, kas pārstāv kodu. 564 00:33:52,770 --> 00:33:55,320 Un tas nav būs C kodu, tas faktiski būs rakstzīmes 565 00:33:55,320 --> 00:33:59,290 kas pārstāv bināro mašīnu kodu, 0s un 1s. 566 00:33:59,290 --> 00:34:01,290 Bet pieņemsim, ka viņi pietiekami gudri, lai to izdarītu, 567 00:34:01,290 --> 00:34:06,500 kaut kā ielīmēt GetString ātri kaut kas būtībā apkopo kodu, 568 00:34:06,500 --> 00:34:09,980 un pēdējie 4 baiti pārrakstīt šo atpakaļadresi. 569 00:34:09,980 --> 00:34:13,360 Un ko adrešu tas, ka ieejas darīt? 570 00:34:13,360 --> 00:34:18,630 Tas faktiski uzglabā šajā sarkanā taisnstūrī adrese pirmās baitu buferī. 571 00:34:18,630 --> 00:34:23,070 Tātad jums ir jābūt ļoti gudrs, un tas ir daudz izmēģinājumu un kļūdu uz sliktiem cilvēkiem, kas tur, 572 00:34:23,070 --> 00:34:25,639 bet, ja jūs varat izdomāt, cik liels šis buferis 573 00:34:25,639 --> 00:34:28,820 piemēram, ka pēdējo baitu ieejas jūs nodrošināt ar programmu 574 00:34:28,820 --> 00:34:33,540 gadās būt līdzvērtīgs uz adresi sākumā jūsu bufera, jūs varat izdarīt. 575 00:34:33,540 --> 00:34:39,320 Ja mēs teiksim normāli sveiki un \ 0, ka tas, ko nonāk buferī. 576 00:34:39,320 --> 00:34:44,420 Bet, ja mēs vairāk gudrs un mums aizpildīt šo buferi ar ko mēs vispārīgi saucam uzbrukuma kods - 577 00:34:44,420 --> 00:34:48,860 AAA, uzbrukums, uzbrukums, uzbrukums - ja tas ir tikai kaut kas dara kaut ko sliktu, 578 00:34:48,860 --> 00:34:51,820 kas notiek, ja jūs patiešām gudrs, jūs varētu darīt. 579 00:34:51,820 --> 00:34:58,610 Ar sarkano kastē šeit ir skaitļu secība - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Ievērojiet, ka saskan ar skaitu, kas ir šeit. 581 00:35:01,610 --> 00:35:04,430 Tas ir apgrieztā secībā, bet vairāk par šo citā laikā. 582 00:35:04,430 --> 00:35:08,140 Ievērojiet, ka šī atgriešanās adrese ir apzināti mainīts 583 00:35:08,140 --> 00:35:12,020 vienāda adresi šeit, nevis adrese galvenais. 584 00:35:12,020 --> 00:35:17,500 Tātad, ja slikts puisis ir super gudrs, viņš vai viņa gatavojas iekļaut šajā uzbrukuma kods 585 00:35:17,500 --> 00:35:20,930 kaut kā izdzēst visus lietotāja failus vai kopēt paroles 586 00:35:20,930 --> 00:35:24,680 vai izveidotu lietotāja kontu, es pēc tam var pieteikties - neko. 587 00:35:24,680 --> 00:35:26,950 >> Un tas ir gan briesmas un C. jauda 588 00:35:26,950 --> 00:35:29,840 Jo jums ir piekļuve atmiņas pa šautru 589 00:35:29,840 --> 00:35:32,520 un jūs varat tāpēc rakstīt kaut ko vēlaties uz datora atmiņā, 590 00:35:32,520 --> 00:35:35,080 Jūs varat veikt dators darīt kaut ko vēlaties 591 00:35:35,080 --> 00:35:39,550 vienkārši kam tas lēkā savā atmiņu. 592 00:35:39,550 --> 00:35:44,650 Un tā līdz pat šai dienai tik daudz programmas un tik daudz portālu, kas ir apdraudēti 593 00:35:44,650 --> 00:35:46,200 vāra uz leju, lai cilvēki, kas izmanto šo. 594 00:35:46,200 --> 00:35:50,760 Un tas varētu šķist super sarežģītu uzbrukumu, taču tas ne vienmēr sākas ka veidā. 595 00:35:50,760 --> 00:35:53,560 Realitāte ir tāda, ka to, ko slikti cilvēki parasti darīt, ir, 596 00:35:53,560 --> 00:35:58,200 vai tas ir pie komandrindas programma vai GUI programmu vai mājas lapā, 597 00:35:58,200 --> 00:35:59,940 jūs vienkārši sākt sniegt muļķības. 598 00:35:59,940 --> 00:36:03,980 Rakstot tiešām liels vārdu, meklēšanas laukā un nospiediet Enter, 599 00:36:03,980 --> 00:36:05,780 un jūs gaidīt, lai redzētu, vai tīmekļa vietne avarē 600 00:36:05,780 --> 00:36:09,990 vai jūs gaidīt, lai redzētu, vai programma izpaužas dažas kļūdas paziņojumu 601 00:36:09,990 --> 00:36:14,330 jo, ja jums paveiksies kā slikts puisis, un jūs sniegt dažas traks ievadi 602 00:36:14,330 --> 00:36:18,980 ka avārijās programmu, kas nozīmē, ka programmētājs nav paredzēt savu slikto uzvedību, 603 00:36:18,980 --> 00:36:23,630 kas nozīmē, ka jūs varat, iespējams ar pietiekami pūles, pietiekami daudz izmēģinājumu un kļūdu, 604 00:36:23,630 --> 00:36:26,650 izdomāt, kā algu precīzāku uzbrukumu. 605 00:36:26,650 --> 00:36:31,410 Tik tik daudz drošības daļa ir ne tikai izvairīties no šiem uzbrukumiem vispār 606 00:36:31,410 --> 00:36:34,100 bet atklājot tos un reāli meklē baļķiem 607 00:36:34,100 --> 00:36:36,780 un redzēt to, ko trakie izejvielas ir cilvēki drukāti savā mājas lapā, 608 00:36:36,780 --> 00:36:38,960 ko meklēt termini cilvēkus drukāti savā mājas lapā 609 00:36:38,960 --> 00:36:42,870 cer pārpildīta kādu buferi. 610 00:36:42,870 --> 00:36:45,500 Un tas viss aprobežojas ar vienkāršu pamati Kas masīvs 611 00:36:45,500 --> 00:36:49,080 un ko tas nozīmē, lai sadalītu un izmantot atmiņu. 612 00:36:49,080 --> 00:36:51,710 >> Saistīta ar to, tad arī tas ir. 613 00:36:51,710 --> 00:36:54,280 Pieņemsim tikai skatienu iekšpusē cieto disku vēlreiz. 614 00:36:54,280 --> 00:36:58,440 Jūs atceraties no nedēļas vai divām pirms, ka, ja jūs vilkt failus uz jūsu atkritni vai trash var, 615 00:36:58,440 --> 00:37:03,710 kas notiek? >> [Students] Nekas. >> Pilnīgi nekas, vai ne? 616 00:37:03,710 --> 00:37:05,740 Galu galā, ja jūs vadāt zemu diska vietas, 617 00:37:05,740 --> 00:37:08,190 Windows vai Mac OS sāks izdzēšot failus jums. 618 00:37:08,190 --> 00:37:10,390 Bet, ja jūs vilkt kaut ko tur, ka nav vispār droši. 619 00:37:10,390 --> 00:37:13,800 Visas jūsu istabas biedrs vai draugs vai ģimenes loceklis, ir jādara, ir divreiz uzklikšķiniet un voila, 620 00:37:13,800 --> 00:37:16,310 tur visi fragmentārie failus, mēģināja izdzēst. 621 00:37:16,310 --> 00:37:19,590 Lielākā daļa no mums ir vismaz zināt, ka jums ir tiesības noklikšķiniet vai Control klikšķi 622 00:37:19,590 --> 00:37:22,310 un tukšs trash vai kaut kas tamlīdzīgs. 623 00:37:22,310 --> 00:37:25,000 Bet pat tad, ka nav gluži darīt to triks 624 00:37:25,000 --> 00:37:28,010 jo kas notiek, ja jums ir fails uz cietā diska 625 00:37:28,010 --> 00:37:32,770 kas pārstāv kādu Word dokumentu vai kādu JPEG, un tas atspoguļo jūsu cietā diska, 626 00:37:32,770 --> 00:37:35,350 un pieņemsim, ka tas skaida šeit ir, ka fails, 627 00:37:35,350 --> 00:37:38,390 un tas sastāv no visu ķekars 0s un 1s. 628 00:37:38,390 --> 00:37:42,470 Kas notiek, ja jūs ne tikai vilkt šo failu uz miskasti var vai atkritni 629 00:37:42,470 --> 00:37:48,020 bet arī iztukšojiet to? Kārtot neko. 630 00:37:48,020 --> 00:37:49,640 Tas nav absolūti nekas tagad. 631 00:37:49,640 --> 00:37:54,290 Tagad tas ir tikai nekas, jo nedaudz kaut kas notiek veidā šīs tabulas. 632 00:37:54,290 --> 00:37:58,370 Tātad tur ir dažas no datubāzes vai galda veida iekšpusē datora atmiņā 633 00:37:58,370 --> 00:38:03,850 ka būtībā ir viens failiem kolonnu vārdiem un viena kolonna faili "vietā, 634 00:38:03,850 --> 00:38:07,720 kur tas varētu būt vieta 123, tikai izlases numuru. 635 00:38:07,720 --> 00:38:14,560 Lai mēs varētu būt kaut kas līdzīgs x.jpeg un atrašanās 123. 636 00:38:14,560 --> 00:38:18,800 Kas notiek tad, kad jūs faktiski iztukšot miskasti? 637 00:38:18,800 --> 00:38:20,330 Kas iet prom. 638 00:38:20,330 --> 00:38:23,610 Bet ko nav iet prom ir 0s un 1s. 639 00:38:23,610 --> 00:38:26,270 >> Tātad, kāda ir tad savienojums ar pset4? 640 00:38:26,270 --> 00:38:31,240 Nu, ar pset4, tikai tāpēc, ka mēs esam nejauši izdzēš kompakto flash karti 641 00:38:31,240 --> 00:38:35,750 ka bija visas šīs fotogrāfijas vai vienkārši tāpēc, ka tas, ko neveiksmes kļuva bojāti 642 00:38:35,750 --> 00:38:38,000 nenozīmē, ka 0s un 1s nav joprojām. 643 00:38:38,000 --> 00:38:40,410 Varbūt daži no viņiem tiek zaudēti, jo kaut got bojāti 644 00:38:40,410 --> 00:38:43,320 tādā ziņā, ka daži 0s kļuva 1s un 1s kļuva 0s. 645 00:38:43,320 --> 00:38:47,240 Sliktas lietas var notikt, jo buggy programmatūru vai bojātu aparatūru. 646 00:38:47,240 --> 00:38:50,370 Bet daudzi no tiem bitiem, varbūt pat 100% no tiem, ir joprojām. 647 00:38:50,370 --> 00:38:55,050 Tas ir tikai, ka dators vai kamera nezina, kur JPEG1 sākās 648 00:38:55,050 --> 00:38:56,910 un kur JPEG2 sākusies. 649 00:38:56,910 --> 00:39:01,070 Bet, ja jūs, programmētājs, zināt, ar mazliet savvy ja šie JPEG ir 650 00:39:01,070 --> 00:39:06,010 vai ko viņi izskatās, lai jūs varētu analizēt 0s un 1s un teikt JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 Jūs varat uzrakstīt programmu ar būtībā tikai par vai kamēr cilpa 652 00:39:09,440 --> 00:39:12,820 kas atgūst katru no šiem failiem. 653 00:39:12,820 --> 00:39:16,030 Tātad mācība, tad ir jāsāk droši dzēšana failus 654 00:39:16,030 --> 00:39:18,340 ja jūs vēlaties, lai izvairītos no šīs pavisam. Jā. 655 00:39:18,340 --> 00:39:21,010 >> [Students] Kā nāk tā saka savā datorā 656 00:39:21,010 --> 00:39:23,550 ka jums ir vairāk atmiņas nekā jūs agrāk? 657 00:39:23,550 --> 00:39:27,820 Ir vairāk atmiņas nekā jūs agrāk - >> [students] vairāk pieejamā atmiņa. 658 00:39:27,820 --> 00:39:29,630 Oh. Labs jautājums. 659 00:39:29,630 --> 00:39:32,360 Tātad, kāpēc tad pēc iztukšošanas miskasti Vai jūsu dators jums pateikt 660 00:39:32,360 --> 00:39:34,910 ka jums ir vairāk brīvas vietas nekā jūs agrāk? 661 00:39:34,910 --> 00:39:36,770 Īsumā, jo tas guļ. 662 00:39:36,770 --> 00:39:40,740 Vairāk tehniski, jums ir vairāk vietas, jo tagad jūs teicāt 663 00:39:40,740 --> 00:39:43,680 Jūs varat nodot citas lietas, kur tas fails reiz bija. 664 00:39:43,680 --> 00:39:45,450 Bet tas nenozīmē, ka biti dodas prom, 665 00:39:45,450 --> 00:39:48,590 un tas nenozīmē, ka biti tiek mainīts uz visiem 0S, piemēram, 666 00:39:48,590 --> 00:39:50,150 jūsu aizsardzību. 667 00:39:50,150 --> 00:39:54,640 Tātad gluži pretēji, ja jūs droši dzēst failus vai fiziski iznīcināt ierīci, 668 00:39:54,640 --> 00:39:57,300 kas patiešām ir vienīgais veids, reizēm ap to. 669 00:39:57,300 --> 00:40:02,020 >> Tātad, kāpēc nav mēs atstāt šajā daļēji biedējošu piezīmi, un mēs redzēt jūs pirmdien. 670 00:40:02,020 --> 00:40:07,000 [Aplausi] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]