1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [МУЗИКА ГРАЄ] 3 00:00:11,261 --> 00:00:12,640 >> David J. Малан: Добре. 4 00:00:12,640 --> 00:00:14,525 Це CS50. 5 00:00:14,525 --> 00:00:16,009 І це початок тижня 5. 6 00:00:16,009 --> 00:00:18,050 І, як ви, можливо, помітили, частина матеріалу 7 00:00:18,050 --> 00:00:21,050 стає трохи більш Комплекс, трохи щільніше. 8 00:00:21,050 --> 00:00:24,560 >> І це дуже легко, особливо якщо ви були в звичку протягом деякого часу, 9 00:00:24,560 --> 00:00:28,600 , Намагається строчити вниз найбільш що ми робимо, ми говоримо в класі. 10 00:00:28,600 --> 00:00:31,626 Але усвідомити, що це не можливо, ідеальне педагогічний підхід 11 00:00:31,626 --> 00:00:34,250 до вивчення такого роду матеріалу, і матеріал в цілому. 12 00:00:34,250 --> 00:00:37,250 І тому ми раді повідомити, що CS50 власну Gheng 13 00:00:37,250 --> 00:00:39,780 Гонг початку підготовки канонічний набір нот 14 00:00:39,780 --> 00:00:42,100 за курс, надія , Який є те, що один, це 15 00:00:42,100 --> 00:00:44,030 не тільки служать довідково-ресурс 16 00:00:44,030 --> 00:00:47,410 для розгляду матеріалу і збирається назад через матеріал, що, можливо, доведеться 17 00:00:47,410 --> 00:00:51,230 втік вам в перший раз навколо, але і так, що ваші голови може бути більш 18 00:00:51,230 --> 00:00:53,740 до, ніж вниз, коли його приходить час, щоб читати лекції, 19 00:00:53,740 --> 00:00:56,960 так що ви могли б займатися більш вдумливо, як 20 00:00:56,960 --> 00:00:59,170 відміну від більш scribbly. 21 00:00:59,170 --> 00:01:02,510 >> З урахуванням сказаного, що ви знайдете на сайт такі документи, як це. 22 00:01:02,510 --> 00:01:04,660 І зверніть увагу, в лівому верхньому кутку, є не тільки зміст, 23 00:01:04,660 --> 00:01:06,920 але і тимчасові коди, що відразу перестрибне вас 24 00:01:06,920 --> 00:01:09,077 у відповідній частині в відео онлайн. 25 00:01:09,077 --> 00:01:11,410 І те, що Чанг тут зробив є, по суті, документально 26 00:01:11,410 --> 00:01:13,340 що відбулося в цей Зокрема лекція. 27 00:01:13,340 --> 00:01:16,370 І багато хто з лекцій вже зараз в мережі з цим URL. 28 00:01:16,370 --> 00:01:20,110 І ми будемо продовжувати розміщувати залишилася з тих, до кінця цього тижня, 29 00:01:20,110 --> 00:01:22,380 так що скористатися цим ресурсом. 30 00:01:22,380 --> 00:01:25,740 >> Отже, без подальших церемоній, ми почали відігніть 31 00:01:25,740 --> 00:01:28,180 Шар, який був Рядок протягом деякого часу. 32 00:01:28,180 --> 00:01:30,670 І що ж ми говоримо рядок насправді на тому тижні? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Так символ зірки. 35 00:01:32,900 --> 00:01:34,900 І символ зірки, добре, що нічого, що насправді означає? 36 00:01:34,900 --> 00:01:37,150 Ну, все це час, якщо ми в були виконанні функції, 37 00:01:37,150 --> 00:01:40,450 як GetString, і зберігання так званий повернення 38 00:01:40,450 --> 00:01:42,910 Значення GetString в переменная-- це називається 39 00:01:42,910 --> 00:01:47,721 с Тип string-- ми писали рядок коду там вище. 40 00:01:47,721 --> 00:01:49,970 І це тільки тоді, коли я бачу, мій почерк збільшується тут 41 00:01:49,970 --> 00:01:51,930 я розумію, наскільки звірячим це. 42 00:01:51,930 --> 00:01:54,180 >> Проте, давайте припустимо, що, на правій стороні 43 00:01:54,180 --> 00:01:57,070 , Проте, розумний зображення того, що це 44 00:01:57,070 --> 00:01:58,880 вже на все це Час з GetString. 45 00:01:58,880 --> 00:02:00,380 GetString, звичайно, отримує рядок. 46 00:02:00,380 --> 00:02:01,691 Але що це дійсно означає? 47 00:02:01,691 --> 00:02:04,190 Це означає, що він отримує шматок пам'яті від операційної системи 48 00:02:04,190 --> 00:02:06,040 шляхом виклику функції, називається Танос. 49 00:02:06,040 --> 00:02:07,390 Але про це пізніше. 50 00:02:07,390 --> 00:02:09,139 А потім він заповнює що частина пам'яті 51 00:02:09,139 --> 00:02:11,764 з буквами користувач має ввели в, за яким слід, звичайно, 52 00:02:11,764 --> 00:02:14,800 нульовий символ, або зворотну косу риску нулю в самому кінці. 53 00:02:14,800 --> 00:02:18,280 >> Між тим, на лівій стороні з цієї історії, все це час, 54 00:02:18,280 --> 00:02:20,850 ми були оголошення змінної, як с. 55 00:02:20,850 --> 00:02:24,770 І, що змінна що зараз почне виклику покажчик. 56 00:02:24,770 --> 00:02:29,190 Це не вікно, всередині якого ми ставимо рядок, Daven, по суті, 57 00:02:29,190 --> 00:02:32,550 а ми ставимо в цій клітці в лівій частині сторінки, що саме? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Да? 60 00:02:35,390 --> 00:02:37,118 >> АУДИТОРІЯ: адреса де він знаходиться в пам'яті. 61 00:02:37,118 --> 00:02:38,118 >> David J. Малан: Точно. 62 00:02:38,118 --> 00:02:40,690 Адреса, куди Daven знаходиться в пам'яті. 63 00:02:40,690 --> 00:02:44,650 І не там, де всі Daven знаходиться, як такої, а саме адреса 64 00:02:44,650 --> 00:02:45,150 чого? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Да? 67 00:02:46,810 --> 00:02:47,460 >> АУДИТОРІЯ: Перший символ. 68 00:02:47,460 --> 00:02:50,209 >> David J. Малан: Перший символ в Daven, який, в даному випадку, 69 00:02:50,209 --> 00:02:53,820 Я запропонував було довільно і нереально 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 який просто означає, що шестнадцатеричное число 1. 71 00:02:55,910 --> 00:02:57,993 Але це, ймовірно, бути набагато більше число 72 00:02:57,993 --> 00:03:01,260 що ми могли б зробити з 0x в якості приставки, 73 00:03:01,260 --> 00:03:02,806 , Що представляє шестнадцатеричное характер. 74 00:03:02,806 --> 00:03:05,930 І тому, що ми не повинні знати, де решта з персонажів Daven 75 00:03:05,930 --> 00:03:09,860 є, тому що простий дизайн Рішення, яке було зроблено багато років тому? 76 00:03:09,860 --> 00:03:10,548 Да? 77 00:03:10,548 --> 00:03:11,651 >> АУДИТОРІЯ: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. Малан: Так, точно. 79 00:03:12,900 --> 00:03:18,100 Зворотна коса риса 0 дозволяє, хоча і в лінійне час, щоб пройти через рядок, 80 00:03:18,100 --> 00:03:20,400 ходьби від зліва направо, с для циклу, або деякий час 81 00:03:20,400 --> 00:03:22,608 петля, або щось подібне що, і визначити, о, тут 82 00:03:22,608 --> 00:03:24,751 це кінець цій конкретній рядка. 83 00:03:24,751 --> 00:03:27,000 Так тільки з адреси в початок рядка, 84 00:03:27,000 --> 00:03:30,290 ми можемо отримати доступ повноту це, тому що весь цей час, 85 00:03:30,290 --> 00:03:32,030 рядок щойно був символ зірки. 86 00:03:32,030 --> 00:03:36,370 >> Так що це, звичайно, прекрасно, щоб продовжити використання Бібліотека CS50 і ця абстракція, 87 00:03:36,370 --> 00:03:38,440 так сказати, але ми будемо починаємо бачити саме 88 00:03:38,440 --> 00:03:41,230 що відбувалося на під весь цей час. 89 00:03:41,230 --> 00:03:45,260 Таким чином, ви, напевно, пам'ятаєте цей приклад, теж з минулого разу, порівнювати 0, 90 00:03:45,260 --> 00:03:47,300 який насправді не порівняти. 91 00:03:47,300 --> 00:03:49,070 Але ми почали з цим розібратися. 92 00:03:49,070 --> 00:03:52,020 >> Але як може бути, перепідготовки, може я зацікавити кого 93 00:03:52,020 --> 00:03:54,261 в рожевого слона сьогодні, також виступили Чанг? 94 00:03:54,261 --> 00:03:55,760 Як про вас перед? [Нерозбірливо]. 95 00:03:55,760 --> 00:03:56,660 Піднімайтеся. 96 00:03:56,660 --> 00:03:58,740 >> І в той же час, як ви придумали, давайте 97 00:03:58,740 --> 00:04:01,670 розглянути на мить, що цей код насправді робить. 98 00:04:01,670 --> 00:04:04,917 Це оголошення двох змінних до зверху, з і т, і закликаючи GetString. 99 00:04:04,917 --> 00:04:08,250 Це не дуже зручно програма, бо це не говорить вам, що робити. 100 00:04:08,250 --> 00:04:10,541 Але давайте припустимо, що ми упором на соковиті частини. 101 00:04:10,541 --> 00:04:14,470 І тоді ми робимо, якщо з одно дорівнює т, він повинен сказати Printf, 102 00:04:14,470 --> 00:04:16,170 Ви ввели те ж саме. 103 00:04:16,170 --> 00:04:16,670 Здравствуйте. 104 00:04:16,670 --> 00:04:17,050 Як тебе звуть? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. Малан: Janelle, приємно познайомитися. 107 00:04:19,529 --> 00:04:21,800 Так ваш виклик на рука для цього слона 108 00:04:21,800 --> 00:04:25,230 є насамперед звертають нам картину того, що знаходиться бути представленими в ті перші два 109 00:04:25,230 --> 00:04:25,970 лінії. 110 00:04:25,970 --> 00:04:28,139 Так с і т може бути представлені як на екрані? 111 00:04:28,139 --> 00:04:30,680 А можна просто намалювати його з пальцем на цьому великому екрані. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Таким чином, є дві половинки в кожна сторона цього рівняння. 114 00:04:34,510 --> 00:04:37,760 Отже з зліва, і потім GetString справа. 115 00:04:37,760 --> 00:04:40,540 А тут ще т на лівій стороні, а потім GetString справа. 116 00:04:40,540 --> 00:04:42,630 Так як ми можемо почати малювання зображення, що 117 00:04:42,630 --> 00:04:46,340 уявляє, що відбувається тут, в пам'яті, ви можете сказати? 118 00:04:46,340 --> 00:04:49,150 І дозвольте мені дозволяють пояснити що ви робите, як ви йдете. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: ОК. 120 00:04:49,820 --> 00:04:58,890 Ну, по-перше, він буде просити Вам отримати вхідну рядок. 121 00:04:58,890 --> 00:05:00,439 І було б store-- ой, вибачте. 122 00:05:00,439 --> 00:05:01,230 David J. Малан: ОК. 123 00:05:01,230 --> 00:05:01,730 Добре. 124 00:05:01,730 --> 00:05:03,330 І це називається і що? 125 00:05:03,330 --> 00:05:03,950 О, добре. 126 00:05:03,950 --> 00:05:04,450 Продовжуйте йти. 127 00:05:04,450 --> 00:05:05,575 Я не хотів переривати. 128 00:05:05,575 --> 00:05:07,060 Janelle: Вибачте. 129 00:05:07,060 --> 00:05:14,237 Так що це буде вхід його в адреса не of-- впевнений. 130 00:05:14,237 --> 00:05:17,320 Я не можу точно пригадати номер, але я вважаю, що це було, починаючи з 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. Малан: Все в порядку, бо я зробив цифри вгору, 132 00:05:18,420 --> 00:05:19,650 так що немає ніякого правильної відповіді. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Починаючи з 0 дуги. 134 00:05:22,105 --> 00:05:24,000 >> David J. Малан: ОК, так елементом 0. 135 00:05:24,000 --> 00:05:24,765 Звичайно. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: І потім, якщо була як просто два-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. Малан: ОК, назад до вас. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Так елемент 0, і то елемент 1 або елемент 2. 139 00:05:33,629 --> 00:05:36,670 David J. Малан: А яка частина картина ти малюєш прямо зараз? 140 00:05:36,670 --> 00:05:37,690 Заклик до GetString? 141 00:05:37,690 --> 00:05:38,830 Або декларація з? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Декларація із с, я вірю. 143 00:05:42,890 --> 00:05:45,980 О, GetString, тому що це, бути введені в кожній [? площа. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. Малан: Добре. 145 00:05:46,510 --> 00:05:47,051 Точно. 146 00:05:47,051 --> 00:05:49,300 Навіть при тому, що це ефективно повертає масив, нагадаємо, 147 00:05:49,300 --> 00:05:53,300 коли ми повернемося рядок, ми можемо індекс в цьому рядку, використовуючи 01 і 2. 148 00:05:53,300 --> 00:05:56,180 Технічно, це, ймовірно, представлена ​​окремими адресами, 149 00:05:56,180 --> 00:05:57,100 але це нормально. 150 00:05:57,100 --> 00:06:00,170 >> Отже, нехай, якщо я можу просто швидко направити туди, де ми зупинилися 151 00:06:00,170 --> 00:06:04,320 останній раз, якщо один з струни був г Ь е, 152 00:06:04,320 --> 00:06:10,337 зворотний слеш 0, тим самим представляючи Гейба вхід, як ми могли б представляти з зараз? 153 00:06:10,337 --> 00:06:12,670 Якщо це пам'ять, це були повернуті на GetString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: було б представлена ​​дугою? 156 00:06:17,610 --> 00:06:18,750 >> David J. Малан: Під дугою? 157 00:06:18,750 --> 00:06:19,130 Ну, немає. 158 00:06:19,130 --> 00:06:21,171 Давайте просто скажемо ,, графічно, дозвольте мені просто йти вперед 159 00:06:21,171 --> 00:06:25,710 і вважаємо, що, якщо це з, ця є повернення вартість GetString. 160 00:06:25,710 --> 00:06:29,482 І ви намалювали це як 0, 1, 2, які цілком розумно, тому що ми 161 00:06:29,482 --> 00:06:30,940 може індексувати в рядок, як такої. 162 00:06:30,940 --> 00:06:33,340 Але тільки, щоб відповідати останній раз, дозвольте мені йти вперед 163 00:06:33,340 --> 00:06:37,310 і довільно припускаємо, що це є адреса 1, це адреса 2, 164 00:06:37,310 --> 00:06:39,597 це адреса 3, і так далі. 165 00:06:39,597 --> 00:06:41,430 І так, просто, щоб бути супер ясно, що відбувається 166 00:06:41,430 --> 00:06:44,580 піти в с в результаті, що Перший рядок коду, ви можете сказати? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Адреса 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. Малан: Точно. 169 00:06:46,420 --> 00:06:47,190 Так що зверніться 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 А між тим, дозвольте мені йти вперед і дублювати багато чого з того, що ви зробили 172 00:06:51,230 --> 00:06:52,740 і додати свій власний т тут. 173 00:06:52,740 --> 00:06:56,340 Якби я був набрати в Гейб знову ж таки, вдруге, 174 00:06:56,340 --> 00:07:01,530 при запиті з GetString, де, Звичайно, такий Гебріел збирається йти? 175 00:07:01,530 --> 00:07:02,280 Ну, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Як тут? 178 00:07:05,975 --> 00:07:06,850 David J. Малан: Так. 179 00:07:06,850 --> 00:07:08,516 Janelle: Чи це теж в тих же ящиках? 180 00:07:08,516 --> 00:07:11,940 David J. Малан: Дозвольте мені запропонувати, так, точно, так в цих додаткових коробок. 181 00:07:11,940 --> 00:07:15,230 Але те, що ключ нині є те, що, навіть хоча я намалював ці досить близько 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, це є 0x2-- в дійсності, 183 00:07:18,650 --> 00:07:25,750 це тепер може бути адреса 0x10, Наприклад, і 0x11 і 0x12, 184 00:07:25,750 --> 00:07:26,870 і так далі. 185 00:07:26,870 --> 00:07:29,955 Так ось, якщо це так, що буде в кінцевому підсумку тут, в т? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. Малан: Точно. 188 00:07:31,830 --> 00:07:33,180 Так 0x10. 189 00:07:33,180 --> 00:07:34,570 І ось тепер, останнє питання. 190 00:07:34,570 --> 00:07:37,510 Ви, безумовно, повинні були працювати важка для слона досі. 191 00:07:37,510 --> 00:07:42,650 В даний час, якщо я підтягнути код знову, коли я роблю, в третій лінії, 192 00:07:42,650 --> 00:07:47,630 якщо з одно дорівнює т, що я насправді порівняння, що ми намалювали тут? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Два адреси? 194 00:07:49,271 --> 00:07:50,270 David J. Малан: Точно. 195 00:07:50,270 --> 00:07:53,350 Так що я говорю, и дорівнює дорівнює т? 196 00:07:53,350 --> 00:07:56,210 Іншими словами, це 1 дорівнює дорівнює 10? 197 00:07:56,210 --> 00:07:59,710 І, звичайно, Очевидна відповідь зараз, немає. 198 00:07:59,710 --> 00:08:02,920 І так ця програма в кінцевому рахунку, в друк, що, б ви сказали? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: було б, Ви ввели те ж саме? 201 00:08:08,405 --> 00:08:11,446 >> David J. Малан: Так що, якщо з 1 і Т 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Ви ввели різні речі. 203 00:08:13,320 --> 00:08:13,570 >> David J. Малан: Точно. 204 00:08:13,570 --> 00:08:14,480 Ви ввели різні речі. 205 00:08:14,480 --> 00:08:14,850 Добре. 206 00:08:14,850 --> 00:08:16,714 Так оплесками, якби ми могли, тут. 207 00:08:16,714 --> 00:08:17,214 [Оплески] 208 00:08:17,214 --> 00:08:17,708 Це було боляче. 209 00:08:17,708 --> 00:08:18,208 Я знаю. 210 00:08:18,208 --> 00:08:19,684 Красиво зроблено. 211 00:08:19,684 --> 00:08:24,690 Так що тепер давайте подивимося, якщо ми не можемо дражнити один від одного, що виправлення було. 212 00:08:24,690 --> 00:08:28,040 І, звичайно, коли ми зафіксували ето-- які тепер я буду представляти в green-- 213 00:08:28,040 --> 00:08:29,690 ми зробили пару поліпшень тут. 214 00:08:29,690 --> 00:08:32,409 По-перше, так само, як здорового глузду перевірити, я першої перевірки 215 00:08:32,409 --> 00:08:35,110 якщо з одно нулю і т дорівнює нулю. 216 00:08:35,110 --> 00:08:39,440 І щоб внести ясність, коли могли б з або т бути порожнім в коді, як це? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Коли може з або т бути порожнім. 219 00:08:44,490 --> 00:08:44,990 Да? 220 00:08:44,990 --> 00:08:45,990 >> АУДИТОРІЯ: [нерозбірливо]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. Малан: Точно. 223 00:08:50,510 --> 00:08:52,840 Якщо рядок, яку користувальницький набраний занадто довго 224 00:08:52,840 --> 00:08:56,140 щоб вписатися в пам'яті, або деякі дивно прикордонні випадки, як, що, 225 00:08:56,140 --> 00:08:59,010 GetString, як ми побачимо, в буквальному сенсі сьогодні, в документації, 226 00:08:59,010 --> 00:09:02,330 говорить він повернеться NULL як Особливе значення дозорного, 227 00:09:02,330 --> 00:09:05,417 або просто свого роду спеціальний символ це означає, що щось пішло не так. 228 00:09:05,417 --> 00:09:07,500 Тому ми хочемо, щоб перевірити що, тому що виявляється 229 00:09:07,500 --> 00:09:09,720 що нуль є дуже небезпечне значення. 230 00:09:09,720 --> 00:09:14,250 >> Часто, якщо ви спробуєте зробити те з нуль за участю function--, пропустивши її 231 00:09:14,250 --> 00:09:17,470 в якості вхідних даних, для instance-- цю функцію може дуже завалиться, а з ним, 232 00:09:17,470 --> 00:09:19,090 зняти всю програму. 233 00:09:19,090 --> 00:09:22,570 Так що це третя рядок тепер це просто здоровий глузд перевірити, перевірку помилок, якщо ви будете. 234 00:09:22,570 --> 00:09:25,450 Це хороша звичка і отримаєте нам потрапити в будь-який час ми 235 00:09:25,450 --> 00:09:28,050 спробуйте використати значення, може, потенційно, бути порожнім. 236 00:09:28,050 --> 00:09:32,000 >> Тепер, в четвертому рядку тут, "Якщо зЬгстр (S, T)," добре, 237 00:09:32,000 --> 00:09:33,180 що це таке говорите? 238 00:09:33,180 --> 00:09:36,750 Ну, ми говорили, що це дуже стисло імені функції для порівняння рядків. 239 00:09:36,750 --> 00:09:40,370 І його мета в житті, щоб порівняти його перший аргумент проти нього другого, 240 00:09:40,370 --> 00:09:44,640 але не в плані їх адреси, як ми зробили ненавмисно момент 241 00:09:44,640 --> 00:09:48,270 тому з червоним кодом, але а порівняти ці два 242 00:09:48,270 --> 00:09:53,210 рядка в людськи інтуїтивно чином, порівнюючи це, відносно того, 243 00:09:53,210 --> 00:09:56,690 проти цього, проти цього, і потім зупинка, якщо і коли один 244 00:09:56,690 --> 00:09:59,590 або обидва моїх пальців парад зворотну косу риску 0. 245 00:09:59,590 --> 00:10:04,530 Так хтось років тому реалізовані зЬгстр здійснити для нас функціональність 246 00:10:04,530 --> 00:10:08,890 що ми сподівалися, що ми отримали б , Просто порівнюючи дві прості значення. 247 00:10:08,890 --> 00:10:14,929 >> Тепер, чесно кажучи, я тримаю рисунок всі ці різні номери. 248 00:10:14,929 --> 00:10:17,470 Але реальність така, що я був що робить ці вгору весь час. 249 00:10:17,470 --> 00:10:19,580 І тому дозвольте мені просто йти вперед і строчити ці поза 250 00:10:19,580 --> 00:10:23,100 зробити пункт, що, врешті денного і рухатися вперед, 251 00:10:23,100 --> 00:10:30,160 ми насправді не збирається дбати про які адреси речі насправді 252 00:10:30,160 --> 00:10:30,790 в пам'яті. 253 00:10:30,790 --> 00:10:34,320 Так що я не збираюся робити це види чисел так більше, 254 00:10:34,320 --> 00:10:38,970 Я просто абстрактна це далеко трохи більш доброзичливим тільки з стрілками. 255 00:10:38,970 --> 00:10:42,060 >> Іншими словами, якщо с є покажчиком, добре, давайте просто намалювати його, в буквальному сенсі, 256 00:10:42,060 --> 00:10:45,430 як покажчик, стрілка від себе щось інше, 257 00:10:45,430 --> 00:10:48,280 і не надто турбуватися більше про дрібницях з цих адрес 258 00:10:48,280 --> 00:10:49,910 які, знову ж таки, я зробив так чи інакше. 259 00:10:49,910 --> 00:10:52,680 Але ми побачимо ці адреси, іноді, при налагодженні коду. 260 00:10:52,680 --> 00:10:56,450 >> Тепер той же час, ця програма тут виправлення, звичайно, 261 00:10:56,450 --> 00:10:58,720 що проблема, порівнюючи ці два рядки. 262 00:10:58,720 --> 00:11:00,260 Але ми зіткнулися з іншою проблемою. 263 00:11:00,260 --> 00:11:03,180 Це було з копії запрограмувати в минулий раз, 264 00:11:03,180 --> 00:11:06,880 в результаті чого, я намагався отримати вигоду тільки перший символ в рядку. 265 00:11:06,880 --> 00:11:09,620 Але те, що було симптомом ми бачили останній раз 266 00:11:09,620 --> 00:11:14,150 користувач вводить у вартості, як Гейб в нижньому регістрі, для х, 267 00:11:14,150 --> 00:11:19,310 Потім ми присвоїли їй в т, а в третьому рядку там, 268 00:11:19,310 --> 00:11:22,900 і тоді я спробував вигоду т кронштейн 0? 269 00:11:22,900 --> 00:11:25,950 Що був ефект зміни т кронштейн 0 тут? 270 00:11:25,950 --> 00:11:27,150 >> АУДИТОРІЯ: Це змінило с. 271 00:11:27,150 --> 00:11:29,360 >> David J. Малан: Так, Я змінив с, а також. 272 00:11:29,360 --> 00:11:31,050 Тому що те, що відбувається насправді? 273 00:11:31,050 --> 00:11:34,130 Ну, дозвольте мені побачити, якщо я можу чистити до цієї картини, як слід. 274 00:11:34,130 --> 00:11:41,390 >> Якщо с, знову ж таки, слово г, а, б, е, зворотний слеш, 0, і з 275 00:11:41,390 --> 00:11:44,084 ми будемо продовжувати малюнок як коробка тут, але не більше адрес. 276 00:11:44,084 --> 00:11:45,250 Давайте припинити речі. 277 00:11:45,250 --> 00:11:47,510 Давайте просто намалювати картину спростити світ. 278 00:11:47,510 --> 00:11:52,640 >> Коли я оголошую т зі струнним т, що створює цей шматок пам'яті. 279 00:11:52,640 --> 00:11:55,850 Площа, трапляється, 32 Біти в більшості комп'ютерів. 280 00:11:55,850 --> 00:11:59,530 Справді, якщо ви ще не чули про комп'ютер, що має 32-розрядну архітектуру, 281 00:11:59,530 --> 00:12:03,000 дійсно фантазійних говорити, що тільки означає, що він використовує 32-бітові адреси. 282 00:12:03,000 --> 00:12:05,370 І як технічна сторону, якщо ви ніколи не замислювалися, 283 00:12:05,370 --> 00:12:09,630 Тому старі комп'ютери, якщо ви насправді намагався суп їх з великим об'ємом оперативної пам'яті, 284 00:12:09,630 --> 00:12:12,360 могли мати тільки максимум з чотирьох гігабайт оперативної пам'яті, 285 00:12:12,360 --> 00:12:14,860 добре, що це тому, що, буквально, ваш старий комп'ютер міг тільки 286 00:12:14,860 --> 00:12:17,250 Кількість вище, ніж 4 млрд, 4 млрд байт, 287 00:12:17,250 --> 00:12:20,590 тому що це було 32-розрядний номера для адрес. 288 00:12:20,590 --> 00:12:23,260 >> Але в будь-якому випадку, в цьому приклад, історія набагато простіше. 289 00:12:23,260 --> 00:12:27,250 т це просто ще один покажчик, або дійсно символ зірки, він же рядок. 290 00:12:27,250 --> 00:12:30,860 І як я хочу, щоб оновити цю картинку тепер з цією другому рядку коду, 291 00:12:30,860 --> 00:12:31,950 після точки, многоточия, многоточия? 292 00:12:31,950 --> 00:12:35,845 Коли я роблю рядок т дорівнює з комою, як же змінити цю картину? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Да? 295 00:12:38,000 --> 00:12:38,916 >> АУДИТОРІЯ: [нерозбірливо]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. Малан: Так. 298 00:12:42,020 --> 00:12:42,600 Точно. 299 00:12:42,600 --> 00:12:45,620 Я просто покласти стрілу з т коробка за тією ж адресою, 300 00:12:45,620 --> 00:12:47,570 те ж саме перший лист в дали. 301 00:12:47,570 --> 00:12:50,850 Або технічно, якщо це хлопець все ще в 0x1, 302 00:12:50,850 --> 00:12:53,052 це як якби я був 0x1 тут і 0x1 тут. 303 00:12:53,052 --> 00:12:54,760 Але, знову ж таки, хто піклується про адреси? 304 00:12:54,760 --> 00:12:56,345 Це просто ідея, що зараз має значення. 305 00:12:56,345 --> 00:12:57,720 Так що це те, що відбувається тут. 306 00:12:57,720 --> 00:13:02,690 Так, звичайно, якщо ви робите т кронштейна 0, що позначення масиву, 307 00:13:02,690 --> 00:13:05,650 з course-- і відверто кажучи, це виглядає як є масив тут, 308 00:13:05,650 --> 00:13:07,340 але тепер є ця дивна річ. 309 00:13:07,340 --> 00:13:11,160 Знайте, що мова програмування, C, пропонує Вам цю функцію, 310 00:13:11,160 --> 00:13:14,650 в результаті чого, навіть якщо Т покажчик, або з є покажчиком, 311 00:13:14,650 --> 00:13:18,050 Ви все ще можете використовувати, що знайомі, зручна квадратна дужка 312 00:13:18,050 --> 00:13:22,520 позначення, щоб перейти до першого елементу, або другий елемент, або будь-який елемент 313 00:13:22,520 --> 00:13:26,130 що, що покажчик направлений , Тому, мабуть, його 314 00:13:26,130 --> 00:13:29,410 це, як в даному випадку, вказуючи на деякий масиву. 315 00:13:29,410 --> 00:13:30,340 >> Так як же нам це виправити? 316 00:13:30,340 --> 00:13:33,660 Чесно кажучи, це те, де він отримав трохи переважною на перший погляд. 317 00:13:33,660 --> 00:13:35,340 Але ось нова і поліпшена версія. 318 00:13:35,340 --> 00:13:37,460 >> Отже, спочатку, я отримую позбутися від бібліотеки CS50, 319 00:13:37,460 --> 00:13:41,170 просто виставити, що S дійсно символ зірки, просто синонім. 320 00:13:41,170 --> 00:13:43,540 І т також символ зірки. 321 00:13:43,540 --> 00:13:48,290 Але те, що відбувається на правая сторона цієї лінії 322 00:13:48,290 --> 00:13:49,970 де т присвоюється значення? 323 00:13:49,970 --> 00:13:50,790 >> Що таке Танос? 324 00:13:50,790 --> 00:13:51,630 Що це STRLEN? 325 00:13:51,630 --> 00:13:52,547 Що таке SizeOf (символ)? 326 00:13:52,547 --> 00:13:54,380 Чому, чорт візьми, робить це лінія погляд настільки складним? 327 00:13:54,380 --> 00:13:55,713 Що він робить на високому рівні? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Що це зберігання в т? 330 00:13:57,440 --> 00:13:58,646 Да? 331 00:13:58,646 --> 00:14:01,104 АУДИТОРІЯ: Це виділення певну кількість пам'яті. 332 00:14:01,104 --> 00:14:03,032 Це для зберігання, я думаю, листа [нерозбірливо]. 333 00:14:03,032 --> 00:14:04,032 >> David J. Малан: Прекрасно. 334 00:14:04,032 --> 00:14:04,540 Прекрасно. 335 00:14:04,540 --> 00:14:06,650 Це виділення певного обсяг простору пам'яті 336 00:14:06,650 --> 00:14:08,940 для зберігання, імовірно, майбутні письма. 337 00:14:08,940 --> 00:14:11,310 І зокрема, Танос Тому повернення і що? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> АУДИТОРІЯ: Повернення [нерозбірливо]? 340 00:14:14,851 --> 00:14:15,850 David J. Малан: Точно. 341 00:14:15,850 --> 00:14:18,850 Повертаючись адресу цієї пам'яті, який є химерний спосіб сказати, 342 00:14:18,850 --> 00:14:21,640 повертає адресу Перший байт цієї пам'яті. 343 00:14:21,640 --> 00:14:25,460 Відповідальність лежить на мені, щоб пам'ятати скільки пам'яті я насправді 344 00:14:25,460 --> 00:14:27,140 виділено або запитав Танос для. 345 00:14:27,140 --> 00:14:28,384 >> Тепер, скільки це? 346 00:14:28,384 --> 00:14:30,550 Ну, хоча є багато дужках тут, 347 00:14:30,550 --> 00:14:32,970 Танос займає всього один аргумент. 348 00:14:32,970 --> 00:14:37,250 І я вказавши STRLEN з х, так дайте мені стільки байт, скільки є в с, 349 00:14:37,250 --> 00:14:37,800 але додайте один. 350 00:14:37,800 --> 00:14:38,300 Чому? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Да? 353 00:14:39,530 --> 00:14:40,840 >> АУДИТОРІЯ: зворотний слеш 0. 354 00:14:40,840 --> 00:14:41,840 David J. Малан: Точно. 355 00:14:41,840 --> 00:14:43,423 Ми повинні зробити невелике домашнє господарство. 356 00:14:43,423 --> 00:14:45,970 Так, тому що є зворотна коса риса 0, ми б краще пам'ятати, що. 357 00:14:45,970 --> 00:14:47,310 В іншому випадку, ми збираємося створити рядок, 358 00:14:47,310 --> 00:14:49,170 не має, що особливу термінатор. 359 00:14:49,170 --> 00:14:52,640 >> Між тим, тільки щоб бути супер анал, у мене є SizeOf (символ), 360 00:14:52,640 --> 00:14:55,730 тільки у випадку, якщо хто працює М.Ю. Код не на CS50 пристрою, 361 00:14:55,730 --> 00:14:58,220 але, можливо, на інший комп'ютер в цілому, де символи 362 00:14:58,220 --> 00:15:01,470 один байт, за угодою, але два байт, чи щось більше, ніж це. 363 00:15:01,470 --> 00:15:04,490 Це просто, щоб бути супер, супер геть помилок. 364 00:15:04,490 --> 00:15:06,940 Навіть при тому, що, насправді, це швидше за все буде 1. 365 00:15:06,940 --> 00:15:11,490 >> Тепер, в той час, я йду вперед і скопіювати Рядок, т кронштейн я дорівнює т кронштейн с. 366 00:15:11,490 --> 00:15:14,962 І я підкорюся минулого тижня вихідний код, щоб побачити, що відбувається. 367 00:15:14,962 --> 00:15:17,670 Але ключ винос, і Тому я поставив код тепер в зелений, 368 00:15:17,670 --> 00:15:22,520 тому, що цієї самої останньої строчки, т кронштейн 0 дорівнює ToUpper, 369 00:15:22,520 --> 00:15:25,230 має ефект Капіталізація який рядок? 370 00:15:25,230 --> 00:15:26,960 T і / або з? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Останній рядок коду. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Просто т, тому що сталося цього разу, 375 00:15:35,560 --> 00:15:41,500 якщо я трохи скасувати цей останній крок, що трапилося вже, коли я називаю Танос, 376 00:15:41,500 --> 00:15:45,380 Я по суті отримати шматок пам'яті що має той же розмір, що і оригінал, 377 00:15:45,380 --> 00:15:47,020 бо це арифметичне я зробив. 378 00:15:47,020 --> 00:15:50,920 Я зберігаю в т адресою з цього шматка пам'яті. 379 00:15:50,920 --> 00:15:53,370 Незважаючи на те, що це виглядає красиво і досить, красиво і пусто, 380 00:15:53,370 --> 00:15:56,882 реальність є, те, що ми будемо дзвонять, значення сміття тут. 381 00:15:56,882 --> 00:15:59,340 Це шматок пам'яті могли б дуже добре були використані раніше, 382 00:15:59,340 --> 00:16:00,940 кілька секунд, кілька хвилин тому. 383 00:16:00,940 --> 00:16:04,410 Так що може бути абсолютно номера або букви там, просто випадково. 384 00:16:04,410 --> 00:16:08,580 Але вони не не діє, поки я сам заповнити цей шматок пам'яті 385 00:16:08,580 --> 00:16:12,510 з фактичними символів, як я зробити в тому, що цикл там. 386 00:16:12,510 --> 00:16:13,180 Добре? 387 00:16:13,180 --> 00:16:16,180 >> Так що тепер, кульмінація ці три приклади 388 00:16:16,180 --> 00:16:20,730 , Які були, здавалося б, розбиті в останній раз, цей приклад заміни, ця функція 389 00:16:20,730 --> 00:16:23,670 працював в тому сенсі, що місцями а і б. 390 00:16:23,670 --> 00:16:25,620 Але це не спрацювало в якому іншому сенсі? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Да? 393 00:16:28,614 --> 00:16:29,612 >> АУДИТОРІЯ: [нерозбірливо]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. Малан: Точно. 396 00:16:36,700 --> 00:16:39,530 Якби мені довелося викликати цю функцію від another-- наприклад, 397 00:16:39,530 --> 00:16:42,870 з функції як основний, де У мене є змінна, х і у, як я 398 00:16:42,870 --> 00:16:46,160 зробив минулого тижня, і той же код, і я проходжу по х і у 399 00:16:46,160 --> 00:16:49,860 щоб Поміняти, а потім викликати Swap-- це, звичайно, правильна версія 400 00:16:49,860 --> 00:16:52,220 це те, що ми збираємося see-- він не працює. 401 00:16:52,220 --> 00:16:53,770 Так що ж таке виправлення? 402 00:16:53,770 --> 00:16:56,850 >> Ну, так що просто бути ясно, дозвольте мені йти вперед 403 00:16:56,850 --> 00:17:05,450 і-- дати мені один другий тут, щоб побачити якщо я можу показати вам останній, який 404 00:17:05,450 --> 00:17:12,464 буде В- давайте подивимося, якщо я можу знайти це реальна fast-- ОК, [нерозбірливо]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 ОК, це так. 407 00:17:19,240 --> 00:17:21,000 Так ігнорувати команди я просто друкувати. 408 00:17:21,000 --> 00:17:23,780 Я хочу, щоб витягти на останньої хвилини приклад 409 00:17:23,780 --> 00:17:27,960 з минулого разу, що НЕ тепер називається не Своп. 410 00:17:27,960 --> 00:17:30,200 >> Так ні Своп не те, де ми зупинилися минулого разу, 411 00:17:30,200 --> 00:17:32,930 в результаті чого, я ініціалізації х 1, а у к 2. 412 00:17:32,930 --> 00:17:35,840 Я потім викликати своп, проходячи в 1 і 2. 413 00:17:35,840 --> 00:17:37,930 А потім ця функція працював в деякому сенсі, 414 00:17:37,930 --> 00:17:40,750 але це не було ніякого постійного ефект від х і у. 415 00:17:40,750 --> 00:17:45,430 Отже питання в руці, як зараз ми насправді вирішити цю проблему? 416 00:17:45,430 --> 00:17:47,820 Що таке рішення під рукою? 417 00:17:47,820 --> 00:17:53,150 >> Ну, в swap.c, що новий сьогодні, помітити пару відмінностей. 418 00:17:53,150 --> 00:17:54,700 х і у є однаковими. 419 00:17:54,700 --> 00:17:57,250 Але те, що явно відрізняється про лінію 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Що нового там, якщо ви пам'ятаєте, що це було схоже секунду назад? 422 00:18:01,715 --> 00:18:02,565 >> АУДИТОРІЯ: [нерозбірливо]. 423 00:18:02,565 --> 00:18:03,440 >> David J. Малан: Так. 424 00:18:03,440 --> 00:18:06,680 Так амперсанди нова частина синтаксису не тільки в цій програмі, 425 00:18:06,680 --> 00:18:08,560 але і в цілому в CS50. 426 00:18:08,560 --> 00:18:10,680 На сьогоднішній день, я не думаю, ми бачили ніяких прикладів 427 00:18:10,680 --> 00:18:14,070 або дійсно говорили про них в будь-якому деталь, крім, може бути, превентивно 428 00:18:14,070 --> 00:18:16,467 в розділі, амперсанд, як це. 429 00:18:16,467 --> 00:18:19,300 Ну, виходить, амперсанд є одним з останніх частин нового синтаксису 430 00:18:19,300 --> 00:18:20,174 ми збираємося дізнатися. 431 00:18:20,174 --> 00:18:23,500 Все це означає, адреса деякої змінної. 432 00:18:23,500 --> 00:18:25,070 На який адреса не х жити? 433 00:18:25,070 --> 00:18:26,510 Але те, що адреса не у жити? 434 00:18:26,510 --> 00:18:28,700 Тому що, якщо Основна проблема, перш ніж 435 00:18:28,700 --> 00:18:32,970 була, що х і у були передається як копії, що ми дійсно хочемо зробити 436 00:18:32,970 --> 00:18:38,780 це надати Переключити з як скарб карта, яка веде до де х і у власне 437 00:18:38,780 --> 00:18:41,910 в оперативній пам'яті, так, щоб Своп може випливати, що карту 438 00:18:41,910 --> 00:18:47,760 і йти туди, де х або у відзначає пляма і змінити фактичні значення 1 і 2 439 00:18:47,760 --> 00:18:48,270 є. 440 00:18:48,270 --> 00:18:50,710 >> Так Своп потрібно трохи змінити теж. 441 00:18:50,710 --> 00:18:53,760 І на перший погляд, це може здається трохи схожий на персонаж зірки. 442 00:18:53,760 --> 00:18:54,850 І це дійсно так. 443 00:18:54,850 --> 00:18:59,635 Так це покажчик на тип даних, на основі цієї виділеної частини? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Так що це внутр. 446 00:19:01,620 --> 00:19:04,880 >> Так що більше не Int, це адреса в междунар. 447 00:19:04,880 --> 00:19:07,910 І точно так само, б тепер збирається бути собою адресу междунар. 448 00:19:07,910 --> 00:19:12,470 Тому, коли я тепер називаємо Переключити від головного, Я не збираюся давати SWAP 1 і 2. 449 00:19:12,470 --> 00:19:15,540 Я збираюся дати його як Ox-то і Ox-то, 450 00:19:15,540 --> 00:19:19,820 дві адреси, які приведуть Своп з їх фактичними місцях 451 00:19:19,820 --> 00:19:21,310 в пам'яті мого комп'ютера. 452 00:19:21,310 --> 00:19:25,580 >> Так що тепер, моя залишилася реалізація необхідно змінити чуть. 453 00:19:25,580 --> 00:19:28,650 Що, безумовно, відрізняються зараз в цих трьох рядків коду? 454 00:19:28,650 --> 00:19:31,350 Там в ці кляті зірки все повсюдно, все гаразд? 455 00:19:31,350 --> 00:19:33,014 Так що тут відбувається? 456 00:19:33,014 --> 00:19:33,514 Да? 457 00:19:33,514 --> 00:19:35,055 >> АУДИТОРІЯ: Це, очевидно, [нерозбірливо]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. Малан: Точно. 460 00:19:37,990 --> 00:19:41,560 Таким чином, в цьому context-- і це не було кращий дизайн рішення, за загальним визнанням, 461 00:19:41,560 --> 00:19:42,530 років тому. 462 00:19:42,530 --> 00:19:45,110 В цьому контексті, в якому ви просто повинні зірку, 463 00:19:45,110 --> 00:19:48,240 і у вас немає тип даних, як Int, відразу наліво, 464 00:19:48,240 --> 00:19:53,146 замість цього ви повинні знак рівності, чітко, В цьому контексті, коли ви говорите, зірки, 465 00:19:53,146 --> 00:19:56,980 це означає, що перейти до адреса, який знаходиться в. 466 00:19:56,980 --> 00:19:58,870 Слідуйте карту скарбів, так би мовити. 467 00:19:58,870 --> 00:20:01,720 >> А між тим, в рядку 37, це означає те ж саме. 468 00:20:01,720 --> 00:20:05,460 До адресної а, і покласти, що там? 469 00:20:05,460 --> 00:20:09,520 Все, що в розташування, що б вказує. 470 00:20:09,520 --> 00:20:10,980 Іншими словами, піти б. 471 00:20:10,980 --> 00:20:12,130 Отримати цю величину. 472 00:20:12,130 --> 00:20:15,620 К і, в рівній підписати, оператор присвоювання, 473 00:20:15,620 --> 00:20:17,010 поставити там це значення. 474 00:20:17,010 --> 00:20:19,272 >> Аналогічно, Int Темп просто внутр. 475 00:20:19,272 --> 00:20:20,730 Нічого не потрібно змінювати про темп. 476 00:20:20,730 --> 00:20:24,810 Це просто запасний скло від Анненберг за молоком або апельсиновим соком. 477 00:20:24,810 --> 00:20:27,630 Але я повинен сказати, піти в б. 478 00:20:27,630 --> 00:20:31,449 До цього пункту призначення і помістити значення в температурі там. 479 00:20:31,449 --> 00:20:32,490 Так що ж тоді відбувається? 480 00:20:32,490 --> 00:20:36,540 Коли я насправді назвати Поміняти цього разу, якщо це перший лоток тут представляє Main, 481 00:20:36,540 --> 00:20:42,270 це другий лоток являє підкачки, коли Я проходжу амперсанда х і амперсанд у 482 00:20:42,270 --> 00:20:47,150 від Майні в Поміняти, просто щоб було ясно, що це за фрейм стека прийому? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Да? 485 00:20:49,200 --> 00:20:50,180 >> АУДИТОРІЯ: [нерозбірливо]. 486 00:20:50,180 --> 00:20:51,180 David J. Малан: Точно. 487 00:20:51,180 --> 00:20:53,129 Адреса х і адреса у. 488 00:20:53,129 --> 00:20:55,170 І ви можете думати про них як поштові адреси. 489 00:20:55,170 --> 00:20:58,772 33 Оксфорд-стріт і 35 Оксфорд-стріт, і ви 490 00:20:58,772 --> 00:21:01,230 хочете перемістити дві будівлі які в цих місцях. 491 00:21:01,230 --> 00:21:04,680 >> Це свого роду безглуздою ідеї, але це все, ми маємо на увазі за адресою. 492 00:21:04,680 --> 00:21:07,000 Де в світі можна Ви знайдете ці два цілих? 493 00:21:07,000 --> 00:21:09,470 Де в світі ви можете знайти ці дві будівлі? 494 00:21:09,470 --> 00:21:15,170 Так що, якщо, нарешті, після всього цього часу I йти в сьогоднішньому вихідного коду і компіляції 495 00:21:15,170 --> 00:21:22,110 Своп і запустити ./swap, нарешті, для Перший раз ми насправді бачимо, що 496 00:21:22,110 --> 00:21:25,330 мої цінності мають дійсно успішно помінялися. 497 00:21:25,330 --> 00:21:30,860 І тепер, ми можемо навіть взяти примітка цього, скажімо, в GDB. 498 00:21:30,860 --> 00:21:32,740 >> Отже, дозвольте мені піти в той же файл. 499 00:21:32,740 --> 00:21:35,010 Дозвольте мені йти вперед і налагоджувати з ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 І тепер, в обмін, я піду вперед і встановити точку зупину у Майні. 502 00:21:40,547 --> 00:21:42,630 А тепер я піду вперед і запустити програму. 503 00:21:42,630 --> 00:21:45,810 І тепер ми бачимо свій код зупинився на цій лінії. 504 00:21:45,810 --> 00:21:48,330 >> Якщо я йду вперед і друк х, що я повинен побачити тут? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Це питання. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Знову сказати? 509 00:21:51,530 --> 00:21:52,295 >> АУДИТОРІЯ: [нерозбірливо]. 510 00:21:52,295 --> 00:21:53,910 >> David J. Малан: Так випадкові числа, може бути. 511 00:21:53,910 --> 00:21:56,010 Може бути, я пощастить, і це просто і красиво, як 0. 512 00:21:56,010 --> 00:21:57,230 Але може бути, це деякий випадкове число. 513 00:21:57,230 --> 00:21:58,090 В цьому випадку, мені пощастило. 514 00:21:58,090 --> 00:21:59,030 Це якраз трапляється бути 0. 515 00:21:59,030 --> 00:22:00,780 Але це дійсно удача, бо не до Я 516 00:22:00,780 --> 00:22:06,280 введіть наступний, а потім роздрукувати х має, що рядок коду, рядок 19, були виконані. 517 00:22:06,280 --> 00:22:10,942 >> Між тим, якщо я типу поруч знову, і роздрукувати зараз з у, я йду до 2. 518 00:22:10,942 --> 00:22:13,900 Тепер, якщо я типу поруч, він збирається отримати трохи заплутаним, тому що тепер, 519 00:22:13,900 --> 00:22:17,250 Е з'являтиметься на екран, як це було. х дорівнює 1. 520 00:22:17,250 --> 00:22:18,606 >> Давайте зробимо це знову. 521 00:22:18,606 --> 00:22:20,480 А тепер, ось, де стає все цікавіше. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Перш ніж надати слово Свопінг або навіть крок в нього, давайте трохи зазирнути. 524 00:22:26,580 --> 00:22:28,980 х, знову ж таки, 1. 525 00:22:28,980 --> 00:22:33,240 Y є, звичайно, швидко здоровий глузд перевірити, 2, таким чином, не важко там. 526 00:22:33,240 --> 00:22:35,740 Але те, що амперсанд х? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Відповідь, це частково фанки дивлячись. 529 00:22:39,350 --> 00:22:43,500 Але Int зірка в дужках просто спосіб ВВП спосіб сказати це адреса. 530 00:22:43,500 --> 00:22:48,290 Це не Int, це покажчик на Int або інакше відомий як адреса. 531 00:22:48,290 --> 00:22:49,742 >> Що це божевільна річ? 532 00:22:49,742 --> 00:22:51,825 Ми ніколи не бачили то зовсім так раніше. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Так що це адреса в мого комп'ютера пам'ять, де х відбувається жити. 535 00:22:58,120 --> 00:22:59,040 Це Ox-то. 536 00:22:59,040 --> 00:23:01,290 І це, чесно кажучи, чому Я почав малювати стрілки, 537 00:23:01,290 --> 00:23:03,340 замість цифр, бо, хто дійсно піклується 538 00:23:03,340 --> 00:23:06,890 що ІНТ знаходиться зокрема адреса ось що великий. 539 00:23:06,890 --> 00:23:12,160 Але bffff0c4, це все Дійсно шістнадцятиричні цифри, 540 00:23:12,160 --> 00:23:13,720 які від 0 до ф. 541 00:23:13,720 --> 00:23:16,590 >> Таким чином, ми не збираємося зупинятися занадто довго на те, що ці речі. 542 00:23:16,590 --> 00:23:19,400 Але якщо я роздрукувати у, Звичайно, я бачу 2. 543 00:23:19,400 --> 00:23:22,440 Але амперсанд у, я бачу цю адресу. 544 00:23:22,440 --> 00:23:26,527 І зауважте, для цікавих, як далеко один від одного знаходяться хну? 545 00:23:26,527 --> 00:23:27,985 Ви можете ігнорувати більшу частину адреси. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Чотири байти. 548 00:23:29,920 --> 00:23:33,510 І це узгоджується з нашим раніше стверджують, що, наскільки великою є Int? 549 00:23:33,510 --> 00:23:34,130 Чотири байти. 550 00:23:34,130 --> 00:23:37,420 Так що, схоже підкладці все в до красиво, як Ви могли б сподіватися, в пам'яті. 551 00:23:37,420 --> 00:23:40,010 >> Так що тепер, давайте просто швидке перемотування вперед до кінця цієї історії. 552 00:23:40,010 --> 00:23:43,290 Давайте підемо далі і ввести крок, зануритися у функції підкачування. 553 00:23:43,290 --> 00:23:46,880 Тепер зверніть увагу, якщо я друкую, це ідентична адресою х. 554 00:23:46,880 --> 00:23:52,130 Якщо я друкую б, це ідентично за адресою у. 555 00:23:52,130 --> 00:23:57,020 Так що я повинен побачити, якщо я кажуть, перейти за адресою на? 556 00:23:57,020 --> 00:23:58,120 Так роздрукувати зірка. 557 00:23:58,120 --> 00:24:00,130 Так зірка означає піти туди, в цьому контексті. 558 00:24:00,130 --> 00:24:02,730 Ampersand означає те, що адреса. 559 00:24:02,730 --> 00:24:05,000 Так зірка кошти 1. 560 00:24:05,000 --> 00:24:09,590 І печатка зірка б дає мені 2. 561 00:24:09,590 --> 00:24:15,750 >> І дозвольте мені припустити, на даний момент, що принаймні код, який 562 00:24:15,750 --> 00:24:18,950 переходить до виконання тепер може бути міркував через таким чином. 563 00:24:18,950 --> 00:24:21,150 Але ми будемо повертатися до цієї ідеї незабаром. 564 00:24:21,150 --> 00:24:23,850 Так ця версія обмін Зараз правильно і дозволяє 565 00:24:23,850 --> 00:24:26,650 нам, щоб поміняти цей конкретний тип даних. 566 00:24:26,650 --> 00:24:29,120 >> Тому будь-які питання, то на обмін? 567 00:24:29,120 --> 00:24:29,890 На зірці? 568 00:24:29,890 --> 00:24:30,690 На адресу? 569 00:24:30,690 --> 00:24:33,270 І ви побачите, з Проблема встановити 4, свого роду, 570 00:24:33,270 --> 00:24:37,310 але проблема встановити 5, визначено, як це речі корисні і отримати набагато більш 571 00:24:37,310 --> 00:24:39,584 комфортно з ними, в результаті. 572 00:24:39,584 --> 00:24:40,430 Все, що завгодно? 573 00:24:40,430 --> 00:24:40,930 Добре. 574 00:24:40,930 --> 00:24:44,350 Так Танос, знову ж таки, ця функція що тільки виділяє пам'ять, пам'ять 575 00:24:44,350 --> 00:24:45,330 розподіл. 576 00:24:45,330 --> 00:24:47,024 І чому це корисно? 577 00:24:47,024 --> 00:24:48,940 Ну, все це час, Ви використовували Танос. 578 00:24:48,940 --> 00:24:52,230 Якщо ви вважаєте, зараз, як GetString робіт, мабуть, це 579 00:24:52,230 --> 00:24:56,140 були просити кого на шматок пам'яті, в будь-який час користувач друкує рядок 580 00:24:56,140 --> 00:24:59,040 в, тому що ми, звичайно, не знаю, як персонал CS50, 581 00:24:59,040 --> 00:25:02,710 наскільки велика ці рядки, що людей збираються ввести може бути. 582 00:25:02,710 --> 00:25:07,910 >> Так що давайте, вперше, починають відігніть собі як вона CS50 робіт, 583 00:25:07,910 --> 00:25:10,990 шляхом пару прикладів що приведе нас є. 584 00:25:10,990 --> 00:25:15,300 Так що, якщо я відкриваю Gedit і відкрити зсапЕ 0, 585 00:25:15,300 --> 00:25:17,055 ми збираємося, щоб побачити наступний код. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, доступні на веб-сайті для сьогодні, має відносно невелике число рядків коду 588 00:25:23,530 --> 00:25:25,351 тут, з 14 по 20. 589 00:25:25,351 --> 00:25:26,600 І давайте подивимося, що він робить. 590 00:25:26,600 --> 00:25:28,920 Це оголошує INT, під назвою х. 591 00:25:28,920 --> 00:25:30,850 Це говорить щось на кшталт: число ласка. 592 00:25:30,850 --> 00:25:33,940 А тепер він каже, зсапЕ% я, і х. 593 00:25:33,940 --> 00:25:35,620 Таким чином, є купа нового матеріалу там. 594 00:25:35,620 --> 00:25:38,420 >> Але зсапЕ, ви можете як би думаю як протилежність Printf. 595 00:25:38,420 --> 00:25:40,090 Е, звичайно, виведену в. 596 00:25:40,090 --> 00:25:44,410 зсапЕ роду сканувань від споживача, клавіатура-то він або вона набрала. 597 00:25:44,410 --> 00:25:46,550 >> % Я точно так само як Printf. 598 00:25:46,550 --> 00:25:49,410 Це означає, очікувати користувачеві введіть Int. 599 00:25:49,410 --> 00:25:52,820 А тепер, чому ви думаєте, я може бути проходження зсапЕ & х? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Якщо мета в житті зсапЕ , Щоб отримати щось від користувача, 602 00:25:57,770 --> 00:26:02,480 що це значить пропускаючи його, і х, зараз? 603 00:26:02,480 --> 00:26:02,980 Да? 604 00:26:02,980 --> 00:26:03,896 >> АУДИТОРІЯ: [нерозбірливо]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. Малан: Точно. 607 00:26:06,540 --> 00:26:12,900 Що б я не, людський, введіть в, мій вхід збирається бути збережені в цьому місці. 608 00:26:12,900 --> 00:26:17,660 Це не достатньо, згадати, просто пройти в х, тому що ми бачили вже, 609 00:26:17,660 --> 00:26:21,630 в будь-який час ви пройти тільки сире змінну, як Int, в деякій іншій функції, 610 00:26:21,630 --> 00:26:25,640 Безумовно, це може змінити, що змінна, але не назавжди. 611 00:26:25,640 --> 00:26:27,360 Він не може мати вплив на Майні. 612 00:26:27,360 --> 00:26:29,420 Це можна змінити тільки свою власну локальну копію. 613 00:26:29,420 --> 00:26:32,560 Але якщо замість цього ви не дати мені фактичний Int, 614 00:26:32,560 --> 00:26:36,640 але ви дати мені направлення що Int, я зараз, будучи зсапЕ, 615 00:26:36,640 --> 00:26:41,050 безумовно, я можу слідувати, що рішення і поставити там ряд 616 00:26:41,050 --> 00:26:43,280 так у вас є доступ до нього також. 617 00:26:43,280 --> 00:26:45,120 >> Тому, коли я запустити цю програму, давайте подивимося. 618 00:26:45,120 --> 00:26:49,660 Зробити зсапЕ 0 точка слеш, SCANF 0. 619 00:26:49,660 --> 00:26:54,030 І якщо я зараз введіть номер як 50, спасибі за 50. 620 00:26:54,030 --> 00:26:58,150 Якщо я зараз введіть число, як негативний 1, за негативний 1. 621 00:26:58,150 --> 00:27:04,200 Тепер я друкую ряд як 1,5, хм. 622 00:27:04,200 --> 00:27:06,030 Чому моя програма ігнорувати мене? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Ну, тому що просто, я сказав це очікувати тільки в Int. 625 00:27:09,880 --> 00:27:10,380 Добре. 626 00:27:10,380 --> 00:27:11,630 Так ось одна версія цього. 627 00:27:11,630 --> 00:27:16,600 Давайте речі на сходинку вище і припустити, що це не добре. 628 00:27:16,600 --> 00:27:20,530 І в цьому полягає дуже простий приклад про те, як ми можемо почати писати код 629 00:27:20,530 --> 00:27:24,450 що інші люди можуть використовувати або на компроміс, робити погані речі. 630 00:27:24,450 --> 00:27:28,336 Так лінія 16, так схожі по духу, перш ніж, 631 00:27:28,336 --> 00:27:29,960 але я не оголосивши його десяткового цього разу. 632 00:27:29,960 --> 00:27:32,970 Я оголошую його сЬаг зірку, він же рядка. 633 00:27:32,970 --> 00:27:35,190 >> Але що це дійсно означає? 634 00:27:35,190 --> 00:27:38,790 Так що, якщо я не вказати address-- і Я дзвоню його довільно, буфер, 635 00:27:38,790 --> 00:27:43,370 але я міг би назвати це з, щоб бути simple-- а потім я зроблю це, поясніть мені, 636 00:27:43,370 --> 00:27:48,630 якби ви могли, на основі попереднього Логіка, що зсапЕ робити в рядку 18, 637 00:27:48,630 --> 00:27:55,000 якщо пропускання% с і буфером, який є адреса? 638 00:27:55,000 --> 00:27:58,210 Що таке зсапЕ, якщо застосувати Точне ж логіка, як версії 0, 639 00:27:58,210 --> 00:28:00,640 збираюся спробувати зробити тут, коли користувач-то в? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Да? 642 00:28:03,409 --> 00:28:04,407 >> АУДИТОРІЯ: [нерозбірливо]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. Малан: Точно. 645 00:28:08,890 --> 00:28:11,577 Scanf, за логікою раніше, збирається прийняти рядок 646 00:28:11,577 --> 00:28:13,410 що людину, надрукованих на машинці В- це тепер рядок, 647 00:28:13,410 --> 00:28:15,790 це не число, очевидно, якщо він або вона cooperates-- 648 00:28:15,790 --> 00:28:19,310 і він збирається спробувати покласти, що рядок в пам'яті на будь-якому адресу 649 00:28:19,310 --> 00:28:20,340 буфера вказує. 650 00:28:20,340 --> 00:28:23,870 І це здорово, тому що буфер дійсно означало, що адреса. 651 00:28:23,870 --> 00:28:30,470 >> Але я стверджую, ця програма глючить в дуже серйозний шлях, тому що значення 652 00:28:30,470 --> 00:28:31,330 буфер за замовчуванням? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Що я ініціалізації в? 655 00:28:34,790 --> 00:28:35,770 Що частина пам'яті? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 У мене немає, чи не так? 658 00:28:38,620 --> 00:28:42,265 >> Таким чином, навіть при тому, що я виділив символ зірки, який більше не називається с, 659 00:28:42,265 --> 00:28:48,030 це замість називається, buffer-- так давайте намалюємо ім'я змінної 660 00:28:48,030 --> 00:28:53,380 Тепер, як buffer-- якщо у мене немає називається GetString або Танос тут, 661 00:28:53,380 --> 00:28:56,030 що фактично означає, що буфер тільки деяке значення сміття. 662 00:28:56,030 --> 00:28:57,030 >> Тепер що ж це означає? 663 00:28:57,030 --> 00:29:00,220 Це означає, що я сказав зсапЕ очікувати рядок від користувача. 664 00:29:00,220 --> 00:29:01,300 І ви знаєте, що? 665 00:29:01,300 --> 00:29:03,883 Незалежно ця річ вказуючи to-- і я малюю знак питання, 666 00:29:03,883 --> 00:29:07,060 але насправді, це буде щось на зразок Ox1, 2, 3, чи не так? 667 00:29:07,060 --> 00:29:10,730 Це деякі фіктивні значення, тільки трапляється, є від обличчя. 668 00:29:10,730 --> 00:29:13,440 Так, по-іншому, це неначе буфер просто 669 00:29:13,440 --> 00:29:16,180 вказуючи на те, в пам'яті. 670 00:29:16,180 --> 00:29:17,610 Я поняття не маю, що таке. 671 00:29:17,610 --> 00:29:24,130 >> Так що, якщо я друкую в Gabe зараз, це відбувається , Щоб спробувати покласти пана А-В-Е / 0 є. 672 00:29:24,130 --> 00:29:25,530 Але хто знає, що це таке? 673 00:29:25,530 --> 00:29:27,480 І в минулому, будь раз, коли ми спробували торкнутися 674 00:29:27,480 --> 00:29:29,770 пам'яті, що не належить нам, що сталось? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Або майже кожен раз. 677 00:29:32,870 --> 00:29:34,310 Помилка сегментації, чи не так? 678 00:29:34,310 --> 00:29:37,829 >> Ця стрілка, я поняття не маю, де це вказуючи. це просто випадкове значення. 679 00:29:37,829 --> 00:29:40,370 І, звичайно, якщо ви інтерпретіруете випадкове значення як адреса, 680 00:29:40,370 --> 00:29:42,610 Ви збираєтеся перейти на деякі випадкові призначення. 681 00:29:42,610 --> 00:29:46,810 Так Гейб дійсно може аварії моя програма в цьому випадку тут. 682 00:29:46,810 --> 00:29:50,600 >> Так що ми можемо зробити, це майже так само погано? 683 00:29:50,600 --> 00:29:52,660 Вважайте, що це третій і Останній приклад зсапЕ. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ця версія краще в якому сенсі? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Якщо ви знайомі з попередня проблема, це краще. 688 00:30:01,400 --> 00:30:02,250 Чому? 689 00:30:02,250 --> 00:30:03,250 >> АУДИТОРІЯ: [нерозбірливо]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. Малан: Добре. 692 00:30:07,110 --> 00:30:09,970 Так що це випадок лінії 16 Краще, в тому сенсі, 693 00:30:09,970 --> 00:30:12,030 що ми явно виділення трохи пам'яті. 694 00:30:12,030 --> 00:30:14,190 Ми не використовуємо Танос, ми використовуємо тиждень 2 695 00:30:14,190 --> 00:30:16,060 підхід просто оголошенні масиву. 696 00:30:16,060 --> 00:30:18,130 І ми вже говорили раніше, що рядок просто масив символів, 697 00:30:18,130 --> 00:30:19,690 так що це абсолютно законно. 698 00:30:19,690 --> 00:30:22,910 Але це, звичайно, як Ви зверніть увагу, що фіксований розмір, 16. 699 00:30:22,910 --> 00:30:25,440 >> Так що це програма повністю безпечним, якщо я друкую 700 00:30:25,440 --> 00:30:29,760 в рядках одного символу, два символу рядка, 15 рядків символів. 701 00:30:29,760 --> 00:30:34,970 Але як тільки я починаю набирати 16, 17, 18, 1000 символьні рядки, 702 00:30:34,970 --> 00:30:37,390 де цей рядок буде в кінцевому підсумку? 703 00:30:37,390 --> 00:30:39,570 Це буде в кінцевому підсумку частково тут. 704 00:30:39,570 --> 00:30:42,820 Але хто знає, що ще поза меж 705 00:30:42,820 --> 00:30:44,270 саме цього масиву? 706 00:30:44,270 --> 00:30:48,015 >> Це як якщо б у мене є заявив 16 коробки тут. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Таким чином, замість витягнути всі 16, ми будемо просто робити вигляд, що я намалював 16. 709 00:30:52,690 --> 00:30:56,540 Але якщо я потім спробувати прочитати рядок це набагато більше, як 50 символів, 710 00:30:56,540 --> 00:31:01,270 Я збираюся започаткувати а, б, в, г, х, у, р 711 00:31:01,270 --> 00:31:04,916 І це, імовірно деякі інші сегмент пам'яті 712 00:31:04,916 --> 00:31:06,790 , Що, знову ж таки, може викликати моя програма до краху, 713 00:31:06,790 --> 00:31:10,600 бо я не попросив нічого більше, ніж просто 16 байт. 714 00:31:10,600 --> 00:31:12,260 >> Так кого це хвилює? 715 00:31:12,260 --> 00:31:13,880 Ну, ось бібліотека CS50. 716 00:31:13,880 --> 00:31:17,220 І більшість з це просто як інструкції до верхньої. 717 00:31:17,220 --> 00:31:21,670 Бібліотека CS50, весь цей час, була цю лінію в лінію 52. 718 00:31:21,670 --> 00:31:23,680 Ми бачили ЬурейеЕ, або Ви побачите ЬурейеЕ 719 00:31:23,680 --> 00:31:27,930 в PSET 4, який просто створює синонім якої символ зірка може бути більш 720 00:31:27,930 --> 00:31:29,290 згадується просто як рядки. 721 00:31:29,290 --> 00:31:31,540 Так що це один з кілька навчальних колеса 722 00:31:31,540 --> 00:31:34,120 ми використовували таємно під капотом. 723 00:31:34,120 --> 00:31:36,490 >> Між тим, от функція, деЬспаг. 724 00:31:36,490 --> 00:31:38,190 Тепер, мабуть, немає тіла до нього. 725 00:31:38,190 --> 00:31:40,273 І справді, якщо я буду продовжувати прокрутка, я насправді не 726 00:31:40,273 --> 00:31:42,080 бачу ніяких реалізацій з цих функцій. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Як для перевірки відсутності помилок, чому це? 729 00:31:45,516 --> 00:31:46,795 >> АУДИТОРІЯ: [нерозбірливо]. 730 00:31:46,795 --> 00:31:47,670 David J. Малан: Так. 731 00:31:47,670 --> 00:31:48,950 Так що це файл заголовка. 732 00:31:48,950 --> 00:31:52,520 І файли заголовків містять прототипи, плюс деякі інші речі, здається, 733 00:31:52,520 --> 00:31:53,780 як визначень типів. 734 00:31:53,780 --> 00:31:56,910 Але в CS50.c, яку ми ніколи не дав вам відверто, 735 00:31:56,910 --> 00:32:02,100 але був в CS50 приладу все на цей раз, глибоко всередині його папок, 736 00:32:02,100 --> 00:32:04,990 помітити, що є цілий купа функцій тут. 737 00:32:04,990 --> 00:32:06,720 >> Насправді, давайте прокрутите вниз. 738 00:32:06,720 --> 00:32:08,810 Давайте ігнорувати більшість з них, на даний момент. 739 00:32:08,810 --> 00:32:12,670 Але Прокрутіть вниз до GetInt і подивитися, як GetInt працює. 740 00:32:12,670 --> 00:32:13,890 Так ось GetInt. 741 00:32:13,890 --> 00:32:17,727 І якщо ви ніколи не дбав, як отримати Int працює, от її документація. 742 00:32:17,727 --> 00:32:19,560 І серед речей це говорить, він говорить вам, 743 00:32:19,560 --> 00:32:21,340 які діапазони значень він може повернутися. 744 00:32:21,340 --> 00:32:24,400 Це істотно негативним 2000000000 до позитивного 2000000000, плюс-мінус. 745 00:32:24,400 --> 00:32:26,420 >> І виявляється, все це Час, хоча ми ніколи не 746 00:32:26,420 --> 00:32:28,570 що ви перевірити його, якщо щось не так, 747 00:32:28,570 --> 00:32:30,680 виходить, що все на цей раз, GetInt має 748 00:32:30,680 --> 00:32:33,600 повертався спеціальна постійна, не нульовий, 749 00:32:33,600 --> 00:32:36,760 а INT_MAX, який Конвенція всього в двох програміста. 750 00:32:36,760 --> 00:32:38,846 Це означає тут це спеціальне значення. 751 00:32:38,846 --> 00:32:41,470 Переконайтеся, що перевірити це, просто якщо щось піде не так. 752 00:32:41,470 --> 00:32:43,261 Але ми ніколи не турбували с, що на сьогоднішній день, 753 00:32:43,261 --> 00:32:45,200 бо знову, це призначений для спрощення. 754 00:32:45,200 --> 00:32:46,950 >> Але як GetInt будуть реалізовані? 755 00:32:46,950 --> 00:32:48,450 Ну, один, він не приймає ніяких аргументів. 756 00:32:48,450 --> 00:32:49,390 Ми знаємо, що. 757 00:32:49,390 --> 00:32:50,820 Це повертає ціле. 758 00:32:50,820 --> 00:32:51,950 Ми знаємо, що. 759 00:32:51,950 --> 00:32:54,460 Так як він працює під капотом? 760 00:32:54,460 --> 00:32:58,290 >> Так що, мабуть нескінченне петля, принаймні, поява одного. 761 00:32:58,290 --> 00:33:00,290 Зверніть увагу, що ми використовуємо GetString. 762 00:33:00,290 --> 00:33:04,000 Так от цікаво. GetInt називає наш власний функція, GetString. 763 00:33:04,000 --> 00:33:05,645 А тепер, чому це могло б бути насправді? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Чому я будучи оборонна тут відповідно 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Що може статися в лінії 164, щоб внести ясність? 768 00:33:15,639 --> 00:33:16,930 Це та ж відповідь, як і раніше. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Може бути просто з пам'яті. 771 00:33:20,089 --> 00:33:23,130 Щось не так з GetString, ми повинні бути в змозі впоратися, що. 772 00:33:23,130 --> 00:33:27,070 І з цієї причини я не повертають нуль є , Що технічно нульовою покажчик. 773 00:33:27,070 --> 00:33:29,120 GetInt повинен повернути Int. 774 00:33:29,120 --> 00:33:31,060 Так що я довільно вирішив, по суті, 775 00:33:31,060 --> 00:33:34,600 що 2000000000, плюс-мінус, збирається бути особливе значення, що я ніколи не може 776 00:33:34,600 --> 00:33:35,970 насправді отримати від користувача. 777 00:33:35,970 --> 00:33:39,930 Це просто одне значення я збираюся витрачати представляти код помилки. 778 00:33:39,930 --> 00:33:41,540 >> Так що тепер, все стає трохи фантазії. 779 00:33:41,540 --> 00:33:44,670 І це не зовсім та ж функція як і раніше, але це дуже схоже. 780 00:33:44,670 --> 00:33:50,120 Так помітити, я заявляю тут, відповідно 172, як Int N і символ с. 781 00:33:50,120 --> 00:33:53,600 І тоді я використовувати цей модний лінію, Sscanf, який виходить 782 00:33:53,600 --> 00:33:55,990 НЕ сканує рядок з клавіатури. 783 00:33:55,990 --> 00:33:59,226 Він стоїть існуючий рядок, користувач вже надруковані. 784 00:33:59,226 --> 00:34:02,100 Так що я вже назвав GetString, який означає, що я є рядок в пам'яті. 785 00:34:02,100 --> 00:34:05,020 Sscanf є те, що ви викликати функцію розбору. 786 00:34:05,020 --> 00:34:07,760 Схоже на рядок я набрав у, символ за символом, 787 00:34:07,760 --> 00:34:09,250 і робить щось корисне. 788 00:34:09,250 --> 00:34:10,969 Цей рядок зберігається в лінії. 789 00:34:10,969 --> 00:34:13,560 І я знаю, що тільки збирається резервне копіювання тут і говорити, ах, добре, 790 00:34:13,560 --> 00:34:15,143 Я назвав його не з цього разу, але лінія. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> І тепер це трохи відрізняється. 793 00:34:18,080 --> 00:34:22,480 Але це фактично означає, по причинам ми кілька махаємо руками на сьогоднішній день, 794 00:34:22,480 --> 00:34:26,070 що ми перевіряємо, щоб побачити, якщо користувач ввів в 795 00:34:26,070 --> 00:34:29,909 і INT і, можливо, ще один персонаж. 796 00:34:29,909 --> 00:34:33,610 Якщо користувач ввів в междунар, це зберігатимуться в п, тому що я 797 00:34:33,610 --> 00:34:36,739 проходження цьому за адресою, новий трюк ми бачили сьогодні. 798 00:34:36,739 --> 00:34:41,570 Якщо користувач набрав також Подібним 123x, що х 799 00:34:41,570 --> 00:34:45,060 збирається в кінцевому підсумку Лист до персонажа в. 800 00:34:45,060 --> 00:34:48,739 >> Тепер виходить, що Sscanf скаже мені, розумно, 801 00:34:48,739 --> 00:34:54,750 скільки змінних було Sscanf успішно в змозі заповнити. 802 00:34:54,750 --> 00:34:58,770 Так за цією логікою, якщо функція Я впевнений, реалізації буде GetInt, 803 00:34:58,770 --> 00:35:00,900 але я перевіряю, потенційно, для користувача 804 00:35:00,900 --> 00:35:04,190 щоб набрали в междунар потім щось ще, 805 00:35:04,190 --> 00:35:08,580 що я хочу Sscanf сайт Значення, що повертається дійсно бути? 806 00:35:08,580 --> 00:35:10,950 Якщо мета полягає в тому, щоб отримати просто Int від користувача? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Так що, якщо Sscanf повертається 2, що це означає? 809 00:35:19,300 --> 00:35:21,660 Користувач набрав у то як, в буквальному сенсі, 810 00:35:21,660 --> 00:35:24,770 123x, яка є просто маячня. 811 00:35:24,770 --> 00:35:27,490 Ця умова помилки, і Я хочу, щоб перевірити, що. 812 00:35:27,490 --> 00:35:32,960 >> Так що, якщо користувач вводить це в, по ця логіка, що робить Sscanf повернутися, 813 00:35:32,960 --> 00:35:33,740 б ви сказали? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Так він збирається повернутися 2, тому що 123 буде йти сюди, 816 00:35:39,130 --> 00:35:41,580 і х буде в кінцевому підсумку тут. 817 00:35:41,580 --> 00:35:43,970 Але я не хочу х до заповнюються. 818 00:35:43,970 --> 00:35:48,580 Я хочу Sscanf тільки домогтися успіху в заповнення першої з змінних. 819 00:35:48,580 --> 00:35:52,490 І ось чому я хочете Sscanf повернути 1. 820 00:35:52,490 --> 00:35:55,750 >> І якщо це трохи по голові на даний момент, що абсолютно нормально. 821 00:35:55,750 --> 00:36:00,030 Зрозумійте, однак, що одне з значення GetInt і GetString 822 00:36:00,030 --> 00:36:03,630 є те, що ми робимо чертовски багато помилок перевірки, як це так 823 00:36:03,630 --> 00:36:07,130 що на сьогоднішній день, ви можете в значній мірі нічого введіть в клавіатурі, 824 00:36:07,130 --> 00:36:08,490 і ми спіймаємо його. 825 00:36:08,490 --> 00:36:10,592 І ми, звичайно ,, персонал, буде безумовно не 826 00:36:10,592 --> 00:36:13,300 бути джерелом помилки у вашому Програма, тому що ми в обороні 827 00:36:13,300 --> 00:36:16,270 перевірка на все нерозумно речі, які користувач може зробити, 828 00:36:16,270 --> 00:36:18,900 як набравши рядок, коли ви дійсно хотіли Int. 829 00:36:18,900 --> 00:36:21,350 Таким чином, для now-- ми прийдемо назад в це раніше long-- 830 00:36:21,350 --> 00:36:23,710 але весь цей час, GetString і GetInt є 831 00:36:23,710 --> 00:36:29,950 був під капотом, використовуючи цей Основна ідея адрес пам'яті. 832 00:36:29,950 --> 00:36:32,580 >> Так що тепер, давайте робити речі трохи більш зручним для користувачів. 833 00:36:32,580 --> 00:36:38,740 Як ви пам'ятаєте, з Binky останнього time-- якщо моя миша буде cooperate-- так 834 00:36:38,740 --> 00:36:42,560 у нас був цей код, який відверто кажучи, досить безглуздо. 835 00:36:42,560 --> 00:36:45,330 Цей код нічого не дає корисно, але це був приклад 836 00:36:45,330 --> 00:36:48,330 що професор Parlante використовується для того, щоб представляти 837 00:36:48,330 --> 00:36:51,840 що відбувається в Програма за участю пам'яті. 838 00:36:51,840 --> 00:36:54,850 >> Так що давайте переказувати це історія супер коротко. 839 00:36:54,850 --> 00:36:58,720 Ці два перші рядки, в Англійська, робити те, що, ви можете сказати? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Просто в розумно людиною, але злегка технічні терміни, прийняти удар. 842 00:37:05,430 --> 00:37:06,346 АУДИТОРІЯ: [нерозбірливо]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. Малан: ОК, ви встановлення адреси для вашої х і у змінних. 845 00:37:11,080 --> 00:37:15,520 Не зовсім, бо х і у не є змінні в традиційному сенсі. 846 00:37:15,520 --> 00:37:18,054 х і у є адресами або буде зберігати адресу. 847 00:37:18,054 --> 00:37:19,220 Так давайте спробуємо це ще раз. 848 00:37:19,220 --> 00:37:21,010 Непоганий початок, хоча. 849 00:37:21,010 --> 00:37:21,510 Да? 850 00:37:21,510 --> 00:37:22,426 >> АУДИТОРІЯ: [нерозбірливо]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. Малан: Добре. 853 00:37:24,840 --> 00:37:26,173 Я думаю, що це трохи чистіше. 854 00:37:26,173 --> 00:37:28,630 Оголошення двох покажчиків, два цілих числа. 855 00:37:28,630 --> 00:37:30,150 І ми називаємо їх х і у. 856 00:37:30,150 --> 00:37:32,790 Або, якщо ми повинні були зробити це як картини, знову ж таки, 857 00:37:32,790 --> 00:37:36,410 Нагадаємо, зовсім просто, що все ми робимо з цією першого рядка 858 00:37:36,410 --> 00:37:39,690 малює вікно, як це, з деяким значенням сміття в ньому, 859 00:37:39,690 --> 00:37:41,920 і називаючи це х, а потім ще один ящик, як це, 860 00:37:41,920 --> 00:37:43,880 з деякого значення сміття в ньому, називаючи його у. 861 00:37:43,880 --> 00:37:45,810 Ми заявили два покажчики, які в кінцевому рахунку 862 00:37:45,810 --> 00:37:47,860 зберігатиме адреса в междунар. 863 00:37:47,860 --> 00:37:49,170 Так що все це є. 864 00:37:49,170 --> 00:37:53,290 >> Тому, коли Бінкі зробив це, глина просто виглядала так. 865 00:37:53,290 --> 00:37:55,350 І Нік тільки почасти загорнутий стрілки, 866 00:37:55,350 --> 00:37:57,590 неначе вони не вказуючи ніде зокрема, тому, що вони просто 867 00:37:57,590 --> 00:37:58,250 значення для сміття. 868 00:37:58,250 --> 00:38:01,670 Вони явно не инициализируется в будь-якому місці зокрема. 869 00:38:01,670 --> 00:38:03,980 >> Тепер наступний лінія Код, нагадаємо, був цей. 870 00:38:03,980 --> 00:38:07,510 Таким чином, в досить зручною, але кілька технічна англійська, 871 00:38:07,510 --> 00:38:09,790 що це за рядок коду робить? 872 00:38:09,790 --> 00:38:10,391 Да? 873 00:38:10,391 --> 00:38:11,333 >> АУДИТОРІЯ: [нерозбірливо]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. Малан: Прекрасно. 876 00:38:13,950 --> 00:38:17,016 Це виділення шматок пам'яті, що це розміром з міжнар. 877 00:38:17,016 --> 00:38:18,140 І це половина відповіді. 878 00:38:18,140 --> 00:38:20,056 Ви відповіли право половина експресії. 879 00:38:20,056 --> 00:38:22,473 Те, що відбувається на ліва сторона знака рівності? 880 00:38:22,473 --> 00:38:22,972 Да? 881 00:38:22,972 --> 00:38:24,814 АУДИТОРІЯ: І правонаступників це до змінної х? 882 00:38:24,814 --> 00:38:27,690 >> David J. Малан: І правонаступників це до змінної х. 883 00:38:27,690 --> 00:38:31,650 Так Нагадаємо, права виділяє Недостатньо пам'яті для зберігання Int. 884 00:38:31,650 --> 00:38:34,150 Але Танос спеціально повертає адресу 885 00:38:34,150 --> 00:38:37,270 цього шматка пам'яті, що ви просто запропонував зберігається в х. 886 00:38:37,270 --> 00:38:42,560 >> Так що Нік зробив минулого разу з Бінки є він потягнув цей покажчик з, глина, 887 00:38:42,560 --> 00:38:46,820 вказати зараз на білий шматок пам'яті що одно розміром з міжнар. 888 00:38:46,820 --> 00:38:49,360 І справді, що означало представляти чотири байти. 889 00:38:49,360 --> 00:38:55,310 >> Тепер, в наступному рядку коду зробив це, зірка х отримує 42. 890 00:38:55,310 --> 00:38:58,530 Так 42 є прямим на Права, сенс життя. 891 00:38:58,530 --> 00:39:00,500 Ліва сторона, зірка х означає? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Це теж може мати gone-- це нормально. 894 00:39:03,280 --> 00:39:04,220 Добре. 895 00:39:04,220 --> 00:39:06,875 >> АУДИТОРІЯ: В принципі, перейти до [нерозбірливо] 896 00:39:06,875 --> 00:39:07,750 David J. Малан: Добре. 897 00:39:07,750 --> 00:39:08,760 АУДИТОРІЯ: [нерозбірливо]. 898 00:39:08,760 --> 00:39:09,760 David J. Малан: Точно. 899 00:39:09,760 --> 00:39:11,979 Ліва сторона означає йти в х. 900 00:39:11,979 --> 00:39:12,520 х адресу. 901 00:39:12,520 --> 00:39:15,520 Це як 33 Оксфорд-стріт, або Ox1. 902 00:39:15,520 --> 00:39:18,690 І зірка х означає йти до того, що рішення і покласти те, що є? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Так дійсно, це саме те, що зробив Нік. 905 00:39:21,290 --> 00:39:23,740 Він почав з іншим, по суті справи, подумки 906 00:39:23,740 --> 00:39:26,270 вказуючи пальцем на х, зазначеному стрілкою 907 00:39:26,270 --> 00:39:30,670 у білій коробці з правого боку сторона, і проставлення числа 42 є. 908 00:39:30,670 --> 00:39:34,120 Але тоді речі стали трохи небезпечно, правда? 909 00:39:34,120 --> 00:39:35,860 Бінки близько втратити голову. 910 00:39:35,860 --> 00:39:39,465 >> Зірка у дорівнює 13, невезіння, це означає? 911 00:39:39,465 --> 00:39:43,620 Так зірки у кошти йдуть на адресу в у. 912 00:39:43,620 --> 00:39:45,630 Але те, що це адреса в у? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Гаразд, це значення сміття, чи не так? 915 00:39:49,440 --> 00:39:50,800 Я звернув його у вигляді знака питання. 916 00:39:50,800 --> 00:39:54,850 Нік звернув його в якості згорнувшись калачиком стрілкою. 917 00:39:54,850 --> 00:39:59,600 І як тільки ви спробуєте зробити зірку у, кажучи піти туди, 918 00:39:59,600 --> 00:40:03,872 але не є законним адреса, це деякі фіктивні розташування, 919 00:40:03,872 --> 00:40:05,080 програма збирається до краху. 920 00:40:05,080 --> 00:40:08,580 І голова Бінкі збирається відлітати тут, як це було. 921 00:40:08,580 --> 00:40:12,130 >> Так в кінці, цієї програми був просто плоский з вада. 922 00:40:12,130 --> 00:40:13,540 Це була програма глючить. 923 00:40:13,540 --> 00:40:14,760 І це мало бути фіксованою. 924 00:40:14,760 --> 00:40:18,260 І єдиний спосіб, дійсно, це виправити буде, наприклад, ця лінія, 925 00:40:18,260 --> 00:40:21,010 які ми навіть не добратися, тому що програма розбився занадто рано. 926 00:40:21,010 --> 00:40:26,170 Але якби ми мали виправити це, те, що ефект робить робити у рівним х є? 927 00:40:26,170 --> 00:40:30,010 Ну, це, по суті вказує у в будь-яке значення х вказує на. 928 00:40:30,010 --> 00:40:32,430 >> Таким чином, в історії Ніка, або історія Бінки, як 929 00:40:32,430 --> 00:40:34,640 х і у були вказуючи на білий ділянку пам'яті, 930 00:40:34,640 --> 00:40:38,300 так що, врешті-решт, коли вам у зірки у дорівнює 13 раз, 931 00:40:38,300 --> 00:40:43,080 Ви в кінцевому підсумку покласти 13 в Підходяще місце. 932 00:40:43,080 --> 00:40:47,640 Отже, всі ці лінії абсолютно законним, для цього крім, 933 00:40:47,640 --> 00:40:51,730 коли це трапилося перед вами фактично призначений ск деяке значення. 934 00:40:51,730 --> 00:40:54,290 >> Тепер, на щастя, ви не повинні міркувати через всі 935 00:40:54,290 --> 00:40:56,560 з цих видів питань за своїм розсудом. 936 00:40:56,560 --> 00:40:59,310 Дозвольте мені йти вперед і відкрити вікно терміналу тут 937 00:40:59,310 --> 00:41:03,050 і відкрити, на мить, супер коротка програма, що 938 00:41:03,050 --> 00:41:04,360 також є свого роду безглуздо. 939 00:41:04,360 --> 00:41:05,152 Це некрасиво. 940 00:41:05,152 --> 00:41:06,610 Це нічого корисного не досягти. 941 00:41:06,610 --> 00:41:10,180 Але це продемонструвати питання пам'яті, так що давайте поглянемо. 942 00:41:10,180 --> 00:41:11,830 >> Головна, супер просто. 943 00:41:11,830 --> 00:41:14,830 Це, мабуть викликає функцію, е, а потім повертає 0. 944 00:41:14,830 --> 00:41:16,310 Це свого роду важко зіпсувати це. 945 00:41:16,310 --> 00:41:18,540 Так Головна досить добре, до цих пір. 946 00:41:18,540 --> 00:41:20,100 >> Так е проблематично. 947 00:41:20,100 --> 00:41:22,120 І просто не покласти багато зусилля в назвавши його 948 00:41:22,120 --> 00:41:23,990 тут, щоб тримати в центрі уваги на код. 949 00:41:23,990 --> 00:41:25,740 е має дві лінії. 950 00:41:25,740 --> 00:41:27,610 І давайте подивимося, що зараз відбувається. 951 00:41:27,610 --> 00:41:29,840 Так, з одного боку здесь-- і дозвольте мені зробити 952 00:41:29,840 --> 00:41:32,680 це відповідно до попереднім example--, з одного боку, 953 00:41:32,680 --> 00:41:35,830 ліва сторона робити те, що, по-англійськи? 954 00:41:35,830 --> 00:41:36,493 Це is-- 955 00:41:36,493 --> 00:41:37,701 АУДИТОРІЯ: Створення покажчик. 956 00:41:37,701 --> 00:41:40,830 David J. Малан: Створення покажчик до міжнар і назвавши його х. 957 00:41:40,830 --> 00:41:43,789 Так що це створення одного з цих ящиків Я продовжую малювати на сенсорному екрані. 958 00:41:43,789 --> 00:41:45,913 А тепер, з правого боку боку, Танос, звичайно, 959 00:41:45,913 --> 00:41:47,420 виділяє шматок пам'яті. 960 00:41:47,420 --> 00:41:49,989 І щоб внести ясність, як обсяг пам'яті його, мабуть 961 00:41:49,989 --> 00:41:52,030 розподілу, якщо вам просто вид робити математику тут? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Так що це 40 байт. 964 00:41:54,040 --> 00:41:57,400 І я знаю, що тільки тому, що я знаю, Int, на CS50 пристрої, принаймні 965 00:41:57,400 --> 00:41:58,060 чотири байти. 966 00:41:58,060 --> 00:41:59,610 Так 10 раз 4 40. 967 00:41:59,610 --> 00:42:04,924 Так що це запам'ятовування х, адреса першого з 40 цілих чисел, що 968 00:42:04,924 --> 00:42:07,340 були виділені місця назад, до спини, до спини, до спини. 969 00:42:07,340 --> 00:42:08,470 >> І ось що ключ про Танос. 970 00:42:08,470 --> 00:42:11,261 Це не займе трохи пам'яті Тут, трохи тут, трохи тут. 971 00:42:11,261 --> 00:42:14,220 Це дає вам один шматок пам'яті, безперервно, від експлуатації 972 00:42:14,220 --> 00:42:15,240 Система. 973 00:42:15,240 --> 00:42:18,500 >> Тепер те, що про це, х кронштейн 10 дорівнює 0? 974 00:42:18,500 --> 00:42:19,470 Довільний рядок коду. 975 00:42:19,470 --> 00:42:21,100 Це нічого корисного не досягти. 976 00:42:21,100 --> 00:42:26,128 Але цікаво, тому х кронштейн 10--? 977 00:42:26,128 --> 00:42:26,628 Да? 978 00:42:26,628 --> 00:42:27,912 >> АУДИТОРІЯ: [нерозбірливо]? 979 00:42:27,912 --> 00:42:30,500 >> David J. Малан: х кронштейн 10 не повинен бути нульовим. 980 00:42:30,500 --> 00:42:35,070 Деталь нуль тільки вступає в гру з рядками, в кінці рядка. 981 00:42:35,070 --> 00:42:36,700 Але хороша думка. 982 00:42:36,700 --> 00:42:39,615 >> Наскільки велика в цьому масиві, навіть хоча я виділив 40 байт? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Це 0 до дев'яти, чи не так? 985 00:42:43,690 --> 00:42:45,120 Це 10 Інтс, заг. 986 00:42:45,120 --> 00:42:48,790 40 байт, але 10 Інтс, індексуються від 0 до 0. 987 00:42:48,790 --> 00:42:50,930 >> Так що ж таке, що х кронштейн 10? 988 00:42:50,930 --> 00:42:53,090 Це насправді деякі невідоме значення сміття. 989 00:42:53,090 --> 00:42:54,780 Це пам'ять, яка не належить мені. 990 00:42:54,780 --> 00:42:59,650 Я не повинна стосуватися, що байт число 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Я збираюся трохи занадто далеко. 992 00:43:01,420 --> 00:43:04,490 >> І справді, якщо я запускаю це Програма, це цілком може потерпіти крах. 993 00:43:04,490 --> 00:43:05,790 Але іноді, нам пощастить. 994 00:43:05,790 --> 00:43:07,706 І тому тільки, щоб продемонструвати ето-- і відверто кажучи, 995 00:43:07,706 --> 00:43:11,000 Ви ніколи не знаєте, перед вами у it-- давайте запустимо цей. 996 00:43:11,000 --> 00:43:12,480 Це насправді не крах. 997 00:43:12,480 --> 00:43:15,032 >> Але якщо я зміню це, для Примірник, щоб бути, як 1000, 998 00:43:15,032 --> 00:43:16,740 зробити це дійсно навмисне, давайте подивимося, 999 00:43:16,740 --> 00:43:18,710 якщо ми можемо отримати до краху на цей раз. 1000 00:43:18,710 --> 00:43:20,070 ОК, це не крах. 1001 00:43:20,070 --> 00:43:22,600 Як щодо 100 тисяч? 1002 00:43:22,600 --> 00:43:25,000 Давайте переробити його, і тепер повторно його. 1003 00:43:25,000 --> 00:43:25,500 Добре. 1004 00:43:25,500 --> 00:43:25,960 Уф. 1005 00:43:25,960 --> 00:43:26,460 Добре. 1006 00:43:26,460 --> 00:43:29,090 Таким чином, очевидно, знову ж таки, це сегменти пам'яті, так сказати, 1007 00:43:29,090 --> 00:43:32,660 розумно великий, тому ми можемо пощастить знову і знову. 1008 00:43:32,660 --> 00:43:36,510 Але врешті-решт, як тільки ви отримаєте смішно і дійсно піти далеко на екрані, 1009 00:43:36,510 --> 00:43:39,120 дотику пам'ять, що дійсно, дійсно не належать вам. 1010 00:43:39,120 --> 00:43:40,870 >> Але, відверто кажучи, це види помилок збираються 1011 00:43:40,870 --> 00:43:43,020 щоб все важче і важче з'ясувати, на свій розсуд. 1012 00:43:43,020 --> 00:43:47,880 Але, на щастя, як програмісти, у нас є інструменти, які дозволяють нам зробити це для нас. 1013 00:43:47,880 --> 00:43:50,140 Так що це, мабуть, одна з найбільш потворних програм, 1014 00:43:50,140 --> 00:43:52,060 ще потворніше, ніж вихід GDB о. 1015 00:43:52,060 --> 00:43:55,670 Але він завжди має лінію або два, які супер корисно. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind це програма, яка допомагає Ви не налагоджувати програму, по суті, 1017 00:44:00,310 --> 00:44:03,500 але знайти, пов'язаних з пам'яттю проблеми, зокрема. 1018 00:44:03,500 --> 00:44:07,590 Він автоматично запуститься код для Ви і подивіться, принаймні дві речі. 1019 00:44:07,590 --> 00:44:10,680 Один, ти зробив те випадково, як Touch Memory 1020 00:44:10,680 --> 00:44:11,980 що не належить вам? 1021 00:44:11,980 --> 00:44:13,590 Це допоможе вам знайти ті випадки. 1022 00:44:13,590 --> 00:44:15,710 >> І два, це допоможе Ви виявите щось, зване 1023 00:44:15,710 --> 00:44:19,270 витоку пам'яті, які у нас є повністю ігнорується, наївно, 1024 00:44:19,270 --> 00:44:21,380 протягом деякого часу і блаженно. 1025 00:44:21,380 --> 00:44:23,140 Але, виявляється, все на цей раз, кожен раз, коли 1026 00:44:23,140 --> 00:44:26,620 Ви викликали GetString в так багато з наших програм, 1027 00:44:26,620 --> 00:44:28,930 ви питаєте операційні Система для пам'яті, 1028 00:44:28,930 --> 00:44:32,070 але у вас є спогади з коли-небудь даючи його 1029 00:44:32,070 --> 00:44:36,169 назад, роблячи unalloc, або безкоштовно, як це називається. 1030 00:44:36,169 --> 00:44:37,960 Ні, тому що ми ніколи не попросив вас зробити це. 1031 00:44:37,960 --> 00:44:41,250 >> Але весь цей час, програми ви писали в С 1032 00:44:41,250 --> 00:44:43,800 були витоку пам'яті, задаючи експлуатаційні 1033 00:44:43,800 --> 00:44:46,190 Система все більше і більше пам'яті для рядків і ще багато чого, 1034 00:44:46,190 --> 00:44:47,870 але ніколи не передавши його назад. 1035 00:44:47,870 --> 00:44:50,080 І тепер це трохи з спрощенням, 1036 00:44:50,080 --> 00:44:53,550 але якщо ви коли-небудь запустити Mac або ваш комп'ютер протягом досить довгого часу, відкриття 1037 00:44:53,550 --> 00:44:55,790 багато програм, можливо закриття програм, 1038 00:44:55,790 --> 00:44:57,795 і навіть при тому, що ваш комп'ютер не розбився, 1039 00:44:57,795 --> 00:45:01,690 вона стає набагато повільніше, неначе це дійсно 1040 00:45:01,690 --> 00:45:04,290 використовуючи багато пам'яті або ресурсів, хоча, 1041 00:45:04,290 --> 00:45:06,070 якщо ви навіть не торкаючись до клавіатури, 1042 00:45:06,070 --> 00:45:10,430 які могли б be-- але не always-- міг бути, що програми ви працюєте 1043 00:45:10,430 --> 00:45:11,920 самі витоків пам'яті. 1044 00:45:11,920 --> 00:45:15,645 І вони продовжують запитувати ОС більше і більше пам'яті, але забуваючи про це, 1045 00:45:15,645 --> 00:45:18,470 насправді не використовувати його, але Тому приймаючи пам'ять від 1046 00:45:18,470 --> 00:45:20,500 від інших програм, які могли б хотіти його. 1047 00:45:20,500 --> 00:45:23,940 Так ось розхожа пояснення. 1048 00:45:23,940 --> 00:45:25,940 Тепер ось де Valgrind сайт Вихід повністю 1049 00:45:25,940 --> 00:45:29,290 звіряче тим, менше і зручніше так. 1050 00:45:29,290 --> 00:45:32,690 Але найцікавіше матеріал прямо тут. 1051 00:45:32,690 --> 00:45:37,060 Він розповідав мені невірний запис про Розмір чотири відбувається в цій програмі, 1052 00:45:37,060 --> 00:45:40,640 Зокрема, на лінії 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Якщо я йду на лінію 21, хм, там дійсно є недійсним запису про розмір чотирьох. 1054 00:45:45,450 --> 00:45:46,250 Чому розмір чотири? 1055 00:45:46,250 --> 00:45:49,500 Ну, це number-- і може бути anything-- є внутр. 1056 00:45:49,500 --> 00:45:50,450 Так що це чотири байти. 1057 00:45:50,450 --> 00:45:52,550 Так що я ставлю чотири байти де вони не належать. 1058 00:45:52,550 --> 00:45:55,080 Ось що Valgrind насправді говорив мені. 1059 00:45:55,080 --> 00:45:57,600 Крім того, це буде також скажіть мені, як ми побачимо, 1060 00:45:57,600 --> 00:46:01,490 як ви запустите в майбутньому PSET, якщо й коли ви витік пам'яті, яке, хоча 1061 00:46:01,490 --> 00:46:05,300 У мене є, тому що я назвав Танос, але у мене немає насправді 1062 00:46:05,300 --> 00:46:08,010 називається, в даному випадку, вільний, який ми в кінцевому рахунку бачити 1063 00:46:08,010 --> 00:46:09,830 є протилежністю Танос. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Так що тепер, як мені здається, останній приклад. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Так що це одна трохи більше таємницею, але це, можливо, 1068 00:46:16,690 --> 00:46:19,180 Найголовніша причина, щоб будьте обережні з пам'яттю, 1069 00:46:19,180 --> 00:46:24,490 і причиною того, що багато програм та / або веб-серверів, навіть донині, 1070 00:46:24,490 --> 00:46:28,200 переймає поганих хлопців де в Інтернеті, які так чи інакше 1071 00:46:28,200 --> 00:46:33,390 відправка фіктивні пакети на сервер намагаються скомпрометувати ваші рахунки, 1072 00:46:33,390 --> 00:46:36,420 або взяти ваші дані, або просто як правило, приймають за машиною. 1073 00:46:36,420 --> 00:46:38,910 Переповнення буфера, а назви, засоби 1074 00:46:38,910 --> 00:46:40,740 переповнені не такої Int, але буфер. 1075 00:46:40,740 --> 00:46:43,490 І буфер тільки химерний спосіб сказати, що це купа пам'яті. 1076 00:46:43,490 --> 00:46:46,710 >> І справді, я подзвонив рядок до буфера, замість с. 1077 00:46:46,710 --> 00:46:49,234 Тому що, якщо це буфер, як в тому сенсі, YouTube, 1078 00:46:49,234 --> 00:46:52,400 або в будь-який час ви дивитеся відео, Ви, можливо, бачили слово буферизації, 1079 00:46:52,400 --> 00:46:53,040 точка, точка, точка. 1080 00:46:53,040 --> 00:46:54,240 Це неймовірно дратує. 1081 00:46:54,240 --> 00:46:55,990 І це просто означає, що плеєр відео 1082 00:46:55,990 --> 00:46:58,710 намагається завантажити багато байтів, багато байт 1083 00:46:58,710 --> 00:47:00,170 з відео з Інтернету. 1084 00:47:00,170 --> 00:47:02,920 Але це повільно, так він намагається завантажити купу з них 1085 00:47:02,920 --> 00:47:06,430 заповнити буфер, контейнер, так що у вас є достатня кількість байтів, що він може потім 1086 00:47:06,430 --> 00:47:09,174 показати вам відео, не зупиняючись постійно. 1087 00:47:09,174 --> 00:47:11,340 Але, виявляється, можна є буфер в цей великий. 1088 00:47:11,340 --> 00:47:15,710 Але спробуйте поставити стільки даних в це, і дуже погані речі можуть трапитися. 1089 00:47:15,710 --> 00:47:22,780 Так, наприклад, давайте подивимося на цей останній тизер прикладу. 1090 00:47:22,780 --> 00:47:24,720 Це інша програма що, на перший погляд, 1091 00:47:24,720 --> 00:47:26,540 нічого супер корисно не робити. 1092 00:47:26,540 --> 00:47:29,590 У цього є Основна функція що викликає цю функцію, ф. 1093 00:47:29,590 --> 00:47:36,640 І, що функція, F, тут, має масив символів, називається с, розмір 12. 1094 00:47:36,640 --> 00:47:39,340 І тоді він використовує це Нова функція називається strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Виходить, що, з цієї простої, просто рядок коду, всього дві лінії, 1097 00:47:45,190 --> 00:47:49,130 ми зробили всю свою програму, і тому, весь мій комп'ютер, 1098 00:47:49,130 --> 00:47:54,000 і моя обліковий запис користувача, і мій жорсткий їзди потенційно уразливі до будь-якого 1099 00:47:54,000 --> 00:47:58,170 хто знає і досить добре, щоб запустити ця програма з певним командного рядка 1100 00:47:58,170 --> 00:47:58,900 Аргумент. 1101 00:47:58,900 --> 00:48:03,400 Іншими словами, якщо це поганий хлопець ставить всередині argvargv [1], ввівши 1102 00:48:03,400 --> 00:48:08,750 на клавіатурі дуже спеціально сформованого рядок, що не азбука, 123, але, по суті, 1103 00:48:08,750 --> 00:48:15,180 двійкові символи, які представляють виконуваний Код, програма, що він або вона пише, 1104 00:48:15,180 --> 00:48:19,190 з цієї простої програмі, яка Представник тисяч програм 1105 00:48:19,190 --> 00:48:23,610 що таким чином, схильні, насмілюся сказати, він чи вона може в кінцевому рахунку, видалити всі 1106 00:48:23,610 --> 00:48:26,680 файли на жорсткому диску, отримати блимати рядок так, щоб він або вона може 1107 00:48:26,680 --> 00:48:30,170 вводити команди самостійно, по електронній пошті файли до себе. 1108 00:48:30,170 --> 00:48:34,660 Все, що я можу зробити, він або вона може зробити з цим кодом. 1109 00:48:34,660 --> 00:48:36,575 >> Ми не будемо досить вирішити це поки. 1110 00:48:36,575 --> 00:48:38,700 І справді, він збирається залучити невелику картину 1111 00:48:38,700 --> 00:48:41,470 як це, яке ми скоро щоб зрозуміти все краще. 1112 00:48:41,470 --> 00:48:44,480 Але на сьогоднішній день, давайте закінчиться що, як ми сподіваємося, трохи більше 1113 00:48:44,480 --> 00:48:48,360 зрозуміло XKCD жарт, поки ми не відновити в наступний раз. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Добре. 1116 00:48:51,600 --> 00:48:53,446 Побачимося в середу. 1117 00:48:53,446 --> 00:48:54,754 >> [МУЗИКА ГРАЄ] 1118 00:48:54,754 --> 00:48:57,790 >> СПІКЕР: А тепер, глибоко думки, по Daven Фарнем. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Пам'ять, як стрибки на купу золоті листя в неділю вдень. 1121 00:49:04,770 --> 00:49:09,000 Вітер дме, кидаючи свій hair-- о, я сумую дні when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Сміх] 1124 00:49:12,650 --> 00:49:13,750