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