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