[МУЗИКА ГРАЄ]
>> 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--
>> [Сміх]