1 00:00:00,000 --> 00:00:11,242 >> [Музика Відтворення] 2 00:00:11,242 --> 00:00:16,630 >> Девід Дж. мала: Добре це CS50 і це початок тижня п'ять. 3 00:00:16,630 --> 00:00:21,480 Таким чином, сьогодні під вашим подушки сидіння, Ви нічого не знайдете. 4 00:00:21,480 --> 00:00:24,790 Але перш, ви повинні знайти їх, маленький знак нашої вдячності за 5 00:00:24,790 --> 00:00:26,970 Всі роботи, які ви поклали у гру п'ятнадцять. 6 00:00:26,970 --> 00:00:30,290 Просто видаліть маленький коло на нижній частині, щоб почати грати на 7 00:00:30,290 --> 00:00:31,680 Інша частина класу. 8 00:00:31,680 --> 00:00:38,930 >> Тому нагадаємо, що, або знаєте, що завдання, поставлене чотири, які вийшли в ці вихідні, 9 00:00:38,930 --> 00:00:40,340 включає в себе написання іншу гру. 10 00:00:40,340 --> 00:00:43,740 Але на цей раз включає в себе використання фактичний графічний інтерфейс користувача, не 11 00:00:43,740 --> 00:00:46,310 текстовий інтерфейс, як Гра П'ятнадцять було. 12 00:00:46,310 --> 00:00:50,210 І гра, яка лежить перед вами, Якщо ви ще не бачили це наступний, 13 00:00:50,210 --> 00:00:52,310 виглядає трохи щось на зразок цього. 14 00:00:52,310 --> 00:00:55,170 Я збираюся йти в мій термінал вікна тут, в GDB. 15 00:00:55,170 --> 00:00:58,600 І я збираюся йти вперед і запустіть Співробітники рішення, яке ви можете отримати доступ 16 00:00:58,600 --> 00:01:01,010 після запуску оновлення 50, як зазвичай. 17 00:01:01,010 --> 00:01:04,090 >> Але я збираюся поставити його в маленьку таємного режиму, трохи пасхальне яйце, 18 00:01:04,090 --> 00:01:08,480 так званий режим Бога, по ставити Бога в argv1. 19 00:01:08,480 --> 00:01:12,920 І я повинен слідувати своїм власним напрямках, запустити його в моєму власному 20 00:01:12,920 --> 00:01:14,220 Проблема встановити каталог. 21 00:01:14,220 --> 00:01:19,190 Отже, тепер ви бачите повну версію в грі прориву. 22 00:01:19,190 --> 00:01:21,090 Справді, це не руки-режимі. 23 00:01:21,090 --> 00:01:24,850 Так це насправді - 24 00:01:24,850 --> 00:01:26,470 вразив, хоча ви могли б бути - 25 00:01:26,470 --> 00:01:30,850 досить просто реалізувати режим Бога в Breakout, на відміну від гри п'ятнадцяти років, 26 00:01:30,850 --> 00:01:33,590 який деякі з вас могли вирішуватися для хакера видання. 27 00:01:33,590 --> 00:01:37,890 >> У Breakout достатньо в Бога режимі, щоб просто робити те, що, 28 00:01:37,890 --> 00:01:41,220 Інтуїтивно з веслом? 29 00:01:41,220 --> 00:01:45,630 Тільки зробіть це все одно горизонтальної позиції кулі. 30 00:01:45,630 --> 00:01:49,220 І до тих пір, як ви робите це в ногу з м'ячем переміщення ця гра буде 31 00:01:49,220 --> 00:01:53,100 ніколи, ніколи, ніколи не пропустити м'яч і ви будете вигравати кожен раз. 32 00:01:53,100 --> 00:01:55,430 >> Але в хакером видання цього тижня є більше, ніж просто режим Бога. 33 00:01:55,430 --> 00:01:56,720 Там, ряд інших можливостей. 34 00:01:56,720 --> 00:01:58,140 Серед них, лазерів. 35 00:01:58,140 --> 00:02:01,070 Так що якщо ви дійсно турбуєтеся ви може почати збивати цеглу 36 00:02:01,070 --> 00:02:02,120 і деякі інші. 37 00:02:02,120 --> 00:02:04,560 А для тих з вас, хто хотів би калібрування стандартним проти хакерів 38 00:02:04,560 --> 00:02:08,750 видання, я бачу, що на цьому тижні хакером видання свідомо є 39 00:02:08,750 --> 00:02:12,830 трохи більше здійсненним, скажімо, чим Бог Режим гри був з п'ятнадцяти років. 40 00:02:12,830 --> 00:02:15,300 >> Так що якщо ви шукаєте розтягування і Ви шукаєте деякі додаткові весело 41 00:02:15,300 --> 00:02:18,400 Особливості роблять занурення в якщо вони представляють інтерес. 42 00:02:18,400 --> 00:02:21,280 Зараз більш практично, я хотів би відзначити на одну річ, а також. 43 00:02:21,280 --> 00:02:24,780 GDB, який деякі з вас, можливо, ще торкнулася особисто, і це добре. 44 00:02:24,780 --> 00:02:28,530 Але зараз дійсно час, щоб звикнути до цього і зручно за допомогою цього інструменту 45 00:02:28,530 --> 00:02:31,510 тому що це зробить ваше життя набагато простіше, по-справжньому. 46 00:02:31,510 --> 00:02:34,900 >> На лекції Роба на GDB пара тижнів тому, нагадаємо 47 00:02:34,900 --> 00:02:36,810 GDB, що це відладчик. 48 00:02:36,810 --> 00:02:41,230 Це інструмент, який дозволяє запускати програми, але запустити його крок за кроком, лінія 49 00:02:41,230 --> 00:02:45,680 за рядком, так що ви можете копатися, так що ви бачите, що відбувається, так що 50 00:02:45,680 --> 00:02:47,310 що ви можете роздрукувати Значення змінних. 51 00:02:47,310 --> 00:02:50,580 Коротше кажучи, це дає вам набагато більше, енергії, ніж PRINTDEF робить. 52 00:02:50,580 --> 00:02:52,900 >> Тепер за загальним визнанням, інтерфейс досить складних. 53 00:02:52,900 --> 00:02:55,180 Чорно-білий текстовий інтерфейс по більшій частині. 54 00:02:55,180 --> 00:02:57,400 Команди кілька жорстким пам'ятати в першу чергу. 55 00:02:57,400 --> 00:03:01,230 Але навіть якщо це може зайняти половину , Годину, щоб покласти, що авансом 56 00:03:01,230 --> 00:03:02,940 витрати часу в нього, повірте мені. 57 00:03:02,940 --> 00:03:06,440 Звичайно, до кінця семестру вона врятує Ви на порядок більше 58 00:03:06,440 --> 00:03:07,600 часу, ніж це. 59 00:03:07,600 --> 00:03:09,200 >> Так що на початку тижня почати дюйма 60 00:03:09,200 --> 00:03:13,200 І з точки зору Breakout, знаю, що ви може зробити це за умови, що у вас є 61 00:03:13,200 --> 00:03:18,230 Код розподілу або ваш власний код у прогрес у вашій Pst4 каталог. 62 00:03:18,230 --> 00:03:21,680 Знайте, що ви можете запустити GDB. / Прориві. 63 00:03:21,680 --> 00:03:23,490 >> Це збирається відкрити таке віконце. 64 00:03:23,490 --> 00:03:25,530 Дозвольте мені навести себе більше з вікна терміналу. 65 00:03:25,530 --> 00:03:27,770 І тоді те, що я збираюся йти вперед і зробити, це не просто запустити його. 66 00:03:27,770 --> 00:03:30,690 Я буду першим встановити точку зупину Нагадаємо, яка дозволяє зробити паузу 67 00:03:30,690 --> 00:03:32,500 виконання в певному місці. 68 00:03:32,500 --> 00:03:35,750 >> Просто, щоб не ускладнювати Я збираюся розірвати на одній лінії, просто набравши 69 00:03:35,750 --> 00:03:37,000 номер один. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Дозвольте мені насправді знову відкрити це вікно , Тому що це стає 72 00:03:43,250 --> 00:03:45,700 трохи маленькі там. 73 00:03:45,700 --> 00:03:53,270 Так що я тепер збираюся зробити тут Якщо я відкриваю моє вікно терміналу. 74 00:03:53,270 --> 00:03:53,910 Давай, там ми йдемо. 75 00:03:53,910 --> 00:03:59,850 >> Отже, якщо я повернуся в Dropbox, Pst4 і запустити GDB. / прориву введіть, помітить 76 00:03:59,850 --> 00:04:02,600 Я збираюся розбити одну для установки точку зупину першої лінії. 77 00:04:02,600 --> 00:04:04,840 А тепер я піду вперед і тип запуску. 78 00:04:04,840 --> 00:04:07,370 І коли я роблю, нічого не помічають , Здається, трапляється. 79 00:04:07,370 --> 00:04:08,120 >> Там немає спливав. 80 00:04:08,120 --> 00:04:09,790 Там немає графічної користувальницький інтерфейс ще. 81 00:04:09,790 --> 00:04:13,340 Але це зрозуміло, тому що я буквально на одній лінії в моїй програмі. 82 00:04:13,340 --> 00:04:17,110 І зауважте, що я швидко пересилати, спеціально зараз до 62, так як всі 83 00:04:17,110 --> 00:04:20,600 матеріал у верхній частині цього файлу речі, як коментарі і констант і 84 00:04:20,600 --> 00:04:22,460 нецікавих речей на даний момент. 85 00:04:22,460 --> 00:04:25,840 >> Так що тепер я всередині основного, здається, у рядку 62. 86 00:04:25,840 --> 00:04:27,960 І це тільки розподіл Код, нагадаємо. 87 00:04:27,960 --> 00:04:33,810 Якщо я відкрию цю, йдучи, так само, в моє падіння в полі Каталог Pst4, 88 00:04:33,810 --> 00:04:35,450 в breakout.c. 89 00:04:35,450 --> 00:04:40,670 І якщо я перейдіть вниз і вниз і вниз, і дозвольте мені йти вперед і включити 90 00:04:40,670 --> 00:04:44,990 Мої номери лінії. 91 00:04:44,990 --> 00:04:50,300 >> Що я буду бачити, якщо я Прокрутіть вниз до рядок 62, точно така лінія, яка 92 00:04:50,300 --> 00:04:50,910 ми зупинилися на. 93 00:04:50,910 --> 00:04:53,720 Так що ця лінія тут, 62, є де ми збираємося бути. 94 00:04:53,720 --> 00:04:57,470 Так що тепер у GDB, якщо я йду вперед і введіть Тепер наступне, введіть його збирається 95 00:04:57,470 --> 00:04:58,450 виконати цю лінію. 96 00:04:58,450 --> 00:05:00,610 І вуаля, у нас є так званий г вікна. 97 00:05:00,610 --> 00:05:02,800 Якщо незнайомі з тим, що GWindow Тобто, не про що турбуватися. 98 00:05:02,800 --> 00:05:05,740 Специфікації познайомить вас з нею, як а також ряд проходження відео 99 00:05:05,740 --> 00:05:06,830 вбудовані в спец. 100 00:05:06,830 --> 00:05:08,610 >> Але тепер давайте зробимо це трохи більш цікавим. 101 00:05:08,610 --> 00:05:10,960 Дозвольте мені перемістити це вікно над у бік небагато. 102 00:05:10,960 --> 00:05:13,480 Дозвольте мені зробити вікно трохи більше, таким чином я можу побачити більше. 103 00:05:13,480 --> 00:05:16,140 >> А тепер дозвольте мені йти вперед і знову робити далі. 104 00:05:16,140 --> 00:05:17,550 І є мої цеглу. 105 00:05:17,550 --> 00:05:20,490 Якщо я друкую наступного разу тепер я бачу м'яч. 106 00:05:20,490 --> 00:05:23,520 І якщо я друкую наступного разу тепер я бачу, весло. 107 00:05:23,520 --> 00:05:26,690 >> І на щастя, це не Gedit дійсно співпрацюють, показуючи мені 108 00:05:26,690 --> 00:05:27,660 все, що захочу. 109 00:05:27,660 --> 00:05:30,820 Але тепер, якщо я роблю наступний раз, Далі ще раз, я просто 110 00:05:30,820 --> 00:05:32,260 Оголошення деяких змінних. 111 00:05:32,260 --> 00:05:34,750 І я можу надрукувати будь з цих хлопців. 112 00:05:34,750 --> 00:05:37,170 Друк цегли, відбитки життів. 113 00:05:37,170 --> 00:05:39,910 >> І тепер, якщо я продовжу робити Далі зверніть увагу, що я буду 114 00:05:39,910 --> 00:05:40,870 Усередині цього циклу. 115 00:05:40,870 --> 00:05:43,380 Але код буде виконувати точно так, як я очікую. 116 00:05:43,380 --> 00:05:45,810 Тому, коли я вдарив цю функцію, почекайте для миші, вона буде робити 117 00:05:45,810 --> 00:05:46,830 що це буквально. 118 00:05:46,830 --> 00:05:48,870 Так що я, здавалося, втратив контроль на програму. 119 00:05:48,870 --> 00:05:50,480 >> GDB не дає мені інший рядок. 120 00:05:50,480 --> 00:05:51,500 Але не хвилюйтеся. 121 00:05:51,500 --> 00:05:53,720 Перейти до моїй грі, клацніть у будь-якому місці. 122 00:05:53,720 --> 00:05:56,270 >> І вуаля, тепер він переходить до лінії 86. 123 00:05:56,270 --> 00:05:59,460 Отже, ще раз, це безцінне, в кінцевому рахунку, для налагодження проблем. 124 00:05:59,460 --> 00:06:03,050 Тому що ви можете буквально покроково коду, друк речі і багато, 125 00:06:03,050 --> 00:06:03,640 багато, багато іншого. 126 00:06:03,640 --> 00:06:07,210 Але зараз, ці інструменти тільки ви повинні отримати досить далеко. 127 00:06:07,210 --> 00:06:10,050 >> Так що ми, звичайно, поглянути Графіка на зараз, все раптово. 128 00:06:10,050 --> 00:06:12,350 І тепер наш світ стає трохи цікавішою. 129 00:06:12,350 --> 00:06:15,680 І ви знаєте, може бути, від деяких з відео в Інтернеті, що у нас є ці 130 00:06:15,680 --> 00:06:18,280 шорти, які Ви дивилися як частина проблеми множин. 131 00:06:18,280 --> 00:06:20,460 >> І вони були розстріляні, свідомо, на білому фоні. 132 00:06:20,460 --> 00:06:23,380 І деякі з них мають вчення Стипендіати зробити деякі тексту на 133 00:06:23,380 --> 00:06:25,490 екран, який обклав на стороні них. 134 00:06:25,490 --> 00:06:27,760 Але, звичайно, це ще не все, що цікаве в реальному світі. 135 00:06:27,760 --> 00:06:30,520 Це всього лише лекційний зал з великий білий екран і фон. 136 00:06:30,520 --> 00:06:33,330 І наш дивовижний роду виробничих команди з змушує все виглядати красивою 137 00:06:33,330 --> 00:06:36,620 постфактум, обрізка з накладення або нічого 138 00:06:36,620 --> 00:06:37,840 ми робимо або не хочуть. 139 00:06:37,840 --> 00:06:41,560 >> Тепер просто мотивувати на цьому тижні і дійсно, де ви можете піти, в кінцевому рахунку, 140 00:06:41,560 --> 00:06:42,560 з інформатикою. 141 00:06:42,560 --> 00:06:44,260 Не тільки після того, як проблема встановити чотири. 142 00:06:44,260 --> 00:06:48,240 Але після того, як інший курс або цілої навчальна програма це дивно, що ви можете 143 00:06:48,240 --> 00:06:51,090 зробити в ці дні з точки зору графіка зокрема. 144 00:06:51,090 --> 00:06:53,440 >> Деякі з вас, можливо, бачили цю обтіканні онлайн. 145 00:06:53,440 --> 00:06:56,240 Але я думав, що я покажу вам, всього за пару хвилин, побачити те, що 146 00:06:56,240 --> 00:07:01,890 комп'ютерні технології і те, що CGI, комп'ютерної графіки можна зробити в ці дні 147 00:07:01,890 --> 00:07:04,510 зі знайомою піснею і, можливо, фільм. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - Лана-дель-Рей, "Молоді і красиві] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Виступаючий 1: Це просто трохи дивовижне, мабуть, тільки, як 151 00:10:52,470 --> 00:10:52,857 всюдисущий - 152 00:10:52,857 --> 00:10:57,040 >> [Оплески] 153 00:10:57,040 --> 00:10:59,230 >> Виступаючий 1: Я просто завантажив його. 154 00:10:59,230 --> 00:11:02,920 Але це дійсно дивно, я думаю, просто як всюдисуще програмне забезпечення та коду і 155 00:11:02,920 --> 00:11:04,230 інструменти, як це насправді. 156 00:11:04,230 --> 00:11:07,685 Так от смак напрямку в якому ви можете йти. 157 00:11:07,685 --> 00:11:10,620 О, ні більше побутової сьогодні. 158 00:11:10,620 --> 00:11:14,640 Ну, це насправді трагічна часу даний момент я просто спробував зробити. 159 00:11:14,640 --> 00:11:18,670 >> Гаразд, давайте запустимо Fusion знову. 160 00:11:18,670 --> 00:11:20,800 Нагадати пізніше. 161 00:11:20,800 --> 00:11:24,190 Все в порядку, і ви повинні їсти електронної пошти, як осторонь, якщо ви все-таки 162 00:11:24,190 --> 00:11:25,460 помітите подібне. 163 00:11:25,460 --> 00:11:29,940 Гаразд, нагадаємо, що минулого тижня ми почали цю відігніть 164 00:11:29,940 --> 00:11:31,380 пізніше відомий як рядок. 165 00:11:31,380 --> 00:11:34,700 >> рядок нагадує тип даних, що це оголошений в CS50 бібліотеки. 166 00:11:34,700 --> 00:11:37,740 І це частина підготовки коліс що тепер почнуть злітати. 167 00:11:37,740 --> 00:11:41,280 Це була корисна концепція, на ранніх стадіях. 168 00:11:41,280 --> 00:11:43,750 Але тепер він збирається отримати більше цікавим і більш потужними, щоб 169 00:11:43,750 --> 00:11:48,330 дійсно бачимо, що під капотом, рядок є тільки те, що, чи не так сказано? 170 00:11:48,330 --> 00:11:50,500 >> Так, так що це так званий символ *. 171 00:11:50,500 --> 00:11:53,860 І там * позначає, що є якусь адресу участь. 172 00:11:53,860 --> 00:11:58,690 І тому, коли ви говорите, символ * ви просто означати, змінну з типом даних 173 00:11:58,690 --> 00:11:59,290 Тепер покажчик. 174 00:11:59,290 --> 00:12:01,770 Той факт, що там є зірки просто означає, що ви розкажете 175 00:12:01,770 --> 00:12:03,020 так званий покажчик. 176 00:12:03,020 --> 00:12:06,220 І, що покажчик буде мабуть зберегти адресу, з 177 00:12:06,220 --> 00:12:07,810 Звичайно, голець. 178 00:12:07,810 --> 00:12:08,960 >> Тепер, чому це має сенс? 179 00:12:08,960 --> 00:12:11,200 Ну, що це рядок під капотом? 180 00:12:11,200 --> 00:12:15,130 Ну, протягом деякого часу ми говорили що рядок під капотом 181 00:12:15,130 --> 00:12:18,460 тільки ч-е-л-л-о, наприклад. 182 00:12:18,460 --> 00:12:21,585 >> Але ми вже говорили про це, як що є, по суті, масив. 183 00:12:21,585 --> 00:12:25,410 А ряд буде виглядати трохи більше як це, з кожною з цих 184 00:12:25,410 --> 00:12:26,460 займаючи укусу. 185 00:12:26,460 --> 00:12:28,710 А потім ми вже говорили, що є щось особливе сюди, 186 00:12:28,710 --> 00:12:31,270 0 зворотну косу риску, або нульове закінчення. 187 00:12:31,270 --> 00:12:35,230 >> Так що все це час, це тут була рядок. 188 00:12:35,230 --> 00:12:38,320 Але насправді, рядок фактично адресою. 189 00:12:38,320 --> 00:12:43,210 І адреси, як ми побачимо, часто префікс 0x за угодою. 190 00:12:43,210 --> 00:12:44,540 Що позначають 0x? 191 00:12:44,540 --> 00:12:45,970 Хто-небудь знає? 192 00:12:45,970 --> 00:12:47,320 >> Так що це просто означає шістнадцяткове. 193 00:12:47,320 --> 00:12:52,360 Таким чином, ви, можливо, пам'ятаєте, насправді, від Pst 1, я вважаю, одна з розминки 194 00:12:52,360 --> 00:12:55,740 питань насправді питання про шістнадцятковому форматі на додаток до 195 00:12:55,740 --> 00:12:57,100 двійковій і десяткової. 196 00:12:57,100 --> 00:13:00,460 І мотивація тут є те, що з шістнадцятиричним у вас є 16 197 00:13:00,460 --> 00:13:01,770 цифри у вашому розпорядженні. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а потім на A, B, C, D, E, F. 199 00:13:07,900 --> 00:13:10,430 >> А якщо порахувати всіх тих, вгору, Ви отримуєте в цілому 16. 200 00:13:10,430 --> 00:13:13,200 Таким чином, це на відміну десяткового, де у нас є 10 201 00:13:13,200 --> 00:13:14,690 цифр, від 0 до дев'яти. 202 00:13:14,690 --> 00:13:17,750 Це на відміну від двійкового де ми просто 0 і 1. 203 00:13:17,750 --> 00:13:21,450 >> Але врешті-решт ви можете просто являють собою ті ж цифри, але 204 00:13:21,450 --> 00:13:22,500 трохи інакше. 205 00:13:22,500 --> 00:13:25,840 І шістнадцяткові є загальним, тому що як виходить - і ми побачимо, це 206 00:13:25,840 --> 00:13:28,790 на більш пізніх стадіях - навіть тоді, коли ми отримуємо на веб-програмування в контексті 207 00:13:28,790 --> 00:13:32,100 HTML і колірні коди, шістнадцятиричному хороша. 208 00:13:32,100 --> 00:13:36,390 Тому що кожна цифра, виявляється, являє собою чотири біта відмінно. 209 00:13:36,390 --> 00:13:39,280 Так що це тільки частково ліній красиво як ми в кінцевому підсумку побачити. 210 00:13:39,280 --> 00:13:44,720 Так що це може бути або щось Ox123 так, що позначає адресу 123 211 00:13:44,720 --> 00:13:47,050 десь всередині мого пам'яті комп'ютера. 212 00:13:47,050 --> 00:13:50,600 >> Але, звичайно, виникають деякі проблеми через це основного 213 00:13:50,600 --> 00:13:51,520 здійснення. 214 00:13:51,520 --> 00:13:55,930 І пам'ятайте, що я прийняв удар на реалізації функції, як це - 215 00:13:55,930 --> 00:14:00,260 порівняти тире 0 точка C минулого тижня, що хоча здавалося, що було 216 00:14:00,260 --> 00:14:04,270 Правильно, це просто не порівняти два рядки правильно. 217 00:14:04,270 --> 00:14:07,470 >> Я викинув основних і я кинув від коментарів просто сфокусуватися на 218 00:14:07,470 --> 00:14:08,970 код, який представляє інтерес тут. 219 00:14:08,970 --> 00:14:10,660 І це в червоному, тому що він помилковий. 220 00:14:10,660 --> 00:14:11,670 З якої причини? 221 00:14:11,670 --> 00:14:15,890 >> Ну, у верхній там, коли я заявив, рядком, то, що відбувається насправді 222 00:14:15,890 --> 00:14:17,260 під капотом? 223 00:14:17,260 --> 00:14:19,530 Ну, дозвольте мені перейти до Наведений тут екран і зробити це. 224 00:14:19,530 --> 00:14:23,230 Таким чином, я заявив, знову ж таки, Рядок з GetString. 225 00:14:23,230 --> 00:14:26,640 >> Так що я збираюся йти вперед і зараз малювати з такою, яка вона насправді. 226 00:14:26,640 --> 00:14:28,590 Це збирається бути квадратної тут. 227 00:14:28,590 --> 00:14:30,490 І я збираюся стверджувати, , Що це 32-бітове. 228 00:14:30,490 --> 00:14:32,890 Принаймні, це зазвичай буває, принаймні, на CS50 229 00:14:32,890 --> 00:14:34,520 Прилад у великій кількості комп'ютерів. 230 00:14:34,520 --> 00:14:35,980 Я буду називати його с. 231 00:14:35,980 --> 00:14:39,070 >> Але тепер нагадаємо, що ми GetString називається. 232 00:14:39,070 --> 00:14:41,430 Так GetString повертається, звичайно, рядок. 233 00:14:41,430 --> 00:14:45,790 Якщо користувач введе в ч-е-л-л-о, введіть Рядок привіт отримує повернувся. 234 00:14:45,790 --> 00:14:51,010 І цей рядок, як ми тільки що сказали, закінчується десь у пам'яті комп'ютера 235 00:14:51,010 --> 00:14:53,240 із зворотного косою риси 0 в кінці. 236 00:14:53,240 --> 00:14:56,650 Я намалюю це як масив - або безперервний блок символів - 237 00:14:56,650 --> 00:14:58,330 що вона насправді. 238 00:14:58,330 --> 00:15:01,790 >> І тепер, що GetString насправді повернення? 239 00:15:01,790 --> 00:15:04,340 Що GetString повертався весь цей час? 240 00:15:04,340 --> 00:15:07,520 Ну, скажімо так, в тижні до, вона повертає рядок. 241 00:15:07,520 --> 00:15:10,250 Але більш технічно, те, що робить GetString повернення мабуть? 242 00:15:10,250 --> 00:15:11,610 >> АУДИТОРІЯ: адреси. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: адреси. 244 00:15:12,600 --> 00:15:16,630 Зокрема, вона повертає адресу найперший укус, що це таке. 245 00:15:16,630 --> 00:15:18,830 Я просто продовжувати використовувати один, два, три тому що це зручно. 246 00:15:18,830 --> 00:15:21,380 >> Вона повертає адресу першого символів в рядку. 247 00:15:21,380 --> 00:15:23,510 І ми минулого тижня заявив, що яка є достатньою. 248 00:15:23,510 --> 00:15:26,710 Тому що ми завжди можемо з'ясувати, де кінця рядка просто 249 00:15:26,710 --> 00:15:30,150 ітерації це, може бути, з для петлю або петлю, або щось на зразок 250 00:15:30,150 --> 00:15:34,990 , Що просто шукає "зворотний слеш 0", спеціальний символ дозорних. 251 00:15:34,990 --> 00:15:37,220 >> І тоді ми знаємо, що рядки трапляється, довжиною - 252 00:15:37,220 --> 00:15:37,980 в даному випадку - 253 00:15:37,980 --> 00:15:38,670 п'ять. 254 00:15:38,670 --> 00:15:43,800 Так що технічно робить GetString це повертає Ox123 в цьому випадку. 255 00:15:43,800 --> 00:15:53,670 І технічно, що відбувається, є те , Що ми зберігаємо, всередині з, Ox123. 256 00:15:53,670 --> 00:15:56,460 Зрештою, навіть якщо це є новою концепцією, покажчики, вони 257 00:15:56,460 --> 00:15:57,350 це просто змінні. 258 00:15:57,350 --> 00:16:00,440 Але вони відбуваються для зберігання бітів, які разом представляють адресою. 259 00:16:00,440 --> 00:16:03,700 Так що все, що вони технічно отримує зберігається в и є Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Але ми, як люди - 261 00:16:04,680 --> 00:16:06,020 в тому числі сьогодні вперед - 262 00:16:06,020 --> 00:16:09,290 дійсно не буде піклуватися, зазвичай, що фактична адреса 263 00:16:09,290 --> 00:16:10,520 деяких шматок пам'яті. 264 00:16:10,520 --> 00:16:14,040 Це просто низький рівень деталізації бути інтелектуально цікавим. 265 00:16:14,040 --> 00:16:15,440 Так що я збираюся скасувати це. 266 00:16:15,440 --> 00:16:19,810 І замість того, більш високий рівень, просто сказати , Що, коли ми говоримо про покажчики 267 00:16:19,810 --> 00:16:22,170 Я збираюся просто залучити більше зручних стрілку, яка передає 268 00:16:22,170 --> 00:16:26,060 ж ідею і абстрагує відомості про те, що фактичне 269 00:16:26,060 --> 00:16:27,700 основний адресу. 270 00:16:27,700 --> 00:16:33,290 >> Тепер, якщо ми повернемося до коду, що сталося минулого тижня, якщо у нас є рядок T 271 00:16:33,290 --> 00:16:34,510 GetString одно? 272 00:16:34,510 --> 00:16:38,630 Ну, якщо я ще раз, введіть привіт на цей раз я йду, щоб отримати 273 00:16:38,630 --> 00:16:40,460 іншу ділянку пам'яті. 274 00:16:40,460 --> 00:16:44,820 ч-е-л-л-о 0 зворотну косу риску. 275 00:16:44,820 --> 00:16:48,320 >> Але тому що я дзвонив GetString вдруге - 276 00:16:48,320 --> 00:16:51,100 і я знаю це, дивлячись на Вихідний код для GetString - навіть 277 00:16:51,100 --> 00:16:54,350 тому, що це випадково, що привіт був набрав в два рази, що не GetString 278 00:16:54,350 --> 00:16:55,890 буде намагатися оптимізувати і бути розумним. 279 00:16:55,890 --> 00:16:58,550 Це просто буде отримати інший шматок пам'яті з комп'ютера, який 280 00:16:58,550 --> 00:16:59,640 буде за іншою адресою. 281 00:16:59,640 --> 00:17:02,330 Давайте просто скажемо, довільно 456. 282 00:17:02,330 --> 00:17:04,079 >> А потім що він збирається повернутися? 283 00:17:04,079 --> 00:17:08,030 Це збирається повернути 456 і зберігати його в т. 284 00:17:08,030 --> 00:17:12,010 Так що ж відбувається насправді, на Ліва сторона у мене є інший шматок 285 00:17:12,010 --> 00:17:14,260 пам'яті, 32 біт зазвичай. 286 00:17:14,260 --> 00:17:16,720 І там буде йти Ox456. 287 00:17:16,720 --> 00:17:20,140 Але знову ж, я не зацікавлений у цих певних чисел більше. 288 00:17:20,140 --> 00:17:23,069 Я просто хочу, щоб абстрактно намалювати його, як стріла. 289 00:17:23,069 --> 00:17:25,202 >> Так що це тепер нове пояснення. 290 00:17:25,202 --> 00:17:28,735 Але це точно такий же ідеєю, що це що відбувалося весь цей час. 291 00:17:28,735 --> 00:17:33,150 І так причини, то, що цей перший версія порівняння було погано, 292 00:17:33,150 --> 00:17:34,480 минулого тижня, чому? 293 00:17:34,480 --> 00:17:38,000 Коли ви це зробите, якщо з одно одно т, що ти по-справжньому 294 00:17:38,000 --> 00:17:40,550 під капотом порівняння? 295 00:17:40,550 --> 00:17:41,910 >> Ви порівнюєте адрес. 296 00:17:41,910 --> 00:17:47,950 І так само, інтуїтивно, зрозуміло, Ox123 не збирається рівне Ox456. 297 00:17:47,950 --> 00:17:49,380 Ці цифри, ці біти просто різні. 298 00:17:49,380 --> 00:17:53,220 >> І так послідовно, минулого тижня він сказав ввести різні речі, навіть якщо 299 00:17:53,220 --> 00:17:55,360 Слова були дослівно те ж саме. 300 00:17:55,360 --> 00:17:58,770 Таким чином, ми це виправити. 301 00:17:58,770 --> 00:18:00,120 З точки зору непрофесіонала, що було виправити? 302 00:18:00,120 --> 00:18:02,110 >> АУДИТОРІЯ: Використовуйте функцію. 303 00:18:02,110 --> 00:18:02,870 >> Виступаючий 1: Використовуйте функцію. 304 00:18:02,870 --> 00:18:05,190 Або зірки виразно залучений, але використовувати функцію для чого? 305 00:18:05,190 --> 00:18:05,962 >> АУДИТОРІЯ: для порівняння рядків. 306 00:18:05,962 --> 00:18:07,390 >> Виступаючий 1: для порівняння рядків. 307 00:18:07,390 --> 00:18:11,030 Таким чином, основна проблема тут була що я просто розгляді 308 00:18:11,030 --> 00:18:15,870 Якість рядків, які будуть визначені порівняння їх адресами. 309 00:18:15,870 --> 00:18:18,540 І, очевидно, це тільки тепер ще німі Ви розумієте, що відбувається 310 00:18:18,540 --> 00:18:19,510 під капотом. 311 00:18:19,510 --> 00:18:23,270 Щоб по-справжньому порівнювати рядки, щоб побачити, якщо вони рівні в тому, що людський 312 00:18:23,270 --> 00:18:26,680 розглядатиме два рядки рівними ми повинні порівняти їх характер для 313 00:18:26,680 --> 00:18:28,070 символ на символ. 314 00:18:28,070 --> 00:18:30,020 >> Тепер я міг би зробити це дуже втомлює. 315 00:18:30,020 --> 00:18:32,240 Але фамільярно, ми використанням циклу. 316 00:18:32,240 --> 00:18:36,050 І просто порівняйте з кронштейном Я проти т кронштейна я. 317 00:18:36,050 --> 00:18:39,590 з кронштейном я плюс 1 т проти кронштейн я плюс 1, і так далі, всередині 318 00:18:39,590 --> 00:18:40,580 якийсь петлі. 319 00:18:40,580 --> 00:18:44,950 І якщо я визначаю будь-яких двох символів, які відрізняються, або якщо я розумію, що ох, з є 320 00:18:44,950 --> 00:18:48,410 коротше, ніж т або більше, ніж т Я можу відразу сказати, брехливо, 321 00:18:48,410 --> 00:18:49,390 вони не те ж саме. 322 00:18:49,390 --> 00:18:55,370 >> Але якщо я отримую через с і т і сказати ж, те ж саме, те ж саме, те ж саме, те ж саме, в кінці 323 00:18:55,370 --> 00:18:58,520 обидва рядки, я можу сказати, правда, вони рівні. 324 00:18:58,520 --> 00:19:01,040 Ну, на щастя, кілька років тому хтось писав, що код для нас. 325 00:19:01,040 --> 00:19:03,790 >> І вони назвали це StrComp для порівняння рядків. 326 00:19:03,790 --> 00:19:11,900 І хоча це трохи лічильника інтуїтивно, StrComp повертає 0, якщо ці 327 00:19:11,900 --> 00:19:14,520 два рядки, з і т однакові. 328 00:19:14,520 --> 00:19:18,090 Але вона повертає від'ємне значення, якщо з повинні прийти до T алфавітом або 329 00:19:18,090 --> 00:19:20,610 позитивне значення, якщо він повинен прийти, після т в алфавітному порядку. 330 00:19:20,610 --> 00:19:24,030 >> Так що, якщо ви хочете залагодити щось, виявляється, що StrComp корисно. 331 00:19:24,030 --> 00:19:26,660 Тому що це не просто сказати Так чи ні, рівні чи ні. 332 00:19:26,660 --> 00:19:30,440 Це дає вам відчуття замовлення як словник мощі. 333 00:19:30,440 --> 00:19:33,770 Так StrComp, з комою T дорівнює дорівнює 0 означає, що 334 00:19:33,770 --> 00:19:35,200 рядків дійсно рівні. 335 00:19:35,200 --> 00:19:38,680 Тому що той, хто писав цю функцію років тому імовірно використовували для петлі 336 00:19:38,680 --> 00:19:42,840 або петлю, або щось на зразок того інтегрувати по персонажів знову 337 00:19:42,840 --> 00:19:45,270 і знову і знову. 338 00:19:45,270 --> 00:19:47,300 >> Але проблема виникла два тут. 339 00:19:47,300 --> 00:19:48,750 Це було copy0.c. 340 00:19:48,750 --> 00:19:51,680 І обидва у червоному тому що це недоліки. 341 00:19:51,680 --> 00:19:52,800 І що ж ми тут робимо? 342 00:19:52,800 --> 00:19:54,310 Ну, по-перше, я зателефонував GetString. 343 00:19:54,310 --> 00:19:56,255 І я зберіг значення, що повертається в с. 344 00:19:56,255 --> 00:20:00,260 Так що це в значній мірі так само, як це верхня частина картини. 345 00:20:00,260 --> 00:20:01,490 >> Але що буде після цього? 346 00:20:01,490 --> 00:20:04,980 Ну, дозвольте мені йти вперед і позбутися цілою купою цьому. 347 00:20:04,980 --> 00:20:09,650 Ми перемотування в часі туди, де ми щойно є з, який в даний час відповідно до 348 00:20:09,650 --> 00:20:10,940 лінії одного там. 349 00:20:10,940 --> 00:20:11,400 >> Я перевіряю. 350 00:20:11,400 --> 00:20:13,450 Якщо з рівним дорівнює 0. 351 00:20:13,450 --> 00:20:18,670 Тепер, швидке примітка боку, коли GetString може повертати 0? 352 00:20:18,670 --> 00:20:19,580 Там не вистачає пам'яті. 353 00:20:19,580 --> 00:20:19,880 Вірно? 354 00:20:19,880 --> 00:20:22,310 >> Це рідкісне, що це відбудеться, звичайно, на комп'ютері, який 355 00:20:22,310 --> 00:20:24,740 є сотні мегабайт або навіть гігабайтами оперативної пам'яті. 356 00:20:24,740 --> 00:20:27,080 Але це може, в теорії, повернутися 0, особливо якщо 357 00:20:27,080 --> 00:20:28,080 Користувач не співпрацює. 358 00:20:28,080 --> 00:20:31,640 Там у способи прикинутися, що у вас немає введених трюк і нічого 359 00:20:31,640 --> 00:20:34,100 GetString до повернення 0 ефективно. 360 00:20:34,100 --> 00:20:35,470 >> Так що це, щоб перевірити це. 361 00:20:35,470 --> 00:20:39,430 Тому що, якщо кожен з вас почали отримати, вже, помилки сегментації - 362 00:20:39,430 --> 00:20:42,280 який, ймовірно, був джерело деякого розчарування - 363 00:20:42,280 --> 00:20:46,150 ті майже завжди результат з про помилку пам'яті. 364 00:20:46,150 --> 00:20:50,440 Якось ви переплуталися у відношенні покажчик, навіть якщо ви не розумієте, 365 00:20:50,440 --> 00:20:51,530 було покажчиком. 366 00:20:51,530 --> 00:20:55,260 Таким чином, ви, можливо, індукованих сегментації несправності ще в один тиждень використання 367 00:20:55,260 --> 00:21:02,100 щось на зразок циклу або в той час як петлю і масив, заходить занадто далеко 368 00:21:02,100 --> 00:21:05,900 повз кордону деяких масив, який Ви заявили на тиждень у дві 369 00:21:05,900 --> 00:21:06,690 зокрема. 370 00:21:06,690 --> 00:21:09,220 >> Ви могли б це зробила навіть у проблемних встановити чотири з прориву. 371 00:21:09,220 --> 00:21:12,910 Хоча ви, ймовірно, не бачили будь-якої зірки у розподілі код 372 00:21:12,910 --> 00:21:17,410 Breakout, виходить, що ті, GRect і GOval та інші подібні речі, 373 00:21:17,410 --> 00:21:19,650 ті фактично є покажчиками під капотом. 374 00:21:19,650 --> 00:21:23,430 >> Але Стенфорд, як і ми, начебто шкури що детально принаймні для бібліотек 375 00:21:23,430 --> 00:21:26,540 цілях, так само, як ми робимо для струнних і символ *. 376 00:21:26,540 --> 00:21:30,060 Але GRect і GOval і всі ці речі ви, хлопці, або буде використовувати 377 00:21:30,060 --> 00:21:32,630 На цьому тижні, в кінцевому рахунку адрес пам'яті. 378 00:21:32,630 --> 00:21:33,650 Ви просто не знаєте. 379 00:21:33,650 --> 00:21:37,240 >> Так що не дивно і те, мабуть, що ви могли б спіткнутися деяких 380 00:21:37,240 --> 00:21:38,580 помилки сегментації. 381 00:21:38,580 --> 00:21:41,290 Але що цікаво, от зараз, Якщо після перевірки на 0 ми робимо 382 00:21:41,290 --> 00:21:43,460 Рядок T отримує с. 383 00:21:43,460 --> 00:21:44,690 Ну, дозвольте мені оголосити T. 384 00:21:44,690 --> 00:21:47,730 Я збираюся намалювати його у вигляді квадрата, 32 біт, назвемо його T. 385 00:21:47,730 --> 00:21:49,740 А потім я збираюся зробити отримує с. 386 00:21:49,740 --> 00:21:51,130 >> Ну, що ж це значить? 387 00:21:51,130 --> 00:21:53,280 Ну, це трохи важко думати Про це уявити мудрим. 388 00:21:53,280 --> 00:21:55,025 Але давайте подумаємо про що всередині х? 389 00:21:55,025 --> 00:21:59,430 Що буквально в цю змінну? 390 00:21:59,430 --> 00:22:01,500 Значення Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Тому коли я кажу T отримує рядок з, що тільки буквально означає взяти число 392 00:22:05,815 --> 00:22:10,070 в с, що Ox123 і поклав його Ox123. 393 00:22:10,070 --> 00:22:13,740 Або графічно, якщо я як би абстрактним від яких докладно він має 394 00:22:13,740 --> 00:22:16,600 Ефект буквально робить це також. 395 00:22:16,600 --> 00:22:22,110 >> Так що тепер, згадайте, коли минулого тижня ми приступили до капіталістичного T. Я 396 00:22:22,110 --> 00:22:23,800 T зробив кронштейн 0. 397 00:22:23,800 --> 00:22:27,150 Ну, T кронштейн 0, навіть якщо це покажчик, ви можете розглядати його як ніби 398 00:22:27,150 --> 00:22:29,220 це масив, з квадратним дужок. 399 00:22:29,220 --> 00:22:31,550 >> То де T 0 кронштейн? 400 00:22:31,550 --> 00:22:32,990 Ну, це година. 401 00:22:32,990 --> 00:22:36,800 І тому, коли ми використовуємо цей рядок коду, Два верхніх, що в цьому з type.h 402 00:22:36,800 --> 00:22:38,460 Файл заголовка, ось де вони оголошені. 403 00:22:38,460 --> 00:22:44,410 Ви капіталізації цієї H. Але, Звичайно, це точно такий же ось год 404 00:22:44,410 --> 00:22:46,540 Всередині з, так би мовити. 405 00:22:46,540 --> 00:22:51,930 І ось тепер ви змінили або капіталізуються як оригінальну і 406 00:22:51,930 --> 00:22:53,120 так звані копії. 407 00:22:53,120 --> 00:22:56,620 Тому що ви не зробити копію чином, що людині хотілося б її бачити. 408 00:22:56,620 --> 00:22:59,710 >> Так що ж виправлення тут, У copy1.c минулого тижня? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Функції, так що ми могли фактично скопіювати рядок. 411 00:23:05,580 --> 00:23:08,700 І важливо, що ж нам потрібно, щоб зробити для того, щоб скопіювати рядок? 412 00:23:08,700 --> 00:23:12,070 >> Ну, в цьому зеленому версію тут я збирається зробити це досить низькому рівні. 413 00:23:12,070 --> 00:23:14,260 Є насправді функції вони могли б допомогти з цим. 414 00:23:14,260 --> 00:23:17,710 Але самий основний, причому найбільш знайома, принаймні, незабаром буде 415 00:23:17,710 --> 00:23:19,600 знайомий нам, наступний - 416 00:23:19,600 --> 00:23:21,910 так що на першій лінії коду в зелений цих пір. 417 00:23:21,910 --> 00:23:23,970 >> Я просто переписав з, як символ *. 418 00:23:23,970 --> 00:23:25,250 Там немає функціонального різниці немає. 419 00:23:25,250 --> 00:23:28,790 Я просто викинув CS50 бібліотеку і Я дзвоню його, як це, символ *. 420 00:23:28,790 --> 00:23:31,640 >> Тепер точка, точка, точка, тому що були обробку помилок, що ні 421 00:23:31,640 --> 00:23:33,200 Цікаво говорити про знову. 422 00:23:33,200 --> 00:23:34,710 Так що тепер Т оголошений. 423 00:23:34,710 --> 00:23:35,780 Це теж символ *. 424 00:23:35,780 --> 00:23:38,280 Так що я звернув на маленькій площі Екран, як раніше. 425 00:23:38,280 --> 00:23:41,870 >> Але, з правого боку, Malloc, ми сказали це пам'ять виділити. 426 00:23:41,870 --> 00:23:44,130 Так що виділити кілька шматок пам'яті. 427 00:23:44,130 --> 00:23:48,830 І скільки байт ми насправді хочемо виділити, вона здається? 428 00:23:48,830 --> 00:23:50,340 >> Ну, довжина рядка с. 429 00:23:50,340 --> 00:23:52,310 Так що якщо це привіт це буде п'ять. 430 00:23:52,310 --> 00:23:53,950 Ми скажемо, ч-е-л-л-о. 431 00:23:53,950 --> 00:23:55,090 Так п'ять байт. 432 00:23:55,090 --> 00:23:57,960 >> Але тоді плюс 1, то чому 1? 433 00:23:57,960 --> 00:23:58,830 Символ 0. 434 00:23:58,830 --> 00:24:03,640 Якщо ми не залишають місця для цього хлопця ми може випадково створити ситуацію, 435 00:24:03,640 --> 00:24:05,600 , Де знаходиться рядок ч-е-л-л-о. 436 00:24:05,600 --> 00:24:08,470 А потім наступний GetString час Я подзвонив і ввести, наприклад, 437 00:24:08,470 --> 00:24:14,020 Девід, D - V-I-д, комп'ютер буде думати, що їй насправді 438 00:24:14,020 --> 00:24:18,900 ч-е-л-л-о-д-а-в-і-D, тому що є Без перерви між цими словами. 439 00:24:18,900 --> 00:24:19,810 >> Так що нам потрібно, що перерва. 440 00:24:19,810 --> 00:24:20,720 Таким чином, ми не хочемо, п'ять. 441 00:24:20,720 --> 00:24:22,100 Ми хочемо шість байт. 442 00:24:22,100 --> 00:24:23,110 >> І я кажу байт. 443 00:24:23,110 --> 00:24:25,220 Але це дійсно час розмір символів. 444 00:24:25,220 --> 00:24:28,040 Технічно символ майже завжди один байт. 445 00:24:28,040 --> 00:24:31,030 >> Але тільки, щоб зробити наш код портативний, так би мовити, так що він працює на 446 00:24:31,030 --> 00:24:33,750 різних комп'ютерах, навіть якщо вони можуть бути дещо іншою під 447 00:24:33,750 --> 00:24:36,590 капот, я збираюся загальному кажуть розмір так, щоб символ 448 00:24:36,590 --> 00:24:37,660 мій код завжди працює. 449 00:24:37,660 --> 00:24:40,610 І я не доведеться перекомпілювати це просто тому що я оновити мій комп'ютер або використовувати 450 00:24:40,610 --> 00:24:42,140 кілька різних платформ. 451 00:24:42,140 --> 00:24:45,300 >> Так що я отримав 6 разів більше символ, який буває 1. 452 00:24:45,300 --> 00:24:47,440 Так, щоб кошти могли Malloc дати мені шість байт. 453 00:24:47,440 --> 00:24:49,140 Що це насправді робити? 454 00:24:49,140 --> 00:24:52,810 Ну, дозвольте мені повернутися в часі тут туди, де ми знаходимося в історію. 455 00:24:52,810 --> 00:24:57,620 >> Так що, якщо я повернуся сюди, я оголосив символ * звані Т. 456 00:24:57,620 --> 00:25:00,280 Я тепер називається Malloc протягом шести байтів. 457 00:25:00,280 --> 00:25:06,400 А тепер я збираюся зробити ці шість байт як масив раніше. 458 00:25:06,400 --> 00:25:10,570 Але я насправді не знаю, що це всередині цього масиву. 459 00:25:10,570 --> 00:25:14,640 >> Якщо ви виділити пам'ять виявляється, що Ви не можете довіряти, що є деякі 460 00:25:14,640 --> 00:25:15,810 Відоме значення там. 461 00:25:15,810 --> 00:25:18,400 Це можна було б використати на щось інакше, деякі інші функції, деякі інші 462 00:25:18,400 --> 00:25:19,630 рядка коду, який ви написали. 463 00:25:19,630 --> 00:25:22,870 Так що ми зазвичай називаємо цим сміттям значення та залучити їх, може бути, як 464 00:25:22,870 --> 00:25:26,170 знаки питання, тільки про те, що ми Не знаю, що насправді там. 465 00:25:26,170 --> 00:25:30,390 І це не велика справа, поки ми досить розумні, щоб перезаписати 466 00:25:30,390 --> 00:25:34,550 сміття значення з номерами або символи, які нас цікавлять. 467 00:25:34,550 --> 00:25:36,340 >> Тому в даному випадку те, що я збираюся робити? 468 00:25:36,340 --> 00:25:38,670 Ну, моя рядок коду Далі, у мене є чотири. 469 00:25:38,670 --> 00:25:41,350 Int я отримую 0, п отримує довжина рядка с. 470 00:25:41,350 --> 00:25:42,750 Так знайома циклу. 471 00:25:42,750 --> 00:25:45,875 Я менше або дорівнює п, який зазвичай вище. 472 00:25:45,875 --> 00:25:47,500 >> Але на цей раз це навмисно. 473 00:25:47,500 --> 00:25:51,890 Я + +, а потім я просто роблю т кронштейна я отримує с. 474 00:25:51,890 --> 00:25:56,320 Тому що моя картина виглядає як це в цей момент зберігається в т є 475 00:25:56,320 --> 00:25:59,530 адресу цього випадкового блок пам'яті , Значення яких невідомі. 476 00:25:59,530 --> 00:26:03,030 Але як тільки я роблю т кронштейна 0, який ставить мене тут. 477 00:26:03,030 --> 00:26:07,430 >> І те, що закінчує тим, що тягне туди? 478 00:26:07,430 --> 00:26:08,740 Ми в кінцевому підсумку покласти ч. 479 00:26:08,740 --> 00:26:11,170 Тому що це те, що стоїть на кронштейні з 0. 480 00:26:11,170 --> 00:26:14,300 А потім те ж саме для е і л і л і о. 481 00:26:14,300 --> 00:26:17,930 >> N, чому не пішов через дорівнює п? 482 00:26:17,930 --> 00:26:19,200 Через 0 характеру. 483 00:26:19,200 --> 00:26:23,580 Так просто бути ясно, то, якщо я насправді стерти всі ці сміття 484 00:26:23,580 --> 00:26:28,870 значення, а потім фактично малювати в те, що я очікував, це з кронштейном 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, плюс який задньому новий характер. 486 00:26:32,440 --> 00:26:36,080 >> І ось тепер, якщо ми продовжимо повз точки, точка, точка в цьому правильна версія 487 00:26:36,080 --> 00:26:41,930 і капіталізовані кронштейн Т +0 я б, Звичайно, бути капіталізації тільки в цьому 488 00:26:41,930 --> 00:26:47,050 хлопець тут, що в принципі, в кінцевому рахунку мета. 489 00:26:47,050 --> 00:26:48,040 Так що все покажчика. 490 00:26:48,040 --> 00:26:51,430 >> І ти використовував їх протягом тижня Тепер в контексті рядків. 491 00:26:51,430 --> 00:26:53,530 Але під капотом вони трохи більш складною. 492 00:26:53,530 --> 00:26:57,520 Але якщо ви думаєте про них у цьому наочній формі я пропоную, щоб вони 493 00:26:57,520 --> 00:27:01,720 ймовірно, не все так страшно, як вони може здатися на перший погляд, 494 00:27:01,720 --> 00:27:04,730 Особливо з такою новий синтаксис. 495 00:27:04,730 --> 00:27:07,290 Будь-які питання за вказівниками, рядків або символів? 496 00:27:07,290 --> 00:27:07,580 Так? 497 00:27:07,580 --> 00:27:09,252 >> Зали: Можна повернутися назад в [нерозбірливо]? 498 00:27:09,252 --> 00:27:10,502 >> Виступаючий 1: Звичайно. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> АУДИТОРІЯ: Так як же у вашій найостаннішої лінії, у вас немає лінії T * 501 00:27:19,525 --> 00:27:21,513 і A * S в лінії? 502 00:27:21,513 --> 00:27:23,004 Чи немає у вас посилання на - 503 00:27:23,004 --> 00:27:24,640 >> Виступаючий 1: Ах, дуже хороше запитання. 504 00:27:24,640 --> 00:27:26,800 Чому у мене немає і Т * A * S? 505 00:27:26,800 --> 00:27:30,340 Так коротко, минулого тижня, як і в нашій поміняти функції, я дійсно говорив, що, коли 506 00:27:30,340 --> 00:27:33,350 у вас є вказівник засіб, за допомогою який Ви йдете туди, як ми зробили 507 00:27:33,350 --> 00:27:36,590 фізично на сцені, був насправді використовувати зірку оператора. 508 00:27:36,590 --> 00:27:40,570 >> Виявляється, що ця квадратних дужок позначення, що ми назвемо синтаксичних 509 00:27:40,570 --> 00:27:44,190 цукор, який знаходиться всього в сексуальний спосіб кажуть, що це скорочений запис 510 00:27:44,190 --> 00:27:45,950 саме те, що ви описуєте. 511 00:27:45,950 --> 00:27:49,385 Але це трохи більш інтуїтивним. 512 00:27:49,385 --> 00:27:53,510 І в той ризик прийняття цього здаються більш складніше, ніж вона повинна бути, 513 00:27:53,510 --> 00:27:56,990 те, що відбувається насправді тут є наступне - 514 00:27:56,990 --> 00:28:01,450 Якщо я скажу, що T * означає піти в адресою, збереженому в т. 515 00:28:01,450 --> 00:28:04,350 >> Так буквально, якщо Т зберігання адресу цієї год 516 00:28:04,350 --> 00:28:07,300 Спочатку * T кошти йдуть сюди. 517 00:28:07,300 --> 00:28:10,730 Отже, що ж т кронштейна 0 означає? 518 00:28:10,730 --> 00:28:11,560 Точно такий же речі. 519 00:28:11,560 --> 00:28:13,510 Це просто трохи більше користувачів дружній писати. 520 00:28:13,510 --> 00:28:14,430 >> Але я ще не закінчив. 521 00:28:14,430 --> 00:28:17,800 Я не можу просто сказати * T * отримує с. 522 00:28:17,800 --> 00:28:19,440 Тому що те, що я буду робити тоді? 523 00:28:19,440 --> 00:28:22,950 Я б покласти Н, Н, Н, Н, Н протягом усього цього. 524 00:28:22,950 --> 00:28:22,995 Вірно? 525 00:28:22,995 --> 00:28:26,020 >> Тому що Т * перейти за адресою в т. 526 00:28:26,020 --> 00:28:27,580 Однак ми всередині циклу. 527 00:28:27,580 --> 00:28:32,150 І яке значення я прирощення, Звичайно, на кожній ітерації? 528 00:28:32,150 --> 00:28:32,690 я. 529 00:28:32,690 --> 00:28:34,590 >> Але є можливість Тут, правда? 530 00:28:34,590 --> 00:28:37,870 Навіть якщо це відчуває, як вона стає трохи складнішою 531 00:28:37,870 --> 00:28:40,730 ніж квадратних дужок ми використовували протягом деякого часу - 532 00:28:40,730 --> 00:28:43,840 дозвольте мені скасувати мій год зміна там - 533 00:28:43,840 --> 00:28:48,870 хоча це тепер стає трохи любитель, основна ідея, якщо T * 534 00:28:48,870 --> 00:28:53,630 означає тут і * т тільки перейти за адресою в т. 535 00:28:53,630 --> 00:28:54,990 >> Але те, що адреса в т? 536 00:28:54,990 --> 00:28:56,850 Числа ми продовжувати використовувати? 537 00:28:56,850 --> 00:29:00,540 Як Ox456, давайте повернути це тільки заради обговорення. 538 00:29:00,540 --> 00:29:05,380 Ну, якщо я хочу отримати на е в T рядків, я просто хочу йти, 539 00:29:05,380 --> 00:29:06,460 По суті, 456. 540 00:29:06,460 --> 00:29:09,230 >> Або, скоріше, 457. 541 00:29:09,230 --> 00:29:10,590 Мені просто потрібно, додайте один. 542 00:29:10,590 --> 00:29:11,790 Але я можу зробити це, чи не так? 543 00:29:11,790 --> 00:29:14,680 Оскільки т, хоча я зберегти малюнок його зараз, як стріла, це просто 544 00:29:14,680 --> 00:29:16,570 число, Ox456. 545 00:29:16,570 --> 00:29:21,400 І якщо я додам, що один або більше Як правило, якщо я додам я до того, я можу 546 00:29:21,400 --> 00:29:24,350 насправді отримати саме там, де я хочу. 547 00:29:24,350 --> 00:29:26,260 Так що, якщо я насправді зробити це - 548 00:29:26,260 --> 00:29:28,970 і це те, що тепер називається арифметика покажчиків - 549 00:29:28,970 --> 00:29:30,375 Я можу видалити цю лінію. 550 00:29:30,375 --> 00:29:33,550 Що, чесно кажучи, я думаю, що ясніше і більш зрозумілим користувачеві читати. 551 00:29:33,550 --> 00:29:35,970 Але це не менш правильно. 552 00:29:35,970 --> 00:29:38,570 >> Цей рядок коду тепер використовує арифметики покажчиків. 553 00:29:38,570 --> 00:29:40,920 Це говорить піти в після виступу - 554 00:29:40,920 --> 00:29:44,670 незалежно від початку т в тому, який є T Plus I, який спочатку 555 00:29:44,670 --> 00:29:45,730 дорівнює 0, і це здорово. 556 00:29:45,730 --> 00:29:49,280 Оскільки це означає початок т плюс один, плюс два, плюс 3, і так далі. 557 00:29:49,280 --> 00:29:51,030 І те ж саме справу з с. 558 00:29:51,030 --> 00:29:52,750 >> Так синтаксичний цукор для цього. 559 00:29:52,750 --> 00:29:55,900 Але розуміння того, що відбувається насправді під капотом, я б сказав, 560 00:29:55,900 --> 00:29:57,410 насправді корисно саме по собі. 561 00:29:57,410 --> 00:30:00,620 Тому що це означає тепер їсти не набагато більше магії відбувається 562 00:30:00,620 --> 00:30:01,620 під капотом. 563 00:30:01,620 --> 00:30:03,920 Там не буде багато більше шари, які ми можемо відігніть для вас. 564 00:30:03,920 --> 00:30:04,810 Це с. 565 00:30:04,810 --> 00:30:06,410 І це програмування. 566 00:30:06,410 --> 00:30:08,002 Дуже гарне питання. 567 00:30:08,002 --> 00:30:11,570 >> Гаразд, так що це було те, що дитяча коляска програма, яку я мав на увазі раніше. 568 00:30:11,570 --> 00:30:12,650 своп був зіпсований. 569 00:30:12,650 --> 00:30:14,070 Якщо дійсно схоже на роботу. 570 00:30:14,070 --> 00:30:17,390 Нагадаємо, що так само, як з молоком і Апельсиновий сік - який я почав 571 00:30:17,390 --> 00:30:18,660 питної сьогоднішній демонстрації. 572 00:30:18,660 --> 00:30:22,220 Так само, як з апельсиновим соком і молоко, ми повинні використовувати 573 00:30:22,220 --> 00:30:26,200 тимчасову змінну TMP, провести тимчасово, так що ми могли тоді 574 00:30:26,200 --> 00:30:28,820 змінити його значення, а потім обновити б. 575 00:30:28,820 --> 00:30:32,870 >> Але ця функція, ми сказали, чи це Програма, в якій ця функція була 576 00:30:32,870 --> 00:30:35,670 написано було неправильно, і недоліки, то чому? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Так? 579 00:30:39,090 --> 00:30:42,471 >> АУДИТОРІЯ: [нерозбірливо]. 580 00:30:42,471 --> 00:30:44,940 >> Виступаючий 1: Точно, коли ви називаєте своп - 581 00:30:44,940 --> 00:30:47,820 або, більш узагальнено, коли називають самим будь-яку функцію - 582 00:30:47,820 --> 00:30:51,210 якщо аргументи для цієї функції є примітивних, так би мовити, цілі і символи 583 00:30:51,210 --> 00:30:56,740 і парному розрядах і плаває, то, без зірки, ви проходите в копію 584 00:30:56,740 --> 00:30:57,540 аргумент. 585 00:30:57,540 --> 00:31:01,580 Так що якщо х був 1 і у 2 було, збирається бути 1 і B буде 2. 586 00:31:01,580 --> 00:31:05,250 Але вони збираються бути різними шматками бітів, різні порції 587 00:31:05,250 --> 00:31:07,540 пам'яті, які, трапляється, зберігання однакові значення. 588 00:31:07,540 --> 00:31:12,160 >> Так що цей код є супер досконалий при перекачуванні і б. 589 00:31:12,160 --> 00:31:13,850 Це нікуди не годиться при перекачуванні - 590 00:31:13,850 --> 00:31:15,290 у прикладі минулого тижня - 591 00:31:15,290 --> 00:31:16,390 х і у. 592 00:31:16,390 --> 00:31:18,780 Бо знову ж, вони в неправильній області. 593 00:31:18,780 --> 00:31:21,310 >> Тепер, як ми йти про фіксацію цього? 594 00:31:21,310 --> 00:31:23,140 Ми повинні були зробити функцію виглядати трохи потворніше. 595 00:31:23,140 --> 00:31:25,250 Але, знову ж, розглянемо, що це просто означає. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> А насправді, дозвольте мені, для послідовності, змінити одну річ так що це ідентично 598 00:31:31,500 --> 00:31:33,200 те, що ми тільки що зробили. 599 00:31:33,200 --> 00:31:35,690 Як я вже говорив минулого тижня, він не має значення, де він йде. 600 00:31:35,690 --> 00:31:38,120 Насправді, Вам потрібно буде поставити зірочку поряд з ім'ям змінної. 601 00:31:38,120 --> 00:31:40,750 Але я думаю, було б трохи легше розглянути * поруч 602 00:31:40,750 --> 00:31:44,910 Тип даних у тому сенсі, що це покажчик до Цілочисельне в цьому випадку. 603 00:31:44,910 --> 00:31:46,270 >> Так що я тут роблю? 604 00:31:46,270 --> 00:31:49,590 Я кажу, що мені не дають Цілочисельне пішов ще один Інтелект, 605 00:31:49,590 --> 00:31:50,810 називаючи їх А і Б. 606 00:31:50,810 --> 00:31:52,460 Дайте мені адресу Int. 607 00:31:52,460 --> 00:31:53,960 Дайте мені адресу іншого Int. 608 00:31:53,960 --> 00:31:56,330 Зателефонуйте ці адреси А і В. 609 00:31:56,330 --> 00:32:00,860 >> А потім за допомогою позначення вниз * нижче, перейдіть до кожного з цих адрес 610 00:32:00,860 --> 00:32:05,290 в міру необхідності або отримати або встановіть його значення. 611 00:32:05,290 --> 00:32:07,400 Але є виняток. 612 00:32:07,400 --> 00:32:11,130 Чому я не * поруч з TMP? 613 00:32:11,130 --> 00:32:15,070 Чому я не робив цього, наприклад? 614 00:32:15,070 --> 00:32:19,370 Таке відчуття, що я б просто йти все , І виправити все це. 615 00:32:19,370 --> 00:32:19,752 Так? 616 00:32:19,752 --> 00:32:21,002 >> АУДИТОРІЯ: [нерозбірливо]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Виступаючий 1: Я не заявили TMP у вигляді рядка. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Так що це буде оголосити, в даному випадку, TMP бути адреса Int. 621 00:32:34,950 --> 00:32:37,380 Але це не зовсім те, що я хочу, з кількох причин. 622 00:32:37,380 --> 00:32:38,616 >> Зали: Ви не хочете, щоб поміняти їх місцями. 623 00:32:38,616 --> 00:32:41,800 >> Виступаючий 1: Точно, я не хочу, щоб поміняти нічого з TMP. TMP просто 624 00:32:41,800 --> 00:32:42,790 тиждень-один матеріал. 625 00:32:42,790 --> 00:32:45,150 Все, що я хочу, є змінною зберігати деяке число. 626 00:32:45,150 --> 00:32:47,330 Я навіть не дбають про адреси в цей момент. 627 00:32:47,330 --> 00:32:50,530 >> Мені просто потрібно 32 біт або тому для зберігання Int. 628 00:32:50,530 --> 00:32:56,690 І я хочу поставити в цих 32 біт все, що не в, так би мовити, але 629 00:32:56,690 --> 00:33:01,260 про що йде, просто щоб бути більш точним. 630 00:33:01,260 --> 00:33:06,420 Тому що, якщо це адреса, * означає, піти туди і отримати значення 1. 631 00:33:06,420 --> 00:33:10,560 Наприклад, у прикладі минулого тижня або у випадку Б, отримаємо значення 2. 632 00:33:10,560 --> 00:33:11,750 >> Так що ж відбувається насправді? 633 00:33:11,750 --> 00:33:15,070 Дозвольте мені намалювати картину тут, що тільки дражнити один від одного частини сьогодні. 634 00:33:15,070 --> 00:33:18,580 Але це будуть продовжувати з'являтися протягом досить довгого часу. 635 00:33:18,580 --> 00:33:22,430 >> Це, я стверджую, те, що ваш комп'ютер пам'яті виглядає, коли ви запускаєте 636 00:33:22,430 --> 00:33:24,060 програми, будь-якої програми. 637 00:33:24,060 --> 00:33:28,340 Коли ви запускаєте програму на самому верху оперативної пам'яті комп'ютера - так що думаю 638 00:33:28,340 --> 00:33:33,530 цього прямокутника, по-справжньому, так як ваш комп'ютера оперативна пам'ять або пам'ять, всі 101 639 00:33:33,530 --> 00:33:36,920 мільярд байт з неї всі два мільярди байт, всі два гігабайти це, 640 00:33:36,920 --> 00:33:39,910 незалежно від кількості у вас є, намалюємо його у вигляді прямокутника. 641 00:33:39,910 --> 00:33:43,260 І я стверджую, що, коли ви запускаєте програму як Microsoft Word або Chrome 642 00:33:43,260 --> 00:33:49,220 або що-небудь подібне, біти, Microsoft або Google, що написав - 643 00:33:49,220 --> 00:33:50,910 у випадках цих програм - 644 00:33:50,910 --> 00:33:54,490 завантажуються в пам'ять комп'ютера де вони можуть бути виконані більш 645 00:33:54,490 --> 00:33:57,520 швидко і подається в процесор, який є мозком комп'ютера. 646 00:33:57,520 --> 00:34:00,940 >> І ТАМ вони зберігаються в самому верху вашої програми, так би мовити. 647 00:34:00,940 --> 00:34:03,300 Іншими словами, якщо це шматок пам'яті, коли ви двічі клацніть на 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, біти приходять з жорсткого диска. 649 00:34:05,740 --> 00:34:06,680 Вони завантажуються в оперативну пам'ять. 650 00:34:06,680 --> 00:34:10,330 І ми будемо пхати їх на самому верху цього прямокутника концептуально. 651 00:34:10,330 --> 00:34:13,010 >> Ну, решта ваша пам'ять використовувати для різних речей. 652 00:34:13,010 --> 00:34:16,460 На самому верху ви бачите ініціалізації даних і ініціалізації даних. 653 00:34:16,460 --> 00:34:20,500 Це пов'язано, здебільшого, при константами або глобальні змінні 654 00:34:20,500 --> 00:34:21,340 які мають значення. 655 00:34:21,340 --> 00:34:22,980 Але більше на тих іншим разом. 656 00:34:22,980 --> 00:34:25,150 >> Тоді у вас є купа, яка ми будемо повертатися. 657 00:34:25,150 --> 00:34:28,420 Але на дні частини, яка Особливо доречні прямо зараз. 658 00:34:28,420 --> 00:34:30,210 Це так званий стек. 659 00:34:30,210 --> 00:34:33,850 Так само, як у більшості будь-яких D зал тут, на кампуса, у вас є ті лотки, які 660 00:34:33,850 --> 00:34:37,210 просто стек поверх один одного на якому Ви можете покласти їжу і ще багато чого. 661 00:34:37,210 --> 00:34:40,139 Стек в комп'ютерній системі дуже схожі. 662 00:34:40,139 --> 00:34:42,679 За винятком у той час як лоток, як ми використовуємо в їдальні, звичайно, мається на увазі 663 00:34:42,679 --> 00:34:45,710 нести речі лотків або кадри - 664 00:34:45,710 --> 00:34:49,469 як ми будемо називати їх - у комп'ютері пам'яті використовується для зберігання 665 00:34:49,469 --> 00:34:51,610 змінних і їх значень. 666 00:34:51,610 --> 00:34:53,929 >> Так що ж насправді відбувається під капотом? 667 00:34:53,929 --> 00:34:55,820 Ну, дозвольте мені перевернутися на екран тут. 668 00:34:55,820 --> 00:34:58,370 І давайте зосередимося тільки на Нижня частина на мить. 669 00:34:58,370 --> 00:35:02,770 Якщо це нижня частина мій пам'яті комп'ютера виявляється, коли я 670 00:35:02,770 --> 00:35:05,350 викликати функцію основного - що відбувається, чесно кажучи, 671 00:35:05,350 --> 00:35:06,950 автоматично для мене - 672 00:35:06,950 --> 00:35:10,510 Я отримую шматок пам'яті в глибини моєї пам'яті, так би мовити. 673 00:35:10,510 --> 00:35:13,390 І тут це основний локальні змінні йти. 674 00:35:13,390 --> 00:35:16,770 Це місце, де ARGC ARGV і, може бути, йти, і я всі змінні 675 00:35:16,770 --> 00:35:18,170 оголосити всередині основного. 676 00:35:18,170 --> 00:35:20,260 Вони в кінцевому підсумку на дні оперативної пам'яті мого комп'ютера. 677 00:35:20,260 --> 00:35:25,040 >> Тепер припустимо, що основним викликає функцію як своп, як це було минулого тижня? 678 00:35:25,040 --> 00:35:30,620 Ну, ми, по суті поставив новий лоток, Новий кадр, на мій шматок пам'яті. 679 00:35:30,620 --> 00:35:34,160 І я збираюся описати це як належать своп функції. 680 00:35:34,160 --> 00:35:35,770 >> Тепер, що всередині своп? 681 00:35:35,770 --> 00:35:39,240 Також, на основі програми минулого тижня і той, який ми тільки що бачили уривок з, 682 00:35:39,240 --> 00:35:46,590 у кадрі свопу, або свопу Лоток, це те, що змінні? 683 00:35:46,590 --> 00:35:47,970 Ну, а, б. 684 00:35:47,970 --> 00:35:51,850 Тому що ті були свої місцеві аргументи, а також третій, TMP. 685 00:35:51,850 --> 00:35:54,470 Так насправді, я міг би звернути на це трохи більш акуратно. 686 00:35:54,470 --> 00:35:56,680 Дозвольте мені піти далі і скасувати етикетці. 687 00:35:56,680 --> 00:35:58,520 І дозвольте мені стверджувати, що ви знаєте, що? 688 00:35:58,520 --> 00:36:00,560 >> , Ймовірно, буде в кінцевому підсумку тут. 689 00:36:00,560 --> 00:36:02,160 B закінчиться тут. 690 00:36:02,160 --> 00:36:03,810 І TMP закінчиться тут. 691 00:36:03,810 --> 00:36:05,160 Тепер, упорядкування може буде трохи відрізнятися. 692 00:36:05,160 --> 00:36:06,840 Але концептуально це ідея. 693 00:36:06,840 --> 00:36:11,490 >> І тільки колективно, це те, що ми будемо називати кадр свопу, або 694 00:36:11,490 --> 00:36:12,136 їдальні лоток. 695 00:36:12,136 --> 00:36:13,150 І те ж саме справу з основним. 696 00:36:13,150 --> 00:36:14,040 Але я не буду, що перемалювати. 697 00:36:14,040 --> 00:36:17,810 Але от де і ARGC ARGV і будь-які своїх локальних змінних, як х і у 698 00:36:17,810 --> 00:36:18,940 може бути також. 699 00:36:18,940 --> 00:36:22,170 >> Отже, тепер розглянемо, що відбувається насправді при виклику підкачки. 700 00:36:22,170 --> 00:36:26,370 При виклику своп, як виконання коду це, ви передаєте, в 701 00:36:26,370 --> 00:36:30,670 версію з помилками, а і б також копії х і у. 702 00:36:30,670 --> 00:36:34,300 Тому, якщо я зараз роблю такий на екрані - 703 00:36:34,300 --> 00:36:36,700 повинен краще на це - 704 00:36:36,700 --> 00:36:40,850 так що історія, яку я розповідав про себе був у цій версії баггі, коли ми 705 00:36:40,850 --> 00:36:46,130 зателефонуйте поміняти проходить в буквальному А і В як цілі числа, що насправді відбувається? 706 00:36:46,130 --> 00:36:48,250 >> Ну, те, що відбувається насправді полягає в наступному. 707 00:36:48,250 --> 00:36:52,850 Дозвольте мені йти вперед і просто скасувати прояснити деякі місця тут. 708 00:36:52,850 --> 00:36:54,720 Так що це моя пам'ять комп'ютера. 709 00:36:54,720 --> 00:36:57,510 >> Так що, якщо у мене, наприклад, - 710 00:36:57,510 --> 00:36:58,910 насправді давайте зробимо це таким чином - 711 00:36:58,910 --> 00:37:02,690 Якщо я стверджую, що це X, зберігання значення 1, як і минулого тижня. 712 00:37:02,690 --> 00:37:05,930 І це у, зберігання значення 2 так само, як минулого тижня. 713 00:37:05,930 --> 00:37:11,370 І це є головним, коли я дзвоню свопу, тим самим даючи собі доступ до і 714 00:37:11,370 --> 00:37:15,150 B і TMP, я збираюся стверджувати, що це і це 1. 715 00:37:15,150 --> 00:37:16,080 >> Це б. 716 00:37:16,080 --> 00:37:17,010 Це два. 717 00:37:17,010 --> 00:37:18,370 Це називається TMP. 718 00:37:18,370 --> 00:37:23,360 >> А спочатку, вона має деякі сміття значення поки я фактично не зберігайте в ньому, 719 00:37:23,360 --> 00:37:24,450 якої дорівнює 1. 720 00:37:24,450 --> 00:37:28,320 Тоді я йду вперед і змінити те, що? 721 00:37:28,320 --> 00:37:29,720 Б значення. 722 00:37:29,720 --> 00:37:31,980 >> І ось тепер у мене є два тут. 723 00:37:31,980 --> 00:37:34,050 І тоді ми сказали б отримує TMP. 724 00:37:34,050 --> 00:37:37,670 Знову ж, як і санітарної перевірки, третій рядок коду тут просто це 725 00:37:37,670 --> 00:37:39,440 Один з них, B отримує TMP. 726 00:37:39,440 --> 00:37:41,730 >> І ось, нарешті, що мені робити? 727 00:37:41,730 --> 00:37:46,800 Я йду вперед і змінити б бути все, що Значення TMP є, що 1. 728 00:37:46,800 --> 00:37:48,390 Я не торкаюся TMP знову. 729 00:37:48,390 --> 00:37:54,100 >> Але тепер, проблема в тому, як тільки своп повертається, тому що це не вручати 730 00:37:54,100 --> 00:37:57,540 повернути частину вартості, немає повернення команда явно в ньому. 731 00:37:57,540 --> 00:37:59,080 Що насправді відбувається? 732 00:37:59,080 --> 00:38:03,480 Ну, по суті, всі ця пам'ять - 733 00:38:03,480 --> 00:38:07,410 ОК, мабуть любить ластик тільки один палець за один раз - 734 00:38:07,410 --> 00:38:08,180 просто зникає. 735 00:38:08,180 --> 00:38:10,070 >> Зараз насправді це не нікуди не дінешся. 736 00:38:10,070 --> 00:38:11,810 Але ви можете думати про це Тепер у вигляді знаків питання. 737 00:38:11,810 --> 00:38:14,040 Тому що це вже не фактично використовується. 738 00:38:14,040 --> 00:38:17,470 І нічого не робиться з цими значеннями. 739 00:38:17,470 --> 00:38:21,920 >> Таким чином, у випадку з зеленим версії цей код, а не те, що в даний час 740 00:38:21,920 --> 00:38:24,640 перейшла в своп? 741 00:38:24,640 --> 00:38:25,770 Так адреси. 742 00:38:25,770 --> 00:38:28,520 Таким чином, адреса х і адреса у. 743 00:38:28,520 --> 00:38:35,790 Тому, якщо ми переказати цю історію один останній час, і я насправді зробити своп знову, 744 00:38:35,790 --> 00:38:44,620 але з покажчиками, що є, це буття B, і цей є TMP, що 745 00:38:44,620 --> 00:38:49,080 насправді зберігається в в цьому зеленому версія мого коду, де я передаю 746 00:38:49,080 --> 00:38:52,110 в адресах? 747 00:38:52,110 --> 00:38:53,780 >> Це збирається бути дороговказом на х. 748 00:38:53,780 --> 00:38:54,890 Так що я міг намалювати стрілку. 749 00:38:54,890 --> 00:38:57,310 Але давайте використовувати той же довільний Наприклад, як раніше. 750 00:38:57,310 --> 00:39:01,220 Давайте говорити, що це щось на зразок Ox123. 751 00:39:01,220 --> 00:39:04,970 І це буде, тому що Ox127 це чотири байти далеко, тому що це 752 00:39:04,970 --> 00:39:07,370 Інтелект, таким Ox127. 753 00:39:07,370 --> 00:39:09,080 >> І знову ж, я беру деякі вільності з номерами. 754 00:39:09,080 --> 00:39:11,430 Вони набагато менше, ніж вони були б дійсно може бути і в іншому порядку. 755 00:39:11,430 --> 00:39:14,350 Але це, як картина Зараз інший. 756 00:39:14,350 --> 00:39:19,060 >> Але коли я використовую цю зелену код і я десяткового TMP отримати *. 757 00:39:19,060 --> 00:39:25,010 * Засіб зробити наступне, візьми -Адресу, в і йти до неї, 758 00:39:25,010 --> 00:39:26,190 якої дорівнює 1. 759 00:39:26,190 --> 00:39:28,480 І ось що я після цього покласти в TMP. 760 00:39:28,480 --> 00:39:32,480 Тим часом, у наступному рядку коду Тут * отримує B, що це означає? 761 00:39:32,480 --> 00:39:36,910 >> Ну, *, так що йти тут отримує * B, що означає піти туди. 762 00:39:36,910 --> 00:39:39,310 А це означає, поставити значення там. 763 00:39:39,310 --> 00:39:43,670 Нарешті, останній рядок коду просто сказав * B отримує TMP. 764 00:39:43,670 --> 00:39:48,900 >> Так Б говорить піти туди і перезаписати його з TMP, який в цьому випадку буде 765 00:39:48,900 --> 00:39:51,520 бути знову 1. 766 00:39:51,520 --> 00:39:54,920 І ось чому зелена версія Наші роботи коду, у той час як червоні 767 00:39:54,920 --> 00:39:56,010 версія ніколи не робив. 768 00:39:56,010 --> 00:39:59,020 Все це просто зводиться до того, пам'ять управляється і, де це 769 00:39:59,020 --> 00:40:02,580 фактично розміщених у вашій оперативної пам'яті комп'ютера. 770 00:40:02,580 --> 00:40:07,270 І на даний момент, це одна з речей, що стек використовується для. 771 00:40:07,270 --> 00:40:09,225 >> Запитання за форматом? 772 00:40:09,225 --> 00:40:10,380 На покажчики? 773 00:40:10,380 --> 00:40:11,630 Або на своп? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Гаразд, Malloc, нагадаємо, зробив щось на зразок цього. 776 00:40:17,043 --> 00:40:18,260 Це було дуже простий приклад. 777 00:40:18,260 --> 00:40:20,550 І це був той, який Binky представив нас, хоча і досить 778 00:40:20,550 --> 00:40:21,870 швидко, в кінці класі. 779 00:40:21,870 --> 00:40:24,480 Чорт візьми, там ми йдемо знову. 780 00:40:24,480 --> 00:40:28,780 >> Таким чином нагадати, що це був приклад Бінкі представив нас, хоча і 781 00:40:28,780 --> 00:40:30,360 дещо швидше в кінці класі. 782 00:40:30,360 --> 00:40:33,640 І тут ми використовували дійсно Malloc вдруге. 783 00:40:33,640 --> 00:40:37,330 Тому що перший раз, коли ми використовували його для створити достатній обсяг оперативної пам'яті, виділити достатній обсяг оперативної пам'яті 784 00:40:37,330 --> 00:40:38,340 для зберігання рядка. 785 00:40:38,340 --> 00:40:40,250 >> На цей раз Binky тримали його простим. 786 00:40:40,250 --> 00:40:42,465 Так що це тільки для зберігання Інтелект, мабуть. 787 00:40:42,465 --> 00:40:43,510 І це абсолютно нормально. 788 00:40:43,510 --> 00:40:46,560 Це трохи дивно, чесно кажучи, для використовувати Malloc виділити одну Int. 789 00:40:46,560 --> 00:40:50,650 Але суть Claymation Ніка була насправді просто розповісти історію про те, що 790 00:40:50,650 --> 00:40:53,830 відбувається або не відбувається при Ви погано поводитися з пам'яттю. 791 00:40:53,830 --> 00:40:56,520 >> Таким чином, в цьому випадку ця програма зробив кілька речей. 792 00:40:56,520 --> 00:41:01,580 У першому випадку тут, він оголошує покажчик на X називається Int. 793 00:41:01,580 --> 00:41:04,480 Потім він оголошує покажчик називається г до Int. 794 00:41:04,480 --> 00:41:06,150 Потім він зберігає в X, то які? 795 00:41:06,150 --> 00:41:07,110 Хтось зараз. 796 00:41:07,110 --> 00:41:09,685 Що зберігається в X відповідно до Третій рядок цієї програми? 797 00:41:09,685 --> 00:41:12,380 >> АУДИТОРІЯ: [нерозбірливо]. 798 00:41:12,380 --> 00:41:14,130 >> Виступаючий 1: Ну, не зовсім байт, за, говорять. 799 00:41:14,130 --> 00:41:16,760 Точніше зараз. 800 00:41:16,760 --> 00:41:18,325 Що зберігається в X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Адреса, я думаю, що я чув. 803 00:41:22,060 --> 00:41:23,570 >> Отже, що ж Malloc повернутися? 804 00:41:23,570 --> 00:41:26,030 Malloc поведінково виділяє шматок пам'яті. 805 00:41:26,030 --> 00:41:27,850 Але як це дасть вам доступ до нього? 806 00:41:27,850 --> 00:41:29,460 Вона повертає що? 807 00:41:29,460 --> 00:41:32,000 Адреса першого байта в блок пам'яті. 808 00:41:32,000 --> 00:41:33,020 >> Тепер, це супер просто. 809 00:41:33,020 --> 00:41:35,380 Це всього лише один байт, що означає, рішення ми повертаємося є 810 00:41:35,380 --> 00:41:37,300 адреса цілком. 811 00:41:37,300 --> 00:41:42,070 Так що зберігати в х, то, це адреса цього блоку пам'яті. 812 00:41:42,070 --> 00:41:43,400 Між тим, що відбувається далі? 813 00:41:43,400 --> 00:41:45,890 Тому насправді, давайте йти вперед і відзначити це дуже швидко. 814 00:41:45,890 --> 00:41:52,490 >> Так що якщо ми йдемо до екрану тут і ми граємо на це десяткового * X і Y десяткового * 815 00:41:52,490 --> 00:41:53,740 збирається робити те, що для мене? 816 00:41:53,740 --> 00:41:58,280 Я стверджую, що це тільки збирається зробити щось на зразок цього і назвемо його X, і 817 00:41:58,280 --> 00:42:00,010 це і називають його у. 818 00:42:00,010 --> 00:42:03,110 Тим часом, в третьому рядку коду збирається виділити розмір Інтелект, 819 00:42:03,110 --> 00:42:06,160 який, виявляється, - шкода, якщо я сказав, одного до Я мав на увазі одну Int - 820 00:42:06,160 --> 00:42:08,280 чотири байти на типовому комп'ютері. 821 00:42:08,280 --> 00:42:09,720 Принаймні, з CS50 приладу. 822 00:42:09,720 --> 00:42:11,490 >> Так що це збирається виділити він, хто знає? 823 00:42:11,490 --> 00:42:12,800 Десь тут. 824 00:42:12,800 --> 00:42:15,780 І це зберігається на деякій Адреса Ox, хто знає? 825 00:42:15,780 --> 00:42:18,330 Але те, що збирається отримати повернувся в тому, що адреси. 826 00:42:18,330 --> 00:42:22,270 Але ми будемо малювати цьому наочно як тільки стрілка подібне. 827 00:42:22,270 --> 00:42:25,430 >> Зараз у наступному рядку * X отримує 42. 828 00:42:25,430 --> 00:42:29,400 Що означає х * з точки зору непрофесіонала? 829 00:42:29,400 --> 00:42:30,040 Просто підіть туди. 830 00:42:30,040 --> 00:42:30,960 Перейти на цю адресу. 831 00:42:30,960 --> 00:42:35,900 Або, іншими словами, дотримуйтесь стрілками і покласти 42 там. 832 00:42:35,900 --> 00:42:38,140 Але потім сталося щось погане до Бінкі, чи не так? 833 00:42:38,140 --> 00:42:43,950 >> Нагадаємо, що лінія тут п'ять, * Y отримує 13, дійсно нещасливим числом, 834 00:42:43,950 --> 00:42:44,760 зробив те, що для нас? 835 00:42:44,760 --> 00:42:47,320 Ну, у * кошти йдуть туди. 836 00:42:47,320 --> 00:42:50,460 Ну, це не було дано Значення ж, чи не так? 837 00:42:50,460 --> 00:42:54,090 Код не має у буття ініціалізувати ні до чого. 838 00:42:54,090 --> 00:42:56,120 Ми х ініціалізації на адресу. 839 00:42:56,120 --> 00:42:57,640 Але у був оголошений нагорі. 840 00:42:57,640 --> 00:43:00,250 Але те крапка з комою, ніякої цінності був насправді покласти в нього. 841 00:43:00,250 --> 00:43:02,330 Так що це справедливо назвати цей сміття значення. 842 00:43:02,330 --> 00:43:03,430 Хто знає, що там? 843 00:43:03,430 --> 00:43:07,160 Це залишки біти, які були використані деякими попередніми рядок коду в 844 00:43:07,160 --> 00:43:08,300 моїй програмі. 845 00:43:08,300 --> 00:43:13,250 >> Так що, якщо я кажу, йдуть там, це як, Я поняття не маю, де ця стрілка 846 00:43:13,250 --> 00:43:14,490 буде в кінцевому підсумку. 847 00:43:14,490 --> 00:43:17,720 І ось, коли ви зазвичай отримаєте помилку сегментації. 848 00:43:17,720 --> 00:43:22,430 Якщо ви випадково разименованія, так кажуть, або перейдіть на адресу, яка не 849 00:43:22,430 --> 00:43:25,400 насправді законний адресу, погані речі трапляються. 850 00:43:25,400 --> 00:43:27,550 >> І це саме те, що сталося думати Бінкі. 851 00:43:27,550 --> 00:43:31,060 Тому нагадаємо, що історія, яку Нік був кажу тут була та ж ідея, що 852 00:43:31,060 --> 00:43:34,050 Я намалював з ілюзією крейдою на дошці там. 853 00:43:34,050 --> 00:43:35,960 X і Y були оголошені. 854 00:43:35,960 --> 00:43:39,690 >> Потім виділено розмір Цілочисельне і зберігати його в х. 855 00:43:39,690 --> 00:43:42,130 А в наступному рядку ми зробили * х. 856 00:43:42,130 --> 00:43:46,070 Це була чарівна паличка Ніка разименованія. 857 00:43:46,070 --> 00:43:49,780 Після цього всі 42 в пам'яті вказав на х. 858 00:43:49,780 --> 00:43:51,600 >> Але це те, де речі пішло жахливо неправильно. 859 00:43:51,600 --> 00:43:51,820 Вірно? 860 00:43:51,820 --> 00:43:53,550 Ми спробували разименованія у. 861 00:43:53,550 --> 00:43:55,620 Але у деяких було невірне значення, чи не так? 862 00:43:55,620 --> 00:43:57,720 >> Це стрілку в лівому нижньому куток, не 863 00:43:57,720 --> 00:43:58,950 вказуючи насправді ні до чого. 864 00:43:58,950 --> 00:44:01,520 Це зразок того, що я роблю зробив тут на дошці. 865 00:44:01,520 --> 00:44:05,900 Так що погані речі трапляються, сегментація вина, або Binky вина, в цьому випадку. 866 00:44:05,900 --> 00:44:10,800 >> Але якщо ми потім виправити, що, роблячи х отримує у як же історія змін? 867 00:44:10,800 --> 00:44:15,760 Ну, якщо я роблю X отримує Y, це фактично те ж саме, як кажуть 868 00:44:15,760 --> 00:44:19,235 б це не було, щось Ox- буде те ж саме тут, 869 00:44:19,235 --> 00:44:20,080 Ox-то. 870 00:44:20,080 --> 00:44:22,970 Або образно ми будемо малювати стрілки. 871 00:44:22,970 --> 00:44:25,530 >> Так от на дошці з Бінкі, з наступного рядка з 872 00:44:25,530 --> 00:44:28,350 коду, * у означає піти туди. 873 00:44:28,350 --> 00:44:29,400 Де там? 874 00:44:29,400 --> 00:44:30,820 Це значить, тут. 875 00:44:30,820 --> 00:44:36,050 >> І коли ми оновлюємо, що бути 13 він просто залучає рух і 876 00:44:36,050 --> 00:44:39,470 написання 13 тут і зараз. 877 00:44:39,470 --> 00:44:44,130 Тому, можливо, не повністю проста на перший погляд. 878 00:44:44,130 --> 00:44:47,740 Але щоб згадати і використовувати той же жаргон Бінкі, що використовував тут, так що 879 00:44:47,740 --> 00:44:50,485 Перші дві виділити покажчики х і у, але не pointees. 880 00:44:50,485 --> 00:44:54,750 І не pointees як правило, використовується термін. 881 00:44:54,750 --> 00:44:56,120 Але покажчик зовсім. 882 00:44:56,120 --> 00:44:59,200 Але це те, що на який вказує У номенклатурі на Бінкі. 883 00:44:59,200 --> 00:45:01,660 >> У наступному рядку, звичайно, виділяє Цілочисельне pointee. 884 00:45:01,660 --> 00:45:04,840 Так що частина пам'яті - як я залучив більше на Права частина там - і набір 885 00:45:04,840 --> 00:45:06,470 х одно точці до нього. 886 00:45:06,470 --> 00:45:11,350 Це разименовивает х для зберігання 42 в пам'яті, які він вказує у. 887 00:45:11,350 --> 00:45:13,380 І тоді це, звичайно, було погано. 888 00:45:13,380 --> 00:45:15,600 Тому що у не вказуючи нічого ще. 889 00:45:15,600 --> 00:45:16,530 Це фіксує це. 890 00:45:16,530 --> 00:45:18,240 Так що це ще баггі програми. 891 00:45:18,240 --> 00:45:21,580 Просто тому, що ми, що дме через код рядок за рядком і кажуть, да ладно, 892 00:45:21,580 --> 00:45:22,690 нехай це крах там. 893 00:45:22,690 --> 00:45:23,420 Це погана річ. 894 00:45:23,420 --> 00:45:26,790 Розбіжності програма просто буде перервати взагалі на цей рядок. 895 00:45:26,790 --> 00:45:30,550 Але якщо ви видалили розбився лінії і замінити його з останніми двома 896 00:45:30,550 --> 00:45:32,470 лінії є ви призначаєте - 897 00:45:32,470 --> 00:45:35,310 використанням присвоювання покажчика - Y щоб вона вказувала на X як точка т. 898 00:45:35,310 --> 00:45:39,280 І тоді ви разименованія у в дуже безпечний спосіб. 899 00:45:39,280 --> 00:45:41,520 >> То де ж це нам дає? 900 00:45:41,520 --> 00:45:45,350 Ну, виходить, що під капотом CS50 в бібліотеці, покажчики 901 00:45:45,350 --> 00:45:46,320 використовуються у всьому. 902 00:45:46,320 --> 00:45:48,910 І ми насправді почати чистити тому, що шар незабаром. 903 00:45:48,910 --> 00:45:51,740 Але виявляється, теж вираз, Деякі з вас можуть бути знайомі з, 904 00:45:51,740 --> 00:45:54,580 особливо більш комфортною, насправді, що з дуже популярної 905 00:45:54,580 --> 00:45:56,390 веб-сайт, або переповнення стека, в ці дні. 906 00:45:56,390 --> 00:45:58,720 >> Але це насправді має дуже технічне значення. 907 00:45:58,720 --> 00:46:00,160 Тепер ми знаємо, що стек. 908 00:46:00,160 --> 00:46:02,550 Це як стопки лотків Всередині їдальні. 909 00:46:02,550 --> 00:46:05,140 >> Або всередині вашого комп'ютера своїй пам'яті ті кадри 910 00:46:05,140 --> 00:46:06,900 , Використовуваних функцій. 911 00:46:06,900 --> 00:46:10,760 Ну, виходить, що через те, що дуже простий реалізації 912 00:46:10,760 --> 00:46:14,970 пам'ять і кадрів на так званому стек, ви можете взяти під свій контроль 913 00:46:14,970 --> 00:46:17,050 обчислювальної системи досить легко. 914 00:46:17,050 --> 00:46:22,180 Ви можете зламати системи, якщо люди як ми не написали наш код 915 00:46:22,180 --> 00:46:23,300 особливо добре. 916 00:46:23,300 --> 00:46:26,670 >> Якщо такі люди, як нам використовувати шматки пам'яті або використовувати масиви - 917 00:46:26,670 --> 00:46:27,810 Ще частіше - 918 00:46:27,810 --> 00:46:31,800 але іноді забудьте перевірити Межі нашого масиву, як Ви могли 919 00:46:31,800 --> 00:46:38,470 у себе іноді, і повторному занадто далеко за межі масиву. 920 00:46:38,470 --> 00:46:40,520 У кращому випадку, ваша програма може просто потерпіти крах. 921 00:46:40,520 --> 00:46:42,280 Помилка сегментації, добрий ніяково. 922 00:46:42,280 --> 00:46:45,480 Чи не відмінний, але це не обов'язково дуже погано. 923 00:46:45,480 --> 00:46:49,480 >> Але якщо ваша програма насправді на реальному комп'ютерах користувачів, якщо він працює 924 00:46:49,480 --> 00:46:53,070 на сайт, який фактично випадкові люди в інтернеті б'ють, дозволяючи 925 00:46:53,070 --> 00:46:56,690 люди ініціюють погані речі на ваш код як правило, не дуже добре, оскільки 926 00:46:56,690 --> 00:46:59,930 це означає, що можливість прийняти контроль над комп'ютером. 927 00:46:59,930 --> 00:47:01,350 І це буде виглядати трохи загадковим. 928 00:47:01,350 --> 00:47:04,570 Але я думав, що я з вас лякати останній приклад. 929 00:47:04,570 --> 00:47:05,650 >> Ось приклад коду. 930 00:47:05,650 --> 00:47:07,370 І є хороший Вікіпедії статтю, яка йде через 931 00:47:07,370 --> 00:47:08,530 це більш докладно. 932 00:47:08,530 --> 00:47:13,890 У мене є основна на нижній покликання Foo, передаючи агду 1. 933 00:47:13,890 --> 00:47:15,750 І це саме так, що ви можете запустити програму і пройти 934 00:47:15,750 --> 00:47:17,080 довільний введення. 935 00:47:17,080 --> 00:47:20,180 >> А потім Foo оголошений нагорі як прийняття рядком, або більше 936 00:47:20,180 --> 00:47:21,700 Точніше, символ *. 937 00:47:21,700 --> 00:47:23,860 Потім він оголошує масив символів. 938 00:47:23,860 --> 00:47:27,130 Назвемо це буфер, в цілому, розмір 12. 939 00:47:27,130 --> 00:47:30,900 Так 12 символів може поміститися всередині цього масиву називається C. 940 00:47:30,900 --> 00:47:33,510 >> І тоді він використовує цю нову функцію, , Яке є новим, але не важко 941 00:47:33,510 --> 00:47:34,930 розумію, пам'ять копію. 942 00:47:34,930 --> 00:47:39,290 Він копіює пам'ять, з бару, який був мінлива н минулому, незалежно від 943 00:47:39,290 --> 00:47:42,080 користувач ввів у ARGV 1 в с. 944 00:47:42,080 --> 00:47:43,090 Скільки байтів? 945 00:47:43,090 --> 00:47:44,260 Довжина рядка з бару. 946 00:47:44,260 --> 00:47:48,380 >> Отже, іншими словами, якщо користувач вводить ч-е-л-л-о Enter, довжина рядка 947 00:47:48,380 --> 00:47:49,260 привіт з дорівнює п'яти. 948 00:47:49,260 --> 00:47:52,790 Так що п'ять із цих байт збирається отримати копіюється в масив з ім'ям С, що 949 00:47:52,790 --> 00:47:54,110 має розмір 12. 950 00:47:54,110 --> 00:47:58,710 Але те, що користувач вводить в набагато довше слово, яке 13 символів або 14 951 00:47:58,710 --> 00:48:01,250 символів або 100 символів чи більше? 952 00:48:01,250 --> 00:48:02,660 >> Де вони будуть йти? 953 00:48:02,660 --> 00:48:06,090 Ну, це кадр, то цей лоток У їдальні стеку, 954 00:48:06,090 --> 00:48:06,930 вони збираються, щоб піти туди. 955 00:48:06,930 --> 00:48:10,080 І це тільки збирається почати перезапис інші речі, які вже 956 00:48:10,080 --> 00:48:12,880 в стек, переповнені стек, так би мовити. 957 00:48:12,880 --> 00:48:14,780 >> Так графічно, думати про це таким чином. 958 00:48:14,780 --> 00:48:17,970 Це всього лише барвиста версія картину ми малюю. 959 00:48:17,970 --> 00:48:20,060 У нижній частині, скажімо, є основним. 960 00:48:20,060 --> 00:48:24,690 І на вершині, що ви бачите зараз в кадрі кольором тепер, 961 00:48:24,690 --> 00:48:26,090 Функція називається Foo. 962 00:48:26,090 --> 00:48:30,170 Але що цікаво, от про Foo є те, що ось його рамки. 963 00:48:30,170 --> 00:48:32,860 Так він малюється так само, як я зробив, але у світло-блакитних. 964 00:48:32,860 --> 00:48:35,220 А тепер це, де З кронштейном 0 йде. 965 00:48:35,220 --> 00:48:37,410 І це де з кронштейном 11 буде в кінцевому підсумку. 966 00:48:37,410 --> 00:48:39,670 >> Іншими словами, це трапляється бути представлені у вигляді квадрата. 967 00:48:39,670 --> 00:48:42,320 Але якщо ви просто тримати шльоп байт вниз - або символи - вони збираються в кінець 968 00:48:42,320 --> 00:48:46,070 за місцем знаходження до 0 все, аж до до 11, тому що це 0 індексуватися. 969 00:48:46,070 --> 00:48:49,170 >> Але де ж 13-го характеру буде в кінцевому підсумку? 970 00:48:49,170 --> 00:48:50,310 Де 14-й? 971 00:48:50,310 --> 00:48:52,430 Де 50-й символ буде в кінцевому підсумку? 972 00:48:52,430 --> 00:48:54,070 >> Це буде продовжувати йти вниз. 973 00:48:54,070 --> 00:48:57,350 Тому що навіть якщо ми намалювали картинки з стек ріс, 974 00:48:57,350 --> 00:48:59,920 адреси, виявляється, йдуть від слабкий адреси, невеликі 975 00:48:59,920 --> 00:49:01,830 покажчиків, до великого адрес. 976 00:49:01,830 --> 00:49:03,540 Так що просто продовжує йти вгору і вгору. 977 00:49:03,540 --> 00:49:05,660 >> Таким чином, якщо користувач вводить привіт, це здорово. 978 00:49:05,660 --> 00:49:08,650 Не помилка, не проблема, безпечною для всіх. 979 00:49:08,650 --> 00:49:11,940 Але якщо користувач вводить в тому, що ми будемо називають змагальним код, зображений 980 00:49:11,940 --> 00:49:16,040 в загальному як, атака, атака, атака, атака, що може статися? 981 00:49:16,040 --> 00:49:19,760 >> Добре, якщо все вхідні що користувач набрав в це не просто дружній 982 00:49:19,760 --> 00:49:21,540 або образливі рядки символів. 983 00:49:21,540 --> 00:49:24,050 Насправді це послідовність символів що якщо він був скомпільований, 984 00:49:24,050 --> 00:49:26,050 насправді це код. 985 00:49:26,050 --> 00:49:29,570 Може бути, це код, який видаляє всі файли на вашому жорсткому диску або розсилає спам 986 00:49:29,570 --> 00:49:30,810 або щось на зразок цього. 987 00:49:30,810 --> 00:49:35,110 Зверніть увагу, що те, що ключовим тут є те, що Якщо поганий хлопець пощастило достатньо, щоб 988 00:49:35,110 --> 00:49:37,830 перезаписати червоним шматок пам'яті - 989 00:49:37,830 --> 00:49:41,080 які я не спиратися на мою картину, але ця картина Вікіпедії тут є - 990 00:49:41,080 --> 00:49:42,890 його так званий зворотну адресу. 991 00:49:42,890 --> 00:49:47,470 >> Коли їжа повертається, коли повертається обмін, яким комп'ютером знати, щоб перейти від 992 00:49:47,470 --> 00:49:49,790 сюди, щоб тут? 993 00:49:49,790 --> 00:49:52,920 Або в технічному сегменті нагорі, як він знає, щоб перейти від свопу 994 00:49:52,920 --> 00:49:54,870 код - 0 і 1 в , Які складають своп - 995 00:49:54,870 --> 00:49:56,020 Повернутися на головну? 996 00:49:56,020 --> 00:50:00,450 Там в так званому зворотною адресою зберігається в тому ж кадрі стека, на 997 00:50:00,450 --> 00:50:02,140 той же лоток кафетерії. 998 00:50:02,140 --> 00:50:06,080 >> Так що якщо поганий хлопець досить розумний, щоб покласти атакуючий код, код атаки, атаки 999 00:50:06,080 --> 00:50:07,960 код, і вам обов'язково пощастить достатньо - 1000 00:50:07,960 --> 00:50:11,630 часто методом проб і помилок - до перезапису, що червоний зворотну адресу, 1001 00:50:11,630 --> 00:50:14,360 з адресою та повідомлення на самому верху. 1002 00:50:14,360 --> 00:50:16,830 Зверніть увагу 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Вона написана нагорі назад для Причини ми, можливо, переглянути. 1004 00:50:20,650 --> 00:50:22,050 Це це число. 1005 00:50:22,050 --> 00:50:25,790 >> Так що якщо поганий хлопець отримує пощастило або досить розумний, щоб перезаписати червоним 1006 00:50:25,790 --> 00:50:29,480 смуга пам'яті з адресою код, який він чи вона якимось чином 1007 00:50:29,480 --> 00:50:34,980 вводиться в комп'ютер, вгадайте, чиї Код збирається бути повернуті 1008 00:50:34,980 --> 00:50:38,260 як тільки Foo робиться виконання? 1009 00:50:38,260 --> 00:50:39,440 >> Поганого хлопця коду. 1010 00:50:39,440 --> 00:50:43,610 Так що це шкідливий код, AAA, знову ж таки, може розсилати спам, може видалити всі файли 1011 00:50:43,610 --> 00:50:44,500 на вашому жорсткому диску. 1012 00:50:44,500 --> 00:50:48,740 Але це те, що дійсно переповнення стека є, або переповнення буфера або 1013 00:50:48,740 --> 00:50:51,060 переповнення буфера атаки. 1014 00:50:51,060 --> 00:50:54,400 >> І це неймовірно, неймовірно часто донині з програмами, написаними на 1015 00:50:54,400 --> 00:50:58,220 C, C + +, і навіть деякі інші мови. 1016 00:50:58,220 --> 00:51:02,275 У той страшний увагу, ми закінчуватися жарти. 1017 00:51:02,275 --> 00:51:03,230 >> [Сміється] 1018 00:51:03,230 --> 00:51:04,550 >> Побачимося в середу. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 На наступному CS50 - 1021 00:51:10,310 --> 00:51:15,920 Так що я весь вільний дисковий ламп сьогодні, але почекай, знежиреного молока, половина телефонів 1022 00:51:15,920 --> 00:51:17,850 Книга, апельсиновий сік що я пив сьогодні. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB кабель, гайковим ключем. 1025 00:51:22,780 --> 00:51:24,800 >> [Музика Відтворення]