[Музыка Воспроизведение] Дэвид Дж. МАЛАН: Хорошо это CS50 и это начало недели пять. Таким образом, сегодня под вашим подушки сиденья, Вы ничего не найдете. Но прежде, вы должны найти их, маленький знак нашей признательности за Все работы, которые вы положили в игру пятнадцать. Просто удалите маленький круг на нижней части, чтобы начать играть на Остальная часть класса. Поэтому напомним, что, или знаете, что задачу, поставленную четыре, которые вышли в эти выходные, включает в себя написание другую игру. Но на этот раз включает в себя использование фактический графический интерфейс пользователя, не текстовый интерфейс, как Игра Пятнадцать было. И игра, которая лежит перед вами, Если вы еще не видели это следующий, выглядит немного что-то вроде этого. Я собираюсь идти в мой терминал окна здесь, в GDB. И я собираюсь идти вперед и запустите Сотрудники решение, которое вы можете получить доступ после запуска обновления 50, как обычно. Но я собираюсь поставить его в маленькую тайного режима, немного пасхальное яйцо, так называемый режим Бога, по ставить Бога в argv1. И я должен следовать своим собственным направлениях, запустить его в моем собственном Проблема установить каталог. Итак, теперь вы видите полную версию в игре прорыва. В самом деле, это не руки-режиме. Так это на самом деле - поразил, хотя вы могли бы быть - довольно просто реализовать режим Бога в Breakout, в отличие от игры пятнадцати лет, который некоторые из вас могли решаться для хакера издания. В Breakout достаточно в Бога режиме, чтобы просто делать то, что, Интуитивно с веслом? Только сделайте это все равно горизонтальной позиции шара. И до тех пор, как вы делаете это в ногу с мячом перемещения эта игра будет никогда, никогда, никогда не пропустить мяч и вы будете выигрывать каждый раз. Но в хакером издание этой неделе есть больше, чем просто режим Бога. Там, ряд других возможностей. Среди них, лазеров. Так что если вы действительно беспокоитесь вы может начать сбивать кирпичи и некоторые другие. А для тех из вас, кто хотел бы калибровки стандартным против хакеров издания, я вижу, что на этой неделе хакером издание сознательно является немного более выполнимой, скажем, чем Бог Режим игры был с пятнадцати лет. Так что если вы ищете растяжения и Вы ищете некоторые дополнительные весело Особенности делают погружение в если они представляют интерес. Сейчас более практично, я хотел бы отметить на одну вещь, а также. GDB, который некоторые из вас, возможно, еще коснулась лично, и это хорошо. Но сейчас действительно время, чтобы привыкнуть к этому и удобно с помощью этого инструмента потому что это сделает вашу жизнь гораздо проще, по-настоящему. На лекции Роба на GDB пара недель назад, напомним GDB, что это отладчик. Это инструмент, который позволяет запускать программы, но запустить его шаг за шагом, линия за строкой, так что вы можете копаться, так что вы видите, что происходит, так что что вы можете распечатать Значения переменных. Короче говоря, это дает вам гораздо больше, энергии, чем PRINTDEF делает. Теперь по общему признанию, интерфейс довольно сложных. Черно-белый текстовый интерфейс по большей части. Команды несколько жестким помнить в первую очередь. Но даже если это может занять половину , час, чтобы положить, что авансом затраты времени в него, поверьте мне. Конечно, к концу семестра она спасет Вы на порядок больше времени, чем это. Так что в начале недели начать дюйма И с точки зрения Breakout, знаю, что вы может сделать это при условии, что у вас есть Код распределения или ваш собственный код в прогресс в вашей Pst4 каталог. Знайте, что вы можете запустить GDB. / Прорыве. Это собирается открыть такое окошко. Позвольте мне привести себя больше из окна терминала. И тогда то, что я собираюсь идти вперед и сделать, это не просто запустить его. Я буду первым установить точку останова Напомним, которая позволяет сделать паузу выполнение в определенном месте. Просто, чтобы не усложнять Я собираюсь разорвать на одной линии, просто набрав номер один. Позвольте мне на самом деле вновь открыть это окно , потому что это становится немного маленькие там. Так что я теперь собираюсь сделать здесь Если я открываю мое окно терминала. Давай, там мы идем. Итак, если я вернусь в Dropbox, Pst4 и запустить GDB. / прорыва введите, заметит Я собираюсь разбить одну для установки точку останова первой линии. А теперь я пойду вперед и тип запуска. И когда я делаю, ничего не замечают , кажется, случается. Там нет всплывал. Там нет графической пользовательский интерфейс еще. Но это понятно, потому что я буквально на одной линии в моей программе. И заметьте, что я быстро пересылать, специально сейчас до 62, так как все материал в верхней части этого файла вещи, как комментарии и констант и неинтересных вещей на данный момент. Так что теперь я внутри основного, кажется, в строке 62. И это только распределение Код, напомним. Если я открою эту, идя, так же, в мое падение в поле Каталог Pst4, в breakout.c. И если я прокрутите вниз и вниз и вниз, и позвольте мне идти вперед и включить Мои номера линии. Что я буду видеть, если я прокрутите вниз до строка 62, точно такая линия, которая мы остановились на. Так что эта линия здесь, 62, является где мы собираемся быть. Так что теперь в GDB, если я иду вперед и введите Теперь следующее, введите его собирается выполнить эту линию. И вуаля, у нас есть так называемый г окна. Если незнакомы с тем, что GWindow есть, не о чем беспокоиться. Спецификации познакомит вас с ней, как а также ряд прохождение видео встроенные в спец. Но теперь давайте сделаем это немного более интересным. Позвольте мне переместить это окно над в сторону немного. Позвольте мне сделать окно немного больше, таким образом я могу увидеть больше. А теперь позвольте мне идти вперед и снова делать дальше. И есть мои кирпичи. Если я печатаю следующий раз теперь я вижу мяч. И если я печатаю следующий раз теперь я вижу, весло. И к счастью, это не Gedit действительно сотрудничают, показывая мне все, что захочу. Но теперь, если я делаю следующий раз, Далее еще раз, я просто Объявление некоторых переменных. И я могу напечатать любой из этих парней. Печать кирпича, отпечатки жизней. И теперь, если я продолжу делать Далее обратите внимание, что я буду Внутри этого цикла. Но код будет выполнять точно так, как я ожидаю. Поэтому, когда я ударил эту функцию, подождите для мыши, она будет делать что это буквально. Так что я, казалось, потерял контроль на программу. GDB не дает мне другую строку. Но не волнуйтесь. Перейти к моей игре, щелкните в любом месте. И вуаля, теперь он переходит к линии 86. Итак, еще раз, это бесценно, в конечном счете, для отладки проблем. Потому что вы можете буквально пошагово кода, печать вещи и многое, многое, многое другое. Но сейчас, эти инструменты только вы должны получить довольно далеко. Так что мы, конечно, взглянуть Графика на сейчас, все внезапно. И теперь наш мир становится немного более интересной. И вы знаете, может быть, от некоторых из видео в Интернете, что у нас есть эти шорты, которые Вы смотрели как часть проблемы множеств. И они были расстреляны, сознательно, на белом фоне. И некоторые из них имеют учение Стипендиаты сделать некоторые текста на экран, который обложил на стороне них. Но, конечно, это еще не все, что интересное в реальном мире. Это всего лишь лекционный зал с большой белый экран и фон. И наш удивительный рода производственных команды из заставляет все выглядеть красивой постфактум, обрезка из наложение или ничего мы делаем или не хотят. Теперь просто мотивировать на этой неделе и действительно, где вы можете пойти, в конечном счете, с информатикой. Не только после того, как проблема установить четыре. Но после того, как другой курс или целой учебная программа это удивительно, что вы можете сделать в эти дни с точки зрения графика в частности. Некоторые из вас, возможно, видели эту обтекании онлайн. Но я думал, что я покажу вам, всего за пару минут, увидеть то, что компьютерные технологии и то, что CGI, компьютерной графики можно сделать в эти дни со знакомой песней и, возможно, фильм. [MUSIC - Лана-дель-Рэй, "Молодые и красивые] Выступающий 1: Это просто немного удивительное, пожалуй, только, как вездесущ - [Аплодисменты] Выступающий 1: Я просто скачал его. Но это действительно удивительно, я думаю, просто как вездесущее программное обеспечение и кода и инструменты, как это на самом деле. Так вот вкус направлении в котором вы можете идти. О, нет больше бытовой сегодня. Ну, это на самом деле трагическая времени данный момент я просто попытался сделать. Ладно, давайте запустим Fusion снова. Напомнить позже. Все в порядке, и вы должны есть электронной почты, как в стороне, если вы все-таки заметите подобное. Ладно, напомним, что на прошлой неделе мы начали эту отогните позже известный как строка. строка напоминает тип данных, что это объявлен в CS50 библиотеки. И это часть подготовки колес что теперь начнут взлетать. Это была полезная концепция, на ранних стадиях. Но теперь он собирается получить больше интересным и более мощными, чтобы действительно видим, что под капотом, строка является только то, что, не так ли сказано? Да, так что это так называемый символ *. И там * обозначает, что есть какой-то адрес участие. И поэтому, когда вы говорите, символ * вы просто означать, переменную с типом данных Теперь указатель. Тот факт, что там есть звезды просто означает, что вы объявляете так называемый указатель. И, что указатель будет видимо сохранить адрес, из Конечно, голец. Теперь, почему это имеет смысл? Ну, что это строка под капотом? Ну, в течение некоторого времени мы говорили что строка под капотом только ч-е-л-л-о, например. Но мы уже говорили об этом, как являющийся, по сути, массив. А ряд будет выглядеть немного больше как это, с каждой из этих занимая укуса. А потом мы уже говорили, что есть что-то особенное сюда, 0 обратную косую черту, или нулевое окончание. Так что все это время, это здесь была строку. Но на самом деле, строка фактически адресу. И адреса, как мы увидим, часто префикс 0x по соглашению. Что обозначают 0x? Кто-нибудь знает? Так что это просто означает шестнадцатеричное. Таким образом, вы, возможно, помните, на самом деле, от Pst 1, я считаю, одна из разминки вопросов на самом деле вопрос о шестнадцатеричном формате в дополнение к двоичной и десятичной. И мотивация здесь является то, что с шестнадцатеричным у вас есть 16 цифры в вашем распоряжении. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а затем на A, B, C, D, E, F. А если посчитать всех тех, вверх, Вы получаете в общей сложности 16. Таким образом, это в отличие десятичной, где у нас есть 10 цифр, от 0 до девяти. Это в отличие от двоичного где мы просто 0 и 1. Но в конце концов вы можете просто представляют собой те же цифры, но несколько иначе. И шестнадцатеричные является общим, потому что как получается - и мы увидим, это на более поздних стадиях - даже тогда, когда мы получаем на веб-программирования в контексте HTML и цветовые коды, шестнадцатеричном хорошая. Потому что каждая цифра, оказывается, представляет собой четыре бита отлично. Так что это только отчасти линий красиво как мы в конечном итоге увидеть. Так что это может быть или что-то Ox123 так, обозначающий адрес 123 где-то внутри моего памяти компьютера. Но, конечно, возникают некоторые проблемы из-за этого основного осуществление. И помните, что я принял удар на реализации функции, как это - сравнить тире 0 точка C на прошлой неделе, что хотя казалось, что было Правильно, это просто не сравнить две строки правильно. Я выбросил основных и я бросил от комментариев просто сфокусироваться на код, который представляет интерес здесь. И это в красном, потому что он ошибочен. По какой причине? Ну, в верхней там, когда я заявил, строкой, то, что происходит на самом деле под капотом? Ну, позвольте мне перейти к Приведенный здесь экран и сделать это. Таким образом, я заявил, опять же, Строка с GetString. Так что я собираюсь идти вперед и сейчас рисовать с такой, какая она на самом деле. Это собирается быть квадратной здесь. И я собираюсь утверждать, , что это 32-битное. По крайней мере, это обычно бывает, по крайней мере, на CS50 Прибор в большом количестве компьютеров. Я буду называть его с. Но теперь напомним, что мы GetString называется. Так GetString возвращается, конечно, строку. Если пользователь введет в ч-е-л-л-о, введите Строка привет получает вернулся. И эту строку, как мы только что сказали, заканчивается где-то в памяти компьютера с обратной косой черты 0 в конце. Я нарисую это как массив - или непрерывный блок символов - что она на самом деле. И теперь, что GetString на самом деле возвращение? Что GetString возвращался все это время? Ну, скажем так, в недели до, она возвращает строку. Но более технически, то, что делает GetString возвращения по-видимому? АУДИТОРИЯ: адреса. SPEAKER 1: адреса. В частности, она возвращает адрес самый первый укус, что это такое. Я просто продолжать использовать один, два, три потому что это удобно. Она возвращает адрес первого символов в строке. И мы на прошлой неделе заявил, что которая является достаточной. Потому что мы всегда можем выяснить, где конца строки просто итерации это, может быть, с для петлю или петлю, или что-то вроде , что просто ищет "обратный слэш 0", специальный символ дозорных. И тогда мы знаем, что строки случается, длиной - в данном случае - пять. Так что технически делает GetString это возвращает Ox123 в этом случае. И технически, что происходит, является то , что мы храним, внутри с, Ox123. В конце концов, даже если это является новой концепцией, указатели, они это просто переменные. Но они происходят для хранения битов, которые вместе представляют адресу. Так что все, что они технически получает хранится в ы является Ox123. Но мы, как люди - в том числе сегодня вперед - действительно не будет заботиться, обычно, что фактический адрес некоторых кусок памяти. Это просто низкий уровень детализации быть интеллектуально интересным. Так что я собираюсь отменить это. И вместо того, более высокий уровень, просто сказать , что, когда мы говорим об указателях Я собираюсь просто привлечь больше удобных стрелку, которая передает же идею и абстрагирует сведения о том, что фактическое основной адрес. Теперь, если мы вернемся к коду, что произошло на прошлой неделе, если у нас есть строка T GetString равно? Ну, если я еще раз, введите привет на этот раз я иду, чтобы получить другой участок памяти. ч-е-л-л-о 0 обратную косую черту. Но потому что я звонил GetString во второй раз - и я знаю это, глядя на Исходный код для GetString - даже том, что это случайно, что привет был набрал в два раза, не GetString будет пытаться оптимизировать и быть умным. Это просто будет получить другой кусок памяти с компьютера, который будет по другому адресу. Давайте просто скажем, произвольно 456. А потом что он собирается вернуться? Это собирается вернуть 456 и хранить его в т. Так что же происходит на самом деле, на Левая сторона у меня есть другой кусок памяти, 32 бит обычно. И там будет идти Ox456. Но опять же, я не заинтересован в этих определенных чисел больше. Я просто хочу, чтобы абстрактно нарисовать его, как стрела. Так что это теперь новое объяснение. Но это точно такой же идеей, что это что происходило все это время. И так причине, то, что этот первый версия сравнение было плохо, на прошлой неделе, почему? Когда вы это сделаете, если с равно равно т, что ты по-настоящему под капотом сравнения? Вы сравниваете адресов. И так же, интуитивно, понятно, Ox123 не собирается равное Ox456. Эти цифры, эти биты просто разные. И так последовательно, на прошлой неделе он сказал ввести разные вещи, даже если Слова были дословно то же самое. Таким образом, мы это исправить. С точки зрения непрофессионала, что было исправить? АУДИТОРИЯ: Используйте функцию. Выступающий 1: Используйте функцию. Или звезды определенно вовлечен, но использовать функцию для чего? АУДИТОРИЯ: для сравнения строк. Выступающий 1: для сравнения строк. Таким образом, основная проблема здесь была что я просто рассмотрении Качество строк, которые будут определены сравнение их адресами. И, очевидно, это только теперь еще немые Вы понимаете, что происходит под капотом. Чтобы по-настоящему сравнивать строки, чтобы увидеть, если они равны в том, что человеческий будет рассматривать две строки равными мы должны сравнить их характер для символ в символ. Теперь я мог бы сделать это очень утомительно. Но фамильярно, мы использованием цикла. И просто сравните с кронштейном Я против т кронштейна я. с кронштейном я плюс 1 т против кронштейн я плюс 1, и так далее, внутри какой-то петли. И если я определяю любых двух символов, которые отличаются, или если я понимаю, что ох, с является короче, чем т или больше, чем т Я могу сразу сказать, ложно, они не то же самое. Но если я получаю через с и т и сказать же, то же самое, то же самое, то же самое, то же самое, в конце обе строки, я могу сказать, правда, они равны. Ну, к счастью, несколько лет назад кто-то писал, что код для нас. И они назвали это StrComp для сравнения строк. И хотя это немного счетчика интуитивно, StrComp возвращает 0, если эти две строки, с и т одинаковы. Но она возвращает отрицательное значение, если с должны прийти до T алфавиту или положительное значение, если он должен прийти, после т в алфавитном порядке. Так что, если вы хотите уладить что-то, оказывается, что StrComp полезно. Потому что это не просто сказать Да или нет, равны или нет. Это дает вам чувство заказа как словарь мощи. Так StrComp, с запятой T равна равно 0 означает, что строк действительно равны. Потому что тот, кто писал эту функцию лет назад предположительно использовали для петли или петлю, или что-то вроде того интегрировать по персонажей снова и снова и снова. Но проблема возникла два здесь. Это было copy0.c. И оба в красном потому что это недостатки. И что же мы здесь делаем? Ну, во-первых, я позвонил GetString. И я сохранил возвращаемого значения в с. Так что это в значительной степени так же, как это верхняя часть картины. Но что будет после этого? Ну, позвольте мне идти вперед и избавиться целой кучей этом. Мы перемотки во времени туда, где мы только что есть с, который в настоящее время в соответствии с линии одного там. Я проверяю. Если с равным равна 0. Теперь, быстрое примечание стороны, когда GetString может возвращать 0? Там не хватает памяти. Верно? Это редкое, что это произойдет, конечно, на компьютере, который есть сотни мегабайт или даже гигабайтами оперативной памяти. Но это может, в теории, вернуться 0, особенно если Пользователь не сотрудничает. Там в способы притвориться, что у вас нет введенных трюк и ничего GetString к возвращению 0 эффективно. Так что это, чтобы проверить это. Потому что, если любой из вас начали получить, уже, ошибки сегментации - который, вероятно, был источник некоторого разочарования - те почти всегда результат из об ошибке памяти. Как-то вы перепутались в отношении указатель, даже если вы не понимаете, было указателем. Таким образом, вы, возможно, индуцированных сегментации неисправности еще в одну неделю использования что-то вроде цикла или в то время как петлю и массив, заходит слишком далеко мимо границы некоторых массив, который Вы заявили в неделю в две частности. Вы могли бы это сделала даже в проблемных установить четыре с прорыва. Хотя вы, вероятно, не видели любой звезды в распределении код Breakout, получается, что те, GRect и GOval и другие подобные вещи, те фактически являются указателями под капотом. Но Стэнфорд, как и мы, вроде шкуры что подробно по крайней мере для библиотек целях, так же, как мы делаем для струнных и символ *. Но GRect и GOval и все эти вещи вы, ребята, или будет использовать На этой неделе, в конечном счете адресов памяти. Вы просто не знаете. Так что не удивительно и то, пожалуй, что вы могли бы споткнуться некоторых ошибки сегментации. Но что интересно, вот сейчас, Если после проверки на 0 мы делаем Строка T получает с. Ну, позвольте мне объявить T. Я собираюсь нарисовать его в виде квадрата, 32 бит, назовем его T. А потом я собираюсь сделать получает с. Ну, что же это значит? Ну, это немного трудно думать Об этом представить мудрым. Но давайте подумаем о что внутри х? Что буквально в эту переменную? Значение Ox123. Поэтому когда я говорю T получает строку с, что только буквально означает взять число в с, что Ox123 и положил его Ox123. Или графически, если я как бы абстрактным от которых подробно он имеет Эффект буквально делает это также. Так что теперь, вспомните, когда на прошлой неделе мы приступили к капиталистическому T. Я T сделал кронштейн 0. Ну, T кронштейн 0, даже если это указатель, вы можете рассматривать его как будто это массив, с квадратным скобок. Так где T 0 кронштейн? Ну, это час. И поэтому, когда мы используем эту строку кода, Два верхних, что в этом с type.h Файл заголовка, вот где они объявлены. Вы капитализации этой H. Но, Конечно, это точно такой же вот ч Внутри с, так сказать. И вот теперь вы изменили или капитализируются как оригинальную и так называемые копии. Потому что вы не сделать копию образом, что человеку хотелось бы ее видеть. Так что же исправление здесь, В copy1.c на прошлой неделе? Функции, так что мы могли фактически скопировать строку. И принципиально, что же нам нужно, чтобы сделать для того, чтобы скопировать строку? Ну, в этом зеленом версию здесь я собирается сделать это довольно низком уровне. Есть на самом деле функции они могли бы помочь с этим. Но самый основной, причем наиболее знакома, по крайней мере, в скором времени будет знакомый нам, следующий - так что на первой линии кода в зеленый сих пор. Я просто переписал с, как символ *. Там нет функционального разницы нет. Я просто выбросил CS50 библиотеку и Я звоню его, каково это, символ *. Теперь точка, точка, точка, потому что были обработку ошибок, что не Интересно говорить о снова. Так что теперь Т объявлен. Это тоже символ *. Так что я обратил на маленькой площади Экран, как раньше. Но, с правой стороны, Malloc, мы сказали это память выделить. Так что выделить несколько кусок памяти. И сколько байт мы на самом деле хотим выделить, она кажется? Ну, длина строки с. Так что если это привет это будет пять. Мы скажем, ч-е-л-л-о. Так пять байт. Но тогда плюс 1, то почему 1? Символ 0. Если мы не оставляют места для этого парня мы может случайно создать ситуацию, , где находится строка ч-е-л-л-о. А потом следующий GetString время Я позвонил и ввести, например, Дэвид, D--V-I-д, компьютер будет думать, что ей на самом деле ч-е-л-л-о-д-а-в-и-D, потому что есть Без перерыва между этими словами. Так что нам нужно, что перерыв. Таким образом, мы не хотим, пять. Мы хотим шесть байт. И я говорю байт. Но это действительно время размер символов. Технически символ почти всегда один байт. Но только, чтобы сделать наш код портативный, так сказать, так что он работает на разных компьютерах, даже если они могут быть несколько иной под капот, я собираюсь общем говорят размер так, чтобы символ мой код всегда работает. И я не придется перекомпилировать это просто потому что я обновить мой компьютер или использовать несколько разных платформ. Так что я получил 6 раз больше символ, который бывает 1. Так, чтобы средства могли Malloc дать мне шесть байт. Что это на самом деле делать? Ну, позвольте мне вернуться во времени здесь туда, где мы находимся в историю. Так что, если я вернусь сюда, я объявил символ * называемые Т. Я теперь называется Malloc течение шести байтов. А теперь я собираюсь сделать эти шесть байт как массив ранее. Но я на самом деле не знаю, что это внутри этого массива. Если вы выделить память оказывается, что Вы не можете доверять, что есть некоторые Известное значение там. Это можно было бы использовать на что-то иначе, некоторые другие функции, некоторые другие строки кода, который вы написали. Так что мы обычно называем этим мусором значения и привлечь их, может быть, как вопросительные знаки, только о том, что мы Не знаю, что на самом деле там. И это не большое дело, пока мы достаточно умны, чтобы перезаписать мусор значения с номерами или символы, которые нас интересуют. Поэтому в данном случае то, что я собираюсь делать? Ну, моя строка кода Далее, у меня есть четыре. Int я получаю 0, п получает длина строки с. Так знакома цикла. Я меньше или равна п, который обычно выше. Но на этот раз это преднамеренно. Я + +, а потом я просто делаю т кронштейна я получает с. Потому что моя картина выглядит как это в этот момент хранится в т является адрес этого случайного блок памяти , значения которых неизвестны. Но как только я делаю т кронштейна 0, который ставит меня здесь. И то, что заканчивает тем, что тянет туда? Мы в конечном итоге положить ч. Потому что это то, что стоит на кронштейне с 0. А потом то же самое для е и л и л и о. N, почему не пошел через равна п? Из-за 0 характера. Так просто быть ясно, то, если я на самом деле стереть все эти мусора значения, а затем фактически рисовать в то, что я ожидал, это с кронштейном 1, 2, 3, 4, плюс который заднем новый характер. И вот теперь, если мы продолжим мимо точки, точка, точка в этом правильная версия и капитализированные кронштейн Т +0 я бы, Конечно, быть капитализации только в этом парень здесь, что в принципе, в конечном счете цель. Так что все указателя. И ты использовал их в течение недели Теперь в контексте строк. Но под капотом они немного более сложной. Но если вы думаете о них в этом наглядной форме я предлагаю, чтобы они вероятно, не все так страшно, как они может показаться на первый взгляд, Особенно с такой новый синтаксис. Любые вопросы по указателям, строк или символов? Да? Зала: Можно вернуться назад в [неразборчиво]? Выступающий 1: Конечно. АУДИТОРИЯ: Так как же в вашей самой последней линии, у вас нет линии T * и A * S в линии? Нет ли у вас ссылки на - Выступающий 1: Ах, очень хороший вопрос. Почему у меня нет и Т * A * S? Так кратко, на прошлой неделе, как и в нашей поменять функции, я действительно говорил, что, когда у вас есть указатель средство, с помощью который Вы идете туда, как мы сделали физически на сцене, был на самом деле использовать звезду оператора. Оказывается, что эта квадратных скобок обозначения, что мы назовем синтаксических сахар, который находится всего в сексуальный способ говорят, что это сокращенная запись именно то, что вы описываете. Но это немного более интуитивным. И в то риск принятия этого кажутся более сложнее, чем она должна быть, то, что происходит на самом деле здесь является следующее - Если я скажу, что T * означает пойти в адресу, сохраненному в т. Так буквально, если Т хранения адрес этой ч Изначально * T средства идут сюда. Итак, что же т кронштейна 0 означает? Точно такой же вещи. Это просто немного больше пользователей дружественный писать. Но я еще не закончил. Я не могу просто сказать * T * получает с. Потому что то, что я буду делать тогда? Я бы положить Н, Н, Н, Н, Н в течение всего этого. Верно? Потому что Т * перейти по адресу в т. Однако мы внутри цикла. И какое значение я приращения, Конечно, на каждой итерации? я. Но есть возможность Здесь, правда? Даже если это чувствует, как она становится немного более сложной чем квадратных скобок мы использовали в течение некоторого времени - позвольте мне отменить мой ч изменение там - хотя это теперь становится немного любитель, основная идея, если T * означает здесь и * т только перейти по адресу в т. Но то, что адрес в т? Числа мы продолжать использовать? Как Ox456, давайте вернуть это только ради обсуждения. Ну, если я хочу получить на е в T строк, я просто хочу идти, По сути, 456. Или, скорее, 457. Мне просто нужно, добавьте один. Но я могу сделать это, не так ли? Поскольку т, хотя я сохранить рисунок его сейчас, как стрела, это просто число, Ox456. И если я добавлю, что один или более Как правило, если я добавлю я к тому, я могу на самом деле получить именно там, где я хочу. Так что, если я на самом деле сделать это - и это то, что теперь называется арифметика указателей - Я могу удалить эту линию. Что, честно говоря, я думаю, что яснее и более понятным пользователю читать. Но это не менее правильно. Эта строка кода теперь использует арифметики указателей. Это говорит пойти в после выступления - независимо от начала т в том, который является T Plus I, который первоначально равно 0, и это здорово. Поскольку это означает начало т плюс один, плюс два, плюс 3, и так далее. И то же самое дело с с. Так синтаксический сахар для этого. Но понимание того, что происходит на самом деле под капотом, я бы сказал, на самом деле полезно само по себе. Потому что это означает теперь есть не гораздо больше магии происходит под капотом. Там не будет много больше слои, которые мы можем отогните для вас. Это с. И это программирование. Очень хороший вопрос. Ладно, так что это было то, что детская коляска программа, которую я имел в виду ранее. своп был испорчен. Если действительно похоже на работу. Напомним, что так же, как с молоком и Апельсиновый сок - который я начал питьевой сегодняшней демонстрации. Так же, как с апельсиновым соком и молоко, мы должны использовать временную переменную TMP, провести временно, так что мы могли тогда изменить его значение, а затем обновить б. Но эта функция, мы сказали, или это Программа, в которой эта функция была написано было неправильно, и недостатки, то почему? Да? АУДИТОРИЯ: [неразборчиво]. Выступающий 1: Точно, когда вы называете своп - или, более обобщенно, когда называют самым любую функцию - если аргументы для этой функции являются примитивных, так сказать, целые и символы и парном разрядах и плавает, то, без звезды, вы проходите в копию аргумент. Так что если х был 1 и у 2 было, собирается быть 1 и B будет 2. Но они собираются быть разными кусками битов, различные порции памяти, которые, случается, хранение одинаковые значения. Так что этот код является супер совершенный при перекачке и б. Это никуда не годится при перекачке - в примере на прошлой неделе - х и у. Потому что опять же, они в неправильной области. Теперь, как мы идти о фиксации этого? Мы должны были сделать функцию выглядеть немного уродливее. Но, опять же, рассмотрим, что это просто означает. А на самом деле, позвольте мне, для последовательности, изменить одну вещь так что это идентично то, что мы только что сделали. Как я уже говорил на прошлой неделе, он не имеет значения, где он идет. На самом деле, Вам нужно будет поставить звездочку рядом с именем переменной. Но я думаю, было бы немного легче рассмотреть * рядом Тип данных в том смысле, что это указатель к Целочисленное в этом случае. Так что я здесь делаю? Я говорю, что мне не дают Целочисленное последовал еще один Интеллект, называя их А и Б. Дайте мне адрес Int. Дайте мне адрес другого Int. Позвоните эти адреса А и В. А затем с помощью обозначения вниз * ниже, перейдите к каждому из этих адресов по мере необходимости либо получить или установите его значение. Но есть исключение. Почему я не * рядом с TMP? Почему я не делал этого, например? Такое чувство, что я бы просто идти все , и исправить все это. Да? АУДИТОРИЯ: [неразборчиво]. Выступающий 1: Я не заявили TMP в виде строки. Так что это будет объявить, в данном случае, TMP быть адрес Int. Но это не совсем то, что я хочу, по нескольким причинам. Зала: Вы не хотите, чтобы поменять их местами. Выступающий 1: Точно, я не хочу, чтобы поменять ничего с TMP. TMP просто неделю-один материал. Все, что я хочу, является переменной хранить некоторое число. Я даже не заботятся об адресах в этот момент. Мне просто нужно 32 бит или поэтому для хранения Int. И я хочу поставить в этих 32 бит все, что не в, так сказать, но о чем идет, просто чтобы быть более точным. Потому что, если это адрес, * означает, пойти туда и получить значение 1. Например, в примере на прошлой неделе или в случае Б, получим значение 2. Так что же происходит на самом деле? Позвольте мне нарисовать картину здесь, что только дразнить друг от друга части сегодня. Но это будут продолжать появляться в течение достаточно долгого времени. Это, я утверждаю, то, что ваш компьютер памяти выглядит, когда вы запускаете программы, любой программы. Когда вы запускаете программу на самом верху оперативной памяти компьютера - так что думаю этого прямоугольника, по-настоящему, так как ваш компьютера оперативная память или память, все 101 миллиард байт из нее все два миллиарда байт, все два гигабайта это, независимо от количества у вас есть, нарисуем его в виде прямоугольника. И я утверждаю, что, когда вы запускаете программу как Microsoft Word или Chrome или что-нибудь подобное, биты, Microsoft или Google, что написал - в случаях этих программ - загружаются в память компьютера где они могут быть выполнены более быстро и подается в процессор, который является мозгом компьютера. И ТАМ они хранятся в самом верху вашей программы, так сказать. Другими словами, если это кусок памяти, когда вы дважды щелкните на Microsoft Word, биты приходят с жесткого диска. Они загружаются в оперативную память. И мы будем пихать их на самом верху этого прямоугольника концептуально. Ну, остальное ваша память использовать для различных вещей. На самом верху вы видите инициализации данных и инициализации данных. Это связано, по большей части, при константами или глобальные переменные которые имеют значения. Но больше на тех в другой раз. Тогда у вас есть куча, которая мы будем возвращаться. Но на дне части, которая Особенно уместны прямо сейчас. Это так называемый стек. Так же, как в большинстве любых D зал здесь, на кампуса, у вас есть те лотки, которые просто стек поверх друг друга на котором Вы можете положить еду и еще много чего. Стек в компьютерной системе очень похожи. За исключением в то время как лоток, как мы используем в столовой, конечно, имеется в виду нести вещи лотков или кадры - как мы будем называть их - в компьютере памяти используется для хранения переменных и их значений. Так что же на самом деле происходит под капотом? Ну, позвольте мне перевернуться на экран здесь. И давайте сосредоточимся только на Нижняя часть на мгновение. Если это нижняя часть мой памяти компьютера оказывается, когда я вызвать функцию основного - что происходит, честно говоря, автоматически для меня - Я получаю кусок памяти в глубины моей памяти, так сказать. И здесь это основной локальные переменные идти. Это место, где ARGC ARGV и, может быть, идти, и я все переменные объявить внутри основного. Они в конечном итоге на дне оперативной памяти моего компьютера. Теперь предположим, что основным вызывает функцию как своп, как это было на прошлой неделе? Ну, мы, по существу поставил новый лоток, Новый кадр, на мой кусок памяти. И я собираюсь описать это как принадлежащих своп функции. Теперь, что внутри своп? Также, на основе программы на прошлой неделе и тот, который мы только что видели отрывок из, внутри фрейма свопа, или свопа Лоток, это то, что переменные? Ну, а, б. Потому что те были свои местные аргументы, а также третий, TMP. Так на самом деле, я мог бы обратить на это немного более аккуратно. Позвольте мне пойти дальше и отменить этикетке. И позвольте мне утверждать, что вы знаете, что? , вероятно, будет в конечном итоге здесь. B закончится здесь. И TMP закончится здесь. Теперь, упорядочение может будет немного отличаться. Но концептуально это идея. И только коллективно, это то, что мы будем называть кадр свопа, или столовой лоток. И то же самое дело с основным. Но я не буду, что перерисовать. Но вот где и ARGC ARGV и любые своих локальных переменных, как х и у может быть также. Итак, теперь рассмотрим, что происходит на самом деле при вызове подкачки. При вызове своп, как выполнение кода это, вы передаете, в версию с ошибками, а и б также копии х и у. Поэтому, если я сейчас делаю такой на экране - должен лучше на это - так что история, которую я рассказывал про себя был в этой версии багги, когда мы позвоните поменять проходящем в буквальном А и В как целые числа, что на самом деле происходит? Ну, то, что происходит на самом деле заключается в следующем. Позвольте мне идти вперед и просто отменить прояснить некоторые места здесь. Так что это моя память компьютера. Так что, если у меня, например, - на самом деле давайте сделаем это таким образом - Если я утверждаю, что это X, хранения значение 1, как и на прошлой неделе. И это у, хранения значения 2 так же, как на прошлой неделе. И это является главным, когда я звоню свопа, тем самым давая себе доступ к и B и TMP, я собираюсь утверждать, что это и это 1. Это б. Это два. Это называется TMP. А изначально, она имеет некоторые мусора значение пока я фактически не храните в нем, которой равна 1. Тогда я иду вперед и изменить то, что? Б значения. И вот теперь у меня есть два здесь. И тогда мы сказали б получает TMP. Опять же, как и санитарной проверки, третий строка кода здесь просто это Один из них, B получает TMP. И вот, наконец, что мне делать? Я иду вперед и изменить б быть все, что Значение TMP является, что 1. Я не касаюсь TMP снова. Но теперь, проблема в том, как только своп возвращается, потому что это не вручать вернуть часть стоимости, нет возврата команда явно в нем. Что на самом деле происходит? Ну, по существу, все эта память - ОК, по-видимому любит ластик только один палец за один раз - просто исчезает. Сейчас на самом деле это не никуда не денешься. Но вы можете думать об этом Теперь в виде знаков вопроса. Потому что это уже не фактически используется. И ничего не делается с этими значениями. Таким образом, в случае с зеленым версии этот код, а не то, что в настоящее время перешла в своп? Так адреса. Таким образом, адрес х и адрес у. Поэтому, если мы пересказать эту историю один последний время, и я на самом деле сделать своп снова, но с указателями, что является, это бытие B, и этот являющийся TMP, что на самом деле хранится в в этом зеленом версия моего кода, где я передаю в адресах? Это собирается быть указателем на х. Так что я мог нарисовать стрелку. Но давайте использовать тот же произвольный Например, как раньше. Давайте говорить, что это что-то вроде Ox123. И это будет, потому что Ox127 это четыре байта далеко, потому что это Интеллект, таким Ox127. И опять же, я беру некоторые вольности с номерами. Они намного меньше, чем они были бы действительно может быть и в другом порядке. Но это, как картина Сейчас другое. Но когда я использую эту зеленую код и я десятичного TMP получить *. * Средство сделать следующее, возьми -адрес, в и идти к ней, которой равна 1. И вот что я после этого положить в TMP. Между тем, в следующей строке кода Здесь * получает B, что это значит? Ну, *, так что идти здесь получает * B, что означает пойти туда. А это значит, поставить значение там. Наконец, последняя строка кода просто сказал * B получает TMP. Так Б говорит пойти туда и перезаписать его с TMP, который в этом случае будет быть опять 1. И вот почему зеленая версия Наши работы кода, в то время как красные версия никогда не делал. Все это просто сводится к тому, память управляется и, где это фактически размещенных в вашей оперативной памяти компьютера. И на данный момент, это одна из вещей, что стек используется для. Вопросы по формату? На указатели? Или на своп? Ладно, Malloc, напомним, сделал что-то вроде этого. Это было очень простой пример. И это был тот, который Binky представил нас, хотя и довольно быстро, в конце классе. Черт возьми, там мы идем снова. Таким образом напомнить, что это был пример Бинки представил нас, хотя и несколько быстрее в конце классе. И здесь мы использовали действительно Malloc во второй раз. Потому что первый раз, когда мы использовали его для создать достаточный объем оперативной памяти, выделить достаточный объем оперативной памяти для хранения строки. На этот раз Binky держали его простым. Так что это только для хранения Интеллект, по-видимому. И это совершенно нормально. Это немного странно, честно говоря, для использовать Malloc выделить одну Int. Но суть Claymation Ника была на самом деле просто рассказать историю о том, что происходит или не происходит при Вы плохо обращаться с памятью. Таким образом, в этом случае эта программа сделал несколько вещей. В первом случае здесь, он объявляет указатель на X называется Int. Затем он объявляет указатель называется г до Int. Затем он сохраняет в X, то какие? Кто-то сейчас. Что сохраняется в X в соответствии с Третья строка этой программы? АУДИТОРИЯ: [неразборчиво]. Выступающий 1: Ну, не совсем байт, за, говорят. Точнее сейчас. Что сохраняется в X? Адрес, я думаю, что я слышал. Итак, что же Malloc вернуться? Malloc поведенчески выделяет кусок памяти. Но как это даст вам доступ к нему? Она возвращает что? Адрес первого байта в блок памяти. Теперь, это супер просто. Это всего лишь один байт, что означает, решения мы возвращаемся является адрес целиком. Так что хранить в х, то, это адрес этого блока памяти. Между тем, что происходит дальше? Поэтому на самом деле, давайте идти вперед и отметить это очень быстро. Так что если мы идем к экрану здесь и мы играем на это десятичного * X и Y десятичного * собирается делать то, что для меня? Я утверждаю, что это только собирается сделать что-то вроде этого и назовем его X, и это и называют его у. Между тем, в третьей строке кода собирается выделить размер Интеллект, который, оказывается, - жаль, если я сказал, одного до Я имел в виду одну Int - четыре байта на типичном компьютере. По крайней мере, с CS50 прибора. Так что это собирается выделить он, кто знает? Где-то здесь. И это хранится на некотором Адрес Ox, кто знает? Но то, что собирается получить вернулся в том, что адреса. Но мы будем рисовать этом наглядно как только стрелка подобное. Сейчас в следующей строке * X получает 42. Что означает х * с точки зрения непрофессионала? Просто пойдите туда. Перейти на этот адрес. Или, другими словами, следуйте стрелками и положить 42 там. Но потом случилось что-то плохое к Бинки, не так ли? Напомним, что линия здесь пять, * Y получает 13, действительно несчастливым числом, сделал то, что для нас? Ну, у * средства идут туда. Ну, это не было дано Значение же, не так ли? Код не имеет у бытия инициализировать ни к чему. Мы х инициализации в адрес. Но у был объявлен наверху. Но то точка с запятой, никакой ценности был на самом деле положить в него. Так что это справедливо назвать этот мусор значения. Кто знает, что там? Это остатки биты, которые были использованы некоторыми предыдущими строку кода в моей программе. Так что, если я говорю, идут там, это как, Я понятия не имею, где эта стрелка будет в конечном итоге. И вот, когда вы обычно получите ошибку сегментации. Если вы случайно разыменования, так говорят, или перейдите на адрес, который не на самом деле законный адрес, плохие вещи случаются. И это именно то, что произошло думать Бинки. Поэтому напомним, что история, которую Ник был говорю здесь была та же идея, что Я нарисовал с иллюзией мелом на доске там. X и Y были объявлены. Затем выделено размер Целочисленное и хранить его в х. А в следующей строке мы сделали * х. Это была волшебная палочка Ника разыменования. После этого все 42 в памяти указал на х. Но это то, где вещи пошло ужасно неправильно. Верно? Мы попытались разыменования у. Но у некоторых было неверное значение, не так ли? Это стрелку в левом нижнем угол, не указывая на самом деле ни к чему. Это вроде того, что я делаю сделал здесь на доске. Так что плохие вещи случаются, сегментация вина, или Binky вина, в этом случае. Но если мы затем исправить, что, делая х получает у как же история изменений? Ну, если я делаю X получает Y, это фактически то же самое, как говорят бы это ни было, что-то Ox- будет то же самое здесь, Ox-то. Или образно мы будем рисовать стрелки. Так вот на доске с Бинки, со следующей строки из кода, * у означает пойти туда. Где там? Это значит, здесь. И когда мы обновляем, что быть 13 он просто вовлекает движение и написание 13 здесь и сейчас. Поэтому, возможно, не полностью проста на первый взгляд. Но чтобы вспомнить и использовать тот же жаргон Бинки, что использовал здесь, так что Первые две выделить указатели х и у, но не pointees. И не pointees как правило, используется термин. Но указатель совсем. Но это то, что на который указывает В номенклатуре на Бинки. В следующей строке, конечно, выделяет Целочисленное pointee. Так что часть памяти - как я привлек более на Правая часть там - и набор х равно точке к нему. Это разыменовывает х для хранения 42 в памяти, которые он указывает в. И тогда это, конечно, было плохо. Потому что у не указывая ничего еще. Это фиксирует это. Так что это еще багги программы. Просто потому, что мы, дующий через код строка за строкой и говорят, да ладно, пусть это крах там. Это плохая вещь. Разногласия программа просто будет прервать вообще на эту строку. Но если вы удалили разбился линии и заменить его с последними двумя линии есть вы назначаете - использованием присваивания указателя - Y чтобы она указывала на X как точка т. И тогда вы разыменования у в очень безопасный способ. Так где же это нам дает? Ну, получается, что под капотом CS50 в библиотеке, указатели используются во всем. И мы на самом деле начать чистить назад, что слой в скором времени. Но оказывается, тоже выражение, Некоторые из вас могут быть знакомы с, особенно более комфортной, на самом деле, что из очень популярной веб-сайт, или переполнение стека, в эти дни. Но это на самом деле имеет очень техническое значение. Теперь мы знаем, что стек. Это как стопки лотков Внутри столовой. Или внутри вашего компьютера своей памяти те кадры , используемых функций. Ну, получается, что из-за того, что очень простой реализации память и кадров на так называемом стек, вы можете взять под свой контроль вычислительной системы довольно легко. Вы можете взломать системы, если люди как мы не написали наш код особенно хорошо. Если такие люди, как нам использовать куски памяти или использовать массивы - Еще чаще - но иногда забудьте проверить Границы нашего массива, как Вы могли у себя иногда, и повторном слишком далеко за границы массива. В лучшем случае, ваша программа может просто потерпеть крах. Ошибка сегментации, добрый неловко. Не отличный, но это не обязательно очень плохо. Но если ваша программа на самом деле на реальном компьютерах пользователей, если он работает на сайт, который фактически случайные люди в интернете бьют, позволяя люди инициируют плохие вещи на ваш код как правило, не очень хорошо, поскольку это означает, что возможность принять контроль над компьютером. И это будет выглядеть немного загадочным. Но я думал, что я с вас пугать последний пример. Вот пример кода. И есть хороший Википедии статью, которая идет через это более подробно. У меня есть основная на нижней призвание Foo, передавая агду 1. И это именно так, что вы можете запустить программу и пройти произвольный ввод. А потом Foo объявлен наверху как принятие строкой, или более Точнее, символ *. Затем он объявляет массив символов. Назовем это буфер, в целом, размер 12. Так 12 символов может поместиться внутри этого массива называется C. И тогда он использует эту новую функцию, , которое является новым, но не трудно понимаю, память копию. Он копирует память, из бара, который был переменная н прошлом, независимо от пользователь ввел в ARGV 1 в с. Сколько байтов? Длина строки из бара. Итак, другими словами, если пользователь вводит ч-е-л-л-о Enter, длина строки привет из равняется пяти. Так что пять из этих байт собирается получить копируется в массив с именем С, что имеет размер 12. Но то, что пользователь вводит в гораздо дольше слово, которое 13 символов или 14 символов или 100 символов или больше? Где они будут идти? Ну, это кадр, то этот лоток В столовой стеке, они собираются, чтобы пойти туда. И это только собирается начать перезапись другие вещи, которые уже в стек, переполненные стек, так сказать. Так графически, думать об этом таким образом. Это всего лишь красочная версия картину мы рисую. В нижней части, скажем, является основным. И на вершине, что вы видите сейчас в кадре цветом теперь, Функция называется Foo. Но что интересно, вот о Foo является то, что вот его рамки. Так он рисуется так же, как я сделал, но в светло-голубых. А теперь это, где С кронштейном 0 идет. И это где с кронштейном 11 будет в конечном итоге. Другими словами, это случается быть представлены в виде квадрата. Но если вы просто держать шлепаясь байт вниз - или символы - они собираются в конец по месту нахождения до 0 все, вплоть до до 11, потому что это 0 индексироваться. Но где же 13-го характера будет в конечном итоге? Где 14-й? Где 50-й символ будет в конечном итоге? Это будет продолжать идти вниз. Потому что даже если мы нарисовали картинки с стек рос, адреса, оказывается, идут от небольшой адреса, небольшие указателей, к большому адресов. Так что просто продолжает идти вверх и вверх. Таким образом, если пользователь вводит привет, это здорово. Не ошибка, не проблема, безопасной для всех. Но если пользователь вводит в том, что мы будем называют состязательным код, изображенный в общем как, атака, атака, атака, атака, что может произойти? Хорошо, если все входные что пользователь набрал в это не просто дружеский или оскорбительные строки символов. На самом деле это последовательность символов что если он был скомпилирован, на самом деле это код. Может быть, это код, который удаляет все файлы на вашем жестком диске или рассылает спам или что-то вроде этого. Обратите внимание, что то, что ключевым здесь является то, что Если плохой парень повезло достаточно, чтобы перезаписать красным кусок памяти - которые я не опираться на мою картину, но эта картина Википедии здесь есть - его так называемый обратный адрес. Когда пища возвращается, когда возвращается обмен, каким компьютером знать, чтобы перейти от сюда, чтобы здесь? Или в техническом сегменте наверху, как он знает, чтобы перейти от свопа код - 0 и 1 в , которые составляют своп - Вернуться на главную? Там в так называемом обратным адресом хранится в том же кадре стека, на тот же лоток кафетерии. Так что если плохой парень достаточно умен, чтобы положить атакующий код, код атаки, атаки код, и вам обязательно повезет достаточно - часто методом проб и ошибок - к перезаписи, что красный обратный адрес, с адресом и уведомления на самом верху. Обратите внимание 0835C080. Она написана наверху назад для Причины мы, возможно, пересмотреть. Это это число. Так что если плохой парень получает повезло или достаточно умен, чтобы перезаписать красным полоса памяти с адресом код, который он или она каким-то образом вводится в компьютер, угадайте, чьи Код собирается быть возвращены как только Foo делается выполнения? Плохого парня кода. Так что это вредоносный код, AAA, опять же, может рассылать спам, может удалить все файлы на вашем жестком диске. Но это то, что действительно переполнение стека есть, или переполнение буфера или переполнения буфера атаки. И это невероятно, невероятно часто по сей день с программами, написанными на C, C + +, и даже некоторые другие языки. В тот страшный внимание, мы заканчиваться шутки. [Смеется] Увидимся в среду. На следующем CS50 - Так что я все свободное дисковое ламп сегодня, но подожди, обезжиренного молока, половина телефонов Книга, апельсиновый сок что я пил сегодня. USB кабель, гаечным ключом. [Музыка Воспроизведение]