[МУЗЫКА ИГРАЕТ]
>> David J. МАЛАН: Хорошо.
Это CS50.
И это начало недели 5.
И, как вы, возможно, заметили, часть материала
становится немного более Комплекс, немного плотнее.
>> И это очень легко, особенно если вы были в привычку в течение некоторого времени,
, пытается строчить вниз наиболее что мы делаем, мы говорим в классе.
Но осознать, что это не возможно, идеальное педагогический подход
к изучению такого рода материала, и материал в целом.
И поэтому мы рады сообщить, что CS50 собственную Gheng
Гонг начала подготовки канонический набор нот
за курс, надежда , который является то, что один, это
не только служат справочно-ресурс
для рассмотрения материала и собирается обратно через материал, что, возможно, придется
бежал вам в первый раз вокруг, но и так, что ваши головы может быть более
до, чем вниз, когда его приходит время, чтобы читать лекции,
так что вы могли бы заниматься более вдумчиво, как
отличие от более scribbly.
>> С учетом сказанного, что вы найдете на сайт такие документы, как это.
И обратите внимание, в левом верхнем углу, есть не только содержание,
но и временные коды, что сразу перепрыгнет вас
в соответствующей части в видео онлайн.
И то, что Чанг здесь сделал является, по сути, документально
что произошло в этот частности лекция.
И многие из лекций уже сейчас в сети с этим URL.
И мы будем продолжать размещать оставшуюся из тех, к концу этой недели,
так что воспользоваться этим ресурсом.
>> Итак, без дальнейших церемоний, мы начали отогните
Слой, который был Строка в течение некоторого времени.
И что же мы говорим строку на самом деле на прошлой неделе?
Так символ звезды.
И символ звезды, хорошо, что ничего, что на самом деле означает?
Ну, все это время, если мы в были вызове функции,
как GetString, и хранения так называемый возврата
Значение GetString в переменная-- это называется
с Тип string-- мы писали строка кода там выше.
И это только тогда, когда я вижу, мой почерк увеличивается здесь
я понимаю, насколько зверским это.
>> Тем не менее, давайте предположим, что, на правой стороне
, тем не менее, разумный изображение того, что это
уже на все это Время с GetString.
GetString, конечно, получает строку.
Но что это действительно означает?
Это означает, что он получает кусок памяти от операционной системы
путем вызова функции, называется таНос.
Но об этом позже.
А потом он заполняет что часть памяти
с буквами пользователь имеет ввели в, за которым следует, конечно,
нулевой символ, или обратную косую черту нулю в самом конце.
>> Между тем, на левой стороне из этой истории, все это время,
мы были объявления переменной, как с.
И, что переменная что сейчас начнет вызова указатель.
Это не окно, внутри которого мы ставим строку, Daven, по сути,
а мы ставим в этой клетке в левой части страницы, что именно?
Да?
>> АУДИТОРИЯ: адрес где он находится в памяти.
>> David J. МАЛАН: Точно.
Адрес, куда Daven находится в памяти.
И не там, где все Daven находится, как таковой, а именно адрес
чего?
Да?
>> АУДИТОРИЯ: Первый символ.
>> David J. МАЛАН: Первый символ в Daven, который, в данном случае,
Я предложил было произвольно и нереально 1, Ox1,
который просто означает, что шестнадцатеричное число 1.
Но это, вероятно, быть намного больше число
что мы могли бы сделать с 0x в качестве приставки,
, представляющей шестнадцатеричное характер.
И потому, что мы не должны знать, где остальные из персонажей Daven
являются, потому что простой дизайн Решение, которое было сделано много лет назад?
Да?
>> АУДИТОРИЯ: Backslash 0.
David J. МАЛАН: Да, точно.
Обратная косая черта 0 позволяет, хотя и в линейное время, чтобы пройти через строку,
ходьбы от слева направо, с для цикла, или некоторое время
петля, или нечто подобное что, и определить, о, здесь
это конец этой конкретной строки.
Так только с адреса в начало строки,
мы можем получить доступ полноту это, потому что все это время,
строка только что был символ звезды.
>> Так что это, конечно, прекрасно, чтобы продолжить использование Библиотека CS50 и эта абстракция,
так сказать, но мы будем начинаем видеть именно
что происходило на под все это время.
Таким образом, вы, наверное, помните этот пример, тоже с прошлого раза, сравнивать 0,
который на самом деле не сравнить.
Но мы начали с этим разобраться.
>> Но как может быть, переподготовки, может я заинтересовать кого
в розового слона сегодня, также выступили Чанг?
Как о вас перед? [Неразборчиво].
Поднимайтесь.
>> И в то же время, как вы придумали, давайте
рассмотреть на мгновение, что этот код на самом деле делает.
Это объявления двух переменных до сверху, с и т, и призывая GetString.
Это не очень удобно программа, потому что это не говорит вам, что делать.
Но давайте предположим, что мы упором на сочные части.
И тогда мы делаем, если с равно равна т, он должен сказать Printf,
Вы ввели то же самое.
Здравствуйте.
Как тебя зовут?
>> Janelle: Janelle.
David J. МАЛАН: Janelle, приятно познакомиться.
Так ваш вызов на рука для этого слона
является первым делом обращают нам картину того, что находится быть представленными в те первые два
линии.
Так с и т может быть представлены как на экране?
А можно просто нарисовать его с пальцем на этом большом экране.
>> Таким образом, есть две половинки в каждая сторона этого уравнения.
Так что с слева, и затем GetString справа.
А тут еще т на левой стороне, а затем GetString справа.
Так как мы можем начать рисование изображения, что
представляет, что происходит здесь, в памяти, вы можете сказать?
И позвольте мне позволяют объяснить что вы делаете, как вы идете.
>> Janelle: ОК.
Ну, во-первых, он будет просить Вам получить входную строку.
И было бы store-- ой, простите.
David J. МАЛАН: ОК.
Хорошо.
И это называется и что?
О, хорошо.
Продолжайте идти.
Я не хотел прерывать.
Janelle: Извините.
Так что это будет вход его в адрес не of-- уверен.
Я не могу точно вспомнить номер, но я полагаю, что это было, начиная с 0.
>> David J. МАЛАН: Все в порядке, потому что я сделал цифры вверх,
так что нет никакого правильного ответа.
>> Janelle: Начиная с 0 дуги.
>> David J. МАЛАН: ОК, так элементом 0.
Конечно.
>> Janelle: И потом, если была как просто два-letter--
>> David J. МАЛАН: ОК, обратно к вам.
>> Janelle: Так элемент 0, и то элемент 1 или элемент 2.
David J. МАЛАН: А какая часть картина ты рисуешь прямо сейчас?
Призыв к GetString?
Или декларация с?
>> Janelle: Декларация из с, я верю.
О, GetString, потому что это, быть введены в каждой [? площадь. ?]
>> David J. МАЛАН: Хорошо.
Точно.
Даже при том, что это эффективно возвращает массив, напомним,
когда мы вернемся строку, мы можем индекс в этой строке, используя 01 и 2.
Технически, это, вероятно, представлена ​​отдельным адресам,
но это нормально.
>> Итак, пусть, если я могу просто быстро направить туда, где мы остановились
последний раз, если один из струны был г Ь е,
обратный слэш 0, тем самым представляя Гейба вход, как мы могли бы представлять с сейчас?
Если это память, это были возвращены на GetString?
>> Janelle: было бы представлена ​​дугой?
>> David J. МАЛАН: Под дугой?
Ну, нет.
Давайте просто скажем,, графически, позвольте мне просто идти вперед
и полагаем, что, если это с, эта является возвращение стоимость GetString.
И вы нарисовали это как 0, 1, 2, которые вполне разумно, потому что мы
может индексировать в строку, как таковой.
Но только, чтобы соответствовать последний раз, позвольте мне идти вперед
и произвольно предполагаем, что это является адрес 1, это адрес 2,
это адрес 3, и так далее.
И так, просто, чтобы быть супер ясно, что происходит
пойти в с в результате, что Первая строка кода, вы можете сказать?
>> Janelle: Адрес 1?
>> David J. МАЛАН: Точно.
Так что обратитесь 0x1.
А между тем, позвольте мне идти вперед и дублировать многое из того, что вы сделали
и добавить свой собственный т здесь.
Если бы я был набрать в Гейб опять же, во второй раз,
при запросе с GetString, где, Конечно, такой Гэбриел собирается идти?
Ну, presumably--
>> Janelle: Как здесь?
David J. МАЛАН: Да.
Janelle: Или это тоже в тех же ящиках?
David J. МАЛАН: Позвольте мне предложить, да, точно, так в этих дополнительных коробок.
Но то, что ключ сейчас является то, что, даже хотя я нарисовал эти довольно близко
together-- 0x1, это является 0x2-- в действительности,
это теперь может быть адрес 0x10, Например, и 0x11 и 0x12,
и так далее.
Так вот, если это так, что будет в конечном итоге здесь, в т?
>> Janelle: 0x10?
David J. МАЛАН: Точно.
Так 0x10.
И вот теперь, последний вопрос.
Вы, безусловно, должны были работать трудная для слона до сих пор.
В настоящее время, если я подтянуть код снова, когда я делаю, в третьей линии,
если с равно равна т, что я на самом деле сравнение, что мы нарисовали здесь?
>> Janelle: Два адреса?
David J. МАЛАН: Точно.
Так что я говорю, ы равна равна т?
Другими словами, это 1 равна равна 10?
И, конечно, Очевидный ответ сейчас, нет.
И так эта программа в конечном счете, в печать, что, бы вы сказали?
>> Janelle: было бы, Вы ввели то же самое?
>> David J. МАЛАН: Так что, если с 1 и Т 10?
>> Janelle: Вы ввели разные вещи.
>> David J. МАЛАН: Точно.
Вы ввели разные вещи.
Хорошо.
Так аплодисментами, если бы мы могли, здесь.
[Аплодисменты]
Это было больно.
Я знаю.
Красиво сделано.
Так что теперь давайте посмотрим, если мы не можем дразнить друг от друга, что исправление было.
И, конечно, когда мы зафиксировали это-- которые теперь я буду представлять в green--
мы сделали пару улучшений здесь.
Во-первых, так же, как здравого смысла проверить, я первой проверки
если с равно нулю и т равна нулю.
И чтобы внести ясность, когда могли бы с или т быть пустым в коде, как это?
Когда может с или т быть пустым.
Да?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Точно.
Если строка, которую пользовательский набранный слишком долго
чтобы вписаться в памяти, или некоторые странно пограничные случаи, как, что,
GetString, как мы увидим, в буквальном смысле сегодня, в документации,
говорит он вернется NULL как Особое значение дозорного,
или просто своего рода специальный символ это означает, что то пошло не так.
Поэтому мы хотим, чтобы проверить что, потому что оказывается
что нуль является очень опасное значение.
>> Часто, если вы попытаетесь сделать то с нуль с участием function--, пропустив ее
в качестве входных данных, для instance-- эту функцию может очень рухнет, а с ним,
снять всю программу.
Так что это третья строка теперь это просто здравый смысл проверить, проверку ошибок, если вы будете.
Это хорошая привычка и получите нам попасть в любое время мы
попробуйте использовать значение, может, потенциально, быть пустым.
>> Теперь, в четвертой строке здесь, "Если зЬгстр (S, T)," хорошо,
что это такое говорите?
Ну, мы говорили, что это очень кратко имени функции для сравнения строк.
И его цель в жизни, чтобы сравнить его первый аргумент против него второго,
но не в плане их адреса, как мы сделали непреднамеренно момент
назад с красным кодом, но а сравнить эти два
строки в человечески интуитивно образом, сравнивая это, в отношении того,
против этого, против этого, и затем остановка, если и когда один
или оба моих пальцев парад обратную косую черту 0.
Так кто-лет назад реализованы зЬгстр осуществить для нас функциональность
что мы надеялись, что мы получили бы , просто сравнивая две простые значения.
>> Теперь, честно говоря, я держу рисунок все эти различные номера.
Но реальность такова, что я был что делает эти вверх все время.
И поэтому позвольте мне просто идти вперед и строчить эти вне
сделать пункт, что, в конце дня и двигаться вперед,
мы на самом деле не собирается заботиться о какие адреса вещи на самом деле
в памяти.
Так что я не собираюсь делать это виды чисел так больше,
Я просто абстрактная это далеко немного более доброжелательным только с стрелками.
>> Другими словами, если с является указателем, хорошо, давайте просто нарисовать его, в буквальном смысле,
как указатель, стрелка от себя что-то другое,
и не слишком беспокоиться больше о мелочах из этих адресов
которые, опять же, я сделал так или иначе.
Но мы увидим эти адреса, иногда, при отладке кода.
>> Теперь то же время, эта программа здесь исправления, конечно,
что проблема, сравнивая эти две строки.
Но мы столкнулись с другой проблемой.
Это было из копии запрограммировать в прошлый раз,
в результате чего, я пытался извлечь выгоду только первый символ в строке.
Но то, что было симптомом мы видели последний раз
пользователь вводит в стоимости, как Гейб в нижнем регистре, для х,
Затем мы присвоили ей в т, а в третьей строке там,
и тогда я попытался выгоду т кронштейн 0?
Что был эффект изменения т кронштейн 0 здесь?
>> АУДИТОРИЯ: Это изменило с.
>> David J. МАЛАН: Да, Я изменил с, а также.
Потому что то, что происходит на самом деле?
Ну, позвольте мне увидеть, если я могу чистить до этой картины, как следует.
>> Если с, опять же, слово г, а, б, е, обратный слеш, 0, и с
мы будем продолжать рисунок как коробка здесь, но не более адресов.
Давайте прекратить вещи.
Давайте просто нарисовать картину упростить мир.
>> Когда я объявляю т со струнным т, что создает этот кусок памяти.
Площадь, случается, 32 Биты в большинстве компьютеров.
В самом деле, если вы еще не слышали о компьютер, имеющий 32-разрядную архитектуру,
действительно фантазийных говорить, что только означает, что он использует 32-битные адреса.
И как техническая сторону, если вы никогда не задумывались,
Поэтому старые компьютеры, если вы на самом деле пытался суп их с большим объемом оперативной памяти,
могли иметь только максимум из четырех гигабайт оперативной памяти,
хорошо, что это потому, что, буквально, ваш старый компьютер мог только
Количество выше, чем 4 млрд, 4 млрд байт,
потому что это было 32-разрядный номера для адресов.
>> Но в любом случае, в этом пример, история гораздо проще.
т это просто еще один указатель, или действительно символ звезды, он же строка.
И как я хочу, чтобы обновить эту картинку теперь с этой второй строке кода,
после точки, многоточия, многоточия?
Когда я делаю строка т равна с запятой, как же изменить эту картину?
Да?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Да.
Точно.
Я просто положить стрелу из т коробка по тому же адресу,
то же самое первое письмо в дали.
Или технически, если это парень все еще в 0x1,
это как если бы я был 0x1 здесь и 0x1 здесь.
Но, опять же, кто заботится об адресах?
Это просто идея, что сейчас имеет значение.
Так что это то, что происходит здесь.
Так, конечно, если вы делаете т кронштейна 0, что обозначение массива,
из course-- и откровенно говоря, это выглядит как есть массив здесь,
но теперь есть эта странная вещь.
Знайте, что язык программирования, C, предлагает Вам эту функцию,
в результате чего, даже если Т указатель, или с является указателем,
Вы все еще можете использовать, что знакомы, удобная квадратная скобка
обозначения, чтобы перейти к первому элементу, или второй элемент, или любой элемент
что, что указатель направлен , потому, по-видимому, его
это, как в данном случае, указывая на некоторое массива.
>> Так как же нам это исправить?
Честно говоря, это то, где он получил немного подавляющим на первый взгляд.
Но вот новая и улучшенная версия.
>> Итак, сначала, я получаю избавиться от библиотеки CS50,
просто выставить, что S действительно символ звезды, просто синоним.
И т также символ звезды.
Но то, что происходит на правая сторона этой линии
где т присваивается значение?
>> Что такое таНос?
Что это STRLEN?
Что такое SizeOf (символ)?
Почему, черт возьми, делает это линия взгляд настолько сложным?
Что он делает на высоком уровне?
Что это хранение в т?
Да?
АУДИТОРИЯ: Это выделение определенное количество памяти.
Это для хранения, я думаю, письма [неразборчиво].
>> David J. МАЛАН: Прекрасно.
Прекрасно.
Это выделение определенного объем пространства памяти
для хранения, предположительно, будущие письма.
И в частности, таНос Поэтому возвращение и что?
>> АУДИТОРИЯ: Возвращение [неразборчиво]?
David J. МАЛАН: Точно.
Возвращаясь адрес этой памяти, который является причудливый способ сказать,
возвращает адрес Первый байт этой памяти.
Ответственность лежит на мне, чтобы помнить сколько памяти я на самом деле
выделено или спросил таНос для.
>> Теперь, сколько это?
Ну, хотя есть много скобках здесь,
таНос занимает всего один аргумент.
И я указав STRLEN из х, так дайте мне столько байт, сколько есть в с,
но добавьте один.
Почему?
Да?
>> АУДИТОРИЯ: обратный слеш 0.
David J. МАЛАН: Точно.
Мы должны сделать небольшое домашнее хозяйство.
Так, потому что есть обратная косая черта 0, мы бы лучше помнить, что.
В противном случае, мы собираемся создать строку,
не имеет, что особое терминатор.
>> Между тем, только чтобы быть супер анал, у меня есть SizeOf (символ),
только в случае, если кто работает М.Ю. Код не на CS50 устройства,
но, возможно, на другой компьютер в общей сложности, где символы
один байт, по соглашению, но два байт, или нечто большее, чем это.
Это просто, чтобы быть супер, супер прочь ошибок.
Даже при том, что, в действительности, это скорее всего будет 1.
>> Теперь, в то время, я иду вперед и скопировать Строка, т кронштейн я равна т кронштейн с.
И я подчинюсь прошлой неделе исходный код, чтобы увидеть, что происходит.
Но ключ вынос, и Поэтому я поставил код теперь в зеленый,
потому, что этой самой последней строчки, т кронштейн 0 равна ToUpper,
имеет эффект Капитализация какая строка?
T и / или с?
Последняя строка кода.
>> Просто т, потому что произошло на этот раз,
если я немного отменить этот последний шаг, что случилось уже, когда я называю таНос,
Я по существу получить кусок памяти что имеет тот же размер, что и оригинал,
потому что это арифметическое я сделал.
Я храню в т адресу из этого куска памяти.
Несмотря на то, что это выглядит красиво и довольно, красиво и пусто,
реальность есть, то, что мы будем звонят, значения мусора здесь.
Это кусок памяти могли бы очень хорошо были использованы раньше,
несколько секунд, несколько минут назад.
Так что может быть абсолютно номера или буквы там, просто случайно.
Но они не не действует, пока я сам заполнить этот кусок памяти
с фактическими символов, как я сделать в том, что цикл там.
Хорошо?
>> Так что теперь, кульминация эти три примера
, которые были, казалось бы, разбиты в последний раз, этот пример замены, эта функция
работал в том смысле, что местами а и б.
Но это не сработало в каком другом смысле?
Да?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Точно.
Если бы мне пришлось вызвать эту функцию от another-- например,
из функции как основной, где У меня есть переменная, х и у, как я
сделал на прошлой неделе, и тот же код, и я прохожу по х и у
чтобы Поменять, а затем вызвать Swap-- это, конечно, правильная версия
это то, что мы собираемся see-- он не работает.
Так что же такое исправление?
>> Ну, так что просто быть ясно, позвольте мне идти вперед
и-- дать мне один второй здесь, чтобы увидеть если я могу показать вам последний, который
будет в-- давайте посмотрим, если я могу найти это реальная fast-- ОК, [неразборчиво].
ОК, это так.
Так игнорировать команды я просто печатать.
Я хочу, чтобы извлечь на последней минуты пример
с прошлого раза, что не теперь называется не Своп.
>> Так нет Своп не то, где мы остановились в прошлый раз,
в результате чего, я инициализации х 1, а у к 2.
Я затем вызвать своп, проходя в 1 и 2.
А потом эта функция работал в некотором смысле,
но это не было никакого постоянного эффект от х и у.
Так что вопрос в руке, как сейчас мы на самом деле решить эту проблему?
Что такое решение под рукой?
>> Ну, в swap.c, что новый сегодня, заметить пару отличий.
х и у являются одинаковыми.
Но то, что явно отличается о линии 25?
Что нового там, если вы помните, что это было похоже секунду назад?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Да.
Так амперсанды новая часть синтаксиса не только в этой программе,
но и в целом в CS50.
На сегодняшний день, я не думаю, мы видели никаких примеров
или действительно говорили о них в любом деталь, кроме, может быть, превентивно
в разделе, амперсанд, как это.
Ну, получается, амперсанд является одним из последних частей нового синтаксиса
мы собираемся узнать.
Все это означает, адрес некоторой переменной.
На какой адрес не х жить?
Но то, что адрес не у жить?
Потому что, если Основная проблема, прежде чем
была, что х и у были передается как копии, что мы действительно хотим сделать
это предоставить Переключить с как сокровище карта, которая ведет к где х и у собственно
в оперативной памяти, так, чтобы Своп может следовать, что карту
и идти туда, где х или у отмечает пятно и изменить фактические значения 1 и 2
есть.
>> Так Своп нужно немного изменить тоже.
И на первый взгляд, это может кажется немного похож на персонаж звезды.
И это действительно так.
Так это указатель на тип данных, на основе этой выделенной части?
Так что это внутр.
>> Так что больше не Int, это адрес в междунар.
И точно так же, б теперь собирается быть собой адрес междунар.
Поэтому, когда я теперь называем Переключить от главного, Я не собираюсь давать SWAP 1 и 2.
Я собираюсь дать его как Ox-то и Ox-то,
два адреса, которые приведут Своп с их фактическими местах
в памяти моего компьютера.
>> Так что теперь, моя оставшаяся реализация необходимо изменить чуть.
Что, безусловно, отличаются сейчас в этих трех строк кода?
Там в эти проклятые звезды все повсеместно, все в порядке?
Так что здесь происходит?
Да?
>> АУДИТОРИЯ: Это, очевидно, [неразборчиво].
>> David J. МАЛАН: Точно.
Таким образом, в этом context-- и это не было лучший дизайн решение, по общему признанию,
лет назад.
В этом контексте, в котором вы просто должны звезду,
и у вас нет тип данных, как Int, сразу налево,
вместо этого вы должны знак равенства, четко, В этом контексте, когда вы говорите, звезды,
это означает, что перейти к адрес, который находится в.
Следуйте карту сокровищ, так сказать.
>> А между тем, в строке 37, это означает то же самое.
К адресной а, и положить, что там?
Все, что в расположение, что б указывает.
Другими словами, пойти б.
Получить эту величину.
К и, в равной подписать, оператор присваивания,
поставить там это значение.
>> Аналогично, Int Темп просто внутр.
Ничего не нужно менять о темп.
Это просто запасной стекло от Анненберг за молоком или апельсиновым соком.
Но я должен сказать, пойти в б.
К этому пункту назначения и поместить значение в температуре там.
Так что же тогда происходит?
Когда я на самом деле назвать Поменять этот раз, если это первый лоток здесь представляет Main,
это второй лоток представляет подкачки, когда Я прохожу амперсанда х и амперсанд у
от Майне в Поменять, просто чтобы было ясно, что это за фрейм стека приема?
Да?
>> АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Точно.
Адрес х и адрес у.
И вы можете думать о них как почтовые адреса.
33 Оксфорд-стрит и 35 Оксфорд-стрит, и вы
хотите переместить два здания которые в этих местах.
>> Это своего рода нелепой идеи, но это все, мы имеем в виду по адресу.
Где в мире можно Вы найдете эти два целых?
Где в мире вы можете найти эти два здания?
Так что, если, наконец, после всего этого времени I идти в сегодняшнем исходного кода и компиляции
Своп и запустить ./swap, наконец, для Первый раз мы на самом деле видим, что
мои ценности имеют действительно успешно поменялись.
И теперь, мы можем даже взять примечание этого, скажем, в GDB.
>> Итак, позвольте мне пойти в тот же файл.
Позвольте мне идти вперед и отлаживать из ./swap.
И теперь, в обмен, я пойду вперед и установить точку останова в Майне.
А теперь я пойду вперед и запустить программу.
И теперь мы видим свой код остановился на этой линии.
>> Если я иду вперед и печать х, что я должен увидеть здесь?
Это вопрос.
Снова сказать?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Так случайные числа, может быть.
Может быть, я повезет, и это просто и красиво, как 0.
Но может быть, это некоторое случайное число.
В этом случае, мне повезло.
Это как раз случается быть 0.
Но это действительно удача, потому что не до Я
введите следующий, а затем распечатать х имеет, что строка кода, строка 19, были выполнены.
>> Между тем, если я типа рядом снова, и распечатать сейчас из у, я иду к 2.
Теперь, если я типа рядом, он собирается получить немного запутанным, потому что теперь,
Е будет появляться на экран, как это было. х равен 1.
>> Давайте сделаем это снова.
А теперь, вот, где становится все интереснее.
Прежде чем предоставить слово Свопинг или даже шаг в него, давайте немного заглянуть.
х, опять же, 1.
Y является, конечно, быстро здравый смысл проверить, 2, таким образом, не трудно там.
Но то, что амперсанд х?
Ответ, это отчасти фанки глядя.
Но Int звезда в скобках просто способ ВВП способ сказать это адрес.
Это не Int, это указатель на Int или иначе известный как адрес.
>> Что это сумасшедшая вещь?
Мы никогда не видели то совсем так раньше.
Так что это адрес в моего компьютера память, где х происходит жить.
Это Ox-то.
И это, честно говоря, почему Я начал рисовать стрелки,
вместо цифр, потому что, кто действительно заботится
что ИНТ находится в частности адрес вот что большой.
Но bffff0c4, это все Действительно шестнадцатеричные цифры,
которые от 0 до ф.
>> Таким образом, мы не собираемся останавливаться слишком долго на то, что эти вещи.
Но если я распечатать у, Конечно, я вижу 2.
Но амперсанд у, я вижу этот адрес.
И заметьте, для любопытных, как далеко друг от друга находятся хну?
Вы можете игнорировать большую часть адреса.
Четыре байта.
И это согласуется с нашим ранее утверждают, что, насколько большой является Int?
Четыре байта.
Так что, похоже подкладке все в до красиво, как Вы могли бы надеяться, в памяти.
>> Так что теперь, давайте просто быстрая перемотка вперед до конца этой истории.
Давайте пойдем дальше и ввести шаг, погрузиться в функции подкачки.
Теперь обратите внимание, если я печатаю, это идентична адресу х.
Если я печатаю б, это идентично по адресу у.
Так что я должен увидеть, если я говорят, перейти по адресу на?
Так распечатать звезда.
Так звезда означает пойти туда, в этом контексте.
Ampersand означает то, что адрес.
Так звезда средства 1.
И печать звезда б дает мне 2.
>> И позвольте мне предположить, на данный момент, что по крайней мере код, который
переходит к выполнения теперь может быть рассуждал через таким образом.
Но мы будем возвращаться к этой идеи в скором времени.
Так эта версия обмен Сейчас правильно и позволяет
нам, чтобы поменять этот конкретный тип данных.
>> Поэтому любые вопросы, то на обмен?
На звезде?
На адрес?
И вы увидите, с Проблема установить 4, своего рода,
но проблема установить 5, определенно, как это вещи полезны и получить гораздо более
комфортно с ними, в результате.
Все, что угодно?
Хорошо.
Так таНос, опять же, эта функция что только выделяет память, память
распределение.
И почему это полезно?
Ну, все это время, Вы использовали таНос.
Если вы считаете, сейчас, как GetString работ, по-видимому, это
были просить кого на кусок памяти, в любое время пользователь печатает строку
в, потому что мы, конечно, не знаю, как персонал CS50,
насколько велика эти строки, что людей собираются ввести может быть.
>> Так что давайте, впервые, начинают отогните себе как она CS50 работ,
путем пару примеров что приведет нас есть.
Так что, если я открываю Gedit и открыть зсапЕ 0,
мы собираемся, чтобы увидеть следующий код.
Scanf 0, доступны на веб-сайте для сегодня, имеет относительно небольшое число строк кода
здесь, с 14 по 20.
И давайте посмотрим, что он делает.
Это объявляет INT, под названием х.
Это говорит нечто вроде: число пожалуйста.
А теперь он говорит, зсапЕ% я, и х.
Таким образом, есть куча нового материала там.
>> Но зсапЕ, вы можете как бы думаю как противоположность Printf.
Е, конечно, выводимую в.
зсапЕ рода сканирований от потребителя, клавиатура-то он или она набрала.
>> % Я точно так же как Printf.
Это означает, ожидать пользователю введите Int.
А теперь, почему вы думаете, я может быть прохождение зсапЕ & х?
Если цель в жизни зсапЕ , чтобы получить то от пользователя,
что это значит пропуская его, и х, сейчас?
Да?
>> АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Точно.
Что бы я ни, человеческий, введите в, мой вход собирается быть сохранены в этом месте.
Это не достаточно, вспомнить, просто пройти в х, потому что мы видели уже,
в любое время вы пройти только сырое переменную, как Int, в некоторой другой функции,
Безусловно, это может изменить, что переменная, но не навсегда.
Он не может иметь влияние на Майне.
Это можно изменить только свою собственную локальную копию.
Но если вместо этого вы не дать мне фактический Int,
но вы дать мне направление что Int, я сейчас, будучи зсапЕ,
безусловно, я могу следовать, что решения и поставить там ряд
так у вас есть доступ к нему также.
>> Поэтому, когда я запустить эту программу, давайте посмотрим.
Сделать зсапЕ 0 точка слэш, SCANF 0.
И если я сейчас введите номер как 50, спасибо за 50.
Если я сейчас введите число, как отрицательный 1, за негативное 1.
Теперь я печатаю ряд как 1,5, хм.
Почему моя программа игнорировать меня?
Ну, потому что просто, я сказал это ожидать только в Int.
Хорошо.
Так вот одна версия этого.
Давайте вещи на ступеньку выше и предположить, что это не хорошо.
И в этом заключается очень простой пример о том, как мы можем начать писать код
что другие люди могут использовать или на компромисс, делать плохие вещи.
Так линия 16, так похожи по духу, прежде чем,
но я не объявив его десятичного этот раз.
Я объявляю его сЬаг звезду, он же строки.
>> Но что это действительно означает?
Так что, если я не указать address-- и Я звоню его произвольно, буфер,
но я мог бы назвать это с, чтобы быть simple-- а затем я сделаю это, объясните мне,
если бы вы могли, на основе предыдущего Логика, что зсапЕ делать в строке 18,
если пропускания% с и буфером, который является адрес?
Что такое зсапЕ, если применить Точное же логика, как версии 0,
собираюсь попытаться сделать здесь, когда пользователь-то в?
Да?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Точно.
Scanf, по логике раньше, собирается принять строку
что человека, напечатанных на машинке в-- это теперь строка,
это не число, по-видимому, если он или она cooperates--
и он собирается попытаться положить, что строка в памяти на любом адрес
буфера указывает.
И это здорово, потому что буфер действительно означало, что адрес.
>> Но я утверждаю, эта программа глючит в очень серьезный путь, потому что значение
буфер по умолчанию?
Что я инициализации в?
Что часть памяти?
У меня нет, не так ли?
>> Таким образом, даже при том, что я выделил символ звезды, который больше не называется с,
это вместо называется, buffer-- так давайте нарисуем имя переменной
Теперь, как buffer-- если у меня нет называется GetString или таНос здесь,
что фактически означает, что буфер только некоторое значение мусора.
>> Теперь что же это значит?
Это означает, что я сказал зсапЕ ожидать строку от пользователя.
И вы знаете, что?
Независимо эта вещь указывая to-- и я рисую вопросительный знак,
но в действительности, это будет что-то вроде Ox1, 2, 3, не так ли?
Это некоторые фиктивные значение, только случается, есть от лица.
Так, по-другому, это как будто буфер просто
указывая на то, в памяти.
Я понятия не имею, что такое.
>> Так что, если я печатаю в Gabe сейчас, это происходит , чтобы попытаться положить г-А-В-Е / 0 есть.
Но кто знает, что это такое?
И в прошлом, любой раз, когда мы попытались коснуться
памяти, что не принадлежит нам, что случилось?
Или почти каждый раз.
Ошибка сегментации, не так ли?
>> Эта стрелка, я понятия не имею, где это указывая. это просто случайное значение.
И, конечно, если вы интерпретируете случайное значение в качестве адреса,
Вы собираетесь перейти на некоторые случайные назначения.
Так Гейб действительно может аварии моя программа в этом случае здесь.
>> Так что мы можем сделать, это почти так же плохо?
Считайте, что это третий и Последний пример зсапЕ.
Эта версия лучше в каком смысле?
Если вы знакомы с предыдущая проблема, это лучше.
Почему?
>> АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Хорошо.
Так что это случай линии 16 Лучше, в том смысле,
что мы явно выделения немного памяти.
Мы не используем таНос, мы используем неделю 2
подход просто объявлении массива.
И мы уже говорили ранее, что строка просто массив символов,
так что это совершенно законно.
Но это, конечно, как Вы обратите внимание, что фиксированный размер, 16.
>> Так что это программа полностью безопасным, если я печатаю
в строках одного символа, два символа строки, 15 строк символов.
Но как только я начинаю набирать 16, 17, 18, 1000 символьные строки,
где эта строка будет в конечном итоге?
Это будет в конечном итоге частично здесь.
Но кто знает, что еще вне границ
именно этого массива?
>> Это как если бы у меня есть заявил 16 коробки здесь.
Таким образом, вместо вытянуть все 16, мы будем просто делать вид, что я нарисовал 16.
Но если я затем попытаться прочитать строку это гораздо больше, как 50 символов,
Я собираюсь положить начало а, б, в, г, х, у, г.
И это, предположительно некоторые другие сегмент памяти
, что, опять же, может вызвать моя программа к краху,
потому что я не попросил ничего больше, чем просто 16 байт.
>> Так кого это волнует?
Ну, вот библиотека CS50.
И большинство из это просто как инструкции до верхней.
Библиотека CS50, все это время, была эту линию в линию 52.
Мы видели ЬурейеЕ, или Вы увидите ЬурейеЕ
в PSET 4, который просто создает синоним которой символ звезда может быть более
упоминается просто как строки.
Так что это один из несколько учебных колеса
мы использовали тайно под капотом.
>> Между тем, вот функция, деЬспаг.
Теперь, по-видимому, нет тела к нему.
И в самом деле, если я буду продолжать прокрутка, я на самом деле не
вижу никаких реализаций из этих функций.
Как для проверки отсутствия ошибок, почему это?
>> АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Да.
Так что это файл заголовка.
И файлы заголовков содержат прототипы, плюс некоторые другие вещи, кажется,
как определений типов.
Но в CS50.c, которую мы никогда не дал вам откровенно,
но был в CS50 прибора все на этот раз, глубоко внутри его папок,
заметить, что есть целый куча функций здесь.
>> На самом деле, давайте прокрутите вниз.
Давайте игнорировать большинство из них, на данный момент.
Но прокрутите вниз до GetInt и посмотреть, как GetInt работает.
Так вот GetInt.
И если вы никогда не заботился, как получить Int работает, вот ее документация.
И среди вещей это говорит, он говорит вам,
какие диапазоны значений он может вернуться.
Это существенно отрицательным 2000000000 к положительному 2000000000, плюс-минус.
>> И оказывается, все это Время, хотя мы никогда не
что вы проверить его, если что не так,
получается, что все на этот раз, GetInt имеет
возвращался специальная постоянная, не нулевой,
а INT_MAX, который Конвенция всего в двух программиста.
Это означает здесь это специальное значение.
Убедитесь, что проверить это, просто если что-то пойдет не так.
Но мы никогда не беспокоили с, что на сегодняшний день,
потому что снова, это предназначен для упрощения.
>> Но как GetInt будут реализованы?
Ну, один, он не принимает никаких аргументов.
Мы знаем, что.
Это возвращает целое.
Мы знаем, что.
Так как он работает под капотом?
>> Так что, по-видимому бесконечное петля, по крайней мере, появление одного.
Обратите внимание, что мы используем GetString.
Так вот интересно. GetInt называет наш собственный функция, GetString.
А теперь, почему это могло бы быть на самом деле?
Почему я будучи оборонительная здесь в соответствии 165?
Что может произойти в линии 164, чтобы внести ясность?
Это тот же ответ, как и раньше.
Может быть просто из памяти.
Что-то не так с GetString, мы должны быть в состоянии справиться, что.
И по этой причине я не возвращают нуль является , что технически нулевой указатель.
GetInt должен вернуть Int.
Так что я произвольно решил, по существу,
что 2000000000, плюс-минус, собирается быть особое значение, что я никогда не может
на самом деле получить от пользователя.
Это просто одно значение я собираюсь тратить представлять код ошибки.
>> Так что теперь, все становится немного фантазии.
И это не совсем та же функция как и раньше, но это очень похоже.
Так заметить, я заявляю здесь, в соответствии 172, как Int N и символ с.
И тогда я использовать этот модный линию, Sscanf, который получается
не сканирует строку с клавиатуры.
Он стоит существующий строку, пользователь уже напечатаны.
Так что я уже назвал GetString, который означает, что я есть строка в памяти.
Sscanf является то, что вы вызвать функцию разбора.
Похоже на строку я набрал в, символ за символом,
и делает что-то полезное.
Эта строка хранится в линии.
И я знаю, что только собирается резервное копирование здесь и говорить, ах, хорошо,
Я назвал его не с на этот раз, но линия.
>> И теперь это немного отличается.
Но это фактически означает, по причинам мы несколько машем руками на сегодняшний день,
что мы проверяем, чтобы увидеть, если пользователь ввел в
и INT и, возможно, еще один персонаж.
Если пользователь ввел в междунар, это будут храниться в п, потому что я
прохождения этом по адресу, новый трюк мы видели сегодня.
Если пользователь набрал также Подобным 123x, что х
собирается в конечном итоге Письмо в персонажа в.
>> Теперь получается, что Sscanf скажет мне, разумно,
сколько переменных было Sscanf успешно в состоянии заполнить.
Так по этой логике, если функция Я уверен, реализации будет GetInt,
но я проверяю, потенциально, для пользователя
чтобы набрали в междунар затем-то еще,
что я хочу Sscanf сайт Возвращаемое значение действительно быть?
Если цель состоит в том, чтобы получить просто Int от пользователя?
>> Так что, если Sscanf возвращается 2, что это значит?
Пользователь набрал в то как, в буквальном смысле,
123x, которая является просто бред.
Это условие ошибки, и Я хочу, чтобы проверить, что.
>> Так что, если пользователь вводит это в, по эта логика, что делает Sscanf вернуться,
бы вы сказали?
Так он собирается вернуться 2, потому что 123 будет идти сюда,
и х будет в конечном итоге здесь.
Но я не хочу х до заполняются.
Я хочу Sscanf только добиться успеха в заполнение первой из переменных.
И вот почему я хотите Sscanf вернуть 1.
>> И если это немного по голове на данный момент, что совершенно нормально.
Поймите, однако, что одно из значения GetInt и GetString
является то, что мы делаем чертовски много ошибок проверки, как это так
что на сегодняшний день, вы можете в значительной степени ничего введите в клавиатуре,
и мы поймаем его.
И мы, конечно,, персонал, будет определенно не
быть источником ошибки в вашем Программа, потому что мы в обороне
проверка на все глупо вещи, которые пользователь может сделать,
как набрав строку, когда вы действительно хотели Int.
Таким образом, для now-- мы придем обратно в это раньше long--
но все это время, GetString и GetInt есть
был под капотом, используя этот Основная идея адресов памяти.
>> Так что теперь, давайте делать вещи немного более удобным для пользователей.
Как вы помните, из Binky последнего time-- если моя мышь будет cooperate-- так
у нас был этот код, который откровенно говоря, довольно бессмысленно.
Этот код ничего не дает полезно, но это был пример
что профессор Parlante используется для того, чтобы представлять
что происходит в Программа с участием памяти.
>> Так что давайте пересказывать это история супер кратко.
Эти две первые строки, в Английский, делать то, что, вы можете сказать?
Просто в разумно человеком, но слегка технические термины, принять удар.
АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: ОК, вы установления адреса для вашей х и у переменных.
Не совсем, потому что х и у не являются переменные в традиционном смысле.
х и у являются адресами или будет хранить адрес.
Так давайте попробуем это еще раз.
Неплохое начало, хотя.
Да?
>> АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Хорошо.
Я думаю, что это немного чище.
Объявление двух указателей, два целых числа.
И мы называем их х и у.
Или, если мы должны были сделать это как картины, опять же,
Напомним, совсем просто, что все мы делаем с этой первой строки
рисует окно, как это, с некоторым значением мусора в нем,
и называя это х, а затем еще один ящик, как это,
с некоторого значения мусора в нем, называя его у.
Мы заявили два указатели, которые в конечном счете
будет хранить адрес в междунар.
Так что все это есть.
>> Поэтому, когда Бинки сделал это, глина просто выглядела так.
И Ник только отчасти завернутый стрелки,
как будто они не указывая нигде в частности, потому, что они просто
значения для мусора.
Они явно не инициализируется в любом месте в частности.
>> Теперь следующий линия Код, напомним, был этот.
Таким образом, в достаточно удобной, но несколько технический английский,
что это за строка кода делает?
Да?
>> АУДИТОРИЯ: [неразборчиво].
>> David J. МАЛАН: Прекрасно.
Это выделения кусок памяти, что это размером с междунар.
И это половина ответа.
Вы ответили право половина экспрессии.
То, что происходит на левая сторона знака равенства?
Да?
АУДИТОРИЯ: И правопреемников это к переменной х?
>> David J. МАЛАН: И правопреемников это к переменной х.
Так Напомним, правая выделяет Недостаточно памяти для хранения Int.
Но таНос специально возвращает адрес
этого куска памяти, что вы просто предложил сохраняется в х.
>> Так что Ник сделал в прошлый раз с Бинки является он потащил этот указатель из, глина,
указать сейчас на белый кусок памяти что равно размером с междунар.
И в самом деле, что означало представлять четыре байта.
>> Теперь, в следующей строке кода сделал это, звезда х получает 42.
Так 42 является прямым на Правая, смысл жизни.
Левая сторона, звезда х означает?
Это тоже может иметь gone-- это нормально.
Хорошо.
>> АУДИТОРИЯ: В принципе, перейти к [неразборчиво]
David J. МАЛАН: Хорошо.
АУДИТОРИЯ: [неразборчиво].
David J. МАЛАН: Точно.
Левая сторона означает идти в х.
х адрес.
Это как 33 Оксфорд-стрит, или Ox1.
И звезда х означает идти к тому, что решения и положить то, что есть?
42.
>> Так действительно, это именно то, что сделал Ник.
Он начал с прочим, по сути дела, мысленно
указывая пальцем на х, указанном стрелкой
в белой коробке с правой стороны сторона, и проставления числа 42 есть.
Но тогда вещи стали немного опасно, правда?
Бинки около потерять голову.
>> Звезда у равна 13, невезение, это означает?
Так звезды у средства идут на адрес в у.
Но то, что это адрес в у?
Ладно, это значение мусор, не так ли?
Я обратил его в виде знака вопроса.
Ник обратил его в качестве свернувшись калачиком стрелкой.
И как только вы попытаетесь сделать звезду у, говоря пойти туда,
но не является законным адрес, это некоторые фиктивные расположение,
программа собирается к краху.
И голова Бинки собирается отлетать здесь, как это было.
>> Так в конце, этой программы был просто плоский из изъян.
Это была программа глючит.
И это должно было быть фиксированной.
И единственный способ, действительно, это исправить будет, например, эта линия,
которые мы даже не добраться, потому что программа разбился слишком рано.
Но если бы мы должны были исправить это, то, что эффект делает делать у равным х есть?
Ну, это, по существу указывает у в любое значение х указывает на.
>> Таким образом, в истории Ника, или история Бинки, как
х и у были указывая на белый участок памяти,
так что, в конце концов, когда вам у звезды у равна 13 раз,
Вы в конечном итоге положить 13 в Подходящее место.
Итак, все эти линии совершенно законным, для этого кроме,
когда это случилось перед вами фактически назначен ск некоторое значение.
>> Теперь, к счастью, вы не должны рассуждать через все
из этих видов вопросов по своему усмотрению.
Позвольте мне идти вперед и открыть окно терминала здесь
и открыть, на мгновение, супер короткая программа, что
также является своего рода бессмысленно.
Это некрасиво.
Это ничего полезного не достичь.
Но это продемонстрировать вопросы памяти, так что давайте взглянем.
>> Главная, супер просто.
Это, по-видимому вызывает функцию, е, а затем возвращает 0.
Это своего рода трудно испортить это.
Так Главная довольно хорошо, до сих пор.
>> Так е проблематично.
И просто не положить много усилия в назвав его
здесь, чтобы держать в центре внимания на код.
е имеет две линии.
И давайте посмотрим, что сейчас происходит.
Так, с одной стороны здесь-- и позвольте мне сделать
это в соответствии с предыдущим example--, с одной стороны,
левая сторона делать то, что, по-английски?
Это is--
АУДИТОРИЯ: Создание указатель.
David J. МАЛАН: Создание указатель к междунар и назвав его х.
Так что это создание одного из этих ящиков Я продолжаю рисовать на сенсорном экране.
А теперь, с правой стороны стороны, таНос, конечно,
выделяет кусок памяти.
И чтобы внести ясность, как объем памяти его, по-видимому
распределения, если вам просто вид делать математику здесь?
>> Так что это 40 байт.
И я знаю, что только потому, что я знаю, Int, на CS50 устройства, по крайней мере
четыре байта.
Так 10 раз 4 40.
Так что это запоминания х, адрес первого из 40 целых чисел, что
были выделены места назад, к спине, к спине, к спине.
>> И вот что ключ о таНос.
Это не займет немного памяти Здесь, немного здесь, немного здесь.
Это дает вам один кусок памяти, непрерывно, от эксплуатации
Система.
>> Теперь то, что об этом, х кронштейн 10 равен 0?
Произвольное строка кода.
Это ничего полезного не достичь.
Но интересно, потому х кронштейн 10--?
Да?
>> АУДИТОРИЯ: [неразборчиво]?
>> David J. МАЛАН: х кронштейн 10 не должен быть нулевым.
Деталь нуль только вступает в игру со строками, в конце строки.
Но хорошая мысль.
>> Насколько велика в этом массиве, даже хотя я выделил 40 байт?
Это 0 до девяти, не так ли?
Это 10 Интс, общ.
40 байт, но 10 Интс, индексируются от 0 до 0.
>> Так что же такое, что х кронштейн 10?
Это на самом деле некоторые неизвестное значение мусора.
Это память, которая не принадлежит мне.
Я не должна касаться, что байт число 41, 42, 43, 44.
Я собираюсь немного слишком далеко.
>> И в самом деле, если я запускаю это Программа, это вполне может потерпеть крах.
Но иногда, нам повезет.
И поэтому только, чтобы продемонстрировать это-- и откровенно говоря,
Вы никогда не знаете, перед вами у it-- давайте запустим этот.
Это на самом деле не крах.
>> Но если я изменю это, для Экземпляр, чтобы быть, как 1000,
сделать это действительно преднамеренное, давайте посмотрим,
если мы можем получить к краху на этот раз.
ОК, это не крах.
Как насчет 100 тысяч?
Давайте переделать его, и теперь повторно его.
Хорошо.
Уф.
Хорошо.
Таким образом, очевидно, опять же, это сегменты памяти, так сказать,
разумно большой, поэтому мы можем повезет снова и снова.
Но в конце концов, как только вы получите смешно и действительно пойти далеко на экране,
прикосновении память, что действительно, действительно не принадлежат вам.
>> Но, откровенно говоря, это виды ошибок собираются
чтобы все труднее и труднее выяснить, по своему усмотрению.
Но, к счастью, как программисты, у нас есть инструменты, которые позволяют нам сделать это для нас.
Так что это, пожалуй, одна из самых уродливых программ,
еще уродливее, чем выход GDB о.
Но он всегда имеет линию или два, которые супер полезно.
>> Valgrind это программа, которая помогает Вы не отлаживать программу, по сути,
но найти, связанных с памятью проблемы, в частности.
Он автоматически запустится код для Вы и посмотрите, по крайней мере две вещи.
Один, ты сделал то случайно, как Touch Memory
что не принадлежит вам?
Это поможет вам найти те случаи.
>> И два, это поможет Вы обнаружите нечто, называемое
утечки памяти, которые у нас есть полностью игнорируется, наивно,
в течение некоторого времени и блаженно.
Но, оказывается, все на этот раз, каждый раз, когда
Вы вызвали GetString в так многие из наших программ,
вы спрашиваете операционные Система для памяти,
но у вас есть воспоминания из когда-либо давая его
назад, делая unalloc, или бесплатно, как это называется.
Нет, потому что мы никогда не попросил вас сделать это.
>> Но все это время, программы вы писали в С
были утечки памяти, задавая эксплуатационные
Система все больше и больше памяти для строк и еще много чего,
но никогда не передав его обратно.
И теперь это немного из упрощением,
но если вы когда-либо запустить Mac или ваш компьютер в течение достаточно долгого времени, открытия
много программ, возможно закрытие программ,
и даже при том, что ваш компьютер не разбился,
она становится гораздо медленнее, как будто это действительно
используя много памяти или ресурсов, хотя,
если вы даже не прикасаясь к клавиатуре,
которые могли бы be-- но не always-- мог быть, что программы вы работаете
сами утечек памяти.
И они продолжают спрашивать ОС больше и больше памяти, но забывая об этом,
на самом деле не использовать его, но Поэтому принимая память от
от других программ, которые могли бы хотеть его.
Так вот расхожее объяснение.
Теперь вот где Valgrind сайт Выход полностью
зверское тем, меньше и удобнее так.
Но самое интересное материал прямо здесь.
Он рассказывал мне неверный запись о Размер четыре происходит в этой программе,
В частности, на линии 21 memory.c.
>> Если я иду на линию 21, хм, там действительно является недействительным записи о размере четырех.
Почему размер четыре?
Ну, это number-- и может быть anything-- является внутр.
Так что это четыре байта.
Так что я ставлю четыре байта где они не принадлежат.
Вот что Valgrind на самом деле говорил мне.
Кроме того, это будет также скажите мне, как мы увидим,
как вы запустите в будущем PSET, если и когда вы утечка памяти, которое, хотя
У меня есть, потому что я назвал таНос, но у меня нет на самом деле
называется, в данном случае, свободный, который мы в конечном счете видеть
является противоположностью таНос.
>> Так что теперь, как мне кажется, последний пример.
Так что это одна немного больше тайной, но это, возможно,
Самая главная причина, чтобы будьте осторожны с памятью,
и причиной того, что многие программы и / или веб-серверов, даже по сей день,
перенимает плохих парней где в Интернете, которые так или иначе
отправка фиктивные пакеты на сервер пытаются скомпрометировать ваши счета,
или взять ваши данные, или просто как правило, принимают за машиной.
Переполнение буфера, а названия, средства
переполнены не такого Int, но буфер.
И буфер только причудливый способ сказать, что это куча памяти.
>> И в самом деле, я позвонил строка до буфера, вместо с.
Потому что, если это буфер, как в том смысле, YouTube,
или в любое время вы смотрите видео, Вы, возможно, видели слово буферизации,
точка, точка, точка.
Это невероятно раздражает.
И это просто означает, что плеер видео
пытается загрузить много байтов, много байт
из видео из Интернета.
Но это медленно, так он пытается загрузить кучу из них
заполнить буфер, контейнер, так что у вас есть достаточное количество байтов, что он может затем
показать вам видео, не останавливаясь постоянно.
Но, оказывается, можно есть буфер в этот большой.
Но попробуйте поставить столько данных в это, и очень плохие вещи могут случиться.
Так, например, давайте посмотрим на этот последний тизер примера.
Это другая программа что, на первый взгляд,
ничего супер полезно не делать.
У этого есть Основная функция что вызывает эту функцию, ф.
И, что функция, F, здесь, имеет массив символов, называется с, размер 12.
И тогда он использует это Новая функция называется strncpy.
>> Получается, что, с этой простой, просто строка кода, всего две линии,
мы сделали всю свою программу, и поэтому, весь мой компьютер,
и моя учетная запись пользователя, и мой жесткий езды потенциально уязвимы к любому
кто знает и достаточно хорошо, чтобы запустить эта программа с определенным командной строки
Аргумент.
Другими словами, если это плохой парень ставит внутри argvargv [1], введя
на клавиатуре очень специально сформированного строка, не азбука, 123, но, по сути,
двоичные символы, которые представляют исполняемый Код, программа, что он или она пишет,
с этой простой программе, которая Представитель тысяч программ
что таким образом, склонны, осмелюсь сказать, он или она может в конечном счете, удалить все
файлы на жестком диске, получить мигать строку так, чтобы он или она может
вводить команды самостоятельно, по электронной почте файлы к себе.
Все, что я могу сделать, он или она может сделать с этим кодом.
>> Мы не будем достаточно решить это пока.
И в самом деле, он собирается привлечь небольшую картину
как это, которое мы скоро чтобы понять все лучше.
Но на сегодняшний день, давайте закончится что, как мы надеемся, чуть больше
понятно XKCD шутка, пока мы не возобновить в следующий раз.
Хорошо.
Увидимся в среду.
>> [МУЗЫКА ИГРАЕТ]
>> СПИКЕР: А теперь, глубоко мысли, по Daven Фарнэме.
Память, как прыжки в груду золотые листья в воскресенье днем.
Ветер дует, бросая свой hair-- о, я скучаю дни when--
>> [Смех]