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