1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Тыдзень 5] 2 00:00:02,860 --> 00:00:04,860 [David J. малая - Гарвардскі універсітэт] 3 00:00:04,860 --> 00:00:07,260 [Гэта CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Гэта CS50, 5-я тыдзень. 5 00:00:09,740 --> 00:00:12,900 Сёння і на гэтым тыдні, мы ўводзім трохі свеце судова-медыцынскай экспертызы 6 00:00:12,900 --> 00:00:14,850 ў кантэксце пастаўленай задачы 4. 7 00:00:14,850 --> 00:00:18,480 Сёння будзе скарочана лекцыю, таму што ёсць спецыяльнае мерапрыемства тут пасля. 8 00:00:18,480 --> 00:00:21,940 Таму мы зазірнуць і дражніць як студэнтаў, так і іх бацькоў сёння 9 00:00:21,940 --> 00:00:24,600 з некаторымі з рэчаў, якія на гарызонце. 10 00:00:24,600 --> 00:00:29,050 >> Сярод іх, як у панядзелак, у вас будзе яшчэ некалькі аднакласнікаў. 11 00:00:29,050 --> 00:00:32,980 EDX, Гарвард і новыя онлайн ініцыятыве MIT для OpenCourseWare і больш, 12 00:00:32,980 --> 00:00:36,730 запускае на кампусе Гарвардскага універсітэта ў панядзелак, што азначае прыйшоў панядзелак 13 00:00:36,730 --> 00:00:40,930 Вы будзеце мець, па стане апошніх падліках, 86 тысяч дадатковых аднакласнікаў 14 00:00:40,930 --> 00:00:43,680 хто будзе наступным разам з лекцыямі CS50 і секцыі 15 00:00:43,680 --> 00:00:45,890 і пакрокавыя кіраўніцтва і праблема мностваў. 16 00:00:45,890 --> 00:00:51,870 І як частка гэтага, вы станеце сябрамі першага класа CS50 і цяпер CS50x. 17 00:00:51,870 --> 00:00:56,150 У рамках гэтага цяпер, разумею, што там будуць нейкія станоўчыя моманты, а таксама. 18 00:00:56,150 --> 00:01:00,620 Каб падрыхтавацца да гэтага, для вялікай колькасці студэнтаў, 19 00:01:00,620 --> 00:01:03,820 Дастаткова сказаць, што, хоць у нас ёсць 108 TFs і сертыфікацыі, 20 00:01:03,820 --> 00:01:07,560 гэта не зусім лепшы вучань-настаўнік суадносінах адзін раз мы патрапілі 80000 студэнтаў. 21 00:01:07,560 --> 00:01:09,830 Мы не збіраемся быць сартаванне столькі праблема устанаўліваецца ўручную, 22 00:01:09,830 --> 00:01:13,050 так прадставіла на гэтым тыдні ў задачы набор будзе CS50 праверкі, 23 00:01:13,050 --> 00:01:15,410 які будзе ўтыліту каманднага радка ўнутры прыбора 24 00:01:15,410 --> 00:01:17,880 што вы атрымаеце, як толькі вы абновіце яго ў канцы гэтага тыдня. 25 00:01:17,880 --> 00:01:21,030 Вы будзеце мець магчымасць запускаць каманды, check50, на свой уласны PSET, 26 00:01:21,030 --> 00:01:24,770 і вы атрымаеце імгненную зваротную сувязь адносна таго, ваша праграма з'яўляецца правільнай ці няправільнай 27 00:01:24,770 --> 00:01:27,980 у адпаведнасці з рознымі спецыфікацыямі дызайну, якія мы прадстаўляем. 28 00:01:27,980 --> 00:01:30,310 Больш падрабязна аб гэтым у апісанні мноства праблем. 29 00:01:30,310 --> 00:01:34,220 CS50x аднакласнікі будуць выкарыстоўваць яго. 30 00:01:34,220 --> 00:01:36,170 >> Праблема Set 4 гэта ўсё аб судовай экспертызы, 31 00:01:36,170 --> 00:01:38,630 і гэта PSET быў сапраўды натхнёны некаторыя рэальныя рэчы 32 00:01:38,630 --> 00:01:41,210 якому, калі я быў у аспірантуры я інтэрнаваныя на час 33 00:01:41,210 --> 00:01:45,270 з офісам акруговага пракурора акругі Миддлсекс справы ідуць судова-медыцынскай экспертызы 34 00:01:45,270 --> 00:01:47,660 з іх вядучым судовым следчым. 35 00:01:47,660 --> 00:01:50,280 Што гэта азначала, як я думаю, я ўжо некалькі тыдняў мінулым, 36 00:01:50,280 --> 00:01:52,720 маса Дзяржаўнай паліцыі або іншых ўвойдзе, 37 00:01:52,720 --> 00:01:56,150 яны сыходзяць такія рэчы, як цвёрдыя дыскі і кампакт-дыскі і дыскеты і да т.п., 38 00:01:56,150 --> 00:01:58,770 і тады мэта офіс экспертызы было высветліць 39 00:01:58,770 --> 00:02:01,470 было, ці не было доказаў нейкі. 40 00:02:01,470 --> 00:02:04,730 Гэта быў Спецыяльная следчая група, так што белых каўнерыкаў злачынствы. 41 00:02:04,730 --> 00:02:10,949 Гэта было больш трывожным роду злачынствах, нічога удзелам некаторых відаў лічбавых носьбітаў. 42 00:02:10,949 --> 00:02:16,450 Аказваецца, што не так шмат людзей пішуць ліст сказаўшы: "Я зрабіў гэта". 43 00:02:16,450 --> 00:02:20,490 Так даволі часта, гэтыя судовыя пошукі не апынуцца ўсе, што шмат садавіны, 44 00:02:20,490 --> 00:02:22,820 але часам людзі будуць пісаць такія лісты. 45 00:02:22,820 --> 00:02:25,240 Так што часам, намаганні былі ўзнагароджаныя. 46 00:02:25,240 --> 00:02:31,210 >> Але даводзіць да гэтага судова PSET, мы будзем прадстаўляць у pset4 трохі графікі. 47 00:02:31,210 --> 00:02:35,410 Вы, напэўна, узяць гэтыя рэчы само сабой разумеецца - JPEG, GIF, і да таго падобнае - у гэтыя дні. 48 00:02:35,410 --> 00:02:38,320 Але калі вы сапраўды думаеце пра гэта, малюнак, гэтак жа, як асоба Роба, 49 00:02:38,320 --> 00:02:41,270 могуць быць змадэляваныя ў выглядзе паслядоўнасці кропак ці пікселяў. 50 00:02:41,270 --> 00:02:43,380 У выпадку твары Роба, ёсць усе віды кветак, 51 00:02:43,380 --> 00:02:46,760 і мы пачалі бачыць асобныя кропкі, інакш вядомы як кропак, 52 00:02:46,760 --> 00:02:48,610 як толькі мы пачалі, каб павялічыць маштаб 53 00:02:48,610 --> 00:02:54,660 Але калі мы спросцім свеце няшмат, і проста сказаць, што гэта тут Роб у чорна-белым, 54 00:02:54,660 --> 00:02:57,490 прадстаўляць чорнае і белае, мы можам проста выкарыстоўваць бінарны. 55 00:02:57,490 --> 00:03:01,660 І калі мы збіраемся выкарыстаць двайковы, 1 або 0, мы можам выказаць гэта ж малюнак 56 00:03:01,660 --> 00:03:06,140 ўсьмешлівы твар Адзежа з гэтай карціны біт. 57 00:03:06,140 --> 00:03:12,100 11000011 ўяўляе белы, белы, чорны, чорны, чорны, чорны, белы, белы. 58 00:03:12,100 --> 00:03:16,150 І гэта не велізарны скачок потым пачынаюць казаць пра маляўнічых фатаграфій, 59 00:03:16,150 --> 00:03:18,600 рэчы, якія вы бачыце на Facebook або ўзяць з сабой лічбавую камеру. 60 00:03:18,600 --> 00:03:21,410 Але, вядома, калі справа даходзіць да кветак, вам трэба больш бітаў. 61 00:03:21,410 --> 00:03:25,690 І вельмі распаўсюджаны ў свеце фатаграфіі з'яўляецца выкарыстанне не з'яўляецца 1-бітны колер, 62 00:03:25,690 --> 00:03:29,560 так як гэта прадугледжвае, але 24-бітны колер, дзе вы фактычна атрымліваеце мільёны кветак. 63 00:03:29,560 --> 00:03:32,250 Так як у выпадку, калі мы павялічана на вочы Роба, 64 00:03:32,250 --> 00:03:36,370 , Што было любую колькасць мільёны розных маляўнічых магчымасцяў. 65 00:03:36,370 --> 00:03:39,040 Такім чынам, мы ўвядзем гэта ў праблеме Set 4, а таксама ў кіраўніцтве 66 00:03:39,040 --> 00:03:43,370 які будзе сёння ў 3:30 замест звычайнага 2:30, таму што лекцыі пятніцу тут. 67 00:03:43,370 --> 00:03:46,620 Але відэа будзе ў рэжыме онлайн, як звычайна, заўтра. 68 00:03:46,620 --> 00:03:48,820 >> Мы таксама пазнаёмім вас з іншы фармат файла. 69 00:03:48,820 --> 00:03:51,270 Гэта загадзя павінна выглядаць страшным на першы, 70 00:03:51,270 --> 00:03:55,670 Але гэта толькі некаторыя дакументы для структуры C. 71 00:03:55,670 --> 00:03:58,940 Аказваецца, Microsoft гадоў назад дапамог папулярызаваць гэты фармат 72 00:03:58,940 --> 00:04:05,150 называецца растравы фармат, BMP, і гэта было супер просты, маляўнічы графічны фармат файла 73 00:04:05,150 --> 00:04:10,150 , Якая была выкарыстаная на працягу досыць доўгага часу, а часам яшчэ для шпалер на працоўных сталах. 74 00:04:10,150 --> 00:04:14,760 Калі вы думаеце, вярнуцца да Windows XP і пагоркаў і блакітнага неба, 75 00:04:14,760 --> 00:04:17,170 , Што было тыпова BMP або растравыя выявы. 76 00:04:17,170 --> 00:04:19,959 Растравых малюнкаў з'яўляюцца забавай для нас, таму што ў іх ёсць трохі больш складанасці. 77 00:04:19,959 --> 00:04:22,610 Гэта не так проста, як гэта сетка з 0 і 1. 78 00:04:22,610 --> 00:04:27,510 Замест гэтага, у Вас ёсць такія рэчы, як загаловак у пачатку файла. 79 00:04:27,510 --> 00:04:31,990 Такім чынам, іншымі словамі, усярэдзіне. Файлаў BMP ўяўляе сабой цэлы букет з 0 і 1, 80 00:04:31,990 --> 00:04:34,910 але ёсць некаторыя дадатковыя 0 і 1 у там. 81 00:04:34,910 --> 00:04:38,220 І атрымліваецца, што тое, што мы, верагодна, само сабой якія разумеюцца на працягу многіх гадоў - 82 00:04:38,220 --> 00:04:45,170 фарматы файлаў, як. дакумент або. або XLS. mp3,. mp4, незалежна ад фарматаў файлаў 83 00:04:45,170 --> 00:04:48,480 што вы знаёмыя з - што гэта ўвогуле значыць быць фармат файла, 84 00:04:48,480 --> 00:04:52,480 таму што ў рэшце рэшт усе гэтыя файлы, якія мы выкарыстоўваем, маюць толькі 0 і 1. 85 00:04:52,480 --> 00:04:56,810 А можа быць, гэтыя 0 і 1 ўяўляюць ABC праз ASCII і да т.п., 86 00:04:56,810 --> 00:04:58,820 але, у рэшце рэшт, гэта яшчэ толькі 0 і 1. 87 00:04:58,820 --> 00:05:02,100 Такім чынам, людзі проста часам вырашылі вынайсці новы фармат файлаў 88 00:05:02,100 --> 00:05:06,420 дзе яны стандартызацыі, якія мадэлі біт будзе на самой справе маю на ўвазе. 89 00:05:06,420 --> 00:05:09,220 І ў гэтым выпадку тут, людзі, якія распрацаваны растравы фармат 90 00:05:09,220 --> 00:05:15,620 Кажуць, што ў самы першы байт у растравы файл, як пазначаць зрушэнне 0 там, 91 00:05:15,620 --> 00:05:18,940 там будзе некалькі загадкава імем зменнай bfType, 92 00:05:18,940 --> 00:05:23,080 які проста каштуе для растравага тыпу файла, тып файла растравага малюнка заключаецца ў наступным. 93 00:05:23,080 --> 00:05:27,700 Можна зрабіць выснову, магчыма, з другога шэрагу, што зрушэнне 2, байт нумар 2, 94 00:05:27,700 --> 00:05:33,740 мае малюнак з 0 і 1, якая прадстаўляе што? Памер нешта. 95 00:05:33,740 --> 00:05:35,310 І гэта ідзе адтуль. 96 00:05:35,310 --> 00:05:37,410 Такім чынам, у праблеме Set 4, вы будзеце прайшоў праз некаторыя з гэтых рэчаў. 97 00:05:37,410 --> 00:05:39,520 Мы не будзем у канчатковым выніку клопат пра ўсіх з іх. 98 00:05:39,520 --> 00:05:47,510 Але заўважце, гэта пачынае станавіцца цікавым вакол байт 54: rgbtBlue, зялёны і чырвоны. 99 00:05:47,510 --> 00:05:52,110 Калі вы калі-небудзь чулі скарачэнне RGB - чырвоны, зялёны, сіні - гэта спасылка на гэты 100 00:05:52,110 --> 00:05:54,610 таму што аказваецца, можна маляваць ўсе колеры вясёлкі 101 00:05:54,610 --> 00:05:58,180 з некаторай камбінацыяй чырвонага і сіняга і зялёнага. 102 00:05:58,180 --> 00:06:03,320 І на самай справе, бацькі ў зале маглі б узгадаць некаторыя з самых ранніх праектараў. 103 00:06:03,320 --> 00:06:05,890 У гэтыя дні, вы бачыце толькі адзін яркі святло, выходны з аб'ектыва, 104 00:06:05,890 --> 00:06:09,800 Але вернемся ў дзень, у вас чырвоныя лінзы, блакітныя лінзы і зялёныя лінзы, 105 00:06:09,800 --> 00:06:13,380 і разам яны накіраваны на экране і сфармаваў маляўнічую карціну. 106 00:06:13,380 --> 00:06:16,270 І даволі часта, сярэдняй школы і ВНУ будуць мець тыя лінзы 107 00:06:16,270 --> 00:06:19,720 ледзь-ледзь крыва, так што вы былі свайго роду бачым двайныя або патройныя малюнкаў. 108 00:06:19,720 --> 00:06:24,100 Але гэта была ідэя. Вы былі чырвоны і зялёны і сіні святло намаляваць карціну. 109 00:06:24,100 --> 00:06:26,590 І той жа самы прынцып выкарыстоўваецца ў кампутарах. 110 00:06:26,590 --> 00:06:30,230 >> Такім чынам, сярод праблем, то для Вас ў праблеме Set 4 збіраемся быць некалькі рэчаў. 111 00:06:30,230 --> 00:06:34,800 Адным з іх з'яўляецца на самай справе змяніць памер малюнка, каб узяць у карціну 0 і 1, 112 00:06:34,800 --> 00:06:40,200 высветліць, якія кавалкі 0 і 1 уяўляюць тое, што ў структуры, як гэта, 113 00:06:40,200 --> 00:06:43,630 , А затым высветліць, як паўтарыць пікселяў - чырвонага, блюз, зеляніна - 114 00:06:43,630 --> 00:06:46,660 ўнутры так, што, калі карціна выглядае так першапачаткова, 115 00:06:46,660 --> 00:06:49,210 гэта можа выглядаць так, а не пасля гэтага. 116 00:06:49,210 --> 00:06:53,640 Сярод іншых праблем таксама будзе, што вы будзеце перададзены судова малюнак 117 00:06:53,640 --> 00:06:56,030 фактычнага файл з лічбавай камеры. 118 00:06:56,030 --> 00:06:58,960 І на гэтай камеры, калісьці, было цэлая куча фатаграфій. 119 00:06:58,960 --> 00:07:03,760 Задача мы выпадкова сцёртыя або быў вобраз пашкоджаны нейкім чынам. 120 00:07:03,760 --> 00:07:05,750 Дрэнныя рэчы здараюцца з лічбавых камер. 121 00:07:05,750 --> 00:07:09,150 І таму мы хутка скапіяваць усё 0 і 1 з гэтай картай для вас, 122 00:07:09,150 --> 00:07:13,610 захаваць іх усё ў адзін вялікі файл, а затым мы будзем перадаваць іх вам у праблеме Set 4 123 00:07:13,610 --> 00:07:19,320 так што вы можаце напісаць праграму на C, з якім, каб аднавіць усе з тых, JPEG, ідэальна. 124 00:07:19,320 --> 00:07:23,330 І аказваецца, што JPEG, нават калі яны чымсьці складаны фармат файла - 125 00:07:23,330 --> 00:07:26,360 яны значна больш складанай, чым гэта ўсьмешлівы твар тут - 126 00:07:26,360 --> 00:07:31,160 Аказваецца, што кожны JPEG пачынаецца з тых жа мадэляў з 0 і 1. 127 00:07:31,160 --> 00:07:35,630 Такім чынам, выкарыстоўваючы, у канчатковым рахунку, у той час як цыкл або цыкл ці аналагічны, 128 00:07:35,630 --> 00:07:38,880 Вы можаце перабраць усе 0 і 1 у гэтай судовай малюнка, 129 00:07:38,880 --> 00:07:43,150 і кожны раз, калі вы бачыце адмысловы шаблон, які вызначаны ў спецыфікацыі пастаўленай задачы, 130 00:07:43,150 --> 00:07:47,880 Вы можаце выказаць здагадку, вось, з вельмі высокай верагоднасцю, пачала JPEG. 131 00:07:47,880 --> 00:07:51,230 І як толькі вы знойдзеце па той жа схеме некаторы колькасць байт 132 00:07:51,230 --> 00:07:55,430 або кілабайтах або мегабайтах пазней, можна выказаць здагадку, вось другі JPEG, 133 00:07:55,430 --> 00:07:57,380 фота я ўзяў пасля таго, як першы. 134 00:07:57,380 --> 00:08:01,370 Дазвольце мне спыніцца чытаў, што першы файл, пачаць пісаць гэтую новую, 135 00:08:01,370 --> 00:08:06,310 і выхад з вашай праграмы для pset4 будзе цэлых 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 А калі гэта не 50 JPEG, у вас ёсць трохі цыклу. 137 00:08:09,270 --> 00:08:12,490 Калі ў вас ёсць бясконцая колькасць JPEG, у вас ёсць бясконцы цыкл. 138 00:08:12,490 --> 00:08:14,910 Так што таксама будзе даволі распаўсюджаны выпадак. 139 00:08:14,910 --> 00:08:16,600 Дык вось што на гарызонце. 140 00:08:16,600 --> 00:08:21,310 >> Віктарына 0 за намі, разумеюць, на маю электронную пошту, якая нязменна ёсць людзі, якія абодва шчаслівыя, 141 00:08:21,310 --> 00:08:23,640 роду нейтральная, і сумна вакол віктарына 0 раз. 142 00:08:23,640 --> 00:08:26,800 І, калі ласка, дацягнуцца да мяне, галава TF Zamyla, вашы ўласныя TF, 143 00:08:26,800 --> 00:08:31,180 або аднаго з цэнтраў сертыфікацыі, якія вы ведаеце, калі вы хацелі б абмеркаваць, як усё прайшло. 144 00:08:31,180 --> 00:08:35,539 >> Такім чынам, каб вырабіць ўражанне на бацькоў тут, у пакоі, што CS50 бібліятэку? 145 00:08:36,429 --> 00:08:40,390 [Смяецца] Добрая праца. 146 00:08:40,390 --> 00:08:48,340 Што CS50 бібліятэку? Так. >> [Студэнт] Гэта папярэдняга пісьмовага набору кода [неразборліва] 147 00:08:48,340 --> 00:08:49,750 Добра, добра. 148 00:08:49,750 --> 00:08:53,240 Гэта папярэдняга пісьмовага набору кода, які мы напісалі супрацоўнікаў, мы даем вам, 149 00:08:53,240 --> 00:08:55,030 , Што дае некаторыя агульныя функцыянальныя магчымасці, 150 00:08:55,030 --> 00:08:59,020 такія рэчы, як мне атрымаць радок, зразумейце мяне INT - усе функцыі, пералічаныя тут. 151 00:08:59,020 --> 00:09:02,260 >> Пачынаючы з гэтага моманту, мы пачынаем па-сапраўднаму ўзяць гэтыя навучальныя колы прэч. 152 00:09:02,260 --> 00:09:05,050 Мы збіраемся пачаць, каб забраць радок з вас, 153 00:09:05,050 --> 00:09:08,870 Нагадаем які быў усяго толькі сінонім, што фактычны тып дадзеных? >> [Некалькі студэнтаў] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Для бацькоў, якія, верагодна, [робіць свісцячы гук]. Гэта добра. 155 00:09:12,730 --> 00:09:17,550 Char *, мы пачнем бачыць на экране ўсё больш, як мы выдаліць радок з нашага лексікону, 156 00:09:17,550 --> 00:09:19,730 па крайняй меры калі справа даходзіць да фактычнага напісання кода. 157 00:09:19,730 --> 00:09:22,840 Акрамя таго, мы будзем адмовіцца ад выкарыстання некаторых з гэтых функцый, як шмат 158 00:09:22,840 --> 00:09:25,280 таму што нашы праграмы збіраюцца атрымаць больш выдасканаленымі. 159 00:09:25,280 --> 00:09:28,480 Замест таго, каб пісаць праграмы, якія сядзяць там з запытам міргаць, 160 00:09:28,480 --> 00:09:31,870 чакання для карыстальніка, каб надрукаваць што-небудзь, вы будзеце атрымліваць вашыя матэрыялы з іншых крыніц. 161 00:09:31,870 --> 00:09:35,490 Напрыклад, Вы будзеце атрымліваць іх з паслядоўнасці бітаў на лакальным цвёрдым дыску. 162 00:09:35,490 --> 00:09:38,580 Вы, а не атрымліваць іх у будучыні ад сеткі, 163 00:09:38,580 --> 00:09:40,230 некаторыя вэб-сайт где-то. 164 00:09:40,230 --> 00:09:44,110 >> Так што давайце адхіліце гэты пласт у першы раз і пацягніце ўверх CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 і гэты файл называецца cs50.h, што вы былі # уключаючы тыдняў, 166 00:09:49,010 --> 00:09:51,140 Але давайце рэальна ўбачыць, што знаходзіцца ўнутры гэтага. 167 00:09:51,140 --> 00:09:54,430 У верхняй частцы файла ў сінім гэта проста цэлая куча каментарыяў: 168 00:09:54,430 --> 00:09:57,050 Інфармацыя ліцэнзавання і гарантыі. 169 00:09:57,050 --> 00:09:59,050 Гэта свайго роду агульную парадыгму ў праграмнае забеспячэнне 170 00:09:59,050 --> 00:10:01,580 таму што шмат праграмнага забеспячэння ў гэтыя дні, што называецца адкрытым зыходным кодам, 171 00:10:01,580 --> 00:10:05,220 Гэта азначае, што нехта напісаў код, і зрабіў гэта ў вольным доступе 172 00:10:05,220 --> 00:10:10,470 Не проста запусціць і выкарыстоўваць, але на самой справе чытаць і змяняць і інтэграваць у сваю працу. 173 00:10:10,470 --> 00:10:14,660 Так вось, што вы выкарыстоўваеце праграмнае забеспячэнне з адкрытым крыніцай, хоць і ў вельмі малой формы. 174 00:10:14,660 --> 00:10:18,560 Калі я пракруціць ўніз міма каментароў, хоць, мы пачынаем бачыць некаторыя больш знаёмыя рэчы. 175 00:10:18,560 --> 00:10:25,010 Звярніце ўвагу на верхнюю тут, што файл cs50.h ўключае ў сябе цэлую кучу файлаў загалоўкаў. 176 00:10:25,010 --> 00:10:28,560 Большасць з іх, мы яшчэ не бачылі, але адзін знаёмы. 177 00:10:28,560 --> 00:10:32,270 Якія з іх мы не бачылі, хоць і ненадоўга, да гэтага часу? >> [Студэнт] Стандартная бібліятэка. 178 00:10:32,270 --> 00:10:35,810 Так, стандартныя бібліятэкі. stdlib.h мае таНос. 179 00:10:35,810 --> 00:10:38,320 Як толькі мы пачалі гаварыць аб дынамічным размеркаванні памяці, 180 00:10:38,320 --> 00:10:41,650 якія мы вернемся на наступным тыдні, а мы пачалі ў тым ліку і файлаў. 181 00:10:41,650 --> 00:10:46,640 Аказваецца, BOOL і праўдзівым і ілжывым на самой справе не існуе ў C такі 182 00:10:46,640 --> 00:10:49,440 калі вы ўключаеце гэты файл тут. 183 00:10:49,440 --> 00:10:52,710 Мы тыдняў былі ў тым ліку stdbool.h 184 00:10:52,710 --> 00:10:55,620 так што вы можаце выкарыстоўваць паняцце лагічнае, праўдзівай ці ілжывай. 185 00:10:55,620 --> 00:10:58,620 Без гэтага, вам прыйдзецца разабрацца падробленых і выкарыстоўваць Int 186 00:10:58,620 --> 00:11:02,610 і проста адвольна лічыць, што 0 з'яўляецца ілжывым і 1 дакладная. 187 00:11:02,610 --> 00:11:07,150 Калі мы пракруціць ўніз далей, вось наша вызначэнне радка. 188 00:11:07,150 --> 00:11:11,390 Аказваецца, як мы ўжо казалі раней, што там, дзе гэтая зорка сапраўды не мае значэння. 189 00:11:11,390 --> 00:11:13,720 Вы нават можаце мець прастору вакол. 190 00:11:13,720 --> 00:11:16,740 Мы ў гэтым семестры было садзейнічанне, так як гэта ясна даць зразумець, 191 00:11:16,740 --> 00:11:18,620 , Што зорка мае справу з тыпам, 192 00:11:18,620 --> 00:11:21,700 але разумею, як агульнага, калі не трохі больш агульнага, 193 00:11:21,700 --> 00:11:24,430 , Каб пакласці яго туды, але функцыянальна гэта тое ж самае. 194 00:11:24,430 --> 00:11:27,720 Але цяпер, калі мы чытаем далей уніз, давайце зірнем на GetInt 195 00:11:27,720 --> 00:11:32,190 таму што мы выкарыстоўвалі, што, магчыма, перш чым што-небудзь яшчэ ў гэтым семестры. 196 00:11:32,190 --> 00:11:37,440 Вось GetInt. Гэта што? >> [Студэнт] прататып. >> Гэта ўсяго толькі прататып. 197 00:11:37,440 --> 00:11:41,410 Часта мы паставілі прататыпы на вяршынях нашых. З файламі, 198 00:11:41,410 --> 00:11:46,690 але вы таксама можаце змясціць прататыпы ў файлы загалоўкаў,. г файлы, як гэта тут 199 00:11:46,690 --> 00:11:50,840 так што калі вы напісаць некалькі функцый, якія вы хочаце, каб іншыя людзі маглі выкарыстоўваць, 200 00:11:50,840 --> 00:11:53,550 які як раз той выпадак з бібліятэкай CS50, 201 00:11:53,550 --> 00:11:57,040 Вы не толькі рэалізаваць свае функцыі ў нешта накшталт cs50.c, 202 00:11:57,040 --> 00:12:02,790 Вы таксама змясціць прататыпы не ў верхняй часткі гэтага файла, але ў верхняй частцы загалоўка файла. 203 00:12:02,790 --> 00:12:07,170 Тады гэты загаловак файла з'яўляецца тое, што сябры і калегі ўключаюць 204 00:12:07,170 --> 00:12:09,760 з № ўключаць у свой уласны код. 205 00:12:09,760 --> 00:12:12,210 Так што ўвесь гэты час вы былі ў тым ліку ўсе гэтыя прататыпы, 206 00:12:12,210 --> 00:12:16,580 эфектыўна ў верхняй частцы вашага файла, але па шляху гэтага # ўключаць механізм, 207 00:12:16,580 --> 00:12:20,070 якія па сутнасці капіюе і ўстаўляе гэты файл у свой уласны. 208 00:12:20,070 --> 00:12:23,070 Вось некаторыя даволі падрабязную дакументацыю. 209 00:12:23,070 --> 00:12:25,640 Мы ў значнай ступені само сабой якія разумеюцца, што GetInt атрымлівае INT, 210 00:12:25,640 --> 00:12:27,640 але, аказваецца, ёсць некаторыя прыватныя выпадкі. 211 00:12:27,640 --> 00:12:31,810 Што рабіць, калі карыстальнік ўводзіць лік, якое занадта вялікі, квинтиллиона, 212 00:12:31,810 --> 00:12:35,490 што проста не можа змясціцца ўнутры Int? Якое чаканае паводзіны? 213 00:12:35,490 --> 00:12:38,020 У ідэале, гэта прадказальна. 214 00:12:38,020 --> 00:12:40,280 Такім чынам, у гэтым выпадку, калі вы на самой справе чытаць дробны шрыфт, 215 00:12:40,280 --> 00:12:44,500 Вы сапраўды будзеце бачыць, што калі радок не можа быць прачытаны, гэта вяртае INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Мы ніколі не казалі пра гэта, але, грунтуючыся на яго капіталізацыю, што гэта магчыма? 217 00:12:48,320 --> 00:12:50,640 [Студэнт] пастаянна. >> Гэта пастаянная. 218 00:12:50,640 --> 00:12:54,770 Гэта нейкая спецыяльная канстанта, якая, верагодна, заявіў у адным з гэтых файлаў загалоўкаў 219 00:12:54,770 --> 00:13:00,090 вось падняцца вышэй у файле, і INT_MAX, верагодна, нешта накшталт прыкладна 2 мільярды, 220 00:13:00,090 --> 00:13:04,990 Ідэя ў тым, што, паколькі мы павінны нейкім чынам азначае, што нешта пайшло не так, 221 00:13:04,990 --> 00:13:10,700 Мы, так, ёсць 4000000000 нумары ў нашым распараджэнні: -2 млрд. да 2 млрд., плюс-мінус. 222 00:13:10,700 --> 00:13:14,710 Ну, тое, што з'яўляецца агульным у праграмаванні ты скраў толькі адзін з гэтых нумароў, 223 00:13:14,710 --> 00:13:18,920 можа быць 0, можа быць, 2 млрд, можа быць, -2000000000, 224 00:13:18,920 --> 00:13:23,280 так што вы марнуеце адну з вашых магчымых значэнняў, так што вы можаце зрабіць у свеце 225 00:13:23,280 --> 00:13:26,820 што калі нешта пойдзе не так, я вярну гэта супер вялікае значэнне. 226 00:13:26,820 --> 00:13:31,030 Але вы не хочаце, каб карыстач друкуе нешта загадкавае, тыпу 234 ..., сапраўды вялікія ліку. 227 00:13:31,030 --> 00:13:34,060 Вы абагульніць яго, а не як канстанту. 228 00:13:34,060 --> 00:13:38,060 Так на самай справе, калі вы былі анальнага апошнія некалькі тыдняў, у любы час вы называлі GetInt, 229 00:13:38,060 --> 00:13:42,900 Вы павінны былі праверыць з умовай, калі карыстач зрабіў тыпу ў INT_MAX, 230 00:13:42,900 --> 00:13:46,590 або, больш канкрэтна, зрабілі GetInt вяртання INT_MAX, таму што калі гэта так, 231 00:13:46,590 --> 00:13:51,830 што на самой справе азначае, што яны не ўводзіце яго. Нешта пайшло не так у гэтым выпадку. 232 00:13:51,830 --> 00:13:56,080 Такім чынам, гэта тое, што звычайна называюць дазорную значэнне, якое проста азначае, асаблівы. 233 00:13:56,080 --> 00:13:58,120 >> Давайце цяпер звернемся ст. Файл з. 234 00:13:58,120 --> 00:14:01,340 Размовы C існавала ў прыбор на некаторы час. 235 00:14:01,340 --> 00:14:06,840 І на самай справе, прыбор мае гэта папярэдне скампіляваныя для вас у гэта рэч, якую мы называлі аб'ектны код, 236 00:14:06,840 --> 00:14:09,540 але гэта проста не мае значэння для вас, дзе гэта таму, што сістэма ведае, 237 00:14:09,540 --> 00:14:11,730 У гэтым выпадку, калі ён: прыбор. 238 00:14:11,730 --> 00:14:17,400 Давайце зараз пракруціць ўніз, каб GetInt і паглядзець, як GetInt працаваў ўвесь гэты час. 239 00:14:17,400 --> 00:14:19,460 Тут у нас ёсць падобныя каментары, чым раней. 240 00:14:19,460 --> 00:14:21,660 Дазвольце мне павялічыць толькі на частку кода. 241 00:14:21,660 --> 00:14:23,900 А што мы маем на GetInt заключаецца ў наступным. 242 00:14:23,900 --> 00:14:25,700 Ён не прымае ніякіх ўваходных дадзеных. 243 00:14:25,700 --> 00:14:29,510 Яна вяртае цэлае, у той час (праўда), так што ў нас ёсць наўмыснае бясконцы цыкл, 244 00:14:29,510 --> 00:14:33,180 але па-відаць, мы вырвацца з гэтага так ці вярнуць з ў гэтым. 245 00:14:33,180 --> 00:14:34,870 >> Давайце паглядзім, як гэта працуе. 246 00:14:34,870 --> 00:14:39,240 Мы, падобна, выкарыстоўваюць GetString ў гэтай першай лініяй ўнутры цыклу, 166. 247 00:14:39,240 --> 00:14:43,780 Цяпер гэта добрая практыка, таму што, пры якіх абставінах можа вярнуцца GetString 248 00:14:43,780 --> 00:14:47,660 адмысловае ключавое слова NULL? >> [Студэнт] Калі нешта пойдзе не так. 249 00:14:47,660 --> 00:14:51,630 Калі нешта пойдзе не так. І тое, што можа пайсці не так, калі вы тэлефануеце нешта накшталт GetString? 250 00:14:54,960 --> 00:14:57,640 Так. >> [Студэнт] Malloc не дае ёй цэлымі. 251 00:14:57,640 --> 00:14:59,150 Так. Можа быць, таНос не атрымоўваецца. 252 00:14:59,150 --> 00:15:03,190 Дзесьці пад капотам, GetString кліча таНос, якая вылучае памяць, 253 00:15:03,190 --> 00:15:06,020 які дазваляе кампутарным краме ўсе знакі 254 00:15:06,020 --> 00:15:07,750 пра тое, што карыстальнік набірае на клавіятуры. 255 00:15:07,750 --> 00:15:11,590 І выкажам здагадку, што карыстач меў шмат вольнага часу і набралі больш, напрыклад, 256 00:15:11,590 --> 00:15:16,160 чым 2 млрд. знакаў, больш сімвалаў, чым кампутар, нават мае RAM. 257 00:15:16,160 --> 00:15:19,250 GetString павінен быць у стане азначае, што да вас. 258 00:15:19,250 --> 00:15:22,560 Нават калі гэта супер, супер рэдкі выпадак куце, 259 00:15:22,560 --> 00:15:24,340 яна павінна нейкім чынам быць у стане справіцца з гэтым, 260 00:15:24,340 --> 00:15:28,750 і так GetString, калі б мы пайшлі назад і прачытайце дакументацыю, у рэчаіснасці NULL вяртанне. 261 00:15:28,750 --> 00:15:34,460 Так што цяпер, калі GetString не атрымоўваецца, вяртаючы NULL, GetInt збіраецца пацярпець няўдачу, вяртаючы INT_MAX 262 00:15:34,460 --> 00:15:37,690 гэтак жа, як дазорцы. Гэта ўсяго толькі чалавечыя канвенцыі. 263 00:15:37,690 --> 00:15:41,450 Толькі так вы б ведалі, што гэта справа, чытаючы дакументацыю. 264 00:15:41,450 --> 00:15:45,040 >> Давайце пракруціць ўніз, туды, дзе Int фактычна атрымалі. 265 00:15:45,040 --> 00:15:51,160 Калі я пракруціць ўніз крыху далей, у лініі 170, у нас ёсць каментар вышэй гэтых ліній. 266 00:15:51,160 --> 00:15:55,100 Мы заяўляем, у 172 Int, п, і сімвал, з, а затым гэтая новая функцыя, 267 00:15:55,100 --> 00:15:58,930 які некаторыя з вас наткнуўся раней, Sscanf. 268 00:15:58,930 --> 00:16:00,870 Гэта азначае радок SCANF. 269 00:16:00,870 --> 00:16:05,700 Іншымі словамі, даць мне радкі, і я буду праверыць яго на кавалкі інфармацыі, якая прадстаўляе цікавасць. 270 00:16:05,700 --> 00:16:07,360 Што гэта значыць? 271 00:16:07,360 --> 00:16:11,800 Выкажам здагадку, што я друкую, літаральна, 123 на клавіятуры, а затым націсніце Enter. 272 00:16:11,800 --> 00:16:16,470 Што такое тып дадзеных з 123, калі вяртаюцца GetString? >> [Студэнт] String. 273 00:16:16,470 --> 00:16:18,380 Відавочна, што гэта радок, ці не так? Я атрымаў радок. 274 00:16:18,380 --> 00:16:23,220 Такім 123 з'яўляецца на самай справе, цытата, канец цытаты, 123 з \ 0 ў канцы яго. 275 00:16:23,220 --> 00:16:27,110 Гэта не Int. Гэта не лік. Гэта выглядае як лік, але гэта не на самай справе. 276 00:16:27,110 --> 00:16:29,080 Такім чынам, што ж GetInt рабіць? 277 00:16:29,080 --> 00:16:35,750 Гэта мае для сканавання гэтага радка злева направа - 123 \ 0 - і нейкім чынам пераўтварыць у фактычных цэлае. 278 00:16:35,750 --> 00:16:37,850 Вы маглі зразумець, як гэта зрабіць. 279 00:16:37,850 --> 00:16:41,450 Калі вы ўспомніце pset2, Вы, верагодна, атрымаў крыху знаёмыя з Цэзарам 280 00:16:41,450 --> 00:16:44,820 або Vigenere, так што вы можаце перамяшчацца па радку, вы можаце канвертаваць знакаў для цэлых лікаў. 281 00:16:44,820 --> 00:16:46,710 Але чорт вазьмі, гэта цэлая вялікая праца. 282 00:16:46,710 --> 00:16:49,860 Чаму б не назваць функцыю, як Sscanf, што робіць гэта для вас? 283 00:16:49,860 --> 00:16:54,230 Так Sscanf чакае аргумент - у гэтым выпадку называецца лінія, якая з'яўляецца радком. 284 00:16:54,230 --> 00:17:01,840 Затым паказваюцца ў двукоссях, вельмі падобны на Printf, што вы чакаеце ўбачыць у гэтай радку. 285 00:17:01,840 --> 00:17:09,000 І тое, што я кажу тут, я чакаю ўбачыць дзесятковы лік і, магчыма, характар. 286 00:17:09,000 --> 00:17:12,000 І мы ўбачым, чаму гэта так, у адзін момант. 287 00:17:12,000 --> 00:17:15,869 І аказваецца, што гэта пазначэнне цяпер нагадвае матэрыял, які мы пачалі казаць пра 288 00:17:15,869 --> 00:17:17,619 крыху больш за тыдзень таму. 289 00:17:17,619 --> 00:17:21,740 Што такое & N і & C робіць для нас тут? >> [Студэнт] Адрас п і адрас з. 290 00:17:21,740 --> 00:17:25,400 Так. Ён даў мне адрас і адрас п с. Чаму гэта так важна? 291 00:17:25,400 --> 00:17:30,220 Вы ведаеце, што з функцыямі ў C, вы заўсёды можаце вярнуць значэнне не мае ніякага значэння наогул. 292 00:17:30,220 --> 00:17:34,530 Вы можаце вярнуць цэлы лік, радок, лік з якая плавае кропкай, сімвал, незалежна, ці вы можаце вярнуцца несапраўднымі, 293 00:17:34,530 --> 00:17:38,030 але вы можаце вярнуць толькі адно максімальна. 294 00:17:38,030 --> 00:17:42,760 Але тут мы хочам Sscanf вярнуць мяне, можа быць, цэлы лік, дзесятковы лік, 295 00:17:42,760 --> 00:17:46,220 а таксама знак, і я растлумачу, чаму знакаў у хвіліну. 296 00:17:46,220 --> 00:17:51,460 Вы хочаце эфектыўна Sscanf вярнуць дзве рэчы, але гэта проста не магчыма ў C. 297 00:17:51,460 --> 00:17:55,200 Вы можаце абыйсці, што, пераходзячы ў два адрасы 298 00:17:55,200 --> 00:17:57,370 таму што як толькі вы перадаць функцыю двух адрасах, 299 00:17:57,370 --> 00:18:00,470 што можна, што функцыя з імі рабіць? >> [Студэнт] Напішыце на гэтыя адрасы. 300 00:18:00,470 --> 00:18:02,010 Ён можа пісаць на гэтыя адрасы. 301 00:18:02,010 --> 00:18:05,770 Вы можаце выкарыстоўваць зорку аперацыю і паехаць туды, да кожнага з гэтых адрасоў. 302 00:18:05,770 --> 00:18:11,260 Гэта свайго роду гэтым заднюю дзверы механізм, але вельмі часта мяняюцца значэння зменных 303 00:18:11,260 --> 00:18:14,870 больш, чым проста адно месца - у дадзеным выпадку, два. 304 00:18:14,870 --> 00:18:21,340 Цяпер я заўважаю праверкі == 1, а затым вяртаюцца п калі гэта, на самой справе, ацаніць да ісціны. 305 00:18:21,340 --> 00:18:26,170 Так што ж адбываецца? Тэхнічна, усе мы сапраўды хочам, адбудзецца ў GetInt гэта. 306 00:18:26,170 --> 00:18:30,740 Мы хочам, каб разабраць, так бы мовіць, мы хочам, каб прачытаць радок - канец цытаты цытаты-123 - 307 00:18:30,740 --> 00:18:34,560 і калі яна выглядае як ёсць шэраг там, што мы гаворым Sscanf рабіць 308 00:18:34,560 --> 00:18:38,190 змяшчаюць гэты лік - 123 - у гэтай зменнай п для мяне. 309 00:18:38,190 --> 00:18:42,090 Дык чаму ж тады я на самой справе гэта так? 310 00:18:42,090 --> 00:18:48,220 Якая роля Sscanf кажуць, што вы можаце таксама атрымаць сімвал тут? 311 00:18:48,220 --> 00:18:53,470 [Неразборліва адказ студэнта] >> дзесятковая кропка на самай справе маглі б працаваць. 312 00:18:53,470 --> 00:18:56,330 Давайце лічыць, што на імгненне задумаўся. Што яшчэ? 313 00:18:56,330 --> 00:18:59,270 [Студэнт] Гэта можа быць NULL. >> Добрая думка. Гэта можа быць нулявы знак. 314 00:18:59,270 --> 00:19:01,660 Гэта на самай справе не ў гэтым выпадку. Так. >> [Студэнт] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Ці дазвольце мне абагульняць яшчэ далей. 316 00:19:04,340 --> 00:19:06,640 % C існуе толькі для праверкі памылак. 317 00:19:06,640 --> 00:19:09,300 Мы не хочам там быць знак пасля нумары, 318 00:19:09,300 --> 00:19:11,870 але тое, што гэта дазваляе мне зрабіць наступнае. 319 00:19:11,870 --> 00:19:18,210 Аказваецца, што Sscanf, акрамя захоўвання значэнняў у п і с у гэтым прыкладзе, 320 00:19:18,210 --> 00:19:24,890 што ён таксама робіць гэта вяртае колькасць зменных пакласці значэння цалі 321 00:19:24,890 --> 00:19:30,260 Так што калі вы толькі ўводзіце 123, то толькі% D будзе супадаць, 322 00:19:30,260 --> 00:19:33,880 і толькі п атрымлівае захоўваецца на суму, як 123, 323 00:19:33,880 --> 00:19:35,640 і нічога не атрымлівае пакласці ў з. 324 00:19:35,640 --> 00:19:37,620 З застаецца смецце значэнне, так бы мовіць - 325 00:19:37,620 --> 00:19:40,730 смецце, таму што ён ніколі не быў ініцыялізаваны да некаторага значэння. 326 00:19:40,730 --> 00:19:45,520 Так што ў гэтым выпадку, Sscanf вяртае 1, таму што я населены 1 з гэтых паказальнікаў, 327 00:19:45,520 --> 00:19:50,190 У гэтым выпадку вялікая, у мяне ёсць цэлы лік, таму я вызваліць лінію, каб вызваліць памяць 328 00:19:50,190 --> 00:19:54,000 GetString, што на самой справе вылучаецца, а затым я вярнуся п, 329 00:19:54,000 --> 00:19:58,500 яшчэ, калі вы ніколі не задумваліся, дзе гэта Паўтарыць заяву прыходзіць, яна прыходзіць прама адсюль. 330 00:19:58,500 --> 00:20:04,390 Такім чынам, калі, наадварот, я набіраю ў 123foo - толькі некаторыя выпадковыя паслядоўнасці тэксту - 331 00:20:04,390 --> 00:20:08,490 Sscanf будзе бачыць нумар, нумар, нумар, F, 332 00:20:08,490 --> 00:20:16,410 і ён збіраецца паставіць 123 у п; ён збіраецца паставіць е месца ў С, а затым вярнуць 2. 333 00:20:16,410 --> 00:20:20,640 Такім чынам, мы маем, толькі з дапамогай асноўнага вызначэння паводзін Sscanf, у вельмі просты спосаб - 334 00:20:20,640 --> 00:20:23,900 Ну, складаныя, на першы погляд, але ў канцы дня даволі просты механізм - 335 00:20:23,900 --> 00:20:28,320 сказаць ёсць цэлы лік, і калі так, то, што адзінае, што я знайшоў? 336 00:20:28,320 --> 00:20:29,860 І прабелы тут не выпадкова. 337 00:20:29,860 --> 00:20:34,000 Калі вы прачыталі дакументацыю па Sscanf, ён кажа вам, што калі вы ўключаеце частка прабелаў 338 00:20:34,000 --> 00:20:38,810 у пачатку ці ў канцы канцоў, Sscanf занадта дазволіць карыстачу, па якой прычыне, 339 00:20:38,810 --> 00:20:41,860 , Дасягнуў 123 прабел, і гэта будзе законна. 340 00:20:41,860 --> 00:20:44,150 Вы не будзеце крычаць на карыстачоў толькі таму, што яны патрапілі ў прабелу 341 00:20:44,150 --> 00:20:48,640 у пачатку ці ў канцы, які з'яўляецца трохі больш зручным для карыстальнікаў. 342 00:20:48,640 --> 00:20:52,300 >> Любыя пытанні, то на GetInt? Так. >> [Студэнт] Што рабіць, калі вы проста пакласці ў знак? 343 00:20:52,300 --> 00:20:54,030 Добры пытанне. 344 00:20:54,030 --> 00:20:59,890 Што рабіць, калі вы толькі што ўвялі ў сімвал, як F і націсніце Enter, ніколі не набраўшы 123? 345 00:20:59,890 --> 00:21:02,420 Што вы думаеце паводзіны гэтага радка кода бы тады? 346 00:21:02,420 --> 00:21:04,730 [Неразборліва адказ студэнта] 347 00:21:04,730 --> 00:21:08,790 Так, так Sscanf можа пакрыць, што таксама, таму што ў такім выпадку, ён не збіраецца запоўніць п або с. 348 00:21:08,790 --> 00:21:15,310 Гэта будзе замест вяртання 0, у гэтым выпадку я таксама лавіць, што сцэнар 349 00:21:15,310 --> 00:21:18,750 таму што чаканае значэнне я хачу 1. 350 00:21:18,750 --> 00:21:22,000 Я хачу толькі адну і толькі адну рэч, каб быць запоўненыя. Добры пытанне. 351 00:21:22,000 --> 00:21:24,290 >> Іншыя? Добра. 352 00:21:24,290 --> 00:21:26,250 >> Давайце не будзем прайсці праз усе функцыі тут, 353 00:21:26,250 --> 00:21:29,500 але той, які, здаецца, можа быць, з пакінутых цікавасць GetString 354 00:21:29,500 --> 00:21:32,790 таму што аказваецца, што GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 Усе пласкадонку шмат іх функцыянальнасць GetString. 356 00:21:36,260 --> 00:21:39,750 Такім чынам, давайце зірнем на тое, як ён рэалізуецца тут. 357 00:21:39,750 --> 00:21:43,630 Гэта выглядае крыху складаным, але ён выкарыстоўвае тыя ж асновы 358 00:21:43,630 --> 00:21:45,670 што мы пачалі гаварыць аб мінулага тыдня. 359 00:21:45,670 --> 00:21:49,490 У GetString, які не прымае аргументаў, як у пустэчу тут 360 00:21:49,490 --> 00:21:53,730 і вяртае радок, я, здаецца, я аб'яўленні радкі называецца буферам. 361 00:21:53,730 --> 00:21:56,270 Я сапраўды не ведаю, што гэта збіраецца быць выкарыстаны для яшчэ няма, але мы будзем бачыць. 362 00:21:56,270 --> 00:21:58,390 Падобна на тое, магутнасцю па змаўчанні 0. 363 00:21:58,390 --> 00:22:01,350 Не зусім упэўнены, дзе гэта адбываецца, не ўпэўнены, што N будзе выкарыстоўвацца для кліентаў, 364 00:22:01,350 --> 00:22:03,590 але зараз гэта становіцца трохі больш цікавай. 365 00:22:03,590 --> 00:22:06,520 У адпаведнасці 243, мы заяўляем, INT, с. 366 00:22:06,520 --> 00:22:08,800 Гэта свайго роду дурныя падрабязна. 367 00:22:08,800 --> 00:22:15,820 Сімвал гэта 8 біт і 8 біт можа захоўваць колькі розных значэнняў? >> [Студэнт] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Праблема ў тым, калі вы хочаце мець 256 розных знакаў ASCII, якія існуюць 369 00:22:20,730 --> 00:22:23,340 Калі вы ўспомніце - і гэта не тое, каб запомніць. 370 00:22:23,340 --> 00:22:25,710 Але калі вы ўспомніце, што вялікая ASCII графіцы мы былі тыдзень таму, 371 00:22:25,710 --> 00:22:30,600 было ў гэтым выпадку 128 або 256 ASCII сімвалаў. 372 00:22:30,600 --> 00:22:32,940 Мы выкарыстоўвалі ўсе мадэлі 0 і 1 ўверх. 373 00:22:32,940 --> 00:22:36,210 Гэта праблема, калі вы хочаце быць у стане выявіць памылку 374 00:22:36,210 --> 00:22:40,190 таму што, калі вы ўжо карыстаецеся 256 значэнняў для вашых персанажаў, 375 00:22:40,190 --> 00:22:43,050 Вы сапраўды не планаваць загадзя, таму што цяпер у вас няма магчымасці сказаць, 376 00:22:43,050 --> 00:22:46,270 гэта не законны характар, гэта нейкае памылковае паведамленне. 377 00:22:46,270 --> 00:22:50,270 Так што свет робіць гэта яны выкарыстоўваюць наступны самая вялікая каштоўнасць, нешта накшталт INT, 378 00:22:50,270 --> 00:22:54,720 так што ў вас вар'ятам колькасцю бітаў, 32, 4 млрд. магчымых значэнняў 379 00:22:54,720 --> 00:22:58,860 так што вы можаце проста канчатковым выніку, выкарыстоўваючы па сутнасці 257 з іх, 380 00:22:58,860 --> 00:23:01,720 1 з якіх мае некаторы асаблівае значэнне як памылку. 381 00:23:01,720 --> 00:23:03,120 >> Такім чынам, давайце паглядзім, як гэта працуе. 382 00:23:03,120 --> 00:23:07,760 У адпаведнасці 246, у мяне ёсць гэты вялікі цыкл, пакуль што выклікае fgetc, 383 00:23:07,760 --> 00:23:11,090 F Значэнне файла, так ЕОКП, а затым стандартнага ўводу. 384 00:23:11,090 --> 00:23:15,520 Аказваецца, гэта ўсяго толькі больш дакладным спосабам сказаць, чытаць ўвод з клавіятуры. 385 00:23:15,520 --> 00:23:19,300 Стандартная клавіятура сродкаў ўвод, стандартны вывад азначае, экран, 386 00:23:19,300 --> 00:23:23,310 і стандартныя памылкі, якія мы ўбачым у pset4, азначае, што экран 387 00:23:23,310 --> 00:23:27,490 але асаблівая частка экрана, так што яна не змешваецца з фактычным выхадам 388 00:23:27,490 --> 00:23:30,750 што вы прызначаныя для друку. Але пра гэта ў будучыні. 389 00:23:30,750 --> 00:23:34,440 Так fgetc проста азначае, што чытаць адзін знак з клавіятуры і захоўваць яго дзе? 390 00:23:34,440 --> 00:23:37,350 Захоўваеце яго ў с. 391 00:23:37,350 --> 00:23:41,360 А потым праверыць - так што я проста выкарыстоўваючы некаторыя Булевы саюзаў тут - 392 00:23:41,360 --> 00:23:46,000 пераканайцеся, што яна не роўная - \ п, так што карыстач націснуў Enter, мы хочам, каб спыніць у той момант, 393 00:23:46,000 --> 00:23:49,850 канец цыклу - і мы таксама хочам, каб праверыць на спецыяльным пастаянным EOF, 394 00:23:49,850 --> 00:23:53,610 , Які, калі вы ведаеце ці здагадваецеся, што гэта азначае? >> [Студэнт] канец файла. >> Канец файла. 395 00:23:53,610 --> 00:23:56,560 Гэта свайго роду бессэнсоўна, таму што калі я друкую на клавіятуры, 396 00:23:56,560 --> 00:23:58,870 там сапраўды няма файла, якія ўдзельнічаюць у гэтым, 397 00:23:58,870 --> 00:24:01,150 Але гэта ўсяго толькі свайго роду агульны тэрмін, які выкарыстоўваецца для абазначэння 398 00:24:01,150 --> 00:24:04,220 што нічога не прыходзіць з пальца чалавека. 399 00:24:04,220 --> 00:24:06,460 EOF - канец файла. 400 00:24:06,460 --> 00:24:09,920 Як у баку, калі вы калі-небудзь ударыў кіравання D на вашай клавіятуры, не тое, што вам давядзецца яшчэ - 401 00:24:09,920 --> 00:24:15,230 Вы патрапілі кіравання C - D кіравання пасылае гэта адмысловая канстанта называецца EOF. 402 00:24:15,230 --> 00:24:19,850 Такім чынам, зараз мы проста ёсць некаторыя дынамічнага размеркавання памяці. 403 00:24:19,850 --> 00:24:23,440 >> Так што, калі (п + 1> магутнасцяў). Зараз я растлумачу, с. 404 00:24:23,440 --> 00:24:26,100 N толькі, колькі байт у цяперашні час у буферы, 405 00:24:26,100 --> 00:24:28,620 Радок, вы ў цяперашні час нарошчвання ад карыстальніка. 406 00:24:28,620 --> 00:24:33,450 Калі ў вас ёсць некалькі знакаў у буферы, чым у вас ёсць патэнцыял у буфер, 407 00:24:33,450 --> 00:24:37,410 Інтуітыўна, што нам трэба зрабіць, гэта вылучыць больш магутнасці. 408 00:24:37,410 --> 00:24:43,330 Так што я буду слізгаць над некаторымі арыфметычнай тут і сканцэнтраваны толькі на гэтай функцыі тут. 409 00:24:43,330 --> 00:24:46,070 Вы ведаеце, што таНос з'яўляецца або, па крайняй меры ў цэлым знаёмыя. 410 00:24:46,070 --> 00:24:48,970 Вазьміце здагадку, што пераразмеркаваць робіць. >> [Студэнт] Дадае памяці. 411 00:24:48,970 --> 00:24:52,920 Гэта не зусім даданне памяці. Яна пераразмяркоўвае памяць наступным чынам. 412 00:24:52,920 --> 00:24:57,220 Калі ёсць яшчэ месца ў канцы радка, каб даць вам больш, што памяць 413 00:24:57,220 --> 00:25:00,000 чым гэта першапачаткова дае вам, то вы атрымаеце, што дадатковая памяць. 414 00:25:00,000 --> 00:25:03,460 Такім чынам, вы можаце проста трымаць пакласці сімвалаў струны спіной да спіны, каб спіна да спіны. 415 00:25:03,460 --> 00:25:05,830 Але калі гэта не так, таму што вы занадта доўга чакалі 416 00:25:05,830 --> 00:25:07,940 і нешта выпадковае атрымаў шлёпнуўся ў памяці ёсць 417 00:25:07,940 --> 00:25:10,290 але ёсць дадатковая памяць тут, унізе, гэта нармальна. 418 00:25:10,290 --> 00:25:13,100 Realloc будзе рабіць усю цяжкую працу за вас, 419 00:25:13,100 --> 00:25:16,750 перамясціць радок, якую вы чыталі ў так далёка адсюль, пакладзеце яго туды, 420 00:25:16,750 --> 00:25:19,460 , А затым даць вам яшчэ некалькі узлётна-пасадачная паласа ў гэтай кропцы. 421 00:25:19,460 --> 00:25:22,550 >> Так што з хваляй боку, дазвольце мне сказаць, што тое, што робіць GetString 422 00:25:22,550 --> 00:25:26,330 яно пачынае з невялікай буфер, можа быць, аднаго характару, 423 00:25:26,330 --> 00:25:30,820 і калі карыстальнік ўводзіць у два знака, GetString сканчаецца выклікам пераразмеркаваць і кажа: 424 00:25:30,820 --> 00:25:33,150 адзін знак не хапала, дай мне два знака. 425 00:25:33,150 --> 00:25:35,950 Тады, калі вы прачыталі логіцы цыклу, яна скажа 426 00:25:35,950 --> 00:25:39,600 карыстач уводзіць у 3 сімвала, дай мне цяпер не 2, а 4-х знакаў, 427 00:25:39,600 --> 00:25:42,320 Затым дайце мне 8, то дайце мне 16 і 32. 428 00:25:42,320 --> 00:25:45,000 Той факт, што я падваенне магутнасці кожны раз 429 00:25:45,000 --> 00:25:48,570 азначае, што буфер не будзе расці павольна, ён будзе расці вельмі хутка. 430 00:25:48,570 --> 00:25:51,380 А што можа быць перавагай, што? 431 00:25:51,380 --> 00:25:54,600 Чаму я падваенне памеру буфера 432 00:25:54,600 --> 00:25:58,020 хоць карыстальнік можа проста трэба адзін дадатковы сімвал з клавіятуры? 433 00:25:58,020 --> 00:26:01,750 [Неразборліва адказ студэнта] >> Што гэта такое? >> [Студэнт] Вы не павінны расці так часта. 434 00:26:01,750 --> 00:26:03,300 Менавіта так. Вы не павінны расці так часта. 435 00:26:03,300 --> 00:26:05,510 І гэта толькі часткова вы хэджавання стаўкі тут, 436 00:26:05,510 --> 00:26:10,850 Ідэя ў тым, што вы не жадаеце патэлефанаваць пераразмеркаваць шмат, таму што ён мае тэндэнцыю быць павольным. 437 00:26:10,850 --> 00:26:12,910 Кожны раз, калі вы спытаеце аперацыйнай сістэмы для памяці, 438 00:26:12,910 --> 00:26:16,990 як вы хутка ўбачыце, у будучыні пастаўленай задачы, ён імкнецца заняць некаторы час. 439 00:26:16,990 --> 00:26:20,010 Такім чынам, мінімізацыя, што колькасць часу, нават калі вы марнуеце некаторы прастору, 440 00:26:20,010 --> 00:26:21,900 як правіла, добра. 441 00:26:21,900 --> 00:26:24,060 >> Але калі мы прачыталі фінальную частку GetString тут - 442 00:26:24,060 --> 00:26:27,950 і зноў разуменні кожны радок тут не так важна сёння - 443 00:26:27,950 --> 00:26:30,530 заўважыць, што ў канчатковым рахунку выклікае таНос раз 444 00:26:30,530 --> 00:26:33,880 і ён вылучае менавіта столькі байт, колькі яму трэба для радкі 445 00:26:33,880 --> 00:26:38,060 , А затым выкідвае па тэлефоне бясплатна празмерна вялікія буфера 446 00:26:38,060 --> 00:26:40,080 калі ён сапраўды атрымаў падвоіў занадта шмат разоў. 447 00:26:40,080 --> 00:26:42,730 Карацей кажучы, вось як GetString працаваў ўвесь гэты час. 448 00:26:42,730 --> 00:26:47,060 Усё гэта робіць чытанне аднаго знака ў той час, зноў і зноў, і зноў, 449 00:26:47,060 --> 00:26:50,750 і кожны раз, калі яна мае патрэбу ў некаторай дадатковай памяці, яна пытае аперацыйнай сістэмы для яе 450 00:26:50,750 --> 00:26:53,670 па тэлефоне пераразмеркаваць. 451 00:26:53,670 --> 00:26:57,890 >> Ёсць пытанні? Добра. 452 00:26:57,890 --> 00:26:59,270 >> Атацы. 453 00:26:59,270 --> 00:27:04,060 Цяпер, калі мы разумеем, паказальнікі або па крайняй меры ўсё больш знаёмым з паказальнікамі, 454 00:27:04,060 --> 00:27:06,700 давайце разгледзім, як увесь свет пачынае развальвацца 455 00:27:06,700 --> 00:27:10,030 калі вы не зусім абараніць ад спаборнасць карыстальнікаў, 456 00:27:10,030 --> 00:27:11,850 людзі, якія спрабуюць узламаць вашу сістэму, 457 00:27:11,850 --> 00:27:16,890 людзі, якія спрабуюць выкрасці вашыя праграмы ў абыход некаторых рэгістрацыйны код 458 00:27:16,890 --> 00:27:19,090 што яны маглі б у адваротным выпадку прыйдзецца ўводзіць цалі 459 00:27:19,090 --> 00:27:22,990 >> Зірніце на гэты прыклад тут, які знаходзіцца ўсяго ў C код, які мае функцыю асноўнага унізе 460 00:27:22,990 --> 00:27:26,380 , Якая выклікае функцыю Foo. І тое, што ён пераход да Foo? 461 00:27:26,380 --> 00:27:29,680 [Студэнт] адзін аргумент. >> [Малая] адзін аргумент. 462 00:27:29,680 --> 00:27:33,450 Так ARGV [1], што азначае, што першае слова, якое карыстальнік ўводзіць у камандным радку 463 00:27:33,450 --> 00:27:36,360 Пасля a.out або любой іншай праграмы, называецца. 464 00:27:36,360 --> 00:27:41,680 Так Foo у верхняй бярэ ў знак *. Але сімвал * толькі што? >> [Студэнт] радок. 465 00:27:41,680 --> 00:27:43,350 [Малая] радкі, так што нічога новага. 466 00:27:43,350 --> 00:27:45,420 Гэты радок ўмоўна называцца барам. 467 00:27:45,420 --> 00:27:51,430 У гэтай лініі тут, сімвал з [12], у родзе паў-тэхнічнага англійскай мовы, то, што гэтая лінія робіць? 468 00:27:51,430 --> 00:27:55,220 [Студэнт] Масіў - >> Масіў? >> [Студэнт] персанажы. >> Персанажы. 469 00:27:55,220 --> 00:27:58,870 Дайце мне масіў з 12 знакаў. Такім чынам, мы маглі б назваць гэта буфер. 470 00:27:58,870 --> 00:28:02,920 Гэта тэхнічна называецца C, а буфер у праграмаванні проста азначае, куча прасторы 471 00:28:02,920 --> 00:28:04,800 што вы можаце змясціць некаторыя рэчы цалі 472 00:28:04,800 --> 00:28:07,940 Тады, нарэшце, тетсру мы не выкарыстоўвалі раней, але вы можаце здагадацца, што ён робіць. 473 00:28:07,940 --> 00:28:10,480 Ён капіюе памяці. Што ён робіць? 474 00:28:10,480 --> 00:28:19,270 Гэта відавочна капіюе бар, на ўваходзе, у з, але толькі да даўжыні бар. 475 00:28:19,270 --> 00:28:24,930 Але ёсць памылка тут. >> [Студэнт] Вы павінны SizeOf характар. >> Добра. 476 00:28:24,930 --> 00:28:30,860 Тэхнічна, мы павінны сапраўды зрабіць StrLen (бар) * SizeOf (Char)). Гэта правільна. 477 00:28:30,860 --> 00:28:33,930 Але ў горшым выпадку тут, давайце выкажам здагадку, што that's - 478 00:28:33,930 --> 00:28:35,950 Добра. Тады ёсць дзве памылкі. 479 00:28:35,950 --> 00:28:39,160 Такім чынам, SizeOf (Char)); 480 00:28:39,160 --> 00:28:41,290 Давайце зробім гэта крыху шырэй. 481 00:28:41,290 --> 00:28:44,910 Так што цяпер ёсць яшчэ памылка, што ёсць што? >> [Неразборліва адказ студэнта] 482 00:28:44,910 --> 00:28:46,990 Калі ласка, праверце, ці што? >> [Студэнт] Праверка на NULL. 483 00:28:46,990 --> 00:28:50,270 Мы павінны, як правіла праверкі на NULL таму, што дрэнныя рэчы здараюцца 484 00:28:50,270 --> 00:28:53,200 калі ваш паказальнік NULL, таму што вы маглі б у канчатковым выніку адбываецца там, 485 00:28:53,200 --> 00:28:57,630 і вы ніколі не павінны ісці ў пустое разнаймення яго з зоркай аператара. 486 00:28:57,630 --> 00:29:01,050 Так што гэта добра. А што яшчэ мы робім? Лагічна, што ёсць недахоп тут. 487 00:29:01,050 --> 00:29:04,450 [Студэнт] Калі ласка, праверце, калі агдс з'яўляецца> = 2. 488 00:29:04,450 --> 00:29:10,550 Такім чынам, праверце агдс з'яўляецца> = 2. Такім чынам, ёсць тры памылкі ў гэтай праграме. 489 00:29:10,550 --> 00:29:16,630 Мы сочым праверкі, калі карыстач на самай справе набралі ні ў чым у ARGV [1]. Добра. 490 00:29:16,630 --> 00:29:20,950 Так што трэцяя памылка? Так. >> [Студэнт] C не можа быць досыць вялікі. 491 00:29:20,950 --> 00:29:23,320 Добра. Мы праверылі адзін сцэнар. 492 00:29:23,320 --> 00:29:29,520 Мы няяўна праверыць, не капіюйце больш памяці, чым будзе перавышаць даўжыню бара. 493 00:29:29,520 --> 00:29:32,510 Такім чынам, калі радок карыстальнік ўводзіць у складаецца з 10 знакаў, 494 00:29:32,510 --> 00:29:36,020 гэта кажа капіяваць толькі 10 знакаў. І гэта нармальна. 495 00:29:36,020 --> 00:29:39,940 Але што, калі карыстальнік ўводзіць у слова ў радку, як 20-значны слова? 496 00:29:39,940 --> 00:29:44,900 Гэта кажа копіі 20 сімвалаў з бара у што? 497 00:29:44,900 --> 00:29:49,750 C, інакш вядомы як наш буфер, які азначае, што вы толькі што напісалі дадзеныя 498 00:29:49,750 --> 00:29:52,540 да 8 байт месцаў, якія вам не належаць, 499 00:29:52,540 --> 00:29:54,870 і вы не валодаеце ім у тым сэнсе, што вы ніколі не вылучала іх. 500 00:29:54,870 --> 00:30:00,370 Такім чынам, гэта тое, што звычайна вядома як атака перапаўнення буфера або нападу з перапаўненнем буфера. 501 00:30:00,370 --> 00:30:05,580 І гэта напад ў тым сэнсе, што калі карыстач ці праграма, якая тэлефануе ваша функцыя 502 00:30:05,580 --> 00:30:10,490 робіць гэта зламысна, што на самой справе адбываецца наступнае самай справе можа быць вельмі дрэнна. 503 00:30:10,490 --> 00:30:12,450 >> Такім чынам, давайце зірнем на гэтую карціну тут. 504 00:30:12,450 --> 00:30:16,060 Гэтая карціна прадстаўляе свой стэк памяці. 505 00:30:16,060 --> 00:30:19,580 Нагадаем, што кожны раз, калі вы выклікаеце функцыю вы атрымаеце гэтую маленькую кадра ў стэку 506 00:30:19,580 --> 00:30:21,520 а потым яшчэ і потым яшчэ і яшчэ. 507 00:30:21,520 --> 00:30:24,300 І да гэтага часу, мы толькі выгляд гэтых адведзенай ў выглядзе прастакутнікаў 508 00:30:24,300 --> 00:30:26,290 альбо на дошцы або на экране тут. 509 00:30:26,290 --> 00:30:30,580 Але калі павялічыць на адзін з гэтых прастакутнікаў, пры выкліку функцыі Foo, 510 00:30:30,580 --> 00:30:35,880 Аказваецца, што ёсць больш у стэк ўнутры гэтага фрэйма ў гэтым прамавугольніку 511 00:30:35,880 --> 00:30:40,060 чым проста х і у, а і Ь, як мы зрабілі гаворым пра своп. 512 00:30:40,060 --> 00:30:44,410 Аказваецца, што ёсць некаторыя нізкаўзроўневыя дэталі, сярод іх зваротны адрас. 513 00:30:44,410 --> 00:30:49,550 Вось і атрымліваецца, калі асноўныя называе Фу, асноўная павінен паведаміць Foo 514 00:30:49,550 --> 00:30:53,520 які адрас асноўнага знаходзіцца ў аператыўнай памяці кампутара 515 00:30:53,520 --> 00:30:57,770 таму што інакш, як толькі Foo робіцца выкананне, як у дадзеным выпадку тут, 516 00:30:57,770 --> 00:31:00,830 як толькі вы дасягнеце гэтага замкнёнага фігурнай дужкай ў канцы Фу, 517 00:31:00,830 --> 00:31:05,310 як, чорт вазьмі ніяк Foo ведае, дзе кантроль праграма павінна пайсці? 518 00:31:05,310 --> 00:31:08,970 Аказваецца, што адказ на гэтае пытанне ў гэтым чырвоным квадраце тут. 519 00:31:08,970 --> 00:31:12,670 Гэта ўяўляе сабой паказальнік, і гэта да кампутара для захоўвання часова 520 00:31:12,670 --> 00:31:17,030 на так званым стэку адрас асноўнага, так што, як толькі Foo робіцца выкананне, 521 00:31:17,030 --> 00:31:21,120 Кампутар ведае, дзе і якія лініі ў асноўным, каб вярнуцца ў. 522 00:31:21,120 --> 00:31:23,940 Захавана паказальнік кадра ставіцца так жа да гэтага. 523 00:31:23,940 --> 00:31:26,310 Char * бар тут прадстаўляе тое, што? 524 00:31:26,310 --> 00:31:31,350 Зараз гэты сегмент сіняга вось кадр Foo аўтара. Што такое бар? 525 00:31:31,570 --> 00:31:35,010 Бар з'яўляецца толькі аргументам функцыі Foo. 526 00:31:35,010 --> 00:31:37,500 Так што цяпер мы вярнуліся на выгляд знаёмая карціна. 527 00:31:37,500 --> 00:31:39,850 Там больш рэчаў і больш адцягвацца на экране, 528 00:31:39,850 --> 00:31:43,380 але гэта блакітны сегмент толькі тое, што мы ўжо абапіраючыся на дошцы 529 00:31:43,380 --> 00:31:45,790 нешта накшталт падпампоўкі. Гэта рамка для Foo. 530 00:31:45,790 --> 00:31:51,490 І адзінае, што ў ёй зараз знаходзіцца бар, які з'яўляецца гэтым параметрам. 531 00:31:51,490 --> 00:31:55,220 Але што яшчэ павінна быць у стэку адпаведнасці з гэтым Кодэксам тут? 532 00:31:55,220 --> 00:31:57,760 [Студэнт] сімвал з [12]. >> [Малая] сімвал з [12]. 533 00:31:57,760 --> 00:32:02,810 Мы павінны таксама бачыць 12 квадратаў памяці, выдзеленай для зменнай с, 534 00:32:02,810 --> 00:32:04,970 ды і ў нас ёсць, што на экране. 535 00:32:04,970 --> 00:32:08,480 У самым версе ёсць з [0], а затым аўтар гэтай схеме 536 00:32:08,480 --> 00:32:11,850 не турбаваць малявання ўсе квадраты, але на самой справе ёсць 12 маецца 537 00:32:11,850 --> 00:32:16,590 таму што калі вы паглядзіце на ніжнюю правую, з [11], калі лічыць ад 0 займае 12-е такія байт. 538 00:32:16,590 --> 00:32:18,400 Але вось у чым праблема. 539 00:32:18,400 --> 00:32:22,390 У якім кірунку з якая расце? 540 00:32:22,390 --> 00:32:27,080 Выгляд зверху ўніз, калі яна пачынаецца ў верхняй і расце на дно. 541 00:32:27,080 --> 00:32:30,110 Гэта не падобна мы пакінулі сабе шмат узлётна-пасадачнай паласы тут наогул. 542 00:32:30,110 --> 00:32:32,090 Мы відаў афарбаваныя сябе ў кут, 543 00:32:32,090 --> 00:32:36,940 і што з [11] ўшчыльную бары, які знаходзіцца прама супраць Захавана паказальнік кадра, 544 00:32:36,940 --> 00:32:39,960 які знаходзіцца прама супраць зваротнага адрасу. Там няма больш месца. 545 00:32:39,960 --> 00:32:42,810 Так што ж маецца на ўвазе тое, калі вы сапсаваць 546 00:32:42,810 --> 00:32:46,500 а вы паспрабуйце прачытаць 20 байт у 12-байт буфера? 547 00:32:46,500 --> 00:32:50,060 Дзе гэтыя 8 дадатковых байтаў ісці? >> [Студэнт] Усярэдзіне - 548 00:32:50,060 --> 00:32:53,200 Усярэдзіне ўсё астатняе, некаторыя з якіх гэта супер важна. 549 00:32:53,200 --> 00:32:57,260 І самае галоўнае, магчыма, з'яўляецца чырвоная скрынка там, зваротны адрас, 550 00:32:57,260 --> 00:33:03,560 таму выкажам здагадку, што вы выпадкова ці adversarially перапісаць гэтыя 4 байта, 551 00:33:03,560 --> 00:33:07,260 што паказальнік адрасы, а не толькі з смеццем, але з шэрагам 552 00:33:07,260 --> 00:33:09,810 што адбываецца ўяўляюць фактычны адрас у памяці. 553 00:33:09,810 --> 00:33:13,880 Што ўскосна, лагічна? >> [Студэнт] Функцыя збіраецца вярнуцца ў іншае месца. 554 00:33:13,880 --> 00:33:15,250 Менавіта так. 555 00:33:15,250 --> 00:33:19,170 Калі Foo вяртаецца і хіты, якія фігурнай дужкай, праграма будзе працягвацца 556 00:33:19,170 --> 00:33:25,060 Не для вяртання ў галоўнае, ён збіраецца вярнуцца ў любы адрас у тым, што чырвоныя скрынкі. 557 00:33:25,060 --> 00:33:28,600 >> У выпадку абыходу рэгістрацыі праграмнага забеспячэння, 558 00:33:28,600 --> 00:33:32,260 Што рабіць, калі адрас які вяртаецца ў гэта функцыя, якая звычайна выклікаецца 559 00:33:32,260 --> 00:33:35,690 пасля таго як вы заплацілі за праграмнае забеспячэнне і ўводзіцца рэгістрацыйны код? 560 00:33:35,690 --> 00:33:39,870 Вы можаце сартаваць трук кампутар у не збіраемся тут, але замест гэтага збіраюцца тут. 561 00:33:39,870 --> 00:33:45,100 Ці, калі вы сапраўды разумны, супернік сапраўды можа ўвесці з клавіятуры, напрыклад, 562 00:33:45,100 --> 00:33:50,690 Ня фактычнага слова, не больш за 20 сімвалаў, але мяркую, што ён ці яна на самай справе тыпаў 563 00:33:50,690 --> 00:33:52,770 некаторыя сімвалы, якія ўяўляюць сабой код. 564 00:33:52,770 --> 00:33:55,320 І гэта не будзе C код, ён на самай справе будзе сімвалы 565 00:33:55,320 --> 00:33:59,290 , Якія ўяўляюць сабой двайковы код машыны, 0 і 1. 566 00:33:59,290 --> 00:34:01,290 Але выкажам здагадку, што яны досыць разумныя, каб зрабіць гэта, 567 00:34:01,290 --> 00:34:06,500 неяк ўставіць у радок GetString тое, што, па сутнасці скампіляваны код, 568 00:34:06,500 --> 00:34:09,980 і апошнія 4 байта перазапісу, што зваротны адрас. 569 00:34:09,980 --> 00:34:13,360 І тое, што адрас не што ўваходны рабіць? 570 00:34:13,360 --> 00:34:18,630 Гэта на самай справе захоўвае ў гэтым чырвоным квадраце адрас першых байта буфера. 571 00:34:18,630 --> 00:34:23,070 Такім чынам, вы павінны быць вельмі разумным, і гэта шмат спроб і памылак для дрэнных людзей там, 572 00:34:23,070 --> 00:34:25,639 Але калі вы можаце высветліць, наколькі вялікі гэты буфер 573 00:34:25,639 --> 00:34:28,820 такія, што за апошнія некалькі байт ць ўваходным вы дае праграме 574 00:34:28,820 --> 00:34:33,540 апынуцца эквівалентнай адрас пачатку вашага буфера, вы можаце зрабіць гэта. 575 00:34:33,540 --> 00:34:39,320 Калі мы кажам, звычайна прывітанне і \ 0, гэта тое, што трапляе ў буфер. 576 00:34:39,320 --> 00:34:44,420 Але калі мы разумней і мы запаўняем гэты буфер з тым, што мы называем агульным шкоднасны код - 577 00:34:44,420 --> 00:34:48,860 AAA, атака, атака, атака - там, дзе гэта толькі тое, што робіць нешта дрэннае, 578 00:34:48,860 --> 00:34:51,820 Што адбудзецца, калі вы сапраўды разумныя, вы можаце гэта зрабіць. 579 00:34:51,820 --> 00:34:58,610 У чырвонай скрынцы тут паслядоўнасць лікаў - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Звярніце ўвагу, што супадае з колькасцю гэта тут. 581 00:35:01,610 --> 00:35:04,430 Гэта ў зваротным парадку, але пра гэта як-небудзь у іншы раз. 582 00:35:04,430 --> 00:35:08,140 Звярніце ўвагу, што гэты зваротны адрас быў наўмысна зменены 583 00:35:08,140 --> 00:35:12,020 роўным адрасе тут, а не адрас асноўнага. 584 00:35:12,020 --> 00:35:17,500 Такім чынам, калі дрэнны хлопец супер разумны, ён ці яна збіраецца ўключыць у гэты шкоднасны код 585 00:35:17,500 --> 00:35:20,930 нешта накшталт выдаліць усе файлы карыстальніка або капіяваць паролі 586 00:35:20,930 --> 00:35:24,680 або стварыць уліковы запіс карыстальніка, што я магу ўвайсці ў сістэму - наогул нічога. 587 00:35:24,680 --> 00:35:26,950 >> І гэта як небяспека і сілу C. 588 00:35:26,950 --> 00:35:29,840 Таму што ў вас ёсць доступ да памяці праз паказальнікі 589 00:35:29,840 --> 00:35:32,520 і таму вы можаце напісаць усё, што заўгодна ў памяць кампутара, 590 00:35:32,520 --> 00:35:35,080 Вы можаце зрабіць кампутар рабіць усё, што заўгодна 591 00:35:35,080 --> 00:35:39,550 проста тое, што скакаць у сваім уласным прасторы памяці. 592 00:35:39,550 --> 00:35:44,650 І так па сённяшні дзень так шмат праграм і так шмат сайтаў, якія аказваюцца пад пагрозай 593 00:35:44,650 --> 00:35:46,200 зводзяцца да людзей скарыстацца гэтым. 594 00:35:46,200 --> 00:35:50,760 І гэта можа здацца супер складаныя атакі, але гэта не заўсёды пачынаюцца менавіта так. 595 00:35:50,760 --> 00:35:53,560 Рэальнасць такая, што тое, што дрэнныя людзі, як правіла, зрабіць гэта, 596 00:35:53,560 --> 00:35:58,200 будзь то праграмы ў камандную радок або графічны інтэрфейс праграмы або вэб-сайт, 597 00:35:58,200 --> 00:35:59,940 Вы проста пачаць прадастаўленне глупства. 598 00:35:59,940 --> 00:36:03,980 Вы ўводзіце ў сапраўды вялікім слова ў поле пошуку і націсніце Enter, 599 00:36:03,980 --> 00:36:05,780 і вы чакаць, каб убачыць, калі сайт падае 600 00:36:05,780 --> 00:36:09,990 ці вы чакаць, каб убачыць, калі праграма выяўляе некаторыя паведамленні пра памылку 601 00:36:09,990 --> 00:36:14,330 таму што, калі вам пашанцуе, як дрэнны хлопец, і вы даць некаторыя вар'яты ўваход 602 00:36:14,330 --> 00:36:18,980 , Што збой праграмы, гэта азначае, што праграміст не чакае вашага дрэннага паводзінаў, 603 00:36:18,980 --> 00:36:23,630 якая азначае, што вы, верагодна, можа з досыць высілкаў, досыць спроб і памылак, 604 00:36:23,630 --> 00:36:26,650 высветліць, як паводзіць больш дакладную атаку. 605 00:36:26,650 --> 00:36:31,410 Такім чынам, як жа неад'емнай часткай бяспекі не толькі пазбегнуць гэтых нападаў зусім 606 00:36:31,410 --> 00:36:34,100 але выяўленне іх і на самай справе, гледзячы на ​​часопісы 607 00:36:34,100 --> 00:36:36,780 і бачачы, што вар'ят уваходаў ёсць людзі, уведзеныя ў свой сайт, 608 00:36:36,780 --> 00:36:38,960 якія пошукавыя тэрміны людзі набралі на свой сайт 609 00:36:38,960 --> 00:36:42,870 у надзеі перапоўненыя некаторыя буфера. 610 00:36:42,870 --> 00:36:45,500 І ўсё гэта зводзіцца да простых асновам таго, што масіў 611 00:36:45,500 --> 00:36:49,080 і што гэта значыць для выдзялення і выкарыстання памяці. 612 00:36:49,080 --> 00:36:51,710 >> , Якія адносяцца да, што тады таксама гэтага. 613 00:36:51,710 --> 00:36:54,280 Давайце проста зазірнуць ўнутр жорсткага дыска яшчэ раз. 614 00:36:54,280 --> 00:36:58,440 Вы памятаеце, з тыдзень ці два таму, што пры перацягванні файлаў ў кашы або кошыка, 615 00:36:58,440 --> 00:37:03,710 што адбываецца? >> [Студэнт] Нічога. >> Абсалютна нічога, дакладна? 616 00:37:03,710 --> 00:37:05,740 У рэшце рэшт, калі вы запусціце недахопу месца на дыску, 617 00:37:05,740 --> 00:37:08,190 АС Windows ці Mac OS пачнецца выдаленне файлаў для вас. 618 00:37:08,190 --> 00:37:10,390 Але калі вы перацягнуць нешта там, што зусім не бяспечна. 619 00:37:10,390 --> 00:37:13,800 Усе ваш сусед ці сябар або член сям'і павінен зрабіць, двойчы пстрыкніце і, вуаля, 620 00:37:13,800 --> 00:37:16,310 там усё адрывістыя файлы, якія вы спрабавалі выдаліць. 621 00:37:16,310 --> 00:37:19,590 Большасць з нас, па меншай меры, ведаю, што вы павінны правай кнопкай мышы або кіравання націсніце 622 00:37:19,590 --> 00:37:22,310 і пустой смецце ці нешта накшталт гэтага. 623 00:37:22,310 --> 00:37:25,000 Але нават тое, што не зусім зрабіць трук 624 00:37:25,000 --> 00:37:28,010 таму што тое, што адбываецца, калі ў вас ёсць файл на цвёрдым дыску 625 00:37:28,010 --> 00:37:32,770 , Які ўяўляе некаторы дакумент або некалькі JPEG, і гэта з'яўляецца жорсткі дыск, 626 00:37:32,770 --> 00:37:35,350 і скажам, гэта стужкі тут прадстаўляе гэты файл, 627 00:37:35,350 --> 00:37:38,390 і ён складаецца з цэлую кучу 0 і 1. 628 00:37:38,390 --> 00:37:42,470 Што адбываецца, калі вы не толькі перацягнуць файл у сметніцу ці каша 629 00:37:42,470 --> 00:37:48,020 але і ачысціць яго? Накшталт нічога. 630 00:37:48,020 --> 00:37:49,640 Гэта не абсалютна нічога не цяпер. 631 00:37:49,640 --> 00:37:54,290 Зараз гэта проста нішто, таму што сёе-тое адбываецца ў форме гэтай табліцы. 632 00:37:54,290 --> 00:37:58,370 Такім чынам, ёсць свайго роду базу дадзеных або табліцу ў памяці кампутара 633 00:37:58,370 --> 00:38:03,850 , Што істотна мае адзін слупок для файлаў, імёны і адзін слупок для файлаў месца, 634 00:38:03,850 --> 00:38:07,720 дзе гэта можа быць размяшчэнне 123, проста выпадковы лік. 635 00:38:07,720 --> 00:38:14,560 Такім чынам, мы маглі б мець нешта накшталт x.jpeg і размяшчэнне 123. 636 00:38:14,560 --> 00:38:18,800 Што адбываецца потым, калі вы сапраўды спустошыць ваш смецце? 637 00:38:18,800 --> 00:38:20,330 Гэта сыходзіць. 638 00:38:20,330 --> 00:38:23,610 Але тое, што не знікае, гэта 0 і 1. 639 00:38:23,610 --> 00:38:26,270 >> Так у чым жа тады падлучэнне да pset4? 640 00:38:26,270 --> 00:38:31,240 Ну, з pset4, проста таму, што мы выпадкова сцёртыя кампактныя флэш-карты 641 00:38:31,240 --> 00:38:35,750 , Што было ўсе гэтыя фатаграфіі або проста таму, што яго няўдача была пашкоджана 642 00:38:35,750 --> 00:38:38,000 не азначае, што 0 і 1, не ўсё яшчэ там. 643 00:38:38,000 --> 00:38:40,410 Можа быць, некаторыя з іх страцілі, таму што нешта сапсаваўся 644 00:38:40,410 --> 00:38:43,320 У тым сэнсе, што некаторыя 0s сталі 1 і 1с стала 0s. 645 00:38:43,320 --> 00:38:47,240 Дрэнныя рэчы могуць адбыцца з-за памылкі ў праграмным забеспячэнні ці няспраўнасць абсталявання. 646 00:38:47,240 --> 00:38:50,370 Але шмат хто з тых бітаў, можа быць, нават 100% з іх, усё яшчэ там. 647 00:38:50,370 --> 00:38:55,050 Гэта проста, што кампутар або камеру не ведае, дзе JPEG1 пачатку 648 00:38:55,050 --> 00:38:56,910 і дзе JPEG2 пачалося. 649 00:38:56,910 --> 00:39:01,070 Але калі вы праграміст, ведаю, з трохі здаровага сэнсу, дзе гэтыя выявы ў фармаце JPEG з'яўляюцца 650 00:39:01,070 --> 00:39:06,010 або тое, што яны выглядаюць так што вы можаце аналізаваць 0 і 1 і казаць JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 Вы можаце напісаць праграму, з асноўным толькі для або падчас цыклу 652 00:39:09,440 --> 00:39:12,820 , Якая аднаўляе кожны з гэтых файлаў. 653 00:39:12,820 --> 00:39:16,030 Так што ўрок з'яўляецца тое, каб пачаць бяспечнага выдалення файлаў 654 00:39:16,030 --> 00:39:18,340 калі вы хочаце, каб пазбегнуць гэтага наогул. Так. 655 00:39:18,340 --> 00:39:21,010 >> [Студэнт] Чаму ён гаворыць на вашым кампутары 656 00:39:21,010 --> 00:39:23,550 што ў вас больш памяці, чым вы рабілі раней? 657 00:39:23,550 --> 00:39:27,820 Мець больш памяці, чым вы рабілі раней - >> [студэнт] падрабязна даступнай памяці. 658 00:39:27,820 --> 00:39:29,630 Ох. Добры пытанне. 659 00:39:29,630 --> 00:39:32,360 Дык чаму ж тады пасля апаражнення смецце ваш кампутар вам сказаць 660 00:39:32,360 --> 00:39:34,910 што ў вас больш вольнага прасторы, чым вы рабілі раней? 661 00:39:34,910 --> 00:39:36,770 У двух словах, таму што ён хлусіць. 662 00:39:36,770 --> 00:39:40,740 Больш тэхнічна, у вас ёсць больш прасторы, таму што цяпер вы сказалі, 663 00:39:40,740 --> 00:39:43,680 Вы можаце змясціць іншыя рэчы, дзе гэты файл быў раней. 664 00:39:43,680 --> 00:39:45,450 Але гэта не азначае, што біт сыходзіць, 665 00:39:45,450 --> 00:39:48,590 і гэта не значыць, біты змяняюцца для ўсіх 0s, напрыклад, 666 00:39:48,590 --> 00:39:50,150 для вашай абароны. 667 00:39:50,150 --> 00:39:54,640 Такім чынам, у адрозненне ад, калі вы надзейна сціраць файлы або фізічна знішчыць прыладу, 668 00:39:54,640 --> 00:39:57,300 , Які сапраўды з'яўляецца адзіным спосабам часам вакол гэтага. 669 00:39:57,300 --> 00:40:02,020 >> Так чаму б нам не пакінуць на гэтым падлозе-страшна запіску, і мы будзем бачыць Вас у панядзелак. 670 00:40:02,020 --> 00:40:07,000 [Апладысменты] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]