[Powered by Google Translate] [Неделя 5] [David J. Малан, Гарвардский университет] [Это CS50.] [CS50.TV] [Женщина] Он лжет, о чем, я не знаю. [Мужчина] Итак, что мы знаем? [Женщина] Что в 9:15, Рэй Сантойя было в банкомате. [Мужчина] Так что вопрос, что он делал в 9:16? [Женщина] Съемки 9 мм на что-то. Может быть, он увидел снайпера. [Мужчина] Или он работает с ним. [Женщина] Подождите. Возврат на один. [Мужчина] Что вы видите? [♫ ♫ тревожной музыкой] [Женщина] Принесите свой лицевой стороной вверх. Полный экран. [Мужчина] Его очки. >> Там в отражении. [♫ ♫ тревожной музыкой] [Мужчина] Вот бейсбольной команды Nuevita в. Это их логотип. [Женщина] И он говорит тому, кто носит эту куртку. [David Malan] Таким образом, это CS50 неделю 5, и сегодня мы разрушит немного телевидения и кино для вас. Поэтому, когда вы смотрите шоу, как это здесь, и полицейские говорят "Можете ли вы чистить, что до?" или "Повысить" нет никакого улучшения в реальном мире. В самом деле, то, что вы действительно получите немного что-то вроде этого. Я подъехал один из сотрудников, фотографии со страницы. Это программа под названием Photoshop. Это 1 из 2 Bowdens, 1 из 3 Bowdens на самом деле, на сегодняшний день, потому что у нас миссис Боуден здесь же, вместе с Робом и Павла. Но вот Роб на экране, и если мы увеличим на эту вспышку, он всегда был в его глазах, то, что вы на самом деле видите, что то, что вы видите, что вы получаете. Это "усиленная", поэтому "CSI" у меня немного не так. Там один другого клипа, если мы можем забрать на "CSI" просто немного дольше. Это одна хорошая фраза произнести отныне, если вы хотите обоснованные технические со своими друзьями, когда, действительно, вы говорите, абсолютно ничего. [Мужчина] В течение нескольких недель я был расследование убийства убийца таксиста с определенным увлечением болезненным. [Woman # 1] Это в реальном времени. [Женщина # 2] Я создам GUI интерфейс с использованием Visual Basic, видеть, если я могу отслеживать IP-адреса. [Малан] Так аудио из синхронизации в сторону, создав графический интерфейс с использованием Visual Basic отслеживать IP-адреса полная ерунда. В эти дни вы не будете использовать Visual Basic, нет необходимости в GUI, и IP адрес был технически точный термин. Так что следите за этим, и один из моих любимых: Это одна немного больше тайной, потому что вы должны знать другой язык. Там есть язык под названием Objective-C, который является расширением C. Что означает, что C плюс некоторые дополнительные возможности, в том числе объектно-ориентированного программирования. И это язык, на котором Apple, популяризировал для программирования IOS. И так вот отрывок из различных шоу в целом, от "Числа", что, если вы действительно посмотрите внимательно на вашем TiVo и паузы в нужный момент, Вы увидите, что то, что они смотрят на не совсем то, что описано. И позвольте мне попробовать различные аудио разъем здесь и посмотреть, если мы не можем сохранить аудио в синхронизации на этот раз. Я даю вам "Числа". [Человек № 1] Это 32-разрядный адрес IPv4. [Мужчина # 2] IP, это Интернет. >> Частной сети. Это частная сеть Аниты. [Малан] Хорошо. Это Objective-C, и это для окраски некоторых программ малыша, как вы, возможно, может заключить от имени переменную. Так что же тогда "Числа". Поэтому сегодня и на этой неделе мы вводим Немного мире судебно-медицинской экспертизы и контекст, в проблемах поэтому. Сегодня будет сокращенно лекцию, потому что есть специальное мероприятие здесь после этого, поэтому мы будем заглянуть, и дразнить как студентов, так и их родителей сегодня с некоторыми из вещей, которые на горизонте. Среди них, как в понедельник, у вас будет еще несколько одноклассников. EDX, Гарвард и MITs новый онлайн инициативе для открытой курсов и более, запуск на кампусе Гарвардского университета в понедельник. Это означает, пришел понедельник у вас будет - по состоянию последним подсчетам, 86000 дополнительных одноклассники будут следить наряду с лекциями в CS50 и разделов и пошаговые руководства и проблема множеств. И как часть этого, вы станете членами первого класса CS50 и теперь CS50x. В рамках этого, сейчас, понимаю, что там будут какие-то положительные моменты, а также. Чтобы подготовиться к этому, для огромного количества студентов, Достаточно сказать, что, хотя у нас есть 108 TFs и сертификации, не совсем лучший ученик / учитель однажды мы попали 80000 других студентов. Таким образом, мы не собираемся быть сортировка столько проблема устанавливает вручную. Таким образом, представил на этой неделе в задаче набор будет CS50 проверки, который будет утилита командной строки внутри прибора что вы получите, как только вы обновите его позже в эти выходные, и вы будете иметь возможность запускать команды, проверьте 50, на свой PSET, и вы получите обратную связь относительно того, ваша программа правильно или неправильно в соответствии с различными спецификациями дизайна, которые мы предоставляем. Так об этом и спецификации проблема набора и CS50x одноклассники будут использовать его. Таким образом, проблема комплект 4 это все о криминалистике. И этот кусок был вдохновлен некоторые реальные вещи, которому, когда я был в аспирантуре, я интернированы на какое-то время с Управление Middlesex округа окружного прокурора делает судебно-медицинской экспертизы с их ведущим судебным следователем, и что это составило это, я думаю, я уже мимо нескольких неделе, масса Государственной полиции или других войдет, они уходят такие вещи, как жесткие диски и компакт-диски и дискеты и т.п., а затем цель офис экспертизы было удостовериться в том, было или не было доказательств какой-то. Это был Специальная следственная группа, так что белых воротничков преступления, она была более тревожной рода преступлений, ничего участием некоторых видов цифровых носителей, оказывается, что не так много людей написать электронное письмо, говоря: "Я сделал это". Так что довольно часто эти поиски экспертизы не явился все, что много фруктов, но иногда люди будут писать такие письма. Так что иногда усилия были вознаграждены. Но доводить до этого судебно PSET, мы будем представлять в PSET 4 немного графики. Таким образом, вы, вероятно, взять эти вещи само собой разумеющееся, JPEG, GIF и как в эти дни, но если вы действительно думаете об этом, изображение, так же, как лицо Роба, могут быть смоделированы в виде последовательности точек, или пикселей. Теперь, в случае лице Роба, есть все виды цветов, и мы начали видеть отдельные точки, otherwide известны как пиксели, как только мы начали, чтобы увеличить масштаб Но если мы упростим мире немного, и просто сказать, что это вот Роб в черно-белом, так, чтобы представить черно-белую мы можем просто использовать бинарный. И если мы собираемся использовать двоичный, 1 или 0, мы можем выразить это же изображение улыбающееся лицо Роба с этой картины битов: 11000011 представляет белый, белый, черный, черный, черный, черный, белый. И это не огромный скачок, то, чтобы начать говорить о красочных фотографий. Вещи, которые вы видите на Facebook или взять с собой цифровую камеру, но, конечно, когда дело доходит до цветов, вам нужно больше битов. И весьма распространены в мире фотографии является использование не является 1-битный цвет, так как это предполагает, но 24-битный цвет, где вы фактически получаете миллионы цветов. Так как в случае, когда мы увеличено на глаза Роба, , что было любое количество миллионы различных красочных возможностей. Таким образом, мы введем это проблема набора 4, а также в руководстве который будет сегодня в 3:30 вместо обычного 2:30, потому что лекции пятницу здесь. Но видео будет в режиме онлайн, как обычно, завтра. Мы также познакомим вас с другой формат файла. Так что это намеренно должна выглядеть пугающим на первый, Но это только некоторые документы для структуры C. Оказывается, Microsoft, много лет назад, способствовал популяризации этого формата, называется растровый формат, BMP, и это было супер-простой, красочный графический формат файла, который был использован в течение некоторого времени а иногда еще для обоев на рабочих столах. Если вы думаете, вернуться к Windows XP и холмов и голубого неба, , что было типично BMP, или растровых изображений, и растровые изображения удовольствие для нас, потому что у них есть немного больше сложности. Это не так просто, как это сетка из 0 и 1; Вместо этого, у Вас есть такие вещи, как заголовок в начале файла. Итак, другими словами, внутри. Файлов BMP представляет собой целый букет из 0 и 1, но есть некоторые дополнительные 0 и 1 в там. И получается, что то, что мы, вероятно, само собой разумеющимся в течение многих лет, форматы файлов, как. документ или. или XLS. mp3 или. mp4, все форматы файлов, которые вы знакомы с. Ну, и что это вообще значит быть формат файла? Потому что в конце концов, все эти файлы, которые мы используем, имеют только 0 и 1 и, возможно, эти 0 и 1 представляют, B, C, через ASCII и т.п., но до конца дня, это только 0 и 1. Таким образом, люди просто иногда решили изобрести новый формат файлов где они стандартизации, какие модели бит будет на самом деле имею в виду. И в этом случае здесь, люди, которые разработаны растровый формат Говорят, что в самый первый байт в растровый файл, как обозначать смещение 0, то, там будут некоторые зашифрованные имена переменной bfType, который просто стоит для растровых типов файлов; какого типа файл изображения этого. Можно сделать вывод, пожалуй, со второго ряда, что смещение 2, байт номер 2, имеет рисунок из 0 и 1, которая представляет что? Размер и то, и это идет оттуда. Таким образом, в проблеме набор 4, вы будете прошел через некоторые из этих вещей. Мы не будем в конечном итоге забота обо всех из них, но заметить это начинает становиться интересным вокруг линии или байт 54, rgbtBlue, зеленый и красный. Если вы когда-нибудь слышали акроним RGB, красный зеленый синий, это ссылка на это. Потому что получается, вы можете рисовать все цвета радуги с некоторой комбинацией красного и синего и зеленого. И в самом деле, родители в зале могли бы вспомнить некоторые из самых ранних проекторов. В эти дни, вы видите только один яркий свет, исходящий из объектива. Но вернемся в день, вы были красные линзы, голубые линзы и зеленые линзы и они вместе, направленной на экране и сформировал красочную картину. И довольно часто средних школ и вузов будут иметь те линзы все так немного криво, так что вы были своего рода видим двойные или тройные изображения, но это была идея. Вы были красный и зеленый и синий свет нарисовать картину. И тот же самый принцип используется в компьютерах. Таким образом, среди проблем, то для Вас в проблеме установить 4 собираются быть несколько вещей, одна является на самом деле изменить размер изображения. Для того, чтобы в шаблоне от 0 и 1, выяснить, какие куски 0 и 1 представляют то, что в структуре, как это, , а затем выяснить, как повторить пикселей: красные, синие, зеленые внутри так, что, когда картина выглядит так изначально, может выглядеть так, а не после этого. Среди других проблем, тоже будет, что вы будете переданы судебно образ сам файл с цифровой камеры и на этой камере, когда-то, было целая куча фотографий. Проблема в том, мы случайно стерты или был образ поврежден каким-то образом. Плохие вещи случаются с цифровых камер, и поэтому мы быстро скопировали все из 0 и 1 с этой картой для вас, сохранить их все в один большой файл, а затем мы будем передавать их для вас В задачу установить 4, так что вы можете написать программу в C, с которой восстановиться все эти изображения в формате JPEG, в идеале. И оказывается, что JPEG, даже если они чем-то сложным форматом файла, они гораздо более сложной, чем это улыбающееся лицо здесь. Получается, что каждый JPEG начинается с тех же моделей от 0 и 1. Таким образом, используя петлю, или цикл или аналогичный, Вы можете перебрать все 0 и 1 в этой судебной изображение и каждый раз, когда вы видите специальный шаблон, который определен в спецификации проблема набора, Вы можете предположить: "Ах, вот, с очень высокой вероятностью, Начало JPEG, и как только вы найдете по той же схеме, некоторое количество байтов или килобайтах или мегабайтах позже, Вы можете предположить, 'О! Вот второй JPEG, фото я взял после того, как первый. Позвольте мне остановиться читал, что первый файл, начать писать этот новый ". И выход из вашей программы для PSET 4 будет целых 50 JPEG. А если это не 50 JPEG, у вас есть немного цикла. Если у вас есть бесконечное количество JPEG, у вас есть бесконечный цикл. Так что, тоже будет довольно распространенный случай. Вот что на горизонте. Викторина 0, позади нас. Поймите, на мою электронную почту, которая неизменно есть люди , которые оба счастливы, как бы нейтральной, и грустные вокруг викторина 0 раз. И, пожалуйста, дотянуться до меня, руководитель ТФ, Zamyla, ваши собственные TF или одного из центров сертификации, которые вы знаете, если вы хотели бы обсудить, как все прошло. Таким образом, чтобы произвести впечатление на родителей здесь, в комнате, что CS50 библиотеку? Хорошая работа. Что CS50 библиотеку? Да? [Ответы студентов, неразборчиво] >> Ладно, хорошо. Так что это Стандартная набор кода, который мы, сотрудники, писал, мы предоставляем вам, чтобы обеспечить некоторые общие функциональные возможности. Такие вещи, как мне получить строку, поймите меня INT, все функции, перечисленные здесь. Начиная с этого момента, мы начинаем по-настоящему взять эти учебные колеса прочь. Таким образом, мы собираемся начать, чтобы забрать "строка" от вас, который, напомним, был всего лишь синоним, что фактический тип данных? символ *. Таким образом, для родителей, которые, вероятно, - это хорошо, так что символ *, мы начинаем видеть На экране тем более, что мы удаляем "строка" из нашего лексикона, по крайней мере когда дело доходит до фактического написания кода. Кроме того, мы будем отказаться от использования некоторых из этих функций столько же, потому что наши программы собираются получить более сложные , а не просто писать программы, которые сидят там с запросом мигать, ожидания для пользователя, чтобы ввести что-то дюйма Вы будете получать ваши материалы из других источников. Например, Вы будете получать их из последовательности битов на локальном жестком диске. Вы, а не получать их в будущем от сети, некоторые веб-сайт где-то. Так что давайте отогните этот слой в первый раз, и потяните вверх CS50 прибора и этот файл называется CS50.h, что вы были резкими, включая несколько недель. Но давайте реально увидеть, что находится внутри этого. Таким образом, в верхней части файла в синем это просто целая куча комментариев, Информация лицензирования и гарантии. Это своего рода общую парадигму в программное обеспечение, потому что много программного обеспечения в эти дни то, что называется "с открытым исходным кодом», Это означает, что кто-то написал код и сделал это в свободном доступе, а не просто бегать и использовать, но на самом деле читать и изменять и интегрировать в свою работу. Так вот что вы используете программное обеспечение с открытым источником, хотя и в очень малой формы. Если я прокрутите вниз мимо комментариев, хотя, мы начинаем видеть некоторые более знакомые вещи. Так заметить в верхней здесь, что файл CS50.h включает в себя целую кучу файлов заголовков. Сейчас большинство из них мы раньше не видели, но одно знакомые, которые из них мы не видели, хотя и ненадолго, до сих пор? Да, стандартные библиотеки. Stdlib.h имеет таНос, поэтому, как только мы начали говорить о динамическом распределении памяти, которые мы вернемся на следующей неделе, а мы начали в том числе и файлов. Оказывается, BOOL и истинным и ложным на самом деле не существует в C, по сути, если вы включаете этот файл здесь. Таким образом, мы в течение нескольких недель, были в том числе стандартные bool.h так что вы можете использовать понятие логическое, истинной или ложной. Без этого, вам придется разобраться поддельных и использовать Int и просто произвольно считать, что 0 является ложным и 1 верна. Теперь, если мы прокрутить вниз дальше, вот наше определение строки. Оказывается, как мы уже говорили ранее, что там, где это * это действительно не имеет значения. Вы даже можете иметь пространство вокруг. Мы, в этом семестре, были его популяризации как это сделать понятно, что * имеет дело с типом. Но понимаете, как общего, если не немного чаще, это поставить его там но функционально это то же самое. Но теперь, если мы будем читать дальше вниз, давайте посмотрим на, скажем, GetInt, потому что мы использовали, что, может быть, прежде чем что-нибудь еще в этом семестре. А вот GetInt. Это что? Это прототип. Так часто мы поставили прототипы на вершинах наших. С файлами, но вы также можете поместить прототипы в файлы заголовков,. ч файлы, как это здесь, так что, когда вы пишете некоторых функций что вы хотите, чтобы другие люди могли использовать, а это именно и в случае с CS50 библиотеки, Вы не только реализовать свои функции в что-то вроде CS50.c, Вы также поместить прототипы не в верхней части этого файла, но в верхней части заголовка файла, то, что заголовок файла является то, что друзья и коллеги включают, с острыми включить в свой код. Так что все это время вы были в том числе все эти прототипы эффективно в верхней части вашего файла, но через этот резкий включать механизм , что существенно копирует и вставляет этот файл в свой собственный. Теперь, вот некоторые довольно подробную документацию. Мы в значительной степени само собой разумеющимся, что GetInt получает INT, но, оказывается, есть некоторые частные случаи, не так ли? Что делать, если пользователь вводит число, это слишком большой? Квинтиллиона, что просто не может поместиться внутри Int? Каково ожидаемое поведение? Ну, в идеале, это предсказуемо. Таким образом, в этом случае, если вы на самом деле читать мелкий шрифт, Вы увидите, что, если линия не может быть прочитан, это возвращает INT_MAX. Мы никогда не говорили об этом, но, основываясь на его капитализации, что это, наверное? Это постоянная, так что некоторые специальные константа, которая, вероятно, объявил в одном из этих файлов заголовков вот подняться выше в файле, INT_MAX и, вероятно, что-то вроде, примерно, 2 миллиарда долларов. Идея заключалась в том, что, поскольку мы должны каким-то образом означает, что что-то пошло не так, Мы, да, есть 4 миллиарда номера в нашем распоряжении, отрицательное 2 млрд. до 2 млрд., плюс-минус. Ну, то, что является общим в программировании ты украл лишь один из этих чисел. Может быть 0, может быть, 2 млрд, может быть отрицательным 2 миллиарда долларов. Таким образом, вы тратите одну из ваших возможных значений, так что вы можете совершить в мире что если что-то пойдет не так, я верну этот супер-большого значения. Но вы не хотите, чтобы пользователь печатает что-то загадочное, как "2, 3, 4 ..." действительно большой номер, где вы обобщать, а не как константу. Так на самом деле, если вы были анального последние несколько недель, в любое время вы звоните GetInt, вы должны были проверить с, если условия. Разве типа пользователя в INT_MAX, или, точнее, GetInt сделал возвращение INT_MAX? Потому что если это так, что на самом деле означает, что они не вводите его, что-то пошло не так в этом случае. Итак, это то, что обычно называют "дозорных" значение, которое просто означает, особенный. Ну, давайте теперь обратимся в службу. С файлами. Файл C существовала в прибор в течение некоторого времени, и, по сути, прибор имеет его предварительно скомпилированных для вас в то, что мы называли "объектный код" но это просто не имеет значения для вас, где это потому, что система знает, В этом случае, где она находится, прибор. Но давайте прокрутите вниз теперь GetInt, и посмотреть, как GetInt работал все это время. Таким образом, здесь мы имеем подобные комментарии, чем прежде. Позвольте мне увеличить только на часть кода, и что мы имеем на GetInt заключается в следующем. Он не принимает входные и возвращает целое, в то время (правда), так что у нас есть преднамеренное бесконечный цикл но, по-видимому, мы вырваться из этого так или иначе, или вернуться внутри этого. Итак, давайте посмотрим, как это работает. Ну, мы, похоже, используют GetString В этой первой линией внутри цикла, 166. Теперь это хорошая практика, потому что, при каких обстоятельствах GetString может вернуть это специальное ключевое слово NULL? Если что-то пойдет не так. Что может пойти не так, когда вы называете что-то вроде GetString? Да? [Студент ответ, неразборчиво] >> Да. Поэтому, возможно, таНос не удается. Где-то под капотом GetString зовет таНос, которая выделяет память, которая позволяет в компьютерный магазин Все символы, которые пользователь набирает на клавиатуре. И предположим, что пользователь имел много свободного времени и набрали больше, например, чем 2 млрд. символов. Больше символов, чем компьютер, даже имеет RAM. Ну, GetString должен быть в состоянии означает, что к вам, даже если это супер, супер редкий случай углу. Он должен каким-то образом быть в состоянии справиться с этим, и так GetString, если мы вернемся и прочесть его документацию, не, на самом деле, вернуть NULL. Теперь, если GetString не удается, возвращая NULL, GetInt собирается потерпеть неудачу путем возврата INT_MAX, как дозорные. Это всего лишь человеческие конвенции. Только так вы бы знали, что это дело , читая документацию. Так что давайте прокрутите вниз, туда, где Int на самом деле GotInt. Так что если я прокрутите вниз немного дальше, в линии 170 у нас есть комментарий выше этих линий. Таким образом, мы заявляем, в 172, Int N и символ с, а затем эта новая функция который некоторые из вас наткнулся раньше, но Sscanf. Это означает F строка сканирования. Иными словами, дать мне строки, и я буду проверить его на куски информации, представляющей интерес. Так что же это значит? Ну, предположим, что я типа в буквальном смысле 1 2 3 на клавиатуре, , а затем нажмите клавишу ВВОД. Что такое тип данных 1 2 3, когда возвращаются GetString? Очевидно, что это строка, не так ли? У меня есть строка, поэтому 1 2 3 действительно "1 2 3" с \ 0 в конце его. Это не Int. Это не число. Это выглядит как число, но это не на самом деле. Итак, что же GetInt делать? Это имеет для сканирования этой строки слева направо, 1 2 3 \ 0, и каким-то образом преобразовать его в фактическое число. Теперь вы можете понять, как это сделать. Если вы вспомните PSET 2, Вы, вероятно, получил немного удобный с Цезарем или Vigenere так что вы можете перебрать строки, Вы можете конвертировать символов для целых чисел с выбором. Это целая большая работа. Почему бы не назвать функцию, как Sscanf, что делает это для вас? Так Sscanf ожидает аргумент, в данном случае называется линия, которая является строкой. Затем вы указываете, в кавычках, очень похожий на Printf, Что вы ожидаете увидеть в этой строке? То, что я говорю здесь, я ожидал увидеть десятичное число и, возможно, характер. И мы увидим, почему это так, в один момент. Оказывается, что это обозначение сейчас напоминает материал Мы начали говорить о чуть более недели назад. Что такое & N и & C делает для нас здесь? [Ответы студентов, неразборчиво] >> Да. Он дал мне адрес и адрес п с. Теперь, почему это так важно? Ну, вы знаете, что с функциями C Вы всегда можете вернуть значение не имеет никакого значения вообще. Вы можете вернуть целое число, строка, число с плавающей точкой, символ, что угодно. Или вы можете вернуться пустоту, но вы можете вернуть только 1 вещь максимально. Но здесь мы хотим Sscanf вернуть меня, может быть, целое число, десятичное число, а также символ, и я объясню, почему символов в минуту. Итак, вы хотите эффективно F вернуть 2 вещи, которые просто не возможно в C. Таким образом, вы можете обойти, что, переходя в 2-адресов, потому что как только вы передать функции 2 адреса, что может эту функцию с ними делать? Он может писать на эти адреса. Вы можете использовать операцию * и "туда" к каждому из этих адресов. Это вроде этого бэкдор механизм, но очень часто меняются значения переменных больше, чем просто 1-е место, в этом случае 2. Теперь обратите внимание, я проверки == to1, а затем возвращаются п если это, на самом деле, оценить к истине. Так что же происходит? Ну, технически, все, что мы действительно хотим, произойдет в GetInt это. Мы хотим, чтобы разобрать, так сказать, мы хотим, чтобы прочитать строку "1 2 3" и, если она выглядит как есть ряд там, то, что мы говорим Sscanf сделать, это положить этот номер, 1 2 3, в этой переменной п, для меня. Почему же тогда у меня это, а? Какова роль также говорят, Sscanf, вы можете также получить символ здесь. [Студент говоря, неразборчиво] >> Не - десятичная точка может работать. Давайте считать, что на мгновение задумался. Что еще? [Студент, неразборчиво] >> Так, хорошие мысли, она может быть нулевой символ. Это на самом деле не в этом случае. Да? [Студент, неразборчиво] >> ASCII. Или, позвольте мне обобщать еще дальше. % C существует только для проверки ошибок. Мы не хотим там быть символ после номера, но то, что это позволяет мне сделать следующее: Оказывается, что Sscanf, помимо хранения значений в н и с, в этом примере, что он также делает это возвращает количество переменных положить значения дюйма Так что если вы только ввести 1 2 3, то только% D будет соответствовать и только п получает хранится со значением, как 1 2 3 и ничего не получает положить в C; С остается мусор значение, так сказать. Мусор, потому что он никогда не был инициализирован как некоторую ценность. Так что в этом случае, Sscanf возвращает 1, потому что я населенный один из тех указателей, В этом случае, велика. У меня есть целое число, так что я освободит линию, чтобы освободить память GetString, что на самом деле выделяется, а потом вернуться с. В противном случае, если вы никогда не задумывались, где это повторить заявление приходит, приходит прямо отсюда. Если, напротив, я набираю в 1 2 3 Фу, лишь некоторые случайные последовательности текста, Sscanf будет видеть, ох, номер, ох, номер, ох, номер, ох - ф. И он собирается поставить 1 2 3 на русском языке. Он собирается поставить е в с, а затем вернуть 2. Итак, мы имеем, только с помощью основного определения поведения SCANF, в Очень простой способ - хорошо, сложные на первый взгляд, но, в конце концов, довольно простой механизм говоря, есть целое число, и если да, то, что единственное, что я нашел? И белое пространство здесь не случайно. Если вы прочитали документацию по Sscanf, он говорит вам, что если вы включаете кусок пробелы в начале или в конце, Sscanf слишком позволит пользователю, по какой причине, чтобы поразить пробел 1 2 3, и это будет законно. Он не будет кричать на пользователей только потому, что они попали в пробела в начале или в конце концов, которые лишь немного более удобным для пользователей. Любые вопросы, то, по GetInts? Да? [Студент вопрос, неразборчиво] >> Хороший вопрос. Что делать, если вы только что ввели в символ, как и F, и нажмите ввод никогда не вводить 1 2 3; что вы думаете поведение этой строки кода бы тогда? Так Sscanf может покрыть, что тоже, потому что в этом случае, он не собирается заполнить N или С; он собирается вместо возврата 0. В таком случае, я также ловить этот сценарий, потому что ожидаемое значение я хочу 1. Я хочу только 1, и только 1 вещь, чтобы быть заполнены. Хороший вопрос. Другие? Ладно, давайте не будем пройти через все функции здесь, но тот, который, кажется, может быть, оставшиеся проценты в GetString, потому что оказывается, что GetFloat, GetInt, GetDouble, GetLongLong все плоскодонки много их функциональность GetString. Итак, давайте взглянем на то, как он реализуется здесь. Это выглядит немного сложным, но он использует те же основы что мы начали говорить о прошлой недели. Таким образом, в GetString, который не принимает аргументов, как в пустоту здесь, и он возвращает строку, так я объявляю строки называется буфером. Я действительно не знаю, что это собирается быть использован для еще нет, но мы будем видеть. Похоже мощности, по умолчанию 0; не совсем уверен, где это происходит. Не уверен, что п собирается быть использован для клиентов. Но сейчас это становится немного более интересной, так и в линии 243, мы заявляем Int C, это своего рода глупые подробно. Символ это 8 бит и 8 бит может хранить сколько различных значений? 256. Проблема в том, если вы хотите иметь 256 различных символов ASCII, которое есть, если вы оглянетесь назад, и это не то, чтобы запомнить. Но если вы вспомните, что большая ASCII графике мы были неделю назад, было, в таком случае, 128 или 256 ASCII символов. Мы использовали все модели 0 и 1 дело. Это проблема, если вы хотите быть в состоянии обнаружить ошибку. Потому что, если вы уже используете 256 значений для ваших персонажей, Вы действительно не планировать заранее, потому что сейчас у вас нет возможности сказать, "Это не законно характер, это какое-то ошибочное сообщение". Так что мир делает это, они используют следующий самая большая ценность, что-то вроде Int, так что у вас есть сумасшедшие число битов, 32 на 4 млрд. значений, так что вы можете просто в конечном итоге, используя, по существу, 257 из них, 1 из которых имеет некоторое особое значение как ошибку. Итак, давайте посмотрим, как это работает. В соответствии 246, у меня есть этот большой цикл при , который вызывает fgetc, е значение файла, ЕОКП, а затем стандартного ввода. Оказывается, это всего лишь более точным способом сказать "читать ввод с клавиатуры". Стандартная клавиатура средств ввод, стандартный вывод означает, экран, и стандартные ошибки, которые мы увидим в PSET 4, означает, что экран, но особая часть экрана, так что она не смешивается с фактическим выходом, что вы предназначены для печати, но об этом в будущем. Так fgetc просто означает, что читать один символ с клавиатуры, и хранить его где? Храните его в C, а затем проверить, так что я просто используя некоторые логические союзы здесь, убедитесь, что она не равна \ п, так что пользователь нажмите ввод. Мы хотим остановить в тот момент, конец цикла, и мы также хотим, чтобы проверить для специальных постоянной, EOF, которая, если вы знаете или угадать - что это означает? Конец файла. Так что это вид бессмысленно, потому что, если я печатаю на клавиатуре, там действительно нет файла, участвующие в этом, Но это всего лишь своего рода общий термин, используемый для обозначения что ничего не приходит из пальца человека. EOF. Конец файла. Как в стороне, если вы когда-либо ударил управления D на вашей клавиатуре, Не, что вы бы еще, вы попали контроль с. Но контроль г посылает это специальная константа называется EOF. Итак, теперь мы просто есть некоторые динамического распределения памяти. Так что, если п + 1> мощностей, сейчас я объясню, с. п, сколько байт в настоящее время в буфере, Строка, вы в настоящее время наращивания от пользователя. Если у вас есть несколько символов в буфере, чем у вас есть потенциал в буфер, интуитивно, что мы должны сделать, это выделить больше мощности. Я хочу, чтобы скользить над некоторыми арифметической здесь и сосредоточиться только на этой функции здесь. Вы знаете, что таНос есть, или по крайней мере в целом знакомы. Возьмите предположение, что перераспределить делает. [Студент ответ, неразборчиво] >> Да. И это не совсем добавление памяти, она перераспределяет память следующим образом: Если есть еще место в конце строки, чтобы дать вам больше, что память чем это изначально дает вам, то вы получите, что дополнительная память. Таким образом, вы можете просто положить строки символов спиной к спине, чтобы спина к спине. Но если это не так, потому что вы слишком долго ждали и что-то случайное получил шлепнулась в память существует, но есть дополнительный память здесь, внизу, это нормально. Realloc будет делать всю тяжелую работу за вас, переместить строку, которую вы читали в так далеко отсюда, положить его туда, а затем дать вам еще несколько взлетно-посадочной полосы в этой точке. Так что с волной стороны, позвольте мне сказать, что то, что делает GetString оно начинает с небольшой буфер, может быть, 1 одиночный символ, и если пользователь вводит в 2-х символов, GetString заканчивается вызове перераспределить и говорит: "О, 1 символов было недостаточно. Дайте мне 2 символов. Тогда, если вы прочитали логике цикла, он собирается сказать: "Ох, пользователь вводит в 3 символов. Дайте мне теперь не 2, а 4-х символов, то дай мне 8, то дайте мне 16 и 32. Тот факт, что я удвоение мощности каждый раз означает, что буфер не будет расти медленно. Он будет расти супер быстрый, и что могло бы быть преимуществом, что? Почему я удвоение размера буфера, даже если пользователь может просто нужно 1 дополнительный символ с клавиатуры? [Студент ответ, неразборчиво]. >> Что это такое? Именно так. Вы не должны расти так часто. И это только отчасти - ты хеджирования ставки здесь. Идея в том, что вы не хотите позвонить перераспределить много, потому что он имеет тенденцию быть медленным. Каждый раз, когда вы спросите операционной системы для памяти, как вы скоро увидите, В будущем поставленной задачи, он стремится занять некоторое время. Таким образом, минимизация, что количество времени, даже если вы тратите некоторое пространство, как правило, хорошо. Но если мы прочитали финальную часть GetString здесь, и снова, понимая, каждая линия здесь не так важна сегодня. Но обратите внимание, что в конечном счете вызывает таНос снова, и он выделяет ровно столько байт, сколько ему нужно для строки , а затем выбрасывает по телефону свободно, слишком большие буфера, если он действительно получил удвоил слишком много раз. Короче говоря, вот как GetString работал все это время. Все это делает чтение одного символа в то время, снова и снова и снова и каждый раз, когда она нуждается в некоторой дополнительной памяти, она спрашивает операционной системы для ее вызова перераспределить. Есть вопросы? Хорошо. Атаке. Теперь, когда мы понимаем, указателей, или по крайней мере все больше и больше знакомы с указателями, давайте рассмотрим, как весь мир начинает разваливаться если вы не совсем защитить от состязательного пользователей, люди, которые пытаются взломать вашу систему. Люди, которые пытаются украсть ваши программы в обход некоторых регистрационный код что они могли бы в противном случае придется вводить дюйма Взгляните на этот пример здесь, который находится всего в C код , который имеет функцию основного внизу, которая вызывает функцию Фу, и для чего он переходя к Foo? [Студент] один аргумент. >> Одного аргумента. Так ARGV [1], что означает первое слово, введенный пользователем В командной строке после a.out или любой другой программы, называется. Так Фу, в верхней части, берет в символ *, а символ * только что? String. Там нет ничего нового здесь, и что строки произвольной называться баром. В этой линии здесь, символ с [12], в роде полу-технического английского языка, то, что эта линия делает? Массив -? Персонажи. Дайте мне массив из 12 символов. Таким образом, мы могли бы назвать это буфер. Это технически называется C, а буфер в программировании просто означает, куча пространства, которые можно положить некоторые вещи дюйма Тогда, наконец, тетсру, мы не использовали раньше. Но вы можете догадаться, что он делает. Он копирует памяти. Что он делает? Ну, это видимо копирует бар, на входе, в с, но только до длины бар. Но есть ошибка здесь. Ладно, так что технически мы действительно должны сделать StrLen (бар) х SizeOf (Char), это правильно. Но в худшем случае здесь, давайте предположим, что that's - значит, все в порядке. Тогда есть 2 ошибки. Таким образом, SizeOf (Char), все в порядке, давайте сделаем это немного шире. Так что теперь есть еще ошибка, что есть что? [Студент ответ, неразборчиво] >> проверки для чего? Итак, мы должны проверять для NULL, потому что плохие вещи случаются, когда ваш указатель NULL, Потому что вы могли бы в конечном итоге происходит там, и вы никогда не должны идти в NULL путем разыменования его с оператором *. Так что хорошо, а что еще мы делаем? Логически есть недостаток здесь. [Студент ответ, неразборчиво] >> Так что проверить, если агдс ≥ 2? Итак, есть 3 ошибки в этой программе. Мы не проверяет, если пользователь набрал на самом деле ни в чем в ARGV [1], хорошо. Так что третья ошибка? Да? [Студент ответ, неразборчиво] >> Хорошо. Таким образом, мы проверили одному сценарию. Мы неявно проверить, не копируйте больше памяти чем будет превышать длину бара. Таким образом, если строка пользователь вводит в состоит из 10 символов, это говорит: «Только копирования 10 символов. И это хорошо, но что делать, если пользователь вводит в слово в строке как 20 символов слова, это, говоря копии 20 символов из бара во что? С, иначе известный как наш буфер, который означает, что вы только что написали данные до 8 байт мест, которые вам не принадлежат, и вы не владеете им в том смысле, что вы никогда не выделяла их. Итак, это то, что обычно называют атаку на переполнение буфера, или переполнение буфера атаку, и его атаки в том смысле, что если пользователь или программы, которая звонит ваша функция делает это злонамеренно, что на самом деле происходит дальше может быть совсем плохо. Давайте взглянем на эту картину здесь. Эта картина представляет свой стек памяти. И напомним, что каждый раз, когда вы вызываете функцию, Вы получаете эту маленькую кадров в стек, а затем другой, а затем другой, а затем другую. И до сих пор мы только вид этих отведенной прочь, как прямоугольники либо есть, на доске или на экране здесь. Но если увеличить на один из этих прямоугольников, При вызове функции Foo, оказывается, что это еще не все в стеке внутри этого кадра и этот прямоугольник чем просто х и у, а и Ь, как мы сделали говорим о своп. Оказывается, что есть некоторые низкоуровневые детали, Среди них обратного адреса. Вот и получается, когда основные называет Фу, основная должен сообщить Foo какой адрес основного находится в оперативной памяти компьютера. Потому что иначе, как только Foo делается выполнение, как в данном случае здесь, как только вы достигнете этого тесного фигурной скобкой в ​​конце Фу, как, черт возьми никак Foo знает, где контроль над программой должна идти? Оказывается, что ответ на этот вопрос в том, что красный прямоугольник здесь. Это представляет собой указатель, и это до компьютера для хранения, временно, на так называемом стеке адрес основного, так что, как только Foo делается выполнение, Компьютер знает, где и какие линии в основном, чтобы вернуться в. Сохранено указатель кадра относится так же к этому. Char * бар здесь представляет то, что? Ну, а теперь эта синяя сегмент здесь кадр Foo, то что находится бар? Итак, бар просто аргумент функции Foo. Так что теперь мы вернулись на знакомую картину. Там больше вещей и больше отвлекаться на экране но это голубой сегмент является то, что мы были рисование на доске что-то вроде подкачки. Это рамка для Foo и единственное, что в ней прямо сейчас, бар, которые этому параметру. Но что еще должно быть в стеке, в соответствии с этим кодом здесь? Char C [12]. Таким образом, мы должны также видеть 12 квадратов памяти, , выделяемых на переменную с. И действительно, у нас есть, что на экране. В самом верху есть с [0], а затем автор этой схеме не беспокоить рисования все квадраты, но на самом деле есть 12 имеется потому что если вы посмотрите на нижнюю правую, с [11], если считать от 0, 12 таких байт. Но вот в чем проблема: в каком направлении с растущей? Вид сверху вниз, не так ли? Если он начинается в верхней и растет на дно, Не похоже мы оставили себе много взлетно-посадочной полосы здесь вообще. Мы видов окрашены себя в угол, и что с [11] вплотную баре, который находится прямо против указателя стека кадра, который находится прямо против обратного адреса; нет больше места. Так в чем же последствия, то, если вы испортить, а вы попробуйте прочитать 20 байт в 12-байт буфера? Где эти 8 дополнительных байтов идти? Внутри все остальное, некоторые из которых это супер важно. И самое главное, возможно, является красная коробка там, обратный адрес. Потому предположим, что вы случайно или adversarially перезаписать эти 4 байта, что указатель адреса, не только с мусором, но со многими, что происходит представляют фактический адрес в памяти? Что implicaiton, логично? [Ответы студентов, неразборчиво] >> Именно так. Когда Foo возвращается и хиты, которые фигурной скобкой, программа будет исходить не вернуться к основной, он собирается вернуться в любой адрес в том, что красные коробки. Теперь, в случае обхода регистрации программного обеспечения, что это адрес который возвращается в это функция , который обычно вызывается после того, как вы заплатили за программное обеспечение и вводится регистрационный код? Вы можете сортировать трюк компьютер в не собираемся здесь, но вместо этого собираются здесь. Или, если вы действительно умный, противник действительно может ввести на клавиатуре, Например, не фактические слова, не более 20 символов, но предполагаю, что он или она В некоторых типах символов, которые представляют код? И это не будет С-код, он будет символы , которые представляют собой двоичный машинный код, 0 и 1. Но предположим, что они достаточно умны, чтобы сделать это, чтобы хоть как-то вставить в строку GetString то, что по существу скомпилированный код, и последние 4 байта перезаписи, что обратный адрес, и то, что адрес не что входной делать? Он хранит в этом красном прямоугольнике адрес первого байта буфера. Таким образом, вы должны быть очень умным, и это много проб и ошибок для плохих людей там, но если вы можете выяснить, насколько большой этот буфер, такие, что за последние несколько байт во входной которые вы предоставляете программе оказаться эквивалентной адрес начала вашего буфера, Вы можете сделать это. Если мы говорим, как правило, привет, и \ 0, это то, что попадает в буфер. Но если мы более умные, и мы заполняем этот буфер с тем, что мы называем общим вредоносный код, A, A, A, A: атака, атака, атака, атака, где это только то, что делает что-то плохое. Ну, а что случится, если вы действительно умны, вы можете сделать это: В красной коробке здесь последовательность чисел: 80, CO, 35, 08. Обратите внимание, что совпадает с числом это здесь. Это в обратном порядке, но об этом как-нибудь в другой раз. Обратите внимание, что этот обратный адрес был намеренно изменен равным адресу здесь, а не адрес основного. Таким образом, если плохой парень супер умный, он или она собирается включить в этот вредоносный код что-то вроде: «Удалите все файлы пользователя. Или «Скопировать пароли" или "Создание учетной записи пользователя, что я могу войти в. Все что угодно, и это как опасность и силу C. Потому что у вас есть доступ к памяти через указатели и поэтому вы можете написать все, что угодно в память компьютера. Вы можете сделать компьютер делать все, что хотят просто то, что прыгать в своем собственном пространстве памяти. И так, по сей день, так много программ и так много сайтов, которые оказываются под угрозой сводятся к людям воспользоваться этим. И это могло бы походить на супер-сложных атак, но это не всегда начинаются именно так. Реальность такова, что то, что плохие люди, как правило, сделать это, будь то программы в командную строку или графический интерфейс программы или веб-сайт, вам просто начать предоставление ерунда. Вы вводите в действительно большом слово в поле поиска и нажать кнопку ввода, и вы ждать, чтобы увидеть, если сайт аварий. Или вы ждете, чтобы увидеть, если программа обнаруживает некоторое сообщение об ошибке. Потому что, если вам повезет, как плохой парень, и вы предоставить некоторые сумасшедшие вход, сбой программы, это означает, что программист не ожидает вашего плохого поведения которая означает, что вы, вероятно, может с достаточным усилием, Достаточно проб и ошибок выяснить, как вести более точную атаку. Итак, как же неотъемлемой частью безопасности не только избежать этих атак в целом, но их обнаружения а на самом деле, глядя на журналы и видя, что сумасшедший входов есть люди, введенные в ваш сайт. Какие поисковые термины людей ввели в свой сайт в надежде переполнены некоторые буфера? И все это сводится к простым основам того, что массив, и что это значит для выделения и использования памяти? И связанные с этим, также, заключается в следующем. Так что давайте просто заглянуть внутрь жесткого диска еще раз. Таким образом, вы помните неделю или две назад, что при перетаскивании файлов в корзины или корзины, что происходит? [Студент] Ничего. >> Да, абсолютно ничего. В конце концов, если вы запустите низкой на диске, Windows или Mac OS начнется удаление файлов для вас. Но если вы перетащите что-то есть, то это вовсе не безопасно. Все ваши Знакомства Поиск Ключевые слова, друг или член семьи должен сделать это дважды кликнуть мышкой, и вуаля. Там все отрывочные файлы, которые вы пытались удалить. Поэтому большинство из нас по крайней мере, знаю, что вы должны кликнуть правой кнопкой мыши или контролировать и пустой мусор, или что-то вроде этого. Но даже то, что не совсем делать свое дело. Потому что то, что происходит, когда у вас есть файл на жестком диске , который представляет некий документ, слово или несколько JPEG? И это представляет ваш жесткий диск, а скажем, это ленты здесь представляет этот файл, и он состоит из целый букет из 0 и 1. Что происходит, когда вы не только перетащить этот файл в корзину, или корзины, но и очистить его? Вроде ничего. Это не абсолютно ничего не сейчас. Теперь это просто ничто, потому что кое-что происходит в форме этой таблице. Таким образом, есть своего рода базу данных или таблицу в памяти компьютера , что существенно имеет 1 колонки для имен файлов, и 1 столбец для размещения файлов, где это может быть расположение 123, просто случайное число. Таким образом, мы могли бы иметь что-то вроде x.jpg и местоположение 123. И что происходит потом, когда вы опустошить ваш мусор? Это уходит. Но то, что не исчезает, это 0 и 1. Так что, то, подключение к PSET 4? Ну, с PSET 4, только потому, что мы случайно стерты компактные флэш-карты, что были все эти фотографии, или просто потому, что его неудача стала поврежден, не означает, что 0 и 1 являются не все еще там. Может быть, некоторые из них потеряли, потому что что-то испортился В том смысле, что некоторым 0 стало 1 и 1 стало 0 '. Плохие вещи могут произойти из-за ошибки в программном обеспечении или неисправность оборудования. Но многие из тех битов, может быть, даже 100% из них все еще там, это просто, что компьютер или камеру не знает, где JPEG 1 началась и где JPEG 2 началась, но если вы программист, Знаете, с немного здравого смысла, где эти изображения в формате JPEG или то, что они выглядят, Вы можете проанализировать 0 и 1, и говорят: "О-о. JPEG. Ох, JPEG. Вы можете написать программу по существу только для или во время цикла , которая восстанавливает каждый из этих файлов. Так что урок таком случае, чтобы начать "надежно" стирания ваших файлов если вы хотите, чтобы избежать этого вообще. Да? [Студент вопрос, неразборчиво] >> Иметь больше памяти, чем раньше - О! Хороший вопрос. Так почему же тогда, после опорожнения мусор, Ваш компьютер скажет вам, что у вас больше свободного пространства, чем вы делали раньше? В двух словах, потому что он лжет. Более технически, у вас есть больше пространства. Потому что сейчас вы сказали, вы можете положить другие вещи, где этот файл был когда-то, но это не означает, что бит уходит, и это не значит, биты меняются все 0, например, для вашей защиты. С другой стороны, если вы "надежно" стереть файлы или физически уничтожить устройство, , который действительно является единственным способом, а иногда и вокруг этого. Так почему бы нам не оставить на этом полу-страшно записку, и мы будем видеть Вас в понедельник. CS50.TV