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