1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Linggo 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [Ito ay CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> CS50, Linggo 5. 5 00:00:09,740 --> 00:00:12,900 Ngayon at sa linggong ito, ipakilala namin ng kaunti ng mundo ng mga forensics 6 00:00:12,900 --> 00:00:14,850 sa konteksto ng Problema Itakda 4. 7 00:00:14,850 --> 00:00:18,480 Ngayon ay isang dinaglat na panayam dahil may isang espesyal na kaganapan sa dito pagkatapos. 8 00:00:18,480 --> 00:00:21,940 Kaya makikita namin tumagal ng isang silip at manunudyo ang parehong mga mag-aaral at mga magulang magkamukha ngayon 9 00:00:21,940 --> 00:00:24,600 na may ilang ng mga bagay na sa abot-tanaw. 10 00:00:24,600 --> 00:00:29,050 >> Kasama ng mga ito, bilang ng Lunes, mayroon ka ng ilang higit pang mga kaklase. 11 00:00:29,050 --> 00:00:32,980 edX, Harvard at MIT bagong online na hakbangin para OpenCourseWare at higit pa, 12 00:00:32,980 --> 00:00:36,730 ay paglunsad sa Harvard ng campus sa Lunes, na nangangahulugan ay Lunes 13 00:00:36,730 --> 00:00:40,930 mayroon ka, bilang ng huling count, 86,000 karagdagang mga kaklase 14 00:00:40,930 --> 00:00:43,680 na ay sumusunod na kasama CS50 aralin at mga seksyon 15 00:00:43,680 --> 00:00:45,890 at walkthroughs at problema set. 16 00:00:45,890 --> 00:00:51,870 At bilang bahagi ng, ikaw ay maging miyembro ng pampasinaya klase ng CS50 at ngayon CS50x. 17 00:00:51,870 --> 00:00:56,150 Bilang bahagi ng ngayon, mapagtanto na magkakaroon ilang mga upsides bilang. 18 00:00:56,150 --> 00:01:00,620 Upang makakuha ng handa para sa, para sa napakalaking bilang ng mga mag-aaral, 19 00:01:00,620 --> 00:01:03,820 sumapat ito sa sabihin na kahit na mayroon kaming 108 TFs at Cas, 20 00:01:03,820 --> 00:01:07,560 ito ay hindi pa ang pinakamahusay na mag-aaral-guro ratio sa sandaling namin pindutin 80,000 ng ang mag-aaral. 21 00:01:07,560 --> 00:01:09,830 Hindi namin na grading maraming problema nagtatakda nang manu-mano, 22 00:01:09,830 --> 00:01:13,050 kaya ipinakilala linggo na ito sa hanay ng problema ay CS50 Check, 23 00:01:13,050 --> 00:01:15,410 na pagpunta sa isang command-line utility sa loob ng appliance 24 00:01:15,410 --> 00:01:17,880 na makakakuha ka ng isang beses mong i-update ang mga ito sa ibang pagkakataon ito weekend. 25 00:01:17,880 --> 00:01:21,030 Magagawa mong upang magpatakbo ng isang command, check50, sa iyong sariling pset, 26 00:01:21,030 --> 00:01:24,770 at makakakuha ka ng instant na feedback bilang sa kung ang iyong programa ay tama o maling 27 00:01:24,770 --> 00:01:27,980 ayon sa iba't-ibang mga pagtutukoy ng disenyo na ibinigay namin. 28 00:01:27,980 --> 00:01:30,310 Higit pa sa na sa detalye ng hanay ng problema. 29 00:01:30,310 --> 00:01:34,220 Ang mga CS50x kaklase ay gumagamit na ito pati na rin. 30 00:01:34,220 --> 00:01:36,170 >> Problema Set 4 ay tungkol sa forensics, 31 00:01:36,170 --> 00:01:38,630 at ang pset ito ay talagang inspirasyon sa pamamagitan ng ilang mga real-buhay na mga bagay-bagay 32 00:01:38,630 --> 00:01:41,210 kung saan kapag ako ay sa graduate paaralan interned ko para sa isang sandali 33 00:01:41,210 --> 00:01:45,270 sa District Attorney opisina Middlesex County ng paggawa ng forensic trabaho 34 00:01:45,270 --> 00:01:47,660 sa kanilang mga lead na forensic imbestigador. 35 00:01:47,660 --> 00:01:50,280 Ano ito amounted sa, sa tingin ko nabanggit ko ng ilang linggo nakaraan, 36 00:01:50,280 --> 00:01:52,720 ay ang Mass Pulisya ng Estado o iba ay darating sa, 37 00:01:52,720 --> 00:01:56,150 sila drop off ang mga bagay tulad ng mga na hard drive at CD at tumbahin disk at ang mga tulad ng, 38 00:01:56,150 --> 00:01:58,770 at pagkatapos ay ang layunin ng opisina ng mga forensics ay upang alamin 39 00:01:58,770 --> 00:02:01,470 kung nagkaroon o ay hindi katibayan ng uri. 40 00:02:01,470 --> 00:02:04,730 Ito sa Espesyal na Yunit ng Pagsisiyasat, kaya ito ay pantanggapan krimen. 41 00:02:04,730 --> 00:02:10,949 Ito ay mas troubling uri ng mga krimen, ang anumang bagay na kinasasangkutan ng ilang mga uri ng mga digital na media. 42 00:02:10,949 --> 00:02:16,450 Ito lumiliko out na hindi na ang maraming tao ay sumulat ng isang email na nagsasabi, "ginawa ko ito." 43 00:02:16,450 --> 00:02:20,490 Kaya medyo madalas, ang mga forensic paghahanap ay hindi i-lahat na magkano prutas, 44 00:02:20,490 --> 00:02:22,820 ngunit kung minsan mga tao ay sumulat ng mga naturang email. 45 00:02:22,820 --> 00:02:25,240 Kaya minsan, ang mga pagsusumikap ay gagantimpalaan. 46 00:02:25,240 --> 00:02:31,210 >> Ngunit sa humantong forensic pset na ito, makikita namin nagpapakilala sa pset4 bit ng graphics. 47 00:02:31,210 --> 00:02:35,410 Maaaring tumagal ng mga bagay na ito para sa nabigyan ng - mga JPEG, GIF, at tulad ng - mga araw na ito. 48 00:02:35,410 --> 00:02:38,320 Ngunit kung sa tingin mo talagang tungkol dito, isang imahe, tulad ng mukha ng Rob, 49 00:02:38,320 --> 00:02:41,270 ma-modelo bilang isang pagkakasunud-sunod ng mga tuldok o pixels. 50 00:02:41,270 --> 00:02:43,380 Sa kaso ng Rob sa mukha, may lahat ng mga uri ng mga kulay, 51 00:02:43,380 --> 00:02:46,760 at nagsimula kaming upang makita ang mga indibidwal na tuldok, na kilala bilang pixel, 52 00:02:46,760 --> 00:02:48,610 sabay-sabay na sinimulan namin upang mag-zoom in. 53 00:02:48,610 --> 00:02:54,660 Ngunit kung pasimplehin namin ang mundo ng kaunti at lamang sabihin na ito dito ay Rob sa black and white, 54 00:02:54,660 --> 00:02:57,490 upang kumatawan sa itim at puti, maaari naming gamitin na lamang ang binary. 55 00:02:57,490 --> 00:03:01,660 At kung kami ay pagpunta sa gamitin ang binary, 1 o 0, maaari naming ipahayag ang parehong imahe 56 00:03:01,660 --> 00:03:06,140 ng nakangiting mukha Rob ang pattern na ito ng bits. 57 00:03:06,140 --> 00:03:12,100 11000011 kumakatawan puti, puti, itim, itim, itim, itim, puti, puti. 58 00:03:12,100 --> 00:03:16,150 At kaya ito ay hindi isang malaking hakbang pagkatapos ay upang simulan ang pakikipag-usap tungkol sa makulay na litrato, 59 00:03:16,150 --> 00:03:18,600 mga bagay na nais mong makita sa Facebook o sa isang digital camera. 60 00:03:18,600 --> 00:03:21,410 Ngunit tiyak na pagdating sa kulay, kailangan mo ng higit pang mga bit. 61 00:03:21,410 --> 00:03:25,690 At medyo karaniwang sa mundo ng mga larawan ay gamitin hindi 1-bit na kulay, 62 00:03:25,690 --> 00:03:29,560 bilang na ito ay nagmumungkahi, ngunit 24-bit na kulay, kung saan ang iyong aktwal na makakuha ng mga milyon-milyong mga kulay. 63 00:03:29,560 --> 00:03:32,250 Kaya bilang sa kaso kapag kami naka-zoom in sa Rob mata, 64 00:03:32,250 --> 00:03:36,370 na anumang bilang ng mga milyon-milyong ng iba't ibang makukulay na posibilidad. 65 00:03:36,370 --> 00:03:39,040 Kaya naming ipakilala ito sa Problema Set 4 pati na rin sa walkthrough, 66 00:03:39,040 --> 00:03:43,370 na ngayon sa 3:30 sa halip ng karaniwang 2:30 dahil sa Biyernes sa panayam dito. 67 00:03:43,370 --> 00:03:46,620 Ngunit video online gaya ng dati bukas. 68 00:03:46,620 --> 00:03:48,820 >> Din namin ipakilala sa iyo sa isa pang format ng file. 69 00:03:48,820 --> 00:03:51,270 Ito ay sadyang ginawa upang hitsura intimidating sa unang, 70 00:03:51,270 --> 00:03:55,670 ngunit ito ay ilan lang dokumentasyon para sa isang C struct. 71 00:03:55,670 --> 00:03:58,940 Ito lumiliko out na ang Microsoft taon na ang nakakaraan nakatulong sa magpabantog ang format na ito 72 00:03:58,940 --> 00:04:05,150 na tinatawag na ang bitmap file format, bmp, at ito ay isang sobrang simple, makulay na graphical format ng file 73 00:04:05,150 --> 00:04:10,150 na ginagamit para sa pa ng ilang oras at paminsan-minsan pa rin para sa mga wallpaper sa desktop. 74 00:04:10,150 --> 00:04:14,760 Kung sa tingin mo pabalik sa Windows XP at ang mga lumiligid na burol at ang mga asul na langit, 75 00:04:14,760 --> 00:04:17,170 na karaniwang isang bmp o bitmap imahe. 76 00:04:17,170 --> 00:04:19,959 Bitmaps ay masaya para sa atin dahil mayroon sila ng kaunti pang pagiging kumplikado. 77 00:04:19,959 --> 00:04:22,610 Hindi pa bilang simpleng bilang ang grid na ito ng 0s at 1s. 78 00:04:22,610 --> 00:04:27,510 Sa halip, mayroon kang mga bagay tulad ng isang header sa simula ng isang file. 79 00:04:27,510 --> 00:04:31,990 Kaya sa ibang salita, sa loob ng isang file na. Bmp ay isang buong bungkos ng 0s at 1s, 80 00:04:31,990 --> 00:04:34,910 ngunit may ilang karagdagang 0s at 1s sa doon. 81 00:04:34,910 --> 00:04:38,220 At ito ay lumiliko out na ang malamang nagsagawa kami para sa ipinagkaloob para sa taon - 82 00:04:38,220 --> 00:04:45,170 format ng file tulad ng. doc o. xls o. mp3,. mp4, anuman ang format ng file 83 00:04:45,170 --> 00:04:48,480 na pamilyar ka sa - ano ang kahit ibig sabihin ay isang format ng file, 84 00:04:48,480 --> 00:04:52,480 dahil sa pagtatapos ng araw ang lahat ng mga file na ito ginagamit namin lamang 0s at 1s. 85 00:04:52,480 --> 00:04:56,810 At siguro mga 0s at 1s kumakatawan ABC sa pamamagitan ng ASCII o tulad ng, 86 00:04:56,810 --> 00:04:58,820 ngunit sa pagtatapos ng araw, ito ay pa rin lamang 0s at 1s. 87 00:04:58,820 --> 00:05:02,100 Kaya mga tao lamang paminsan-minsan magpasya upang maglubid ng isang bagong format ng file 88 00:05:02,100 --> 00:05:06,420 kung saan sila alisunod sa pamantayan kung ano ang talagang ibig sabihin ng mga pattern ng bits. 89 00:05:06,420 --> 00:05:09,220 At sa kasong ito dito, ang mga tao na dinisenyo sa bitmap format ng file 90 00:05:09,220 --> 00:05:15,620 sinabi na sa unang byte sa isang bitmap na file, tulad ng naitala sa pamamagitan ng offset 0 doon, 91 00:05:15,620 --> 00:05:18,940 may ilang cryptically na pinangalanang variable na tinatawag na bfType, 92 00:05:18,940 --> 00:05:23,080 kung saan nakatayo lamang para sa bitmap uri ng file, kung anong uri ng bitmap file ito. 93 00:05:23,080 --> 00:05:27,700 Maaari mong magpakilala marahil mula sa pangalawang hilera na offset 2, byte numero 2, 94 00:05:27,700 --> 00:05:33,740 may isang pattern ng 0s at 1s na kumakatawan sa kung ano ang? Ang laki ng isang bagay. 95 00:05:33,740 --> 00:05:35,310 At ito napupunta mula doon. 96 00:05:35,310 --> 00:05:37,410 Kaya sa Problema Set 4, makikita ka lumakad sa pamamagitan ng ilan sa mga bagay na ito. 97 00:05:37,410 --> 00:05:39,520 Hindi namin aalaga tungkol sa lahat ng mga ito. 98 00:05:39,520 --> 00:05:47,510 Ngunit mapansin ito nagsimulang upang makakuha ng kawili-wiling sa buong byte 54: rgbtBlue, Green, at Red. 99 00:05:47,510 --> 00:05:52,110 Kung sakaling mo na narinig ang acronym RGB - pula, berde, asul - ito ay isang reference na 100 00:05:52,110 --> 00:05:54,610 dahil ito ay lumiliko ang maaari mong ipinta ang lahat ng mga kulay ng bahaghari 101 00:05:54,610 --> 00:05:58,180 may ilang mga kumbinasyon ng mga pula at bughaw at berde. 102 00:05:58,180 --> 00:06:03,320 At sa katunayan, ang mga magulang sa kuwarto ay maaaring isipin ang ilan sa pinakamaagang Projector. 103 00:06:03,320 --> 00:06:05,890 Mga araw na ito, mo lamang makita ang isang maliwanag na ilaw paparating ng lens, 104 00:06:05,890 --> 00:06:09,800 ngunit pabalik sa araw ay ang pulang lens, ang mga asul na lens, at ang berde lens, 105 00:06:09,800 --> 00:06:13,380 at kasama nila naglalayong sa isang screen at nabuo ang isang makulay na larawan. 106 00:06:13,380 --> 00:06:16,270 At medyo madalas, gitnang paaralan at mataas na paaralan ay may mga lens 107 00:06:16,270 --> 00:06:19,720 kailanman kaya bahagyang nakatagilid, kaya ikaw ay ang uri ng makakita ng mga double o triple larawan. 108 00:06:19,720 --> 00:06:24,100 Ngunit na ideya. Ikaw ay may pula at berde at bughaw na ilaw pagpipinta ng isang larawan. 109 00:06:24,100 --> 00:06:26,590 At ang parehong prinsipyo ay ginagamit sa mga computer. 110 00:06:26,590 --> 00:06:30,230 >> Kaya kabilang ang mga hamon pagkatapos ay para sa iyo sa Problema Set 4 na ang ilang mga bagay. 111 00:06:30,230 --> 00:06:34,800 Ay isa sa aktwal na baguhin ang laki ng isang imahe, sa isang pattern ng 0s at 1s, 112 00:06:34,800 --> 00:06:40,200 malaman kung aling chunks ng 0s at 1s ay kumakatawan sa kung ano ang sa isang istraktura tulad nito, 113 00:06:40,200 --> 00:06:43,630 at pagkatapos malaman kung paano ginagaya ang pixels - ang mga pula, blues, sa paglalaro ng golf - 114 00:06:43,630 --> 00:06:46,660 sa loob ng sa gayon ay kapag ang isang larawan ay ganito ang hitsura simula, 115 00:06:46,660 --> 00:06:49,210 maaaring magmukhang ganito sa halip pagkatapos na. 116 00:06:49,210 --> 00:06:53,640 Kabilang sa iba pang mga hamon na ikaw ay ipinasa ng forensic imahe 117 00:06:53,640 --> 00:06:56,030 ng isang aktwal na file mula sa isang digital camera. 118 00:06:56,030 --> 00:06:58,960 At sa camera na, sa sandaling unang panahon, ay isang buong grupo ng mga larawan. 119 00:06:58,960 --> 00:07:03,760 Ang problema ay aksidenteng namin mabubura o may larawan Nasira sa paanuman. 120 00:07:03,760 --> 00:07:05,750 Masamang mangyayari sa mga digital camera. 121 00:07:05,750 --> 00:07:09,150 At kaya mabilis namin kinopya lahat ng 0s at 1s off ng card na iyon para sa iyo, 122 00:07:09,150 --> 00:07:13,610 naka-save na ang lahat ng ito sa isang malaking file, at pagkatapos ay makikita namin ipasa ang mga ito sa iyo sa Problema Itakda 4 123 00:07:13,610 --> 00:07:19,320 sa gayon ay maaari mong magsulat ng isang programa sa C na upang mabawi ang lahat ng mga JPEG na, perpektong. 124 00:07:19,320 --> 00:07:23,330 At ito ay lumiliko out na mga JPEG, kahit na nasa medyo ng isang complex na format ng file - 125 00:07:23,330 --> 00:07:26,360 sila magkano ang mas kumplikado kaysa ito nakangiting mukha dito - 126 00:07:26,360 --> 00:07:31,160 ito lumiliko out na ang bawat JPEG ay nagsisimula na may parehong pattern ng 0s at 1s. 127 00:07:31,160 --> 00:07:35,630 Ito gamit, sa huli, habang loop o para sa loop o katulad, 128 00:07:35,630 --> 00:07:38,880 maaari mong umulit sa ibabaw ng lahat ng 0s at 1s sa forensic imahe, 129 00:07:38,880 --> 00:07:43,150 at sa bawat oras na makita mo ang mga espesyal na pattern na tinukoy sa detalye ng hanay ng problema, 130 00:07:43,150 --> 00:07:47,880 maaari mong ipagpalagay dito ay, na may napakataas na posibilidad, ang simula ng isang JPEG. 131 00:07:47,880 --> 00:07:51,230 At sa lalong madaling mahanap ka ng parehong pattern sa ilang bilang ng mga byte 132 00:07:51,230 --> 00:07:55,430 o kilobytes o megabytes sa ibang pagkakataon, maaari mong ipagpalagay dito ay isang pangalawang JPEG, 133 00:07:55,430 --> 00:07:57,380 ang mga larawan na kinuha ko pagkatapos ng unang. 134 00:07:57,380 --> 00:08:01,370 Hayaan akong itigil ang pagbabasa na unang file, simulan ang pagsusulat na ito bagong, 135 00:08:01,370 --> 00:08:06,310 at ang output ng iyong programa para sa pset4 pagpunta sa bilang maraming bilang 50 mga JPEG. 136 00:08:06,310 --> 00:08:09,270 At kung hindi ito 50 mga JPEG, mayroon kang isang bit ng isang loop. 137 00:08:09,270 --> 00:08:12,490 Kung mayroon ka ng isang walang-katapusang bilang ng mga JPEG, mayroon ka ng isang walang-katapusang loop. 138 00:08:12,490 --> 00:08:14,910 Sa gayon ay masyadong ay lubos na isang karaniwang kaso. 139 00:08:14,910 --> 00:08:16,600 Kaya na kung ano ang sa abot-tanaw. 140 00:08:16,600 --> 00:08:21,310 >> Pagsusulit 0 likod sa amin, Napagtanto bawat aking email na walang paltos may mga tao na parehong masaya, 141 00:08:21,310 --> 00:08:23,640 uri ng neutral, at malungkot sa paligid pagsusulit 0 oras. 142 00:08:23,640 --> 00:08:26,800 At mangyaring huwag makipag-ugnay sa akin, ang ulo ng tf Zamyla, ang iyong sariling tf, 143 00:08:26,800 --> 00:08:31,180 o isa ng Cas na alam mo kung nais mong upang talakayin kung paano ang mga bagay nagpunta. 144 00:08:31,180 --> 00:08:35,539 >> Kaya sa mapabilib ang mga magulang dito sa kuwarto, kung ano ang CS50 library? 145 00:08:36,429 --> 00:08:40,390 [Tawa] Magandang trabaho. 146 00:08:40,390 --> 00:08:48,340 Ano ang CS50 library? Oo. >> [Mag-aaral] Ito ay isang paunang nakasulat na hanay ng mga code [hindi marinig] 147 00:08:48,340 --> 00:08:49,750 Okay, mabuti. 148 00:08:49,750 --> 00:08:53,240 Ito ay isang paunang nakasulat na hanay ng mga code na namin ang mga kawani sinulat ni, nagbibigay kami sa iyo, 149 00:08:53,240 --> 00:08:55,030 na nagbibigay ng ilang mga karaniwang pag-andar, 150 00:08:55,030 --> 00:08:59,020 bagay-bagay na tulad ng makakuha ako ng isang string, kumuha ako ng isang int - lahat ng mga pagpapaandar na nakalista dito. 151 00:08:59,020 --> 00:09:02,260 >> Simula ngayon, sisimulan namin talagang gawin ang mga gulong ng pagsasanay. 152 00:09:02,260 --> 00:09:05,050 Kami ay pagpunta upang simulan ang isang string mula sa iyo, 153 00:09:05,050 --> 00:09:08,870 kung saan manariwa sa diwa ay lamang isang kasingkahulugan para sa kung ano ang aktwal na mga uri ng data? >> [Maramihang mga mag-aaral] magpasinda *. 154 00:09:08,870 --> 00:09:12,730 Magpasinda *. Para sa mga magulang, na marahil [ginagawang whooshing tunog]. Iyon ay mabuti. 155 00:09:12,730 --> 00:09:17,550 Magpasinda * magsisimula kami upang makita sa screen ang lahat ng higit pa bilang aalisin namin ang string mula sa aming bokabularyo, 156 00:09:17,550 --> 00:09:19,730 hindi bababa sa pagdating sa aktwal na pagsusulat code. 157 00:09:19,730 --> 00:09:22,840 Gayundin, ititigil namin gamit ang ilan sa mga function ng mas maraming 158 00:09:22,840 --> 00:09:25,280 dahil ang aming mga programa ay pagpunta upang makakuha ng mas sopistikadong. 159 00:09:25,280 --> 00:09:28,480 Sa halip na magsulat lamang ng mga programa na umupo doon na may isang prompt kumikislap, 160 00:09:28,480 --> 00:09:31,870 naghihintay para sa user i-type ang isang bagay sa, makakakuha ka ng iyong mga input mula sa ibang lugar. 161 00:09:31,870 --> 00:09:35,490 Halimbawa, makakakuha ka ng mga ito mula sa isang serye ng mga bits sa lokal na hard drive. 162 00:09:35,490 --> 00:09:38,580 Makikita mo sa halip makakuha ng mga ito sa hinaharap mula sa isang network connection, 163 00:09:38,580 --> 00:09:40,230 ilang mga website sa isang lugar. 164 00:09:40,230 --> 00:09:44,110 >> Kaya sabihin alisan ng balat pabalik ang layer na ito sa unang pagkakataon at makuha ang CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 at ang file na ito na tinatawag na cs50.h, kung saan ikaw ay # kabilang para sa linggo, 166 00:09:49,010 --> 00:09:51,140 ngunit hayaan ng aktwal na makita kung ano ang sa loob ng mga ito. 167 00:09:51,140 --> 00:09:54,430 Ang tuktok ng file sa asul ay lamang ng buong bungkos ng mga komento: 168 00:09:54,430 --> 00:09:57,050 warranty impormasyon at paglilisensya. 169 00:09:57,050 --> 00:09:59,050 Ito ay uri ng isang karaniwang paradaym sa software 170 00:09:59,050 --> 00:10:01,580 dahil maraming ng software mga araw na ito ay kung ano ang tinatawag na open source, 171 00:10:01,580 --> 00:10:05,220 na nangangahulugan na ang isang tao ay nakasulat na code at ginawa ito malayang magagamit 172 00:10:05,220 --> 00:10:10,470 hindi lamang upang mapatakbo at upang gamitin ngunit sa aktwal na basahin at baguhin at isama sa iyong sariling. 173 00:10:10,470 --> 00:10:14,660 Kaya na kung ano ang iyong ginagamit, open source software, kahit na sa isang napakaliit na paraan. 174 00:10:14,660 --> 00:10:18,560 Kung mag-scroll ko pababa nakaraan ng mga komento, bagaman, makikita namin simulan upang makita ang ilang mga mas pamilyar na mga bagay. 175 00:10:18,560 --> 00:10:25,010 Abiso sa tuktok narito na ang cs50.h file ay nagsasama ng isang buong grupo ng mga file ng header. 176 00:10:25,010 --> 00:10:28,560 Karamihan sa mga ito, hindi namin nakita bago, ngunit ang isa ay pamilyar. 177 00:10:28,560 --> 00:10:32,270 Alin sa mga ito ang na namin nakikita, kahit na sa maikling, kaya sa ngayon? >> [Mag-aaral] Standard library. 178 00:10:32,270 --> 00:10:35,810 Oo, standard library. stdlib.h may malloc. 179 00:10:35,810 --> 00:10:38,320 Sa sandaling na sinimulan namin ang pakikipag-usap tungkol sa dynamic memory paglalaan, 180 00:10:38,320 --> 00:10:41,650 na gagamitin namin bumalik sa susunod na linggo pati na rin, na sinimulan namin kasama ang file na iyon. 181 00:10:41,650 --> 00:10:46,640 Ito lumiliko out na bool at totoo at maling hindi tunay na umiiral sa C per se 182 00:10:46,640 --> 00:10:49,440 maliban kung isama mo ang file na ito dito. 183 00:10:49,440 --> 00:10:52,710 Namin ang para sa linggo ay kabilang stdbool.h 184 00:10:52,710 --> 00:10:55,620 sa gayon ay maaari mong gamitin ang paniwala ng bool, true o false. 185 00:10:55,620 --> 00:10:58,620 Wala ang, gusto mo upang pag-uri-uriin ng mga pekeng ito at gamitin ang isang int 186 00:10:58,620 --> 00:11:02,610 at mang ipinapalagay na ang 0 ay mali at 1 ay totoo. 187 00:11:02,610 --> 00:11:07,150 Kung mag-scroll namin hiwalay, narito ang aming kahulugan ng isang string. 188 00:11:07,150 --> 00:11:11,390 Ito lumiliko out, bilang namin ang sinabi bago, na kung saan ito ay ang bituin ay hindi talagang mahalaga. 189 00:11:11,390 --> 00:11:13,720 Maaari ka ring magkaroon ng espasyo sa buong. 190 00:11:13,720 --> 00:11:16,740 Namin ito semestre ay nagpo-promote ang mga ito bilang ito upang gumawa ng malinaw 191 00:11:16,740 --> 00:11:18,620 na ang star ay may sa gawin sa ang uri, 192 00:11:18,620 --> 00:11:21,700 ngunit Napagtanto tulad ng karaniwan, kung hindi isang maliit na mas karaniwang, 193 00:11:21,700 --> 00:11:24,430 ay ilagay ang mga ito doon, ngunit pagtakbo nito ang parehong bagay. 194 00:11:24,430 --> 00:11:27,720 Ngunit ngayon kung binabasa namin ang hiwalay, sabihin kumuha ng isang pagtingin sa GetInt 195 00:11:27,720 --> 00:11:32,190 dahil ginagamit namin na marahil unang bago anumang bagay na ito semestre. 196 00:11:32,190 --> 00:11:37,440 Narito ang GetInt. Ito ay kung ano ang? >> [Mag-aaral] Isang prototype. >>, Ito ay lamang prototype. 197 00:11:37,440 --> 00:11:41,410 Madalas, namin ilagay modelo sa tops ng aming c file, 198 00:11:41,410 --> 00:11:46,690 ngunit maaari mo ring ilagay ang modelo sa mga file ng header,. h file, tulad ng isang ito dito 199 00:11:46,690 --> 00:11:50,840 sa gayon ay kapag sumulat kang ilang mga function na nais mong iba pang mga tao magagawang gamitin, 200 00:11:50,840 --> 00:11:53,550 na eksakto ang kaso sa CS50 sa library, 201 00:11:53,550 --> 00:11:57,040 hindi lamang ipatupad ang iyong mga function sa isang bagay tulad ng cs50.c, 202 00:11:57,040 --> 00:12:02,790 mo ring ilagay ang mga modelo ay hindi sa tuktok ng file na iyon ngunit sa tuktok ng isang file ng header. 203 00:12:02,790 --> 00:12:07,170 Pagkatapos na header file ay kung ano ang mga kaibigan at kasamahan ang 204 00:12:07,170 --> 00:12:09,760 may # include sa kanilang sariling mga code. 205 00:12:09,760 --> 00:12:12,210 Kaya lahat ng oras na ito, na kabilang ang lahat ng mga modelo, 206 00:12:12,210 --> 00:12:16,580 epektibo sa tuktok ng iyong mga file ngunit sa pamamagitan nito # include mekanismo, 207 00:12:16,580 --> 00:12:20,070 kung saan ang mahalagang mga kopya at pastes ang file na ito sa iyong sariling. 208 00:12:20,070 --> 00:12:23,070 Narito ang ilang medyo detalyadong dokumentasyon. 209 00:12:23,070 --> 00:12:25,640 Namin na medyo mas kinuha para sa ipinagkaloob na GetInt nakakakuha ng isang int, 210 00:12:25,640 --> 00:12:27,640 ngunit ito lumiliko out mayroong ilang mga sulok kaso. 211 00:12:27,640 --> 00:12:31,810 Paano kung ang mga uri ng user sa isang numero na paraan masyadong malaki, quintillion, 212 00:12:31,810 --> 00:12:35,490 na lamang ay hindi maaaring magkasya sa loob ng isang int? Ano ang inaasahang pag-uugali? 213 00:12:35,490 --> 00:12:38,020 May perpektong, predictable. 214 00:12:38,020 --> 00:12:40,280 Kaya sa kasong ito, kung aktwal mong basahin ang fine na naka-print, 215 00:12:40,280 --> 00:12:44,500 aktwal mong makita na kung linya ay hindi maaaring basahin, ito babalik INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Hindi kailanman na-uusapang namin tungkol dito, ngunit batay sa capitalization, ano ito marahil? 217 00:12:48,320 --> 00:12:50,640 [Mag-aaral] Ang isang pare-pareho. >> Ito ay isang pare-pareho. 218 00:12:50,640 --> 00:12:54,770 Ang ilang espesyal na pare-pareho na malamang na ipinahayag sa isa ng mga file ng header 219 00:12:54,770 --> 00:13:00,090 na hanggang mas mataas sa ang file, at INT_MAX ay marahil isang bagay tulad ng halos 2 bilyong, 220 00:13:00,090 --> 00:13:04,990 nangyaring mali ang ideya pagiging na dahil kailangan namin sa paanuman magpahiwatig na may isang bagay, 221 00:13:04,990 --> 00:13:10,700 namin, oo, 4 bilyong numero sa aming pagtatapon: -2 bilyong sa hanggang sa 2 bilyong, bigyan o. 222 00:13:10,700 --> 00:13:14,710 Well, kung ano ang karaniwan sa programming nakawin mo lang ang isa sa mga numero, 223 00:13:14,710 --> 00:13:18,920 siguro 0, siguro 2 bilyong, siguro -2 bilyong, 224 00:13:18,920 --> 00:13:23,280 kaya gagastusin mo ang isa sa iyong mga posibleng halaga upang maaari kang mangako sa mundo 225 00:13:23,280 --> 00:13:26,820 na kung ang isang bagay napupunta mali, ako ay ibalik ito sobrang malaking halaga. 226 00:13:26,820 --> 00:13:31,030 Ngunit hindi mo nais ang user ng pag-type ng isang bagay na misteriyoso tulad ng 234 ..., talagang malaking bilang. 227 00:13:31,030 --> 00:13:34,060 Kang magbigay ng tuntuning panlahat ang mga ito sa halip bilang isang pare-pareho. 228 00:13:34,060 --> 00:13:38,060 Kaya talagang, kung ikaw ay pagiging anal sa nakalipas na ilang linggo, anumang oras na tinatawag na GetInt, 229 00:13:38,060 --> 00:13:42,900 dapat mong na-check sa isang kung kundisyon ginawa ang uri ng user sa INT_MAX, 230 00:13:42,900 --> 00:13:46,590 o, higit na partikular, ginawa GetInt return INT_MAX, dahil kung ginawa ito, 231 00:13:46,590 --> 00:13:51,830 na aktwal na nangangahulugan na hindi nila type ito. May nangyaring mali sa kasong ito. 232 00:13:51,830 --> 00:13:56,080 Kaya ito ay kung ano ang karaniwang kilala bilang isang tanod na halaga, na kung saan ay nangangahulugan lamang espesyal. 233 00:13:56,080 --> 00:13:58,120 >> Natin ngayon maging ang file na. C. 234 00:13:58,120 --> 00:14:01,340 Ang C file ay umiiral sa appliance para sa ilang oras. 235 00:14:01,340 --> 00:14:06,840 At sa katunayan, appliance ay pre-pinagsama-sama para sa iyo sa na bagay na tinatawag namin ang bagay na code, 236 00:14:06,840 --> 00:14:09,540 ngunit ito lamang ay hindi mahalaga sa iyo kung saan ito ay dahil alam ng system ang 237 00:14:09,540 --> 00:14:11,730 sa kasong ito kung saan ito ay: ang appliance. 238 00:14:11,730 --> 00:14:17,400 Sabihin mag-scroll pababa ngayon sa GetInt at makita kung paano GetInt ay nagtatrabaho lahat oras na ito. 239 00:14:17,400 --> 00:14:19,460 Narito mayroon kami ng mga katulad na mga komento mula sa bago. 240 00:14:19,460 --> 00:14:21,660 Hayaan akong mag-zoom in sa lamang ang bahagi code. 241 00:14:21,660 --> 00:14:23,900 At kung ano ang mayroon kami para sa GetInt ay ang mga sumusunod. 242 00:14:23,900 --> 00:14:25,700 Ito ay tumatagal ng walang input. 243 00:14:25,700 --> 00:14:29,510 Nagbalik ng isang int, habang (totoo), kaya kami ay may isang sinadya na walang-katapusang loop, 244 00:14:29,510 --> 00:14:33,180 ngunit baka makikita namin masira ng ito sa paanuman o bumalik mula sa loob ng. 245 00:14:33,180 --> 00:14:34,870 >> Natin makita kung paano ito gumagana. 246 00:14:34,870 --> 00:14:39,240 Mukhang namin na ang paggamit na GetString sa ang unang linya na ito sa loob ng loop, 166. 247 00:14:39,240 --> 00:14:43,780 Ito ay mahusay na kasanayan na ngayon dahil sa ilalim kung ano pangyayari ay maaaring GetString bumalik 248 00:14:43,780 --> 00:14:47,660 espesyal null keyword? >> [Mag-aaral] Kung ang isang bagay napupunta mali. 249 00:14:47,660 --> 00:14:51,630 Kung ang isang bagay napupunta mali. At kung ano ang maaaring pumunta mali kapag tumawag ka ng isang bagay tulad ng GetString? 250 00:14:54,960 --> 00:14:57,640 Oo. >> [Mag-aaral] Malloc nabigo upang bigyan ito ng ints. 251 00:14:57,640 --> 00:14:59,150 Oo. Siguro malloc nabigo. 252 00:14:59,150 --> 00:15:03,190 Sa isang lugar sa ilalim ng hood, GetString pagtawag malloc, na allocates memorya, 253 00:15:03,190 --> 00:15:06,020 kung saan ay nagbibigay-daan sa computer store ang lahat ng ang mga character na 254 00:15:06,020 --> 00:15:07,750 na gumagamit ng mga uri sa keyboard. 255 00:15:07,750 --> 00:15:11,590 At ipagpalagay na ang user ay may isang buong maraming libreng oras at nai-type nang higit pa, halimbawa, 256 00:15:11,590 --> 00:15:16,160 sa 2 bilyong character sa, ang higit pang mga character kaysa sa computer kahit may RAM. 257 00:15:16,160 --> 00:15:19,250 May GetString upang magpahiwatig na ang sa iyo. 258 00:15:19,250 --> 00:15:22,560 Kahit na ito ay isang napakabilis, sobrang bihira na sulok ng kaso, 259 00:15:22,560 --> 00:15:24,340 ay sa paanuman magagawang upang mahawakan ito, 260 00:15:24,340 --> 00:15:28,750 at kaya GetString, kung namin nagpunta bumalik at basahin nito dokumentasyon, ginagawa sa katotohanan return null. 261 00:15:28,750 --> 00:15:34,460 Kaya ngayon kung GetString nabigo sa pamamagitan ng pagbalik null, GetInt ay pagpunta sa mabibigo sa pamamagitan ng pagbalik INT_MAX 262 00:15:34,460 --> 00:15:37,690 bilang isang tanod. Ito ang lang tao convention. 263 00:15:37,690 --> 00:15:41,450 Ang tanging paraan na alam mo ito ang kaso ay sa pamamagitan ng pagbabasa ang dokumentasyon. 264 00:15:41,450 --> 00:15:45,040 >> Sabihin mag-scroll pababa kung saan ay aktwal na nakuha ang int. 265 00:15:45,040 --> 00:15:51,160 Kung mag-scroll ko ng kaunti pa, sa line 170, mayroon kaming isang komento sa itaas ng mga linya. 266 00:15:51,160 --> 00:15:55,100 Idedeklara namin sa 172 isang int, n, at isang pansamantalang trabaho, c, at pagkatapos ay ang bagong function na, 267 00:15:55,100 --> 00:15:58,930 kung saan ang ilan sa inyo ay stumbled kabila bago, sscanf. 268 00:15:58,930 --> 00:16:00,870 Ito ay nakatayo para sa string scanf. 269 00:16:00,870 --> 00:16:05,700 Sa ibang salita, bigyan ako ng string at ko i-scan ang mga ito para sa mga piraso ng impormasyon ng interes. 270 00:16:05,700 --> 00:16:07,360 Ano ang na ibig sabihin nito? 271 00:16:07,360 --> 00:16:11,800 Ipagpalagay na-type sa ko, literal, 123 sa keyboard at pagkatapos ay pindutin ang Enter. 272 00:16:11,800 --> 00:16:16,470 Ano ang mga uri ng data ng 123 kapag ibinalik ng GetString? >> [Mag-aaral] String. 273 00:16:16,470 --> 00:16:18,380 Ito ay malinaw naman isang string, i-right? Nakatanggap ako ng string. 274 00:16:18,380 --> 00:16:23,220 Kaya 123 ay talagang, quote-magpanipi, 123 gamit ang \ 0 sa pagtatapos nito. 275 00:16:23,220 --> 00:16:27,110 Na ay hindi isang int. Iyon ay hindi isang numero. Mukhang isang numero ngunit ito ay hindi tunay na. 276 00:16:27,110 --> 00:16:29,080 Kaya kung ano ang GetInt gawin? 277 00:16:29,080 --> 00:16:35,750 Upang i-scan na string kaliwa papuntang kanan - 123 \ 0 - at sa paanuman-convert sa isang aktwal na integer. 278 00:16:35,750 --> 00:16:37,850 Maaari mong malaman kung paano gawin ito. 279 00:16:37,850 --> 00:16:41,450 Kung sa tingin mo bumalik sa pset2, baka Mayroon isang maliit na komportable sa Caesar 280 00:16:41,450 --> 00:16:44,820 o Vigenere, kaya maaari mong umulit sa loob ng isang string, maaari mong i-convert ng mga karakter sa mga ints. 281 00:16:44,820 --> 00:16:46,710 Ngunit ano ba, ang isang buong maraming trabaho. 282 00:16:46,710 --> 00:16:49,860 Bakit hindi tumawag sa isang function tulad sscanf na ginagawa na para sa iyo? 283 00:16:49,860 --> 00:16:54,230 Kaya inaasahan ng sscanf ng argumento - sa kasong ito na tinatawag na linya, na isang string. 284 00:16:54,230 --> 00:17:01,840 Mo nang tinukoy sa mga panipi, na halos kapareho sa printf, kung ano ang inaasahan mong makita sa ang string na ito. 285 00:17:01,840 --> 00:17:09,000 At kung ano ang ako sinasabi dito ay inaasahan ko upang makita ang isang decimal na numero at maaaring isang character. 286 00:17:09,000 --> 00:17:12,000 At kami na makita kung bakit ito ang kaso sa sandali lamang. 287 00:17:12,000 --> 00:17:15,869 At ito ay lumiliko ang pagtatanda na ito ay nakapagpapaalaala na ngayon ng mga bagay-bagay na sinimulan namin ang pakikipag-usap tungkol sa 288 00:17:15,869 --> 00:17:17,619 higit lamang sa isang linggo na ang nakalipas. 289 00:17:17,619 --> 00:17:21,740 Ano ang & n at & c na ginagawa para sa amin dito? >> [Mag-aaral] Address ng n at address ng c. 290 00:17:21,740 --> 00:17:25,400 Oo. Ito ay nagbibigay sa akin ang address ng n at address ng c. Bakit ay na mahalaga? 291 00:17:25,400 --> 00:17:30,220 Alam mo na may mga function sa C, maaari mong laging nagbabalik ng halaga o walang halaga sa lahat. 292 00:17:30,220 --> 00:17:34,530 Maaari mong ibalik ang isang int, isang string, Float, pansamantalang trabaho, anumang, o maaari kang bumalik walang bisa, 293 00:17:34,530 --> 00:17:38,030 ngunit maaari ka lamang bumalik ang isang bagay maximally. 294 00:17:38,030 --> 00:17:42,760 Ngunit dito gusto naming sscanf upang bumalik sa akin siguro isang int, decimal na numero, 295 00:17:42,760 --> 00:17:46,220 at ding pansamantalang trabaho, at Ipapaliwanag ko kung bakit pansamantalang trabaho sa isang sandali. 296 00:17:46,220 --> 00:17:51,460 Gusto mong epektibong sscanf upang bumalik ang dalawang bagay, ngunit ito lamang ay hindi posible sa C. 297 00:17:51,460 --> 00:17:55,200 Maaari kang gumawa sa paligid na sa pamamagitan ng pagpasa sa dalawang address 298 00:17:55,200 --> 00:17:57,370 dahil sa lalong madaling mo ipasa ang isang function ng dalawang address, 299 00:17:57,370 --> 00:18:00,470 ano ang function na sa kanila? >> [Mag-aaral] Sumulat sa mga address na iyon. 300 00:18:00,470 --> 00:18:02,010 Maaari itong sumulat sa mga address na iyon. 301 00:18:02,010 --> 00:18:05,770 Maaari mong gamitin ang operasyon ng star at pumunta doon, sa bawat isa sa mga address na iyon. 302 00:18:05,770 --> 00:18:11,260 Ito ay uri ng ang back-pinto mekanismo ngunit napaka-karaniwang para sa pagbabago sa mga halaga ng variable 303 00:18:11,260 --> 00:18:14,870 higit pa kaysa lamang isang lugar - sa kasong ito, dalawang. 304 00:18:14,870 --> 00:18:21,340 Ngayon mapansin Lalabas na ako para sa == 1 at pagkatapos ay bumabalik n kung iyon ay, sa katunayan, evaluate sa true. 305 00:18:21,340 --> 00:18:26,170 Kaya kung ano ang nangyayari sa? Technically, lahat talaga namin nais na mangyayari sa GetInt ito. 306 00:18:26,170 --> 00:18:30,740 Gusto naming upang i-parse, kaya na magsalita, gusto naming basahin ang string - quote-magpanipi 123 - 307 00:18:30,740 --> 00:18:34,560 at kung ito ay mukhang may isang numero doon, kung ano ang sinasabi namin ang sa sscanf gawin 308 00:18:34,560 --> 00:18:38,190 ay ilagay na numero - 123 - sa variable n para sa akin. 309 00:18:38,190 --> 00:18:42,090 Kaya bakit pagkatapos ay ako aktwal na mayroon na ito pati na rin? 310 00:18:42,090 --> 00:18:48,220 Ano ang papel na ginagampanan ng sscanf sinasabi maaari mo ring makakuha ng isang character dito? 311 00:18:48,220 --> 00:18:53,470 [Hindi marinig na mag-aaral ng tugon] >> Isang decimal point aktwal na maaaring gumana. 312 00:18:53,470 --> 00:18:56,330 Natin pindutin nang matagal na naisip para sa isang sandali. Ano pa? 313 00:18:56,330 --> 00:18:59,270 [Mag-aaral] Ito ay maaaring maging null. >> Magandang iisip. Ito ay maaaring maging null karakter. 314 00:18:59,270 --> 00:19:01,660 Ito ay aktwal na hindi sa kasong ito. Oo. >> [Mag-aaral] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. O ipaalam sa akin ng tuntuning panlahat kahit karagdagang. 316 00:19:04,340 --> 00:19:06,640 Ang% c may lamang para sa error checking. 317 00:19:06,640 --> 00:19:09,300 Hindi namin gusto doon sa isang character pagkatapos ang numero, 318 00:19:09,300 --> 00:19:11,870 ngunit kung ano ang nagbibigay-daan sa akin upang gawin ang mga sumusunod na. 319 00:19:11,870 --> 00:19:18,210 Ito lumiliko out na sscanf, bukod sa pag-iimbak ng mga halaga sa n at c sa halimbawang ito dito, 320 00:19:18,210 --> 00:19:24,890 kung ano ito din ay nagbabalik ang bilang ng mga variable ilagay ito ng mga halaga. 321 00:19:24,890 --> 00:19:30,260 Kaya kung nag-type lamang sa 123, pagkatapos lamang ang% d upang tumugma sa, 322 00:19:30,260 --> 00:19:33,880 at lamang n ay makakakuha ng naka-imbak na may halaga tulad ng 123, 323 00:19:33,880 --> 00:19:35,640 at walang maipo ilagay sa c. 324 00:19:35,640 --> 00:19:37,620 C nananatiling isang halaga ng basura, kaya magsalita - 325 00:19:37,620 --> 00:19:40,730 basura dahil hindi ito ay nasimulan sa ilang mga halaga. 326 00:19:40,730 --> 00:19:45,520 Kaya sa kasong iyon, nagbabalik ang sscanf 1 dahil ako populated 1 ng mga payo, 327 00:19:45,520 --> 00:19:50,190 kung saan mahusay na, mayroon akong isang int kaya magbakante ko ang linya sa magbakante ang memorya 328 00:19:50,190 --> 00:19:54,000 GetString na aktwal na inilaan, at pagkatapos ay bumalik ako n, 329 00:19:54,000 --> 00:19:58,500 tao kung ikaw ba kung saan na pahayag Subukang muli ay mula, ito ay mula dito mismo. 330 00:19:58,500 --> 00:20:04,390 Kaya kung, sa pamamagitan ng kaibahan, ako type sa 123foo - ilang mga random na pagkakasunod-sunod ng teksto - 331 00:20:04,390 --> 00:20:08,490 sscanf ay pagpunta upang makita ang numero, numero, bilang, f, 332 00:20:08,490 --> 00:20:16,410 at pagpunta sa ilagay ang 123 sa n; ito upang ilagay ang f sa c at pagkatapos ay bumalik 2. 333 00:20:16,410 --> 00:20:20,640 Kaya mayroon kami, lamang gamit ang pangunahing kahulugan ng sscanf pag-uugali, isang napaka-simpleng paraan - 334 00:20:20,640 --> 00:20:23,900 mahusay, complex sa unang tingin ngunit sa pagtatapos ng araw medyo simple na mekanismo - 335 00:20:23,900 --> 00:20:28,320 ng pagsabi may int at kung gayon, ay ang tanging bagay na nakita ko? 336 00:20:28,320 --> 00:20:29,860 At ang whitespace dito ay sinadya. 337 00:20:29,860 --> 00:20:34,000 Kung ikaw ay basahin ang dokumentasyon para sa sscanf, ay nagsasabi sa iyo na kung isasama mo ang isang piraso ng whitespace 338 00:20:34,000 --> 00:20:38,810 sa simula o sa katapusan, sscanf masyadong ay magbibigay-daan sa user, para sa anumang dahilan, 339 00:20:38,810 --> 00:20:41,860 sa pindutin ang space bar 123 at na lehitimong. 340 00:20:41,860 --> 00:20:44,150 Hindi ka sumigaw sa user dahil lamang sila pindutin ang space bar 341 00:20:44,150 --> 00:20:48,640 sa simula o sa katapusan, na sandali lang mas user-friendly. 342 00:20:48,640 --> 00:20:52,300 >> Anumang mga katanungan pagkatapos sa GetInt? Oo. >> [Mag-aaral] Paano kung mo lamang ilagay sa isang pansamantalang trabaho? 343 00:20:52,300 --> 00:20:54,030 Magandang tanong. 344 00:20:54,030 --> 00:20:59,890 Paano kung ikaw-type sa isang pansamantalang trabaho tulad ng f at pindutin ang Enter nang hindi pag-type ng 123? 345 00:20:59,890 --> 00:21:02,420 Ano sa tingin ninyo ang pag-uugali ng ang linya ng code pagkatapos? 346 00:21:02,420 --> 00:21:04,730 [Hindi marinig na mag-aaral ng tugon] 347 00:21:04,730 --> 00:21:08,790 Oo, kaya sscanf maaaring masaklawan na masyadong dahil sa kasong iyon, hindi ito upang punan n o c. 348 00:21:08,790 --> 00:21:15,310 Ito ay sa halip na bumalik 0, kung saan rin ako pansing na sitwasyon 349 00:21:15,310 --> 00:21:18,750 dahil ang inaasahang halaga na gusto kong ay 1. 350 00:21:18,750 --> 00:21:22,000 Gusto ko lang ng isa at lamang ng isang bagay na puno. Magandang tanong. 351 00:21:22,000 --> 00:21:24,290 >> Iba? Ayos lang. 352 00:21:24,290 --> 00:21:26,250 >> Natin hindi pumunta sa pamamagitan ng lahat ng mga function in dito, 353 00:21:26,250 --> 00:21:29,500 ngunit ang isa na tila marahil ng natitirang interes GetString 354 00:21:29,500 --> 00:21:32,790 dahil ito ay lumiliko out na GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 lahat ng tumikin ng maraming ng kanilang mga pag-andar sa GetString. 356 00:21:36,260 --> 00:21:39,750 Kaya sabihin kumuha ng isang pagtingin sa kung paano siya ay ipinatupad dito. 357 00:21:39,750 --> 00:21:43,630 Ito mukhang isang maliit na kumplikado, ngunit ginagamit nito ang parehong batayan 358 00:21:43,630 --> 00:21:45,670 namin na sinimulan ng pakikipag-usap tungkol sa huling linggo. 359 00:21:45,670 --> 00:21:49,490 Sa Sa GetString, na walang argumento bilang bawat ang walang bisa hanggang dito 360 00:21:49,490 --> 00:21:53,730 at nagbabalik ng isang string, tila ko ako ang deklarasyon ng isang string na tinatawag na buffer. 361 00:21:53,730 --> 00:21:56,270 Hindi ko talaga alam ano ang pagpunta sa ginagamit para sa pa, ngunit gagamitin namin makita. 362 00:21:56,270 --> 00:21:58,390 Mukhang kapasidad ay sa pamamagitan ng default 0. 363 00:21:58,390 --> 00:22:01,350 Hindi masyadong sigurado kung saan ito ay pagpunta, hindi sigurado kung ano n ay pagpunta upang gamitin para sa pa, 364 00:22:01,350 --> 00:22:03,590 ngunit ngayon ay nakakakuha ito ng kaunti pa sa kawili-wili. 365 00:22:03,590 --> 00:22:06,520 Sa linya 243, ipinapahayag namin ang isang int, c. 366 00:22:06,520 --> 00:22:08,800 Ito ay uri ng bobo detalye. 367 00:22:08,800 --> 00:22:15,820 Pansamantalang trabaho ay 8 bit, at 8 bits ay maaaring iimbak sa kung gaano karaming iba't ibang mga halaga? >> [Mag-aaral] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Ang problema ay kung gusto mong magkaroon ng 256 iba't ibang mga character na ASCII, na may mga 369 00:22:20,730 --> 00:22:23,340 kung sa tingin mo muli - at ito ay hindi isang bagay na kabisaduhin. 370 00:22:23,340 --> 00:22:25,710 Ngunit kung sa tingin mo na malaki ASCII chart nagkaroon kami linggo ang nakalipas, 371 00:22:25,710 --> 00:22:30,600 mayroong sa kasong iyon 128 o 256 mga character na ASCII. 372 00:22:30,600 --> 00:22:32,940 Ginamit namin ang lahat ng mga pattern ng 0s at 1s up. 373 00:22:32,940 --> 00:22:36,210 Na ang isang problema kung nais mong upang makita ang isang error 374 00:22:36,210 --> 00:22:40,190 dahil kung gumagamit ka na ng 256 halaga para sa iyong mga character, 375 00:22:40,190 --> 00:22:43,050 hindi mo talaga magplano magpatuloy dahil ngayon mayroon kang walang paraan ng pagsabi, 376 00:22:43,050 --> 00:22:46,270 ito ay hindi isang legit karakter, ito ay ilang maling mensahe. 377 00:22:46,270 --> 00:22:50,270 Kaya kung ano ang mundo ang ginagawa nila gamitin ang susunod na pinakamalaking halaga, ang isang bagay tulad ng isang int, 378 00:22:50,270 --> 00:22:54,720 kaya na mayroon kang mabaliw bilang ng mga bits, 32, para sa 4 bilyong posibleng halaga 379 00:22:54,720 --> 00:22:58,860 sa gayon ay maaari mo lamang gamit ang mahalagang 257 sa kanila, 380 00:22:58,860 --> 00:23:01,720 1 na may ilang mga espesyal na kahulugan bilang isang error. 381 00:23:01,720 --> 00:23:03,120 >> Kaya sabihin makita kung paano ito gumagana. 382 00:23:03,120 --> 00:23:07,760 Sa linya 246, mayroon akong ito malaki habang loop na pagtawag fgetc, 383 00:23:07,760 --> 00:23:11,090 f file ng kahulugan, kaya getc, at pagkatapos stdin. 384 00:23:11,090 --> 00:23:15,520 Ito lumiliko out lamang ito sa mas tumpak na paraan ng pagsabi basahin ang input mula sa keyboard. 385 00:23:15,520 --> 00:23:19,300 Standard keyboard input paraan, ang ibig sabihin ng standard output screen, 386 00:23:19,300 --> 00:23:23,310 at standard na error, na kung saan namin makita sa pset4, ay nangangahulugan na ang screen 387 00:23:23,310 --> 00:23:27,490 ngunit ang isang espesyal na bahagi ng screen upang hindi ito conflated may aktwal na output 388 00:23:27,490 --> 00:23:30,750 na nilayon mo upang i-print. Ngunit higit pa sa na sa hinaharap. 389 00:23:30,750 --> 00:23:34,440 Kaya fgetc lamang nangangahulugan basahin ang isang character mula sa keyboard at mag-imbak ito kung saan? 390 00:23:34,440 --> 00:23:37,350 Iimbak ito sa c. 391 00:23:37,350 --> 00:23:41,360 At pagkatapos suriin - kaya lang ako sa paggamit ng ilang mga Boolean conjunctions dito - 392 00:23:41,360 --> 00:23:46,000 suriin na ito ay hindi katumbas - \ n, kaya ang gumagamit ay pindutin ang Enter, gusto naming huminto sa puntong iyon, 393 00:23:46,000 --> 00:23:49,850 magtapos ng loop - at gusto rin naming mag-check para sa espesyal na pare-pareho ang EOF, 394 00:23:49,850 --> 00:23:53,610 na kung alam mo o hulaan, ano ang tumayo para sa? >> [Mag-aaral] Pagtatapos ng file. >> End ng file. 395 00:23:53,610 --> 00:23:56,560 Ito ay uri ng walang saysay dahil kung nagta-type ako sa keyboard, 396 00:23:56,560 --> 00:23:58,870 may talagang walang file na kasangkot sa, 397 00:23:58,870 --> 00:24:01,150 ngunit ito ay lamang ayusin ng generic na termino na ginagamit sa ibig sabihin 398 00:24:01,150 --> 00:24:04,220 na walang ibang darating mula sa mga daliri ang tao. 399 00:24:04,220 --> 00:24:06,460 EOF - pagtatapos ng file. 400 00:24:06,460 --> 00:24:09,920 Bilang isang bukod, kung sakaling mo na pindutin ang Control D sa iyong keyboard, hindi na mayroon ka pa - 401 00:24:09,920 --> 00:24:15,230 mo na pindutin ang Control C - Control D nagpapadala ito ng espesyal na pare-pareho na tinatawag na EOF. 402 00:24:15,230 --> 00:24:19,850 Kaya ngayon namin lamang magkaroon ng ilang dynamic na paglalaan ng memorya. 403 00:24:19,850 --> 00:24:23,440 >> Kaya kung (n + 1> kapasidad). Ngayon Ipapaliwanag ko kung n. 404 00:24:23,440 --> 00:24:26,100 N ay lamang kung gaano karaming mga byte ay kasalukuyang sa buffer, 405 00:24:26,100 --> 00:24:28,620 ang string na kasalukuyan mong pagbuo mula sa user. 406 00:24:28,620 --> 00:24:33,450 Kung mayroon kang higit pang mga character sa iyong buffer kaysa sa mayroon kang kapasidad sa buffer, 407 00:24:33,450 --> 00:24:37,410 intuitively kung ano ang kailangan namin upang gawin pagkatapos ay magtalaga ng karagdagang kapasidad. 408 00:24:37,410 --> 00:24:43,330 Kaya ako sagap sa paglipas ng ilang ng aritmetika dito at tumutok lamang sa function na ito dito. 409 00:24:43,330 --> 00:24:46,070 Alam mo kung ano ang malloc o hindi bababa sa pangkalahatan pamilyar. 410 00:24:46,070 --> 00:24:48,970 Kumuha ng hula kung ano ang realloc ginagawa. >> [Mag-aaral] Nagdadagdag ng memorya. 411 00:24:48,970 --> 00:24:52,920 Hindi ito medyo pagdaragdag ng memorya. Reallocates memory tulad ng sumusunod. 412 00:24:52,920 --> 00:24:57,220 Kung mayroon pa rin room sa dulo ng string upang bigyan ka ng higit pa sa na memorya 413 00:24:57,220 --> 00:25:00,000 kaysa sa orihinal na ito ay nagbibigay sa iyo, pagkatapos ay makakakuha ka na ng karagdagang memorya. 414 00:25:00,000 --> 00:25:03,460 Sa gayon ay maaari mo lamang panatilihin ang paglalagay ng character ang string pabalik upang i-back i-back upang i-back. 415 00:25:03,460 --> 00:25:05,830 Ngunit kung hindi iyon ang kaso dahil naghintay ka masyadong mahaba 416 00:25:05,830 --> 00:25:07,940 at isang bagay random Nakakuha plopped sa memory doon 417 00:25:07,940 --> 00:25:10,290 ngunit may dagdag na memorya pababa dito, na okay lang. 418 00:25:10,290 --> 00:25:13,100 Realloc ay pagpunta sa gawin ang lahat ng mga mabibigat na nakakataas para sa iyo, 419 00:25:13,100 --> 00:25:16,750 ilipat ang string na nabasa mo na sa samakatuwid ay malayo mula dito, ilagay ito doon, 420 00:25:16,750 --> 00:25:19,460 at pagkatapos ay magbibigay sa iyo ng ilang higit pang mga paliparan sa puntong iyon. 421 00:25:19,460 --> 00:25:22,550 >> Kaya may isang wave ng kamay, sabihin sabihin sa akin na ang GetString ay ginagawa 422 00:25:22,550 --> 00:25:26,330 ay ito ay nagsisimula sa isang maliit na buffer, maaaring isang solong character, 423 00:25:26,330 --> 00:25:30,820 at kung ang user ay uri sa dalawang character, GetString nagtatapos up ng pagtawag realloc at sabi 424 00:25:30,820 --> 00:25:33,150 isang character ay hindi sapat; magbibigay sa akin ng dalawang character. 425 00:25:33,150 --> 00:25:35,950 Pagkatapos kung mong basahin sa pamamagitan ng logic ng loop, ito sasabihin 426 00:25:35,950 --> 00:25:39,600 ng gumagamit na nai-type sa 3 mga character; ninyo ako ngayon hindi 2 ngunit 4 na mga character, 427 00:25:39,600 --> 00:25:42,320 pagkatapos akong bigyan 8, pagkatapos ninyo ako 16 at 32. 428 00:25:42,320 --> 00:25:45,000 Ang katotohanan na ako pagdodoble ang kapasidad sa bawat oras 429 00:25:45,000 --> 00:25:48,570 ay nangangahulugan na ang buffer ang hindi pagpunta sa palaguin mabagal, ito upang mapalago ang napakabilis na. 430 00:25:48,570 --> 00:25:51,380 At kung ano ang maaaring ang bentahe ng na? 431 00:25:51,380 --> 00:25:54,600 Bakit ako pagdodoble ang laki ng buffer 432 00:25:54,600 --> 00:25:58,020 kahit na ang user ay maaaring kailangan lang ng isang dagdag na character mula sa keyboard? 433 00:25:58,020 --> 00:26:01,750 [Hindi marinig na mag-aaral ng tugon] >> Ano iyon? >> [Mag-aaral] Hindi mo binabalak na palaguin ang mga ito nang madalas. 434 00:26:01,750 --> 00:26:03,300 Eksakto. Hindi mo binabalak na palaguin ang mga ito nang madalas. 435 00:26:03,300 --> 00:26:05,510 At ito lamang ang uri ng sa iyo ay hedging dito ang iyong mga taya, 436 00:26:05,510 --> 00:26:10,850 ideya sa na hindi mo nais na upang tawagan ang realloc ng maraming dahil ito ay may gawi na maging mabagal ang. 437 00:26:10,850 --> 00:26:12,910 Anumang oras na hinihiling mo ang operating system para sa memory, 438 00:26:12,910 --> 00:26:16,990 tulad ng makikita mo sa lalong madaling panahon makita sa isang hinaharap na hanay ng problema, ay may kaugaliang upang tumagal ng ilang oras. 439 00:26:16,990 --> 00:26:20,010 Kaya sa pagliit na halaga ng oras, kahit na kung ikaw ay aksaya ng ilang espasyo, 440 00:26:20,010 --> 00:26:21,900 may gawi na maging isang magandang bagay. 441 00:26:21,900 --> 00:26:24,060 >> Ngunit kung basahin namin sa pamamagitan ng huling bahagi ng GetString dito - 442 00:26:24,060 --> 00:26:27,950 at muli unawa bawat solong linya dito ay hindi kaya mahalaga ngayon - 443 00:26:27,950 --> 00:26:30,530 mapansin na kalaunan tawag malloc muli 444 00:26:30,530 --> 00:26:33,880 at ito allocates eksakto tulad ng maraming mga byte kailangan nito para sa string 445 00:26:33,880 --> 00:26:38,060 at pagkatapos throws ang layo sa pamamagitan ng pagtawag sa libreng labis na malaking buffer 446 00:26:38,060 --> 00:26:40,080 kung ito ay sa katunayan Nakakuha Dinoble masyadong maraming beses. 447 00:26:40,080 --> 00:26:42,730 Kaya sa maikling salita, na kung paano GetString ay nagtatrabaho lahat oras na ito. 448 00:26:42,730 --> 00:26:47,060 Lahat ng ito ay basahin ang isang character sa isang pagkakataon muli at muli at muli, 449 00:26:47,060 --> 00:26:50,750 at sa bawat oras na ito ay nangangailangan ng ilang karagdagang memorya, Humihingi ito ang operating system para sa 450 00:26:50,750 --> 00:26:53,670 sa pamamagitan ng pagtawag realloc. 451 00:26:53,670 --> 00:26:57,890 >> Anumang mga katanungan? Ayos lang. 452 00:26:57,890 --> 00:26:59,270 >> Isang atake. 453 00:26:59,270 --> 00:27:04,060 Ngayon na naiintindihan namin payo o hindi bababa sa ay nagiging pamilyar na may mga payo, 454 00:27:04,060 --> 00:27:06,700 sabihin isaalang-alang kung paano ang buong mundo ay nagsimulang upang tiklupin 455 00:27:06,700 --> 00:27:10,030 kung hindi mo pa masyadong ipagtanggol laban adversarial mga gumagamit, 456 00:27:10,030 --> 00:27:11,850 mga taong sinusubukang i-Hack sa iyong system, 457 00:27:11,850 --> 00:27:16,890 mga tao na sinusubukang nakawin ang iyong software sa pamamagitan ng circumventing ilang pagpaparehistro code 458 00:27:16,890 --> 00:27:19,090 na maaaring sila kung hindi man ay i-type in. 459 00:27:19,090 --> 00:27:22,990 >> Tingnan sa halimbawang ito dito, na lamang C code na may isang function na pangunahing sa ibaba 460 00:27:22,990 --> 00:27:26,380 na tawag ng isang function foo. At kung ano ang pagpasa sa foo? 461 00:27:26,380 --> 00:27:29,680 [Mag-aaral] Ang isang argumento. >> [Malan] Ang isang argumento. 462 00:27:29,680 --> 00:27:33,450 Kaya argv [1], na nangangahulugan na ang unang salita na ng user ang na-type sa command line 463 00:27:33,450 --> 00:27:36,360 pagkatapos a.out o anumang programa ay tinatawag na. 464 00:27:36,360 --> 00:27:41,680 Kaya ang foo sa tuktok tumatagal sa isang pansamantalang trabaho *. Ngunit magpasinda * kung ano? >> [Mag-aaral] Isang string. 465 00:27:41,680 --> 00:27:43,350 [Malan] A string, kaya walang bagong dito. 466 00:27:43,350 --> 00:27:45,420 Na string ay mang na tinatawag na bar. 467 00:27:45,420 --> 00:27:51,430 Ang line dito, magpasinda c [12], sa uri ng semi-teknikal Ingles, ano ang linya na ito ginagawa? 468 00:27:51,430 --> 00:27:55,220 [Mag-aaral] Isang hanay ng mga - >> Array ng? >> [Mag-aaral] Character. >> Character. 469 00:27:55,220 --> 00:27:58,870 Bigyan mo ako ng isang hanay ng mga 12 character. Kaya maaari naming tumawag ito ng buffer. 470 00:27:58,870 --> 00:28:02,920 Ito ang technically tinatawag c, ngunit isang buffer sa programming lamang ay nangangahulugan na ang isang bungkos ng espasyo 471 00:28:02,920 --> 00:28:04,800 na maaari mong ilagay ang ilang mga bagay-bagay. 472 00:28:04,800 --> 00:28:07,940 Pagkatapos bilang wakas, memcpy hindi namin ginamit mo dati, ngunit maaari mong malamang na hulaan kung ano ang ginagawa nito. 473 00:28:07,940 --> 00:28:10,480 Ito kinokopya sa memory. Ano ang gagawin? 474 00:28:10,480 --> 00:28:19,270 Tila ito kinokopya ang bar, ang input, sa c ngunit lamang hanggang sa haba ng bar. 475 00:28:19,270 --> 00:28:24,930 Ngunit mayroong isang bug dito. >> [Mag-aaral] Kailangan mong sizeof karakter. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Technically, dapat namin talagang gawin strlen (bar) * sizeof (pansamantalang trabaho)). Na tama. 477 00:28:30,860 --> 00:28:33,930 Ngunit sa ang pinakamasama kaso dito, sabihin ipinapalagay na that's - 478 00:28:33,930 --> 00:28:35,950 Okay. Pagkatapos ay may dalawang mga bug. 479 00:28:35,950 --> 00:28:39,160 Kaya sizeof (pansamantalang trabaho)); 480 00:28:39,160 --> 00:28:41,290 Natin gumawa ito ng kaunti mas malawak na. 481 00:28:41,290 --> 00:28:44,910 Kaya ngayon ay may pa rin ng isang bug, na kung ano ang? >> [Hindi marinig na mag-aaral tugon] 482 00:28:44,910 --> 00:28:46,990 Suriin para sa kung ano? >> [Mag-aaral] Suriin para sa null. 483 00:28:46,990 --> 00:28:50,270 Dapat namin sa pangkalahatan ay check para sa null dahil masamang mangyayari 484 00:28:50,270 --> 00:28:53,200 kapag ang iyong pointer null dahil maaari mong pagpunta doon, 485 00:28:53,200 --> 00:28:57,630 at hindi kailanman mo dapat null sa pamamagitan ng dereferencing ito sa operator star. 486 00:28:57,630 --> 00:29:01,050 Kaya na mabuti. At kung ano ang tao ay namin ginagawa? Lohikal na, may lamat dito masyadong. 487 00:29:01,050 --> 00:29:04,450 [Mag-aaral] Suriin kung ang argc> = sa 2. 488 00:29:04,450 --> 00:29:10,550 Kaya suriin kung ang argc ay> = 2. Okay, kaya may tatlong bug sa programang ito dito. 489 00:29:10,550 --> 00:29:16,630 Sinusuri namin ngayon kung ang user ay talagang type sa anumang sa argv [1]. Mabuti. 490 00:29:16,630 --> 00:29:20,950 Kaya kung ano ang sa ikatlong bug? Oo. >> [Mag-aaral] C maaaring hindi malaki sapat. 491 00:29:20,950 --> 00:29:23,320 Mabuti. Naka-check namin ang isang sitwasyon. 492 00:29:23,320 --> 00:29:29,520 Naka-check nang kataon lamang namin huwag kopyahin ang higit pang memory kaysa ay lumampas sa haba ng bar. 493 00:29:29,520 --> 00:29:32,510 Kaya kung ang string ng gumagamit na nai-type sa 10 character ang haba, 494 00:29:32,510 --> 00:29:36,020 ito ay sinasabi lamang kopyahin 10 character. At na okay lang. 495 00:29:36,020 --> 00:29:39,940 Ngunit ano kung ang user ay nai-type sa isang salita sa prompt tulad ng isang 20-character na salita? 496 00:29:39,940 --> 00:29:44,900 Ito ay sinasabi ng kopya 20 character mula sa bar sa kung anong? 497 00:29:44,900 --> 00:29:49,750 C, na kilala bilang aming buffer, na nangangahulugan ka lang sinulat ni data 498 00:29:49,750 --> 00:29:52,540 8 byte lokasyon na hindi mo pag-aari, 499 00:29:52,540 --> 00:29:54,870 at hindi ito sa iyo sa pakiramdam na hindi ka na kailanman inilalaan sa kanila. 500 00:29:54,870 --> 00:30:00,370 Kaya ito ay kung ano ang karaniwang kilala bilang buffer overflow atake o atake ng buffer paglampas. 501 00:30:00,370 --> 00:30:05,580 At ang isang pag-atake sa kamalayan na kung ang gumagamit o ang programa na pagtawag sa iyong function na 502 00:30:05,580 --> 00:30:10,490 ginagawa ito maliciously, kung ano ang aktwal na ang susunod na mangyayari ay maaaring aktwal na medyo masamang. 503 00:30:10,490 --> 00:30:12,450 >> Kaya sabihin tingnan ang larawang ito dito. 504 00:30:12,450 --> 00:30:16,060 Ang larawan na ito ay kumakatawan sa iyong stack ng memory. 505 00:30:16,060 --> 00:30:19,580 Manariwa sa diwa na ang bawat oras na tumawag ka ng isang function makuha mo ang mga maliit na frame sa stack 506 00:30:19,580 --> 00:30:21,520 at pagkatapos ay isa at pagkatapos ay isa at sa isa pang. 507 00:30:21,520 --> 00:30:24,300 At kaya ngayon, lang namin uri ng malayo ito bilang mga parihaba 508 00:30:24,300 --> 00:30:26,290 alinman sa board o sa screen dito. 509 00:30:26,290 --> 00:30:30,580 Ngunit kung namin mag-zoom in sa isa sa mga parihaba, kapag tumawag ka ng isang function foo, 510 00:30:30,580 --> 00:30:35,880 ito lumiliko out na may higit pa sa stack loob ng frame na sa na parihaba 511 00:30:35,880 --> 00:30:40,060 kaysa lamang x at y at isang at b, tulad namin ay pakikipag-usap tungkol makipagpalitan. 512 00:30:40,060 --> 00:30:44,410 Ito lumiliko out na ang ilang mga mas mababang antas na mga detalye, kasama ng mga ito Return Address. 513 00:30:44,410 --> 00:30:49,550 Kaya ito lumiliko out kapag pangunahing tawag foo, ang pangunahing ay upang ipaalam sa foo 514 00:30:49,550 --> 00:30:53,520 ano ang pangunahing address sa memory ng computer 515 00:30:53,520 --> 00:30:57,770 dahil kung hindi man, sa lalong madaling foo tapos na execute, tulad ng sa kasong ito dito, 516 00:30:57,770 --> 00:31:00,830 sa sandaling naabot mo na ito closed kulot suhay sa dulo ng foo, 517 00:31:00,830 --> 00:31:05,310 kung paano ang ano ba ang foo malaman kung saan ang kontrol ng programa ay dapat na pumunta? 518 00:31:05,310 --> 00:31:08,970 Ito lumiliko out na ang sagot sa tanong na ito pulang parihaba dito. 519 00:31:08,970 --> 00:31:12,670 Ito ay kumakatawan sa isang pointer, at ito ay hanggang sa ang computer upang mag-imbak ng pansamantalang 520 00:31:12,670 --> 00:31:17,030 sa tinatawag na stack ang address ng pangunahing upang ang sa lalong madaling foo tapos na e-execute, 521 00:31:17,030 --> 00:31:21,120 computer na ang nakakaalam kung saan at kung ano ang linya sa pangunahing upang bumalik sa. 522 00:31:21,120 --> 00:31:23,940 Nai-save na Frame pointer nauugnay katulad na ito. 523 00:31:23,940 --> 00:31:26,310 Magpasinda * bar dito ay kumakatawan sa kung ano ang? 524 00:31:26,310 --> 00:31:31,350 Ngayon ang asul na segment dito foo ng frame. Ano ang bar? 525 00:31:31,570 --> 00:31:35,010 Bar ay ang argumento sa pag-andar ng foo. 526 00:31:35,010 --> 00:31:37,500 Kaya ngayon hindi namin pabalik sa uri ng pamilyar larawan. 527 00:31:37,500 --> 00:31:39,850 Mayroong higit pang mga bagay-bagay at higit pa distractions sa screen, 528 00:31:39,850 --> 00:31:43,380 ngunit ito mapusyaw na asul na segment lamang kung ano ang namin ang pagguhit sa Chalkboard 529 00:31:43,380 --> 00:31:45,790 para sa isang bagay tulad ng makipagpalitan. Na ang frame para sa foo. 530 00:31:45,790 --> 00:31:51,490 At ang tanging bagay sa loob nito ngayon ay bar, na ang parameter na ito. 531 00:31:51,490 --> 00:31:55,220 Ngunit ano pa ang dapat sa stack ayon sa ang code na ito dito? 532 00:31:55,220 --> 00:31:57,760 [Mag-aaral] magpasinda c [12]. >> [Malan] magpasinda c [12]. 533 00:31:57,760 --> 00:32:02,810 Dapat din namin makita ang 12 parisukat ng memory na inilalaan sa isang variable na tinatawag c, 534 00:32:02,810 --> 00:32:04,970 at sa katunayan namin na sa screen. 535 00:32:04,970 --> 00:32:08,480 Pinakatuktok may c [0], at pagkatapos ay ang may-akda ng diagram na ito 536 00:32:08,480 --> 00:32:11,850 ay hindi abala ang pagguhit ng lahat ng mga parisukat, ngunit may katunayan 12 doon 537 00:32:11,850 --> 00:32:16,590 dahil kung titingnan mo sa kanan sa ibaba, c [11] kung ikaw ay mabibilang mula 0 ay ang ika-12 tulad byte. 538 00:32:16,590 --> 00:32:18,400 Ngunit narito ang problema. 539 00:32:18,400 --> 00:32:22,390 Sa aling mga direksyon ay c lumalaking? 540 00:32:22,390 --> 00:32:27,080 -Uri-uriin ng tuktok pababa kung ito ay nagsisimula sa tuktok at lumalaki sa ibaba. 541 00:32:27,080 --> 00:32:30,110 Hindi ito hitsura namin ang natitira sa ating sarili magkano paliparan dito sa lahat. 542 00:32:30,110 --> 00:32:32,090 Namin ang uri ng ipininta sa ating sarili sa isang sulok, 543 00:32:32,090 --> 00:32:36,940 at c [11] ay karapatan up laban sa bar, na karapatan up laban sa Nai-save na pointer ng Frame, 544 00:32:36,940 --> 00:32:39,960 na karapatan up laban sa Return Address. Walang karagdagang puwang. 545 00:32:39,960 --> 00:32:42,810 Kaya kung ano ang implikasyon pagkatapos ay kung ikaw magtaas 546 00:32:42,810 --> 00:32:46,500 at subukan mong pagbabasa 20 bytes sa isang 12-byte buffer? 547 00:32:46,500 --> 00:32:50,060 Kung saan ang mga 8 karagdagang mga byte pagpunta sa pumunta? >> [Mag-aaral] Inside - 548 00:32:50,060 --> 00:32:53,200 Inside lahat ng iba pa, ang ilang na kung saan ay sobrang mahalaga. 549 00:32:53,200 --> 00:32:57,260 At ang pinaka-mahalagang bagay, potensyal na, ay ang pulang kahon doon, Return Address, 550 00:32:57,260 --> 00:33:03,560 dahil ipagpalagay mong alinman sa aksidente o adversarially patungan ang mga 4 bytes, 551 00:33:03,560 --> 00:33:07,260 na pointer address, hindi lamang sa ng basura ngunit may isang numero 552 00:33:07,260 --> 00:33:09,810 na mangyayari sa kumakatawan sa isang aktwal na address sa memorya. 553 00:33:09,810 --> 00:33:13,880 Ano ang implikasyon, lohikal? >> [Mag-aaral] Ang function na ay pagpunta upang bumalik sa ibang lugar. 554 00:33:13,880 --> 00:33:15,250 Eksakto. 555 00:33:15,250 --> 00:33:19,170 Kapag foo babalik at hit na kulot suhay, ang programa ay upang magpatuloy 556 00:33:19,170 --> 00:33:25,060 hindi upang bumalik sa pangunahing, ito ay pagpunta sa bumalik sa anumang address na pulang kahon. 557 00:33:25,060 --> 00:33:28,600 >> Sa kaso ng circumventing ng pagpaparehistro ng software, 558 00:33:28,600 --> 00:33:32,260 paano kung ang address na ibinalik sa function na normal ay makakakuha tinatawag 559 00:33:32,260 --> 00:33:35,690 pagkatapos mo binayaran para sa software at inputted ang iyong pagpaparehistro code? 560 00:33:35,690 --> 00:33:39,870 Maaari mong pag-uri-uriin ng nanlilinlang ang computer sa hindi pagpunta dito ngunit sa halip ng pagpunta dito. 561 00:33:39,870 --> 00:33:45,100 O kung ikaw ay talagang matalino, kalaban ng aktwal type in sa keyboard, halimbawa, 562 00:33:45,100 --> 00:33:50,690 hindi isang aktwal na salita, hindi 20 character, ngunit ipagpalagay siya aktwal na uri sa 563 00:33:50,690 --> 00:33:52,770 ilang mga character na kumakatawan code. 564 00:33:52,770 --> 00:33:55,320 At hindi ito pagpunta sa C code, aktwal na ito ang mga character na 565 00:33:55,320 --> 00:33:59,290 na kumakatawan sa binary code machine, 0s at 1s. 566 00:33:59,290 --> 00:34:01,290 Ngunit ipagpalagay na ito ay matalino sapat na upang gawin iyon, 567 00:34:01,290 --> 00:34:06,500 sa paano pa man i-paste sa GetString prompt ng isang bagay na mahalagang inipon code, 568 00:34:06,500 --> 00:34:09,980 at ang huling 4 bytes patungan na return address. 569 00:34:09,980 --> 00:34:13,360 At kung ano ang address ay input na gawin? 570 00:34:13,360 --> 00:34:18,630 Ito aktwal na nag-iimbak sa pulang parihaba ang address ng unang byte ng buffer. 571 00:34:18,630 --> 00:34:23,070 Kaya mayroon kang talagang matalino, at ito ng maraming pagsubok at error para sa mga masamang tao out doon, 572 00:34:23,070 --> 00:34:25,639 ngunit kung maaari mong malaman kung gaano kalaki ang buffer ito 573 00:34:25,639 --> 00:34:28,820 tulad na ang huling ilang mga byte sa input magbigay sa iyo sa programa 574 00:34:28,820 --> 00:34:33,540 mangyari katumbas sa address ng simula ng iyong buffer, maaari mong gawin ito. 575 00:34:33,540 --> 00:34:39,320 Kung sabihin namin normal kumusta at \ 0, na kung ano ang nagtatapos sa buffer. 576 00:34:39,320 --> 00:34:44,420 Ngunit kung hindi namin mas matalino at punan namin na buffer sa kung ano ang makikita namin generically call na code ng atake - 577 00:34:44,420 --> 00:34:48,860 AAA, atake, atake, atake - kung saan ito ay isang bagay na ang isang bagay masamang, 578 00:34:48,860 --> 00:34:51,820 kung ano ang mangyayari kung ikaw ay talagang matalino, maaari mong gawin ito. 579 00:34:51,820 --> 00:34:58,610 Sa pulang kahon dito ay isang sequence ng mga numero - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Pansinin na na tumutugma sa numero na dito. 581 00:35:01,610 --> 00:35:04,430 Sa reverse pagkakasunud-sunod, ngunit higit pa sa na ang ilang iba pang mga oras. 582 00:35:04,430 --> 00:35:08,140 Pansinin na ang return address na ito ay sadyang binago 583 00:35:08,140 --> 00:35:12,020 katumbas ng address dito, hindi ang address ng pangunahing. 584 00:35:12,020 --> 00:35:17,500 Kaya kung ang masamang tao ay sobrang na smart, siya ay pagpunta sa isama sa na atake code 585 00:35:17,500 --> 00:35:20,930 isang bagay tulad ng tanggalin ang lahat ng mga file ng user o kopyahin ang mga password 586 00:35:20,930 --> 00:35:24,680 o lumikha ng isang user account na maaari kong pagkatapos ay mag-log in sa - anumang bagay sa lahat. 587 00:35:24,680 --> 00:35:26,950 >> At ito ay parehong mga panganib at ang kapangyarihan ng C. 588 00:35:26,950 --> 00:35:29,840 Dahil mayroon kang access sa memory sa pamamagitan ng pointer 589 00:35:29,840 --> 00:35:32,520 at maaari mong samakatuwid isulat ang anumang nais mo sa memory ng computer, 590 00:35:32,520 --> 00:35:35,080 maaari kang gumawa ng computer ng isang gawin ang anumang nais mo 591 00:35:35,080 --> 00:35:39,550 sa pamamagitan lamang ng pag-ito tumalon sa paligid sa loob ng sarili nitong espasyo sa memory. 592 00:35:39,550 --> 00:35:44,650 At iba pa sa araw na ito kaya maraming mga programa at mga website na maraming na nakompromiso 593 00:35:44,650 --> 00:35:46,200 pasingawan sa mga tao na sinasamantala ng mga ito. 594 00:35:46,200 --> 00:35:50,760 At maaaring ito tila tulad ng isang sobrang sopistikadong atake, ngunit ito ay hindi palaging simulan na paraan. 595 00:35:50,760 --> 00:35:53,560 Katotohanan ay na ang masamang tao ay karaniwang gawin ay, 596 00:35:53,560 --> 00:35:58,200 kung ito ay isang programa sa command line o isang GUI na programa o sa isang website, 597 00:35:58,200 --> 00:35:59,940 mo lang simulan ang pagbibigay ng bagay na walang kapararakan. 598 00:35:59,940 --> 00:36:03,980 Kang mag-type sa isang talagang malaking salita sa patlang ng paghahanap at pindutin ang Enter, 599 00:36:03,980 --> 00:36:05,780 at maghintay upang makita kung nagka-crash ang website 600 00:36:05,780 --> 00:36:09,990 o hintayin mo upang makita kung ang programa sa manifests ilang mga mensahe ng error 601 00:36:09,990 --> 00:36:14,330 dahil kung makakuha ka ng masuwerteng bilang ang masamang tao at magbigay sa iyo ng ilang mabaliw input 602 00:36:14,330 --> 00:36:18,980 na nagka-crash sa programa, na nangangahulugan na programmer ay hindi inaasahan ang iyong masamang pag-uugali, 603 00:36:18,980 --> 00:36:23,630 na nangangahulugan na maaari mong malamang na may sapat na pagsisikap, sapat na pagsubok at error, 604 00:36:23,630 --> 00:36:26,650 malaman kung paano sa pasahod ng mas tumpak na pag-atake. 605 00:36:26,650 --> 00:36:31,410 Kaya bilang magkano ang isang bahagi ng seguridad ay hindi lamang pag-iwas sa mga pag-atake na ito nang sama-sama 606 00:36:31,410 --> 00:36:34,100 ngunit detect ang mga ito at talagang aktwal na tumitingin sa mga tala ng 607 00:36:34,100 --> 00:36:36,780 at nakikita kung ano ang mabaliw input ay may mga tao na nai-type sa iyong website, 608 00:36:36,780 --> 00:36:38,960 kung ano ang mga term sa paghahanap na mga tao-type sa iyong website 609 00:36:38,960 --> 00:36:42,870 sa pag-asa ng umaapaw ilang buffer. 610 00:36:42,870 --> 00:36:45,500 At ito kahulihan babagsak sa simpleng mga pangunahing kaalaman ng kung ano ang isang array 611 00:36:45,500 --> 00:36:49,080 at kung ano ang ibig sabihin upang maglaan at gamitin ang memory. 612 00:36:49,080 --> 00:36:51,710 >> Na may kaugnayan sa na pagkatapos ay masyadong ito. 613 00:36:51,710 --> 00:36:54,280 Sabihin lamang sulyap sa loob ng isang hard drive pa muli. 614 00:36:54,280 --> 00:36:58,440 Manariwa sa diwa ka mula sa isa o dalawang linggo ang nakalipas na kapag ikaw ay i-drag ang mga file sa iyong recycle bin o basurahan, 615 00:36:58,440 --> 00:37:03,710 ano ang mangyayari? >> [Mag-aaral] Walang. >> GANAP wala, i-right? 616 00:37:03,710 --> 00:37:05,740 Sa paglaon kung nagpapatakbo ka mababa sa disk space, 617 00:37:05,740 --> 00:37:08,190 Windows o Mac OS ay simulan ang pagtanggal ng mga file para sa iyo. 618 00:37:08,190 --> 00:37:10,390 Ngunit kung mong i-drag ang isang bagay sa doon, na hindi sa lahat ng ligtas. 619 00:37:10,390 --> 00:37:13,800 Lahat ng iyong mga kasama o kaibigan o miyembro ng pamilya ay may sa gawin ay i-double click at, voila, 620 00:37:13,800 --> 00:37:16,310 may lahat ang pahapyaw na mga file na sinubukan mong tanggalin. 621 00:37:16,310 --> 00:37:19,590 Karamihan sa atin ng hindi bababa sa malaman na mayroon kang upang i-right click o Kontrolin ang pag-click 622 00:37:19,590 --> 00:37:22,310 at walang laman ang basura o isang bagay tulad na. 623 00:37:22,310 --> 00:37:25,000 Ngunit kahit na pagkatapos na hindi pa gawin ang nanlilinlang 624 00:37:25,000 --> 00:37:28,010 dahil kung ano ang mangyayari kapag mayroon ka ng isang file sa iyong hard drive 625 00:37:28,010 --> 00:37:32,770 na kumakatawan ang ilang mga dokumento ng Word o ilang JPEG, at ito ay kumakatawan sa iyong hard drive, 626 00:37:32,770 --> 00:37:35,350 at sabihin nating ito salubsob dito ay kumakatawan sa file na iyon, 627 00:37:35,350 --> 00:37:38,390 at ito ay binubuo ng isang buong bungkos ng 0s at 1s. 628 00:37:38,390 --> 00:37:42,470 Ano ang mangyayari kapag hindi mo lamang i-drag ang file na iyon sa trash maaari o recycle bin 629 00:37:42,470 --> 00:37:48,020 ngunit din alisan ng laman ang mga ito? Pagsunud-sunurin ng walang. 630 00:37:48,020 --> 00:37:49,640 Ito ay hindi ganap na walang ngayon. 631 00:37:49,640 --> 00:37:54,290 Ngayon lang wala dahil ang isang maliit na isang bagay na mangyayari sa paraan ng table na ito. 632 00:37:54,290 --> 00:37:58,370 Kaya may ilang mga uri ng database o talahanayan sa loob ng memorya ng isang computer 633 00:37:58,370 --> 00:38:03,850 na mahalagang na may isang hanay para sa mga file na 'pangalan at isang hanay para sa mga file na' lokasyon, 634 00:38:03,850 --> 00:38:07,720 kung saan maaaring ito ay ang lokasyon 123, lamang ng random na numero. 635 00:38:07,720 --> 00:38:14,560 Kaya maaari naming magkaroon ng tulad ng x.jpeg at lokasyon 123. 636 00:38:14,560 --> 00:38:18,800 Ano ang mangyayari pagkatapos ay kapag aktwal mong alisan ng laman ang iyong basurahan? 637 00:38:18,800 --> 00:38:20,330 Na mawala. 638 00:38:20,330 --> 00:38:23,610 Ngunit ano ay hindi umalis ang 0s at 1s. 639 00:38:23,610 --> 00:38:26,270 >> Kaya kung ano ang pagkatapos ay ang koneksyon sa pset4? 640 00:38:26,270 --> 00:38:31,240 Well, may pset4, dahil lang sa hindi sinasadyang kami mabubura ang compact flash card 641 00:38:31,240 --> 00:38:35,750 na mayroon ang lahat ng mga larawan o dahil lang sa ito sa pamamagitan ng alat naging Nasira 642 00:38:35,750 --> 00:38:38,000 ay hindi nangangahulugan na ang 0s at 1s ay hindi pa rin doon. 643 00:38:38,000 --> 00:38:40,410 Siguro ang ilan sa mga ito ay nawala dahil isang bagay Nakakuha Nasira 644 00:38:40,410 --> 00:38:43,320 sa kamalayan na ang ilang 0s naging 1s at 1s naging 0s. 645 00:38:43,320 --> 00:38:47,240 Bad bagay ay maaaring mangyari dahil sa maraming surot software o depekto hardware. 646 00:38:47,240 --> 00:38:50,370 Ngunit maraming ng mga bit, marahil kahit na 100% ng mga ito, hindi pa rin doon. 647 00:38:50,370 --> 00:38:55,050 Lang na ang computer o ang camera ay hindi alam kung saan JPEG1 makapagsimula 648 00:38:55,050 --> 00:38:56,910 at kung saan JPEG2 makapagsimula. 649 00:38:56,910 --> 00:39:01,070 Ngunit kung ikaw, programmer, alam na may bit ng savvy na kung saan ang mga JPEG na 650 00:39:01,070 --> 00:39:06,010 o kung ano ang tumingin sila tulad ng sa gayon ay maaari mong pag-aralan ang 0s at 1s at sabihin JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 Maaari kang magsulat ng isang programa na may mahalagang lamang para sa o habang loop 652 00:39:09,440 --> 00:39:12,820 na recovers sa bawat isa sa mga file. 653 00:39:12,820 --> 00:39:16,030 Kaya aralin pagkatapos ay upang simulan ang secure na binubura ang iyong mga file 654 00:39:16,030 --> 00:39:18,340 kung nais mong upang maiwasan ang kabuuan. Oo. 655 00:39:18,340 --> 00:39:21,010 >> [Mag-aaral] Paano dumating sinasabi nito sa iyong computer 656 00:39:21,010 --> 00:39:23,550 na mayroon kang higit pang memory kaysa ginawa mo dati? 657 00:39:23,550 --> 00:39:27,820 Magkaroon ng higit pang memory kaysa ginawa mo dati - >> [mag-aaral] Higit pang mga magagamit na memorya. 658 00:39:27,820 --> 00:39:29,630 Oh. Magandang tanong. 659 00:39:29,630 --> 00:39:32,360 Kaya bakit pagkatapos tinatanggalan ng laman ang trash ang iyong computer sabihin sa iyo 660 00:39:32,360 --> 00:39:34,910 na mayroon kang higit libreng espasyo kaysa ginawa mo dati? 661 00:39:34,910 --> 00:39:36,770 Sa maikling sabi, dahil ito namamalagi. 662 00:39:36,770 --> 00:39:40,740 Mas technically, ikaw ay walang higit pang espasyo dahil ngayon mo pa sinabi 663 00:39:40,740 --> 00:39:43,680 maaari mong ilagay ang iba pang mga bagay-bagay na kung saan ang file na sabay-sabay ay. 664 00:39:43,680 --> 00:39:45,450 Ngunit iyon ay hindi nangangahulugan na ang mga bits ay mawawala, 665 00:39:45,450 --> 00:39:48,590 at na ay hindi nangangahulugan na ang mga bits ay nabago sa lahat ng 0s, halimbawa, 666 00:39:48,590 --> 00:39:50,150 para sa iyong proteksyon. 667 00:39:50,150 --> 00:39:54,640 Kaya sa pamamagitan ng kaibahan, kung burahin mo secure file o pisikal na sirain ang aparato, 668 00:39:54,640 --> 00:39:57,300 na talagang ay ang tanging paraan na minsan sa paligid na. 669 00:39:57,300 --> 00:40:02,020 >> Kaya bakit hindi namin umalis sa na semi-nakakatakot na tala, at kami ay nakikita mo sa Lunes. 670 00:40:02,020 --> 00:40:07,000 [Palakpakan] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]