1 00:00:00,000 --> 00:00:03,381 >> [Грає музика] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [ВІДТВОРЕННЯ ВІДЕО] 4 00:00:11,610 --> 00:00:13,640 >> -Він Бреше. 5 00:00:13,640 --> 00:00:14,380 >> -Про що? 6 00:00:14,380 --> 00:00:17,182 >> -Не знаю. 7 00:00:17,182 --> 00:00:19,990 >> -Так Що ми знаємо? 8 00:00:19,990 --> 00:00:23,145 >> -Це У 9:15, Рей Сантойо був в банкоматі. 9 00:00:23,145 --> 00:00:23,644 -Так. 10 00:00:23,644 --> 00:00:27,030 Таким чином, питання, що він робить у 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Зйомка 9-міліметрового на щось. 12 00:00:29,720 --> 00:00:31,540 Може бути, він побачив снайпера. 13 00:00:31,540 --> 00:00:33,412 >> -Чи Працював з ним. 14 00:00:33,412 --> 00:00:34,340 >> Почекай. 15 00:00:34,340 --> 00:00:36,200 Повернення на один. 16 00:00:36,200 --> 00:00:36,975 >> -Що ти бачиш? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Його горілиць повному екрані. 19 00:00:47,805 --> 00:00:48,680 >> -Його Окуляри. 20 00:00:48,680 --> 00:00:50,060 >> -Є Це відображення. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Це Бейсбольної команди Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Це їх логотип. 24 00:01:03,110 --> 00:01:05,820 >> -А Він розмовляє з хто носить цю куртку. 25 00:01:05,820 --> 00:01:06,670 >> [КІНЕЦЬ ПЕРЕГЛЯДУ] 26 00:01:06,670 --> 00:01:07,628 >> Девід Малан: Гаразд. 27 00:01:07,628 --> 00:01:11,210 Це CS50 і це трохи більш з [нерозбірливо], з якою ви 28 00:01:11,210 --> 00:01:12,890 втручаються з проблемою встановити чотири. 29 00:01:12,890 --> 00:01:16,606 Сьогодні ми починаємо виглядати трохи більш глибоко в цих речах, званих покажчиків, 30 00:01:16,606 --> 00:01:18,480 який, хоча це досить таємницею тема, 31 00:01:18,480 --> 00:01:20,813 Виявляється, що він збирається бути засобом, за допомогою якого ми 32 00:01:20,813 --> 00:01:24,320 може почати будівництво та монтаж набагато більш складні програми. 33 00:01:24,320 --> 00:01:28,150 Але ми зробили це в останню середу допомогою деякого claymation першою. 34 00:01:28,150 --> 00:01:30,190 Так що це, нагадаємо, є Бінки, і ми використовували його 35 00:01:30,190 --> 00:01:33,148 щоб поглянути на програму, яка не дійсно що-небудь цікаве, 36 00:01:33,148 --> 00:01:34,950 але він розкрити кілька проблем. 37 00:01:34,950 --> 00:01:38,570 Таким чином, щоб почати сьогодні, чому ми не ходити швидко через кілька з цих кроків, 38 00:01:38,570 --> 00:01:41,920 спробуйте, щоб відігнати в умовах людський в саме те, що тут відбувається 39 00:01:41,920 --> 00:01:45,410 і чому це погано, а потім перейти на а насправді почати будувати щось 40 00:01:45,410 --> 00:01:46,309 з цією технікою? 41 00:01:46,309 --> 00:01:48,350 Так що це були перші дві лінії цієї програми 42 00:01:48,350 --> 00:01:51,340 і з точки зору непрофесіонала, те, що які ці дві лінії роблять? 43 00:01:51,340 --> 00:01:55,600 Хтось, хто досить комфортно з тим, що заявив на екрані? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Які ці дві лінії роблять? 46 00:02:00,120 --> 00:02:02,070 Це не все, що відрізняється від тижня один, 47 00:02:02,070 --> 00:02:03,611 але є деякі нові спеціальні символи. 48 00:02:03,611 --> 00:02:04,152 Так? 49 00:02:04,152 --> 00:02:05,628 Повернутися там. 50 00:02:05,628 --> 00:02:07,092 >> АУДИТОРІЯ: Оголошення покажчики? 51 00:02:07,092 --> 00:02:08,050 Девід Малан: раз сказати? 52 00:02:08,050 --> 00:02:08,860 АУДИТОРІЯ: Оголошення покажчики? 53 00:02:08,860 --> 00:02:11,776 Девід Малан: Оголошення покажчики та давайте уточнити його трохи більше. 54 00:02:11,776 --> 00:02:14,050 АУДИТОРІЯ: [нерозбірливо] адресу, а потім х у. 55 00:02:14,050 --> 00:02:15,300 Девід Малан: А потім звернутися. 56 00:02:15,300 --> 00:02:18,550 Так що конкретно ми робимо що ми оголошуємо дві змінні. 57 00:02:18,550 --> 00:02:21,252 Ці змінні, хоча, збираються до типу INT зірки, 58 00:02:21,252 --> 00:02:23,210 більш конкретно означає вони збираються зберігати 59 00:02:23,210 --> 00:02:26,450 адреса з Int, відповідно, х та у. 60 00:02:26,450 --> 00:02:27,660 Тепер є які-небудь цінності? 61 00:02:27,660 --> 00:02:32,621 Чи є якісь фактична адреси в них дві змінні в даний момент? 62 00:02:32,621 --> 00:02:33,120 Немає. 63 00:02:33,120 --> 00:02:35,030 Це просто так називається значення сміття. 64 00:02:35,030 --> 00:02:38,120 Якщо ви насправді не призначати Змінна, все, що було в пам'яті 65 00:02:38,120 --> 00:02:42,224 раніше збирається заповнити нулями і ті, обидва з цих змінних. 66 00:02:42,224 --> 00:02:44,140 Але ми ще не знаємо, які вони є, і це 67 00:02:44,140 --> 00:02:47,060 буде ключем до чому Binky втратив голову минулого тижня. 68 00:02:47,060 --> 00:02:49,980 >> Так що це був claymation Втілення цього 69 00:02:49,980 --> 00:02:53,580 в результаті чого у вас є тільки дві змінні, маленькі кругові частини глини, 70 00:02:53,580 --> 00:02:57,330 який може зберігати змінні, але, як обгорнутих стрілки запропонувати, 71 00:02:57,330 --> 00:03:00,640 вони насправді не вказуючи в будь-яку точку по собі відомі. 72 00:03:00,640 --> 00:03:03,670 Отже, ми мали цю лінію, і це була новою минулого тижня, Танос на пам'ять 73 00:03:03,670 --> 00:03:07,130 розподіл, який є тільки химерний спосіб розповідати операційну систему Linux, 74 00:03:07,130 --> 00:03:09,750 або Mac OS або Windows, Центр агов, дайте мені пам'ять, 75 00:03:09,750 --> 00:03:11,780 і все, що ви повинні сказати операційна система 76 00:03:11,780 --> 00:03:14,699 це те, що, коли його просять на пам'ять. 77 00:03:14,699 --> 00:03:16,990 Це не збирається піклуватися, що Ви збираєтеся з ним робити, 78 00:03:16,990 --> 00:03:19,786 але ви повинні сказати операційної Система, що шляхом Танос. 79 00:03:19,786 --> 00:03:20,286 Так? 80 00:03:20,286 --> 00:03:21,078 >> АУДИТОРІЯ: Скільки? 81 00:03:21,078 --> 00:03:21,994 Девід Малан: Скільки? 82 00:03:21,994 --> 00:03:25,280 Наскільки в байтах, а це так, то, знову ж таки, надуманий приклад, просто кажучи, 83 00:03:25,280 --> 00:03:27,360 дати мені розмір в міжнар. 84 00:03:27,360 --> 00:03:30,550 Тепер, розміром з Int чотири байти або 32 біта. 85 00:03:30,550 --> 00:03:32,850 Так що це просто спосіб кажучи, гей, операційна система, 86 00:03:32,850 --> 00:03:37,290 дайте мені чотири байти пам'яті що я можу використовувати в моєму розпорядженні, 87 00:03:37,290 --> 00:03:40,560 і, зокрема, те, що робить Танос повернення по 88 00:03:40,560 --> 00:03:41,795 в цьому фрагменті з чотирьох байтів? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 АУДИТОРІЯ: Адреса? 91 00:03:44,860 --> 00:03:45,901 Девід Малан: Адреса. 92 00:03:45,901 --> 00:03:47,580 Адреса цієї порції з чотирьох байтів. 93 00:03:47,580 --> 00:03:48,190 Точно. 94 00:03:48,190 --> 00:03:51,430 І ось що в кінцевому рахунку зберігається х, і тому ми дійсно не 95 00:03:51,430 --> 00:03:55,240 все одно, що кількість, що адреса, будь то OX1 або OX2 96 00:03:55,240 --> 00:03:57,110 або деякі загадкові адреса шістнадцятковій. 97 00:03:57,110 --> 00:03:59,850 Ми просто дбаємо графічно що змінна х зараз 98 00:03:59,850 --> 00:04:01,630 вказуючи на те шматок пам'яті. 99 00:04:01,630 --> 00:04:05,570 Таким чином, стрілка являє собою покажчик або Більш конкретно, адреса пам'яті. 100 00:04:05,570 --> 00:04:09,120 Але, знову ж, ми зазвичай не піклуються що ці фактичні адреси. 101 00:04:09,120 --> 00:04:11,780 Тепер, каже, що це лінія те, що з точки зору непрофесіонала? 102 00:04:11,780 --> 00:04:14,330 Зірка х отримує 42 з комою. 103 00:04:14,330 --> 00:04:17,390 Що це значить? 104 00:04:17,390 --> 00:04:18,200 Ти хочеш піти? 105 00:04:18,200 --> 00:04:20,102 Не подряпати вашу шию. 106 00:04:20,102 --> 00:04:22,360 >> Аудиторія: адреса х знаходиться в 42. 107 00:04:22,360 --> 00:04:24,300 >> Девід Малан: Адреса х знаходиться в 42. 108 00:04:24,300 --> 00:04:25,190 Не зовсім. 109 00:04:25,190 --> 00:04:28,485 Так близько, але не зовсім, бо є зірка, яка, випереджаючи цей х. 110 00:04:28,485 --> 00:04:29,860 Таким чином, ми повинні налаштувати небагато. 111 00:04:29,860 --> 00:04:31,032 Так? 112 00:04:31,032 --> 00:04:36,044 >> АУДИТОРІЯ: Значення, яке Покажчик х вказуючи на це 42. 113 00:04:36,044 --> 00:04:36,710 Девід Малан: ОК. 114 00:04:36,710 --> 00:04:40,840 Значення, покажчик х вказуючи на, скажімо, буде 42, 115 00:04:40,840 --> 00:04:44,165 або іншими словами, зірки х каже, перейдіть до будь-яку адресу 116 00:04:44,165 --> 00:04:48,340 в х, будь то 1 Оксфорд Вулиця або 33 Оксфорд-стріт 117 00:04:48,340 --> 00:04:51,850 або OX1 або ox33, незалежно що числове адреса, 118 00:04:51,850 --> 00:04:54,380 зірковий х є разименованія х. 119 00:04:54,380 --> 00:04:57,297 Так що за цією адресою і Потім покласти туди число 42. 120 00:04:57,297 --> 00:04:59,380 Так що було б Еквівалентний спосіб сказати, що. 121 00:04:59,380 --> 00:05:01,860 Так що все нормально, а потім ми представлятиме картину 122 00:05:01,860 --> 00:05:05,370 наступним, де ми додали 42 до цього шматок чотирьох 123 00:05:05,370 --> 00:05:09,370 байти на правій стороні, але Ця лінія була, де все пішло шкереберть 124 00:05:09,370 --> 00:05:11,120 і глава Бінки вискочив від в цій точці, 125 00:05:11,120 --> 00:05:15,290 бо погані речі трапляються, коли Ви разименованія значення для сміття 126 00:05:15,290 --> 00:05:18,210 або ви разименованія недійсним покажчики, і я кажу недійсним 127 00:05:18,210 --> 00:05:21,020 тому що в даний момент в історія, те, що знаходиться всередині у? 128 00:05:21,020 --> 00:05:24,440 Що значення у на основі на останні кілька кроків? 129 00:05:24,440 --> 00:05:25,360 Так? 130 00:05:25,360 --> 00:05:26,115 Що це? 131 00:05:26,115 --> 00:05:26,990 >> АУДИТОРІЯ: адресу. 132 00:05:26,990 --> 00:05:28,460 Девід Малан: адреса. 133 00:05:28,460 --> 00:05:31,910 Це має бути адреса але я її ініціалізації? 134 00:05:31,910 --> 00:05:32,800 Так що у мене ще немає. 135 00:05:32,800 --> 00:05:35,430 Так що, як відомо, там? 136 00:05:35,430 --> 00:05:37,590 Це просто деяке значення сміття. 137 00:05:37,590 --> 00:05:41,500 Це може бути будь адресу від нуля до 2 млрд, якщо у вас є два гігабайтами оперативної пам'яті, 138 00:05:41,500 --> 00:05:44,289 або від нуля до 4 млрд якщо у Вас є отримав чотири гігабайти оперативної пам'яті. 139 00:05:44,289 --> 00:05:46,080 Це деяке значення сміття, але проблема в тому, 140 00:05:46,080 --> 00:05:48,200 що в операційній системі, якщо він не дав вам 141 00:05:48,200 --> 00:05:51,140 що частина пам'яті спеціально що ви намагаєтеся йти, 142 00:05:51,140 --> 00:05:54,650 це взагалі буде викликати що ми бачили, як помилки сегментації. 143 00:05:54,650 --> 00:05:57,810 Таким чином, справді, кожен з вас, хто боровся на проблеми в робочий час 144 00:05:57,810 --> 00:06:00,393 або в проблемах, які більше як правило, в спробі з'ясувати, 145 00:06:00,393 --> 00:06:02,150 помилки сегментації, що зазвичай означає, 146 00:06:02,150 --> 00:06:05,017 ти торкаєшся сегмент пам'яті, що ви не повинні бути. 147 00:06:05,017 --> 00:06:07,350 Ви торкаючись пам'яті, операційна система не має 148 00:06:07,350 --> 00:06:10,450 дозволив вам доторкнутися, будь то по заходить занадто далеко у вашому масиві 149 00:06:10,450 --> 00:06:12,870 або починаючи з сьогоднішнього дня, будь це тому, що ти торкаєшся 150 00:06:12,870 --> 00:06:14,780 пам'яті, просто деяке значення сміття. 151 00:06:14,780 --> 00:06:18,230 >> Так роблять зірки х тут зразок невизначеного поведінки. 152 00:06:18,230 --> 00:06:22,030 Ви ніколи не повинні робити це, тому що шанси які, програма просто буде крах, 153 00:06:22,030 --> 00:06:24,050 тому що ви говорите, перейти на цю адресу 154 00:06:24,050 --> 00:06:27,000 і ви поняття не маю, де що адреса насправді. 155 00:06:27,000 --> 00:06:30,300 Таким чином, операційна система, швидше за все, збирається до краху програми 156 00:06:30,300 --> 00:06:33,840 в результаті і справді, що це що там сталося на Бінки. 157 00:06:33,840 --> 00:06:37,210 Так в кінцевому рахунку, Бінки фіксованою ця проблема з цим. 158 00:06:37,210 --> 00:06:38,909 Так цієї програми сам був зіпсований. 159 00:06:38,909 --> 00:06:41,450 Але якщо ви як би просуватися вперед і виконати цей рядок замість 160 00:06:41,450 --> 00:06:45,580 у дорівнює х просто означає те, що адреса є х, також покласти його в у. 161 00:06:45,580 --> 00:06:48,740 >> І так наочно, ми представлені в цьому з двома стрілками 162 00:06:48,740 --> 00:06:51,570 від х і від у вказуючи в те ж місце. 163 00:06:51,570 --> 00:06:55,760 Так семантично, х дорівнює щоб у тому що обидва з них 164 00:06:55,760 --> 00:07:00,300 зберігайте той же адреса, отже, вказуючи на 42, 165 00:07:00,300 --> 00:07:04,910 і тепер, коли ви говорите, зірки у, перейти за адресою в у, 166 00:07:04,910 --> 00:07:06,790 це має цікавий побічний ефект. 167 00:07:06,790 --> 00:07:10,320 Таким чином, адреса в у є Те ж саме, як адреса в х. 168 00:07:10,320 --> 00:07:15,060 Так що, якщо ви говорите, йти за адресою в у і змініть значення на 13, 169 00:07:15,060 --> 00:07:17,140 хто ще впливає? 170 00:07:17,140 --> 00:07:21,100 Х, точка D, так би мовити, повинні бути порушені також. 171 00:07:21,100 --> 00:07:24,340 >> І справді, як Нік звернув цю картину в claymation саме це. 172 00:07:24,340 --> 00:07:28,665 Навіть якщо ми будемо слідувати покажчик у, ми опинилися в тому ж місці, 173 00:07:28,665 --> 00:07:32,780 і тому, якщо ми повинні були роздрукувати з х або pointee Y, в 174 00:07:32,780 --> 00:07:35,720 то ми побачили б значення 13. 175 00:07:35,720 --> 00:07:37,927 Тепер, я говорю pointee бути відповідно до відео. 176 00:07:37,927 --> 00:07:39,760 Програмісти, на мій знання, насправді ніколи не 177 00:07:39,760 --> 00:07:42,460 кажуть слово pointee, що є гострим 178 00:07:42,460 --> 00:07:44,650 в, але для послідовності з відео, розуміють, 179 00:07:44,650 --> 00:07:47,520 це все, що було означало в такій ситуації. 180 00:07:47,520 --> 00:07:54,190 Так які-небудь питання по claymation або покажчики або Танос тільки поки? 181 00:07:54,190 --> 00:07:54,850 Немає? 182 00:07:54,850 --> 00:07:55,470 Добре. 183 00:07:55,470 --> 00:07:58,560 >> Так що без подальшого шуму, давайте поглянемо 184 00:07:58,560 --> 00:08:00,700 в якому це має насправді були використані протягом деякого часу. 185 00:08:00,700 --> 00:08:03,580 Таким чином, ми мали цю бібліотеку CS50 що є всі ці функції. 186 00:08:03,580 --> 00:08:06,810 Ми використовували GetInt багато, GetString, ймовірно, GetLongLong раніше 187 00:08:06,810 --> 00:08:09,840 в моєму Pset один або так, але що насправді відбувається? 188 00:08:09,840 --> 00:08:12,920 Ну, давайте поглянемо під капотом на програму, яка 189 00:08:12,920 --> 00:08:17,017 надихає тому ми даємо вам CS50 бібліотека, і справді, як минулого тижня, 190 00:08:17,017 --> 00:08:18,850 ми почали приймати тих, навчальні колеса від. 191 00:08:18,850 --> 00:08:21,080 Так що це тепер упорядковано з того, що посмертних 192 00:08:21,080 --> 00:08:23,690 має вже на в бібліотеці CS50, 193 00:08:23,690 --> 00:08:27,250 навіть якщо ми тепер почне рухатися від нього для більшості програм. 194 00:08:27,250 --> 00:08:29,460 >> Так що це програма називається зсапЕ 0. 195 00:08:29,460 --> 00:08:30,510 Це супер короткий. 196 00:08:30,510 --> 00:08:33,909 Це просто є ці рядки, але це вводить функцію називають зсапЕ 197 00:08:33,909 --> 00:08:36,909 що ми насправді відбувається, щоб бачити в момент усередині бібліотеки CS50, 198 00:08:36,909 --> 00:08:38,600 хоча і в дещо іншій формі. 199 00:08:38,600 --> 00:08:41,330 Так що це програма на лінії 16 оголошує змінну х. 200 00:08:41,330 --> 00:08:43,150 То дайте мені чотири байти для Int. 201 00:08:43,150 --> 00:08:45,750 Це було розповідати користувачеві, Кількість будь ласка, а потім 202 00:08:45,750 --> 00:08:49,010 це цікаво, що лінія насправді пов'язує минулого тижня 203 00:08:49,010 --> 00:08:49,790 і це. 204 00:08:49,790 --> 00:08:53,230 Scanf, і зверніть увагу на те, що займає Рядок формату, як Printf, 205 00:08:53,230 --> 00:08:57,480 % Я означає Int, а потім вона займає Другий аргумент, який виглядає трохи 206 00:08:57,480 --> 00:08:58,260 фанки. 207 00:08:58,260 --> 00:09:01,880 Це амперсанд х, і згадати, ми бачили тільки один раз минулого тижня. 208 00:09:01,880 --> 00:09:03,465 Що амперсанд х представляють? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Що робити в амперсанд C? 211 00:09:08,450 --> 00:09:08,950 Так? 212 00:09:08,950 --> 00:09:10,024 >> Аудиторія: адреса. 213 00:09:10,024 --> 00:09:11,190 Девід Малан: Адреса. 214 00:09:11,190 --> 00:09:13,190 Так це навпаки зоряного оператора, 215 00:09:13,190 --> 00:09:17,270 в той час як зірка оператор говорить, перейдіть до цю адресу, амперсанд оператор 216 00:09:17,270 --> 00:09:20,280 говорить, з'ясувати адресу цієї змінної, 217 00:09:20,280 --> 00:09:23,530 і таким чином це є ключовим, тому що Мета Scanf в житті 218 00:09:23,530 --> 00:09:26,320 це для сканування користувача ввести з клавіатури, 219 00:09:26,320 --> 00:09:29,970 залежно від все, що він або вона типи, а потім читати введення даного користувача 220 00:09:29,970 --> 00:09:32,970 в змінну, але ми бачили в останні два тижні 221 00:09:32,970 --> 00:09:36,080 що ця функція підкачки, що ми намагався зусиль для реалізації 222 00:09:36,080 --> 00:09:37,110 просто розбиті. 223 00:09:37,110 --> 00:09:42,470 Нагадаємо, що з функцією підкачки, якщо ми тільки що оголосили А і В, цілих чисел, 224 00:09:42,470 --> 00:09:47,040 ми дійсно успішно своп дві змінні всередині своп 225 00:09:47,040 --> 00:09:50,080 просто подобається з молоком і OJ, але як тільки повернувся підкачки, 226 00:09:50,080 --> 00:09:55,200 який був результат по х і в, оригінальні значення? 227 00:09:55,200 --> 00:09:55,700 Нічого. 228 00:09:55,700 --> 00:09:56,200 Так. 229 00:09:56,200 --> 00:09:59,754 Нічого не сталося, що час, тому що свопи змінити тільки свої локальні копії, 230 00:09:59,754 --> 00:10:01,670 який повинен сказати, все на цей раз, щоразу, коли ми в 231 00:10:01,670 --> 00:10:04,010 були передаючи аргументів до функцій, ми 232 00:10:04,010 --> 00:10:05,939 просто проходячи копії цих аргументів. 233 00:10:05,939 --> 00:10:07,980 Ви можете робити з цим що ви хочете з ними, 234 00:10:07,980 --> 00:10:10,890 але вони збираються мати НЕ Вплив на вихідні значення. 235 00:10:10,890 --> 00:10:13,650 Так що це проблематично, якщо вам хочете мати функцію, як зсапЕ 236 00:10:13,650 --> 00:10:17,170 в житті, мета якого полягає в скануванні вхід користувача з клавіатури 237 00:10:17,170 --> 00:10:22,010 а потім заповнити прогалини, так кажуть, що це, дають змінну х, як 238 00:10:22,010 --> 00:10:25,410 значення, тому що, якби я був просто передати х в Scanf, 239 00:10:25,410 --> 00:10:28,790 якщо ви вважаєте, логіку в минулому тиждень, зсапЕ може робити все, що він хоче 240 00:10:28,790 --> 00:10:33,100 з копією х, але вона не могла назавжди змінити х, якщо ми не дамо 241 00:10:33,100 --> 00:10:37,120 Scanf карту скарбів, так би мовити, де х позначає місце, в результаті чого 242 00:10:37,120 --> 00:10:41,860 ми проходимо на адресу х, так що зсапЕ можете піти туди і фактично зміна 243 00:10:41,860 --> 00:10:42,920 значення х. 244 00:10:42,920 --> 00:10:45,080 І так дійсно, все що ця програма робить 245 00:10:45,080 --> 00:10:53,180 якщо я зсапЕ 0, на мій джерела Каталог 5м, зробити зсапЕ 0, 246 00:10:53,180 --> 00:10:57,730 точка слеш зсапЕ, номер будь ласка, 50, спасибі за 50. 247 00:10:57,730 --> 00:11:01,020 >> Так що це не все, що цікаво, Але те, що дійсно відбувається 248 00:11:01,020 --> 00:11:04,820 є те, що, як тільки я називаю Scanf тут, значення х 249 00:11:04,820 --> 00:11:06,410 в даний час постійно змінюється. 250 00:11:06,410 --> 00:11:08,335 Тепер, це, здається, хороший і добре, а насправді, це 251 00:11:08,335 --> 00:11:11,200 Схоже, ми дійсно не потрібно бібліотека CS50 взагалі більше. 252 00:11:11,200 --> 00:11:13,960 Наприклад, давайте працювати це ще раз тут. 253 00:11:13,960 --> 00:11:15,750 Дозвольте мені відкрити його протягом секунди. 254 00:11:15,750 --> 00:11:20,600 Давайте спробуємо номер, будь ласка, і замість того щоб сказати 50, як раніше, 255 00:11:20,600 --> 00:11:22,810 давайте просто сказати ні. 256 00:11:22,810 --> 00:11:24,000 ОК, це трохи дивно. 257 00:11:24,000 --> 00:11:25,270 ДОБРЕ. 258 00:11:25,270 --> 00:11:28,680 І лише деякі дурниця тут. 259 00:11:28,680 --> 00:11:31,170 Так що, здається, не обробляти помилкові ситуації. 260 00:11:31,170 --> 00:11:33,620 Таким чином, ми повинні мінімально старт додавши деякі перевірки помилок 261 00:11:33,620 --> 00:11:37,460 щоб переконатися, що користувач має надрукована в фактична кількість як 50, 262 00:11:37,460 --> 00:11:40,720 тому що очевидно набравши слів не виявлено проблематичним, 263 00:11:40,720 --> 00:11:42,020 але це, ймовірно, повинно бути. 264 00:11:42,020 --> 00:11:46,450 >> Давайте подивимося на цю версію тепер це моя спроба перевизначити GetString. 265 00:11:46,450 --> 00:11:48,437 Якщо зсапЕ все це має Функціональність вбудована, 266 00:11:48,437 --> 00:11:51,270 чому ми були з ними балуватися навчальні диски, як GetString? 267 00:11:51,270 --> 00:11:55,450 Ну, ось, мабуть, моя власна проста версія GetString 268 00:11:55,450 --> 00:12:00,766 в результаті чого тиждень тому, я б сказав дати мені рядок і називають це буфер. 269 00:12:00,766 --> 00:12:03,390 Сьогодні, я збираюся почати тільки кажучи сЬаг зірки, який, нагадаємо, 270 00:12:03,390 --> 00:12:04,400 це просто синоніми. 271 00:12:04,400 --> 00:12:06,629 Це виглядає страшніше, але це точно така ж річ. 272 00:12:06,629 --> 00:12:09,420 То дайте мені змінної називається буфер що збирається зберігати рядок, 273 00:12:09,420 --> 00:12:12,780 скажіть будь ласка, рядок користувача, а потім, як і колись, 274 00:12:12,780 --> 00:12:17,760 давайте спробуємо зайняти цей урок зсапЕ % S цей час, а потім передати в буфері. 275 00:12:17,760 --> 00:12:19,310 Тепер, швидка перевірка розсудливість. 276 00:12:19,310 --> 00:12:22,120 Чому я не кажу, амперсанд буфер на цей раз? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Висновок з попереднього прикладу. 279 00:12:26,625 --> 00:12:28,000 АУДИТОРІЯ: Чар зірка покажчик. 280 00:12:28,000 --> 00:12:29,920 Девід Малан: Рівне, бо це час, гольця 281 00:12:29,920 --> 00:12:34,080 зірка вже покажчик, адреса, за визначенням цієї зірки бути там. 282 00:12:34,080 --> 00:12:37,530 І якщо зсапЕ очікує адреса, достатньо лише пройти в буфері. 283 00:12:37,530 --> 00:12:39,260 Мені не потрібно, щоб сказати, амперсанд буфер. 284 00:12:39,260 --> 00:12:42,177 Для цікавих, ви могли б зробити щось на зразок цього. 285 00:12:42,177 --> 00:12:43,510 Це матиме інше значення. 286 00:12:43,510 --> 00:12:47,240 Це дасть вам покажчик на покажчик, який насправді 287 00:12:47,240 --> 00:12:50,050 дійсний річ в C, але для Тепер, давайте тримати його проста 288 00:12:50,050 --> 00:12:51,750 і тримати історію відповідно. 289 00:12:51,750 --> 00:12:54,100 Я просто хочу, щоб передати в буфер і це правильно. 290 00:12:54,100 --> 00:12:56,487 Проблема, однак, полягає в наступному. 291 00:12:56,487 --> 00:12:58,820 Дозвольте мені йти вперед і працювати в цьому Програма після компіляції. 292 00:12:58,820 --> 00:13:00,902 Зробити зсапЕ 1. 293 00:13:00,902 --> 00:13:02,610 Чорт візьми, мій компілятора ловити свою помилку. 294 00:13:02,610 --> 00:13:04,090 Дайте мені одну секунду. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Скажімо Scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ДОБРЕ. 299 00:13:11,380 --> 00:13:12,720 Там ми йдемо. 300 00:13:12,720 --> 00:13:14,280 Мені це потрібно. 301 00:13:14,280 --> 00:13:16,750 CS50 ID має різні Параметри конфігурації 302 00:13:16,750 --> 00:13:18,280 що захистить вас від себе. 303 00:13:18,280 --> 00:13:21,300 Мені потрібно відключити ті, по працює брязкіт вручну в цей раз. 304 00:13:21,300 --> 00:13:22,140 Так рядок ласка. 305 00:13:22,140 --> 00:13:25,560 Я збираюся йти вперед і ввести в моєму улюбленому світі привіт. 306 00:13:25,560 --> 00:13:26,490 ОК, нуль. 307 00:13:26,490 --> 00:13:27,700 Це не те, що я набрав. 308 00:13:27,700 --> 00:13:29,690 Так що це свідчить про то помилитися. 309 00:13:29,690 --> 00:13:33,920 Дозвольте мені йти вперед і ввести справді довгого рядка. 310 00:13:33,920 --> 00:13:37,210 Подяка за нуль, і я не знаю, якщо я збираюся бути в змозі розбити його. 311 00:13:37,210 --> 00:13:40,240 Давайте спробуємо трохи копію вставити і подивитися, якщо це допомагає. 312 00:13:40,240 --> 00:13:43,290 Просто вставте багато що з цього. 313 00:13:43,290 --> 00:13:47,310 Це, безумовно, більше Рядок, ніж зазвичай. 314 00:13:47,310 --> 00:13:51,450 Давайте просто дійсно написати його. 315 00:13:51,450 --> 00:13:51,950 Немає. 316 00:13:51,950 --> 00:13:52,650 Блін. 317 00:13:52,650 --> 00:13:53,480 Команда не знайдена. 318 00:13:53,480 --> 00:13:54,550 Так от не пов'язані. 319 00:13:54,550 --> 00:13:56,440 Це тому, що я вставив деякі погані персонажі, 320 00:13:56,440 --> 00:13:59,780 але це виявляється не працюватиме. 321 00:13:59,780 --> 00:14:03,510 >> Давайте спробуємо це ще раз, тому що це більш цікаво, якщо ми насправді крах його. 322 00:14:03,510 --> 00:14:09,116 Давайте друкую це, і тепер, я збирається копіювати дійсно довгий рядок 323 00:14:09,116 --> 00:14:10,990 а тепер давайте подивимося, якщо ми може призвести до збою цю річ. 324 00:14:10,990 --> 00:14:14,235 Зверніть увагу, я опустив простору і нові лінії і крапки з комою 325 00:14:14,235 --> 00:14:16,035 і всі незрозумілі символи. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 І тепер в мережі просто бути повільним. 329 00:14:22,880 --> 00:14:27,460 Я тримав вниз Command-V занадто довго, ясно. 330 00:14:27,460 --> 00:14:28,190 Блін! 331 00:14:28,190 --> 00:14:29,260 Команда не знайдена. 332 00:14:29,260 --> 00:14:29,780 >> ДОБРЕ. 333 00:14:29,780 --> 00:14:32,240 Ну, справа в тому, тим не менше, після. 334 00:14:32,240 --> 00:14:36,910 Так що насправді відбувається з цією декларацією 335 00:14:36,910 --> 00:14:39,240 Чар зірок буфера на лінії 16? 336 00:14:39,240 --> 00:14:41,820 Так що я отримую Коли я оголошую покажчик? 337 00:14:41,820 --> 00:14:47,440 Все, що я отримую значення байта чотирьох звана буферна, але те, що всередині нього 338 00:14:47,440 --> 00:14:49,540 на даний момент? 339 00:14:49,540 --> 00:14:50,930 Це просто деяке значення сміття. 340 00:14:50,930 --> 00:14:54,170 Тому будь-який час ви оголошуєте змінну в C, це просто деяке значення сміття, 341 00:14:54,170 --> 00:14:56,220 і ми починаємо Поїздка по цій реальності. 342 00:14:56,220 --> 00:14:59,720 Тепер, коли я говорю зсапЕ, перейти на цю адресу 343 00:14:59,720 --> 00:15:01,520 і покласти всі типи користувачів в. 344 00:15:01,520 --> 00:15:06,400 Якщо користувач в привіт Світ, ну, куди я поклав його? 345 00:15:06,400 --> 00:15:07,750 Буфер значення сміття. 346 00:15:07,750 --> 00:15:11,510 >> Так що начебто як стріла який, вказуючи, хто знає, де. 347 00:15:11,510 --> 00:15:13,880 Може бути, це вказує прямо тут, в моїй пам'яті. 348 00:15:13,880 --> 00:15:16,560 І тому, коли користувач типи в світі, здравствулте! 349 00:15:16,560 --> 00:15:22,380 програма намагається поставити Рядок привіт світ зворотний слеш 0 350 00:15:22,380 --> 00:15:23,910 в цьому шматку пам'яті. 351 00:15:23,910 --> 00:15:27,070 Але з великою часткою ймовірності, але явно не 100% ймовірність, 352 00:15:27,070 --> 00:15:30,440 комп'ютер буде крах, то Програма, тому що це не 353 00:15:30,440 --> 00:15:32,490 пам'яті змушений бути дозволено доторкнутися. 354 00:15:32,490 --> 00:15:36,330 Коротше кажучи, ця програма недоліки саме з цієї причини. 355 00:15:36,330 --> 00:15:38,070 Я принципово не робить? 356 00:15:38,070 --> 00:15:42,366 Які кроки я опущені, як ми опустили з першого прикладу Бінки? 357 00:15:42,366 --> 00:15:42,866 Так? 358 00:15:42,866 --> 00:15:43,710 >> АУДИТОРІЯ: розподіл пам'яті? 359 00:15:43,710 --> 00:15:45,001 >> Девід Малан: розподіл пам'яті. 360 00:15:45,001 --> 00:15:48,400 Я насправді не виділені будь-яка пам'ять для цього рядка. 361 00:15:48,400 --> 00:15:50,270 Таким чином, ми можемо виправити це в кілька способів. 362 00:15:50,270 --> 00:15:52,700 Один з них, ми можемо зберегти його простим і справді, тепер ти 363 00:15:52,700 --> 00:15:55,116 збирається почати бачити розмивання ліній між тим, що 364 00:15:55,116 --> 00:15:58,520 Масив, те, що рядок є, те, що символ зірка, яка масив символів 365 00:15:58,520 --> 00:15:59,020 є. 366 00:15:59,020 --> 00:16:02,450 Ось другий приклад за участю струнних і повідомлення 367 00:16:02,450 --> 00:16:05,690 Все, що я зробив на лінії 16, замість того щоб сказати 368 00:16:05,690 --> 00:16:09,530 що буфер буде символ зірка, покажчик на шматок пам'яті, 369 00:16:09,530 --> 00:16:14,057 Я збираюся дуже активно дають сам буфер 16 символів, 370 00:16:14,057 --> 00:16:16,390 і справді, якщо ви знайомі з терміном буферизації, 371 00:16:16,390 --> 00:16:20,570 ймовірно, зі світу відео, де відео буферизації, буферизація, 372 00:16:20,570 --> 00:16:21,175 буферизації. 373 00:16:21,175 --> 00:16:22,550 Ну, яка зв'язок тут? 374 00:16:22,550 --> 00:16:24,960 Ну, всередині YouTube і всередині відеоплеєрів 375 00:16:24,960 --> 00:16:27,200 як правило, являє собою масив це більше, ніж 16 років. 376 00:16:27,200 --> 00:16:30,340 Це може бути масив розміру одного мегабайт, може бути, 10 мегабайт, 377 00:16:30,340 --> 00:16:34,330 і в цьому масиві робить ваш браузер скачати цілу купу байтів, 378 00:16:34,330 --> 00:16:37,500 ціла купа мегабайт відео, і відео-плеєр, 379 00:16:37,500 --> 00:16:40,930 YouTube, або хто б не, починається читати байти з цього масиву, 380 00:16:40,930 --> 00:16:43,530 і в будь-який час ви бачите Слово буферизації, буферизація, 381 00:16:43,530 --> 00:16:46,350 це означає, що гравець має дійшли до кінця масиву. 382 00:16:46,350 --> 00:16:50,430 Мережа настільки повільно, що це не має наповнив масив з більш байт 383 00:16:50,430 --> 00:16:55,610 і так ви з бітів для відображення користувачеві. 384 00:16:55,610 --> 00:16:59,430 >> Так буфера є вдалий термін тут у тому, це просто масив, шматок пам'яті. 385 00:16:59,430 --> 00:17:02,530 І це буде виправити бо це виявляється 386 00:17:02,530 --> 00:17:07,410 що ви можете звертатися масиви, як ніби вони адреси, навіть якщо буфер 387 00:17:07,410 --> 00:17:10,710 це просто символ, це послідовність символів, буфер 388 00:17:10,710 --> 00:17:14,760 це корисно для мене, програміст, Ви можете передати своє ім'я навколо 389 00:17:14,760 --> 00:17:17,079 як якщо б це були покажчик, як би це 390 00:17:17,079 --> 00:17:21,000 були також адреса шматок пам'яті для 16 символів. 391 00:17:21,000 --> 00:17:24,530 Так от, щоб сказати, що я можу пройти зсапЕ саме це слово 392 00:17:24,530 --> 00:17:30,670 і тепер, якщо я цю програму, зробити зсапЕ 2, точка слеш зсапЕ 2, 393 00:17:30,670 --> 00:17:35,386 і введіть в привіт світ, Введіть, що time-- 394 00:17:35,386 --> 00:17:37,590 >> Хм, що трапилося? 395 00:17:37,590 --> 00:17:39,340 Рядок ласка. 396 00:17:39,340 --> 00:17:41,430 Що я зробив не так? 397 00:17:41,430 --> 00:17:43,800 Привіт світ, буфер. 398 00:17:43,800 --> 00:17:44,705 Привіт Світ. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ах, я знаю, що він робить. 401 00:17:49,420 --> 00:17:49,920 ДОБРЕ. 402 00:17:49,920 --> 00:17:51,628 Так що читає до до першого пропуску. 403 00:17:51,628 --> 00:17:55,680 Так що давайте обдурити на мить і сказати, що я просто хотів, щоб щось типу 404 00:17:55,680 --> 00:18:01,408 дійсно довго, як це довге речення це одна, дві, три, чотири, п'ять, 405 00:18:01,408 --> 00:18:04,420 шість, сім, вісім, дев'ять, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 ДОБРЕ. 407 00:18:05,300 --> 00:18:07,600 Це дійсно довге речення. 408 00:18:07,600 --> 00:18:10,710 Таким чином, ця пропозиція є більше, ніж 16 символів 409 00:18:10,710 --> 00:18:13,670 і тому, коли я вдарив Enter, що станеться? 410 00:18:13,670 --> 00:18:16,940 Ну, в цьому випадку з історія, я оголосив буфер 411 00:18:16,940 --> 00:18:22,190 насправді є масив з 16 символи готовий до роботи. 412 00:18:22,190 --> 00:18:27,426 Так один, два, три, чотири, п'ять, шість, сім, вісім, дев'ять, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Так 16 символів, і тепер, коли я читати щось, як це довго 415 00:18:34,410 --> 00:18:43,950 Вирок, що станеться в що я збираюся читати в це довго 416 00:18:43,950 --> 00:18:49,660 S-Е-Н-Т-Е-Н-С-Е, пропозицію. 417 00:18:49,660 --> 00:18:52,270 >> Так що це навмисно погано, що я 418 00:18:52,270 --> 00:18:55,060 продовжувати писати за межами Межі моєї масиву, 419 00:18:55,060 --> 00:18:56,660 за межами мого буфера. 420 00:18:56,660 --> 00:19:00,100 Я міг би отримати пощастило, і програма буде продовжувати працювати і не хвилює, 421 00:19:00,100 --> 00:19:03,450 але, взагалі кажучи, це дійсно крах мою програму, 422 00:19:03,450 --> 00:19:06,440 і це помилка в моєму код момент, коли я крок 423 00:19:06,440 --> 00:19:08,576 за кордону з цього масиву, тому що я 424 00:19:08,576 --> 00:19:10,450 не знаю, якщо це обов'язково вріжеться 425 00:19:10,450 --> 00:19:12,120 або якщо я просто хочу, щоб повезти. 426 00:19:12,120 --> 00:19:15,750 Так що це проблематично, тому що в цей випадок, він, здається, працюють 427 00:19:15,750 --> 00:19:20,931 і давайте спокушати долю тут, хоча інтегрована середа, здається, терпіти зовсім небагато 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Там ми йдемо. 430 00:19:22,040 --> 00:19:23,240 Нарешті. 431 00:19:23,240 --> 00:19:26,470 Так що я єдиний, хто може це побачити. 432 00:19:26,470 --> 00:19:29,630 Так що я просто було багато веселощів, набравши з дуже довгий фактичної фразу 433 00:19:29,630 --> 00:19:32,800 що це, звичайно, перевищила 16 байт, тому що я 434 00:19:32,800 --> 00:19:38,050 набрали в цьому божевільному тривалого мульти-лінії Фраза, і зверніть увагу на те, що сталося. 435 00:19:38,050 --> 00:19:41,110 Програма намагалася його друку а потім отримав помилку сегментації 436 00:19:41,110 --> 00:19:44,430 і помилки сегментації, коли щось подібне 437 00:19:44,430 --> 00:19:47,650 і операційна система говорить ні, не можуть доторкнутися до пам'яті. 438 00:19:47,650 --> 00:19:49,570 Ми збираємося, щоб убити Програма в цілому. 439 00:19:49,570 --> 00:19:51,180 >> Таким чином, це видається проблематичним. 440 00:19:51,180 --> 00:19:54,540 Я поліпшив програму, за допомогою якої принаймні, є пам'ять, 441 00:19:54,540 --> 00:19:58,000 але це, здавалося б обмежитися функція GetString, щоб отримати 442 00:19:58,000 --> 00:20:00,780 струни деякої кінцевої довжини 16. 443 00:20:00,780 --> 00:20:04,200 Так що, якщо ви хочете підтримувати більше вироки, ніж 16 символів, 444 00:20:04,200 --> 00:20:04,880 що ти робиш? 445 00:20:04,880 --> 00:20:07,970 Ну, ви можете збільшити Розмір цього буфера до 32 446 00:20:07,970 --> 00:20:09,190 або, що здається почасти коротким. 447 00:20:09,190 --> 00:20:12,260 Чому б нам не просто зробити це 1000, але відсунути. 448 00:20:12,260 --> 00:20:17,100 Що відповідь інтуїтивно з просто уникнути цієї проблеми шляхом 449 00:20:17,100 --> 00:20:20,660 мій буфер більше, як 1000 символів? 450 00:20:20,660 --> 00:20:23,470 Реалізуючи GetString цей шлях. 451 00:20:23,470 --> 00:20:27,130 Те, що добре чи погано тут? 452 00:20:27,130 --> 00:20:28,033 Так? 453 00:20:28,033 --> 00:20:30,574 АУДИТОРІЯ: Якщо ви пов'язувати багато простору, і ви не використовуєте його, 454 00:20:30,574 --> 00:20:33,500 то ви не можете перерозподілити цей простір. 455 00:20:33,500 --> 00:20:34,500 Девід Малан: Абсолютно вірно. 456 00:20:34,500 --> 00:20:38,480 Це марнотратно, оскільки, якщо ви не насправді потрібно 900 байт з цих 457 00:20:38,480 --> 00:20:41,057 і ще ви просите 1000 в цілому в будь-якому випадку, 458 00:20:41,057 --> 00:20:44,140 ви просто споживати більше пам'яті на комп'ютер користувача, ніж потрібно, 459 00:20:44,140 --> 00:20:45,740 і врешті-решт, деякі з Ви вже зустрічалися 460 00:20:45,740 --> 00:20:47,620 в житті, що, коли ви працює безліч програм 461 00:20:47,620 --> 00:20:50,470 і що вони їдять до багато пам'яті, це дійсно може вплинути на продуктивність 462 00:20:50,470 --> 00:20:52,220 і досвід користувача на комп'ютері. 463 00:20:52,220 --> 00:20:56,090 Так що начебто ледачий рішення, напевно, і, навпаки, 464 00:20:56,090 --> 00:21:00,140 це не тільки марнотратно, те, що проблема як і раніше залишається, навіть якщо я можу зробити мій буфера 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Так? 467 00:21:02,600 --> 00:21:04,475 >> Аудиторія: рядок довжиною 1,001. 468 00:21:04,475 --> 00:21:05,350 Девід Малан: Точно. 469 00:21:05,350 --> 00:21:08,280 Якщо рядок довжиною 1001, у вас є точно такою ж проблемою, 470 00:21:08,280 --> 00:21:10,705 і мій аргумент, я б тільки потім зробити його +2000 471 00:21:10,705 --> 00:21:12,830 але ви не знаєте, в заздалегідь, наскільки великий це повинно бути, 472 00:21:12,830 --> 00:21:16,890 і все ж, я повинен зібрати свою програму перш ніж дати людям використовувати і завантажити 473 00:21:16,890 --> 00:21:17,390 це. 474 00:21:17,390 --> 00:21:21,490 Так що це саме те, речі, які бібліотека намагається CS50 475 00:21:21,490 --> 00:21:24,750 щоб допомогти нам з, і ми будемо тільки погляд на деякі з базової реалізації 476 00:21:24,750 --> 00:21:29,790 тут, але це CS50 точка С. Це це файл, який був на CS50 IDE 477 00:21:29,790 --> 00:21:31,420 всі ці тижні, що ви використовуєте. 478 00:21:31,420 --> 00:21:34,280 Це попередньо складений і у Вас є використовує його автоматично 479 00:21:34,280 --> 00:21:38,780 за характером, що має тире L CS50 прапор з брязкотом, 480 00:21:38,780 --> 00:21:42,300 але якщо я перейдіть вниз через всі ці функції, ось GetString, 481 00:21:42,300 --> 00:21:44,636 і просто щоб дати вам смак того, що відбувається, 482 00:21:44,636 --> 00:21:46,760 давайте швидкий погляд на відносну складність. 483 00:21:46,760 --> 00:21:48,870 Це не супер довго Функція, але ми не зробили 484 00:21:48,870 --> 00:21:52,530 повинні думаю, що всі важко про як йти про отримання рядків. 485 00:21:52,530 --> 00:21:55,660 >> Отже, ось мій буфер, і я мабуть, його ініціалізації до нуля. 486 00:21:55,660 --> 00:21:57,990 Це, звичайно, є Те ж саме, як напівкоксу зірки, 487 00:21:57,990 --> 00:22:00,585 але я вирішив в реалізації бібліотеки CS50 488 00:22:00,585 --> 00:22:02,460 що якщо ми збираємося повністю динамічний, 489 00:22:02,460 --> 00:22:05,770 Я не знаю, заздалегідь, наскільки велика в рядок користувачі будуть хочете отримати. 490 00:22:05,770 --> 00:22:08,140 Так що я збираюся почати тільки з порожнім рядком 491 00:22:08,140 --> 00:22:11,507 і я збираюся побудувати стільки пам'яті, як мені потрібно, щоб відповідати рядок користувача 492 00:22:11,507 --> 00:22:13,340 і якщо я не достатньо, я попрошу 493 00:22:13,340 --> 00:22:15,010 операційна система для отримання додаткової пам'яті. 494 00:22:15,010 --> 00:22:17,510 Я збираюся перемістити їх рядок в більший шматок пам'яті 495 00:22:17,510 --> 00:22:21,847 і я збираюся випустити або звільнити недостатньо великий шматок пам'яті 496 00:22:21,847 --> 00:22:23,680 і ми тільки збираємося зробити це багаторазово. 497 00:22:23,680 --> 00:22:25,570 >> Таким чином, швидкий погляд, от тільки змінної 498 00:22:25,570 --> 00:22:28,780 з якою я йду, щоб відстежувати ємності моєї буфера. 499 00:22:28,780 --> 00:22:30,071 Скільки байт я можу відповідати? 500 00:22:30,071 --> 00:22:32,070 Ось змінна п з який я буду тримати 501 00:22:32,070 --> 00:22:36,200 трек скільки байт насправді в буфер, або що користувач ввів. 502 00:22:36,200 --> 00:22:39,900 Якщо ви не бачили це раніше, вам можна вказати, що змінна, як Int 503 00:22:39,900 --> 00:22:46,370 без знака, який, як випливає з назви, означає, що це не-негативним, а чому б 504 00:22:46,370 --> 00:22:50,590 Я коли-небудь хотів турбувати уточненням що INT це не просто INT, 505 00:22:50,590 --> 00:22:52,540 але це беззнаковое INT? 506 00:22:52,540 --> 00:22:55,064 Це неотрицательная Int. 507 00:22:55,064 --> 00:22:56,355 Що означає [нерозбірливо] на увазі? 508 00:22:56,355 --> 00:22:58,910 >> АУДИТОРІЯ: Це описі кількість пам'яті, який може бути [нерозбірливо]. 509 00:22:58,910 --> 00:22:59,660 >> Девід Малан: Так. 510 00:22:59,660 --> 00:23:03,710 Так що, якщо я говорю без знака, це насправді даючи вам один біт додаткової пам'яті 511 00:23:03,710 --> 00:23:07,440 і, здається, безглуздо, але якщо ви є один біт додаткової пам'яті, що 512 00:23:07,440 --> 00:23:09,940 означає, що ви повинні в два рази більше значення можна уявити, 513 00:23:09,940 --> 00:23:11,570 тому що це може бути 0 або 1. 514 00:23:11,570 --> 00:23:14,660 Так, за замовчуванням, цілочисельне може бути приблизно негативне 2 млрд весь шлях 515 00:23:14,660 --> 00:23:16,030 до позитивного 2 млрд. 516 00:23:16,030 --> 00:23:18,540 Ті великі діапазони, але він як і раніше вид марнотратно 517 00:23:18,540 --> 00:23:21,280 якщо ви тільки піклуватися про розміри, які просто інтуїтивно 518 00:23:21,280 --> 00:23:24,620 не повинні бути негативними або позитивне або 0, ну а потім, 519 00:23:24,620 --> 00:23:28,884 чому ви витрачаєте 2 млрд Можливі значення для негативних чисел 520 00:23:28,884 --> 00:23:30,300 якщо ви ніколи не збираєтеся їх використовувати? 521 00:23:30,300 --> 00:23:35,350 Так, говорячи без знака, тепер моя Int може бути між 0 і приблизно 4 млрд. 522 00:23:35,350 --> 00:23:39,280 >> Так от просто INT C з причин, ми не зможемо отримати в зараз, як 523 00:23:39,280 --> 00:23:42,280 чому це цілочисельне замість з гольця, але от 524 00:23:42,280 --> 00:23:44,630 суть того, що відбувається на, і деякі з вас 525 00:23:44,630 --> 00:23:48,340 можуть використовувати, наприклад, fgetc функція навіть в чотири Pset 526 00:23:48,340 --> 00:23:51,580 або після того, що ми побачимо його знову в задачі встановити п'ять, 527 00:23:51,580 --> 00:23:55,410 fgetc приємно, тому що, як ім'я вигляд, начебто arcanely припускає, 528 00:23:55,410 --> 00:23:57,940 це функція, яка отримує характер і тому, 529 00:23:57,940 --> 00:24:00,690 що принципово відрізняється про те, що ми робимо в GetString 530 00:24:00,690 --> 00:24:03,110 це ми не використовуємо зсапЕ таким же чином. 531 00:24:03,110 --> 00:24:07,550 Ми просто повзе крок за кроком протягом будь-якого користувач ввів в, 532 00:24:07,550 --> 00:24:10,970 тому що ми завжди можемо виділити один символ, і таким чином, ми завжди можемо сміливо 533 00:24:10,970 --> 00:24:15,599 дивитися в одну гольця в той час, і магія починає відбуватися тут. 534 00:24:15,599 --> 00:24:17,890 Я збираюся Прокрутіть вниз до середина цієї функції 535 00:24:17,890 --> 00:24:20,360 просто коротко представити цю функцію. 536 00:24:20,360 --> 00:24:22,670 Багато чого, як є Функція Танос, є 537 00:24:22,670 --> 00:24:27,740 функція Realloc де Realloc дозволяє вам перерозподілити частину пам'яті 538 00:24:27,740 --> 00:24:29,570 і зробити його більше або менше. 539 00:24:29,570 --> 00:24:33,060 Так Коротше кажучи, і з хвиля мого боку на сьогоднішній день, 540 00:24:33,060 --> 00:24:35,620 знаю, що GetString робить це свого роду 541 00:24:35,620 --> 00:24:39,720 магічно росте або скорочується буфер як користувач 542 00:24:39,720 --> 00:24:41,440 типи в його або її рядка. 543 00:24:41,440 --> 00:24:43,962 >> Так що, якщо користувач вводить Короткий рядок, цей код 544 00:24:43,962 --> 00:24:45,920 тільки виділяє достатньо пам'яті, щоб відповідати рядок. 545 00:24:45,920 --> 00:24:48,086 Якщо користувач зберігає введення як я зробив це знову і знову 546 00:24:48,086 --> 00:24:50,330 і знову, і, якщо буфера спочатку цей великий 547 00:24:50,330 --> 00:24:53,310 і програма реалізує, щоб постривай, я з космосу, 548 00:24:53,310 --> 00:24:55,410 це збирається подвоїти розмір буфера 549 00:24:55,410 --> 00:24:59,110 і потім два рази розмір буфера і код, який робить подвоєння, 550 00:24:59,110 --> 00:25:03,170 якщо ми подивимося на нього тут, це тільки ця розумна одна вкладиш. 551 00:25:03,170 --> 00:25:06,830 Ви, можливо, не бачив цей синтаксис раніше, але якщо ви говорите, зірки дорівнює, 552 00:25:06,830 --> 00:25:10,470 це те ж саме, кажучи раз Місткість 2. 553 00:25:10,470 --> 00:25:13,390 Так він просто продовжує подвоєння ємність буфера 554 00:25:13,390 --> 00:25:17,480 а потім розповідати Realloc дати Сам, що набагато більше пам'яті. 555 00:25:17,480 --> 00:25:19,720 >> Тепер, як в сторону, там інші функції в тут 556 00:25:19,720 --> 00:25:23,680 що ми не будемо дивитися в деталі крім як показати в GetInt, 557 00:25:23,680 --> 00:25:26,150 ми використовуємо GetString в GetInt. 558 00:25:26,150 --> 00:25:28,192 Ми перевіряємо, що це не NULL, який, нагадаємо, 559 00:25:28,192 --> 00:25:30,400 це спеціальне значення, що означає щось пішло не так. 560 00:25:30,400 --> 00:25:31,233 Ми з пам'яті. 561 00:25:31,233 --> 00:25:32,310 Краще перевірити це. 562 00:25:32,310 --> 00:25:33,710 І ми повертаємо значення дозорного. 563 00:25:33,710 --> 00:25:37,850 Але я відкласти на коментарі щодо того, чому, а потім ми використовуємо цю двоюрідний брат зсапЕ 564 00:25:37,850 --> 00:25:42,100 називається sscanf і виходить, що sscanf, або рядок зсапЕ, 565 00:25:42,100 --> 00:25:45,310 дозволяє вам поглянути на лінії, користувач ввів в вас, і нехай 566 00:25:45,310 --> 00:25:49,610 проаналізувати його по суті і те, що я робимо тут, я кажу sscanf, 567 00:25:49,610 --> 00:25:54,440 проаналізувати всі користувач набрали в і переконайтеся,% I, 568 00:25:54,440 --> 00:25:59,250 існує ціле число в ньому, і ми не будемо потрапити в сьогодні точно, чому є також 569 00:25:59,250 --> 00:26:03,760 A% C тут, але в двох словах дозволяє нам виявити, якщо користувач ввів 570 00:26:03,760 --> 00:26:06,050 в чомусь фіктивні після номера. 571 00:26:06,050 --> 00:26:11,766 Так що причина, що GetInt і GetString сказати вам, щоб повторити спробу, повторіть, повторіть спробу 572 00:26:11,766 --> 00:26:13,640 з-за всіх що код, який ми написали, 573 00:26:13,640 --> 00:26:17,900 це свого роду погляд на вході користувача в переконавшись, що він повністю цифрова Це 574 00:26:17,900 --> 00:26:21,700 або це реальна плаваючою значення точки і т.п., 575 00:26:21,700 --> 00:26:24,233 в залежності від того, якої величини функціонувати ви використовуєте. 576 00:26:24,233 --> 00:26:25,060 >> Ось так. 577 00:26:25,060 --> 00:26:25,710 ДОБРЕ. 578 00:26:25,710 --> 00:26:27,592 Це був ковток але справа тут 579 00:26:27,592 --> 00:26:29,550 що причина у нас було ці навчальні диски по 580 00:26:29,550 --> 00:26:32,880 в тому, що на найнижчому рівні, Є тільки так багато речей, які 581 00:26:32,880 --> 00:26:35,674 може піти не так, що ми хотіли превентивно обробляти 582 00:26:35,674 --> 00:26:38,090 ці речі, звичайно, в Перші тижні класу, 583 00:26:38,090 --> 00:26:42,230 але тепер з Pset чотири і п'ять, і Pset за ви побачите, що це більше до 584 00:26:42,230 --> 00:26:45,570 Ви, але і ви більш здатні вирішення цих проблем види 585 00:26:45,570 --> 00:26:47,180 самостійно. 586 00:26:47,180 --> 00:26:51,770 Будь-які питання по GetString або GetInt? 587 00:26:51,770 --> 00:26:52,630 Так? 588 00:26:52,630 --> 00:26:55,130 >> АУДИТОРІЯ: Чому б вам подвоїти ємність буфера 589 00:26:55,130 --> 00:26:57,630 а не просто збільшення це по точної суми? 590 00:26:57,630 --> 00:26:58,100 >> Девід Малан: Хороший вопрос. 591 00:26:58,100 --> 00:27:00,474 Чому ми вдвічі ємність буфера, на відміну 592 00:27:00,474 --> 00:27:02,800 просто збільшуючи його деякої постійної величини? 593 00:27:02,800 --> 00:27:03,900 Це було дизайнерське рішення. 594 00:27:03,900 --> 00:27:08,590 Ми просто вирішили, що, тому що це, як правило, бути трохи дорожче часу мудро запитати 595 00:27:08,590 --> 00:27:10,440 операційна система на пам'ять, ми не 596 00:27:10,440 --> 00:27:13,210 хочете в кінцевому підсумку отримати в ситуація для великих рядків 597 00:27:13,210 --> 00:27:14,960 що ми просили ОС знову і знову 598 00:27:14,960 --> 00:27:17,500 і знову, і знову в Швидка зміна на пам'ять. 599 00:27:17,500 --> 00:27:20,387 Таким чином, ми просто вирішили, кілька довільно, але ми сподіваємося, що розумно, 600 00:27:20,387 --> 00:27:22,720 що, ви знаєте, що, давайте спробувати отримати попереду себе 601 00:27:22,720 --> 00:27:25,520 і просто продовжувати подвоювати його так, що ми мінімізуємо кількість разів 602 00:27:25,520 --> 00:27:29,010 ми повинні називати Танос або Realloc, але в цілому суд 603 00:27:29,010 --> 00:27:31,820 назвати в відсутність знаючи те, що користувачі, можливо, захочете, щоб ввести в. 604 00:27:31,820 --> 00:27:33,600 Обидва способи можуть бути спірним. 605 00:27:33,600 --> 00:27:35,430 Можливо добре. 606 00:27:35,430 --> 00:27:39,240 >> Отже, давайте поглянемо на пару інших побічних ефектів пам'яті, 607 00:27:39,240 --> 00:27:41,610 речі, які можуть піти не так і інструменти, які ви можете 608 00:27:41,610 --> 00:27:43,880 використовувати, щоб зловити ці види помилок. 609 00:27:43,880 --> 00:27:47,800 Виявляється всі з вас, навіть якщо check50 не сказав вам, як багато, 610 00:27:47,800 --> 00:27:50,050 пишу баггі Код, оскільки тижні один, 611 00:27:50,050 --> 00:27:53,630 навіть якщо всі тести є check50 пройшло, і навіть якщо ви і ваш TF 612 00:27:53,630 --> 00:27:56,010 супер впевнені, що Ваш код працює, як передбачалося. 613 00:27:56,010 --> 00:27:59,190 Ваш код був баггі або недоліки в тому, що всі з вас, 614 00:27:59,190 --> 00:28:02,540 за допомогою бібліотеки CS50, були витоку пам'яті. 615 00:28:02,540 --> 00:28:06,040 Ти питав операційну систему на пам'ять в більшості програм 616 00:28:06,040 --> 00:28:08,850 Ви написали, але ви ніколи не повернула його. 617 00:28:08,850 --> 00:28:12,110 Ви назвали GetString і GetInt і GetFloat, 618 00:28:12,110 --> 00:28:15,270 але з GetString, ви, ніколи не називав unGetString або Дайте 619 00:28:15,270 --> 00:28:19,890 Рядок Назад або т.п., але ми бачили, що робить GetString виділити пам'ять 620 00:28:19,890 --> 00:28:22,810 шляхом Танос або це Функція Realloc, який знаходиться всього 621 00:28:22,810 --> 00:28:25,670 дуже схожі по духу, і все ж, ми були 622 00:28:25,670 --> 00:28:28,629 просити операційну систему для пам'ять і пам'ять знову і знову 623 00:28:28,629 --> 00:28:29,670 але ніколи не даючи його назад. 624 00:28:29,670 --> 00:28:33,550 >> Тепер, як в сторону, то виходить, що коли програма завершує роботу, вся пам'ять 625 00:28:33,550 --> 00:28:34,870 автоматично звільняється. 626 00:28:34,870 --> 00:28:36,150 Таким чином, це не було величезну справу. 627 00:28:36,150 --> 00:28:38,590 Це не збирається зламати IDE або повільно речі вниз, 628 00:28:38,590 --> 00:28:40,670 Але коли програми не як правило, витік пам'яті 629 00:28:40,670 --> 00:28:42,170 і вони працюють протягом тривалого часу. 630 00:28:42,170 --> 00:28:45,640 Якщо ви коли-небудь бачили дурна маленька пляжний м'яч в Mac OS або пісочний годинник 631 00:28:45,640 --> 00:28:51,160 У Windows, де це вид уповільнення або думати або думати 632 00:28:51,160 --> 00:28:53,770 або просто дійсно починає щоб сповільнитися, 633 00:28:53,770 --> 00:28:56,960 дуже можливо, може бути результатом витоку пам'яті. 634 00:28:56,960 --> 00:28:59,970 Програмісти, які писали програмне забезпечення ви використовуєте 635 00:28:59,970 --> 00:29:03,570 просити операційну систему для пам'яті кожні кілька хвилин, щогодини. 636 00:29:03,570 --> 00:29:05,570 Але якщо ви виконавши Програмне забезпечення, навіть якщо це 637 00:29:05,570 --> 00:29:08,680 звести до мінімуму у вашому комп'ютері протягом декількох годин або днів поспіль, 638 00:29:08,680 --> 00:29:11,980 Ви могли б просити більше і більше пам'яті і ніколи не використовувати його насправді 639 00:29:11,980 --> 00:29:15,180 і так що ваш код може бути, або програми можуть бути витік пам'яті, 640 00:29:15,180 --> 00:29:18,350 і якщо ви починаєте витік пам'яті, їсти менше пам'яті для інших програм, 641 00:29:18,350 --> 00:29:21,220 і ефект в уповільнити все вниз. 642 00:29:21,220 --> 00:29:23,600 >> Тепер, це, безумовно, один з Найбільш жорстокі програми 643 00:29:23,600 --> 00:29:26,350 Ви будете мати можливість працювати в тій CS50 644 00:29:26,350 --> 00:29:31,650 а його вихід ще більш езотерична, ніж брязкіт Або зробити або будь-якої команди 645 00:29:31,650 --> 00:29:35,930 Програми лінії ми запускаємо раніше, але На щастя, вбудовані в його виході 646 00:29:35,930 --> 00:29:39,810 це деякі супер корисні поради, що буде корисна як для Pset чотирьох 647 00:29:39,810 --> 00:29:41,510 або, звичайно, Pset п'ять. 648 00:29:41,510 --> 00:29:44,250 Так Valgrind є інструментом який може бути використаний, щоб подивитися 649 00:29:44,250 --> 00:29:46,930 витоків пам'яті у вашій програмі. 650 00:29:46,930 --> 00:29:48,570 Це відносно просто працювати. 651 00:29:48,570 --> 00:29:51,420 Ви запускаєте Valgrind, а потім, навіть хоча це трохи багатослівний, 652 00:29:51,420 --> 00:29:54,440 тире перевірка витік тире дорівнює повній, а потім точка 653 00:29:54,440 --> 00:29:56,320 слеш і ім'я вашої програми. 654 00:29:56,320 --> 00:30:00,010 Так Valgrind буде запустити програму і в самому кінці своєї програми 655 00:30:00,010 --> 00:30:02,240 працює, перш ніж він іде і дає вам ще підкажіть, 656 00:30:02,240 --> 00:30:04,980 він збирається для аналізу Програма поки вона бігла 657 00:30:04,980 --> 00:30:07,740 і сказати, що ти ви витік будь-яка пам'ять і ще краще, 658 00:30:07,740 --> 00:30:10,610 ти Touch Memory, що не належить вам? 659 00:30:10,610 --> 00:30:13,700 Він не може зловити всі, але це дуже добре при лові більшість речей. 660 00:30:13,700 --> 00:30:19,700 >> Так ось приклад моєї пробігши ця програма, пробігши Valgrind, 661 00:30:19,700 --> 00:30:21,470 на програму під назвою пам'яті, і я збираюся 662 00:30:21,470 --> 00:30:24,730 виділити рядки, які в кінцевому рахунку, представляє для нас інтерес. 663 00:30:24,730 --> 00:30:27,690 Так що ще більше відволікатися що я видалений з слайда. 664 00:30:27,690 --> 00:30:30,930 Але давайте подивимося, що це Програма здатна сказати нам. 665 00:30:30,930 --> 00:30:34,800 Він здатний розповідати нам речі як недійсним запису розміром 4. 666 00:30:34,800 --> 00:30:38,020 Іншими словами, якщо ви торкаєтеся пам'ять, зокрема 4 байт пам'яті 667 00:30:38,020 --> 00:30:40,350 що ви не повинні мати, Valgrind можу сказати вам, що. 668 00:30:40,350 --> 00:30:41,660 Невірний записи розміром 4. 669 00:30:41,660 --> 00:30:43,640 Ви торкнулися чотири байти що ви не повинні мати. 670 00:30:43,640 --> 00:30:44,840 Де ти це зробив? 671 00:30:44,840 --> 00:30:45,900 Це краса. 672 00:30:45,900 --> 00:30:50,000 Точка пам'яті з лінії 21, де вас облажались, і саме тому це корисно. 673 00:30:50,000 --> 00:30:53,410 Багато чого, як GDB, він може допомогти вказати вам на помилки фактичного. 674 00:30:53,410 --> 00:30:57,170 >> Тепер, цей трохи більше багатослівний, якщо не плутаю. 675 00:30:57,170 --> 00:31:01,307 40 байт 1 блоків, безумовно, втратили у втраті записи 1 з 1. 676 00:31:01,307 --> 00:31:02,140 Що це означає? 677 00:31:02,140 --> 00:31:05,920 Ну, це просто означає, що ви просили 40 байт і ти ніколи не дав його назад. 678 00:31:05,920 --> 00:31:08,930 Ви назвали Танос або ви назвати GetString і операційна система 679 00:31:08,930 --> 00:31:12,450 не дав вам 40 байт, але ви ніколи не звільнені або звільнені, що пам'ять, 680 00:31:12,450 --> 00:31:15,400 і бути справедливими, ми ніколи не показуємо Ви, як віддати пам'ять. 681 00:31:15,400 --> 00:31:17,910 Виявляється, є супер проста функція називається вільним. 682 00:31:17,910 --> 00:31:21,170 Приймає один аргумент, річ Ви хочете, щоб звільнити або віддати, 683 00:31:21,170 --> 00:31:23,430 але 40 байт, мабуть, у цій програмі 684 00:31:23,430 --> 00:31:27,300 були втрачені в рядку 20 пам'яті точка гр. 685 00:31:27,300 --> 00:31:28,650 >> Отже, давайте подивимося цю програму. 686 00:31:28,650 --> 00:31:31,020 Це супер марно. 687 00:31:31,020 --> 00:31:33,980 Це тільки демонструє це конкретна помилка. 688 00:31:33,980 --> 00:31:34,920 Отже, давайте поглянемо. 689 00:31:34,920 --> 00:31:39,920 Ось основні і головні, повідомлення, дзвінки функція називається F, а потім повертається. 690 00:31:39,920 --> 00:31:41,550 Так що не все, що цікаво. 691 00:31:41,550 --> 00:31:42,664 Що е робити? 692 00:31:42,664 --> 00:31:44,330 Зверніть увагу, я не став з прототипом. 693 00:31:44,330 --> 00:31:46,520 Я хотів, щоб зберегти код якомога менше. 694 00:31:46,520 --> 00:31:49,530 Так що я поклав п вище основної і це нормально, звичайно, 695 00:31:49,530 --> 00:31:51,500 для коротких програм, як це. 696 00:31:51,500 --> 00:31:56,910 Так е нічого не повертає і робить не взяти що-небудь, але це зробити. 697 00:31:56,910 --> 00:31:59,620 Це заявляє, подібно в прикладі Binky, 698 00:31:59,620 --> 00:32:02,682 покажчик називається х, що відбувається зберігати адресу в міжнар. 699 00:32:02,682 --> 00:32:03,890 Так от ліва сторона. 700 00:32:03,890 --> 00:32:07,230 В англійській мові, що є Права робити? 701 00:32:07,230 --> 00:32:09,770 Хто-небудь? 702 00:32:09,770 --> 00:32:13,665 Що це робить для нас? 703 00:32:13,665 --> 00:32:14,651 Так? 704 00:32:14,651 --> 00:32:16,623 >> АУДИТОРІЯ: [нерозбірливо] разів розмір з Int 705 00:32:16,623 --> 00:32:19,175 що в 10 разів більше, ніж [нерозбірливо] 706 00:32:19,175 --> 00:32:20,800 Девід Малан: Добре, і дозвольте мені підвести підсумок. 707 00:32:20,800 --> 00:32:25,480 Так виділити достатньо місця для 10 чисел або 10, що розміром з Int, 708 00:32:25,480 --> 00:32:29,340 це чотири байти, тому в 10 разів 4 40, так що з правого боку, що я 709 00:32:29,340 --> 00:32:33,930 виділений це дати мені 40 байт і зберегти адресу першого байта 710 00:32:33,930 --> 00:32:34,940 в х. 711 00:32:34,940 --> 00:32:38,380 А тепер, нарешті, і ось, де ця програма глючить, що 712 00:32:38,380 --> 00:32:41,540 так з лінії 21 на основі цієї логіки? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Що сталося з лінією 21? 715 00:32:46,280 --> 00:32:46,780 Так? 716 00:32:46,780 --> 00:32:49,550 АУДИТОРІЯ: Ви не можете індекс у х [нерозбірливо]. 717 00:32:49,550 --> 00:32:50,300 Девід Малан: Так. 718 00:32:50,300 --> 00:32:52,270 Я не повинен індекс в х, як, що. 719 00:32:52,270 --> 00:32:53,850 Так синтаксично, це нормально. 720 00:32:53,850 --> 00:32:56,990 Що приємно, так само, як вам може відноситися до імені масиву 721 00:32:56,990 --> 00:33:01,080 як ніби це покажчик, аналогічно Ви можете лікувати покажчик як ніби це 722 00:33:01,080 --> 00:33:06,425 масив, і тому я можу синтаксично говорять щось х кронштейн, кронштейн х я, 723 00:33:06,425 --> 00:33:07,800 але 10 є проблематичним. 724 00:33:07,800 --> 00:33:09,096 Чому? 725 00:33:09,096 --> 00:33:10,910 >> АУДИТОРІЯ: Тому що це не всередині. 726 00:33:10,910 --> 00:33:12,390 >> Девід Малан: Це не всередині цього шматка пам'яті. 727 00:33:12,390 --> 00:33:15,306 Що найбільше значення я повинен класти в цих квадратних дужках? 728 00:33:15,306 --> 00:33:16,870 До 9 9, 0. 729 00:33:16,870 --> 00:33:18,160 Через нульовий індексації. 730 00:33:18,160 --> 00:33:20,190 Так від 0 до 9 буде в порядку. 731 00:33:20,190 --> 00:33:23,960 Кронштейн 10 не хорошо, і але, нагадаємо, однак, кожен раз, 732 00:33:23,960 --> 00:33:27,017 Я, здається, щоб спробувати зробити CS50 IDE аварії, набравши в фіктивних цінностей, 733 00:33:27,017 --> 00:33:29,100 це не завжди співпрацювати, і, дійсно, часто 734 00:33:29,100 --> 00:33:31,460 пощастить тільки тому, що Операційна система не 735 00:33:31,460 --> 00:33:35,467 Ви помітите, що трохи пройти деякий шматок пам'яті, 736 00:33:35,467 --> 00:33:38,300 тому що ви залишилися в технічно Ваш сегмент, але про це 737 00:33:38,300 --> 00:33:40,940 в класі операційних систем, і так щось на зразок цього 738 00:33:40,940 --> 00:33:43,000 може дуже легко залишитися непоміченими. 739 00:33:43,000 --> 00:33:48,120 Ваша програма ніколи не буде врізатися послідовно, але, можливо один раз на деякий час. 740 00:33:48,120 --> 00:33:50,610 >> І так давайте спробуємо Valgrind на це, і ось 741 00:33:50,610 --> 00:33:52,870 де ми перевантажені по виході на мить. 742 00:33:52,870 --> 00:34:00,810 Так що перевірку на витік пам'яті Valgrind дорівнює повній пам'яті точка слеш. 743 00:34:00,810 --> 00:34:03,040 І ось чому я обіцяю це розтрощити. 744 00:34:03,040 --> 00:34:05,700 Ось те, що Valgrind, ось що програміст, кілька років ago- 745 00:34:05,700 --> 00:34:08,469 вирішив, що це буде хороша ідея, для виходу виглядати. 746 00:34:08,469 --> 00:34:09,750 Отже, давайте розібратися в цьому. 747 00:34:09,750 --> 00:34:13,120 Так всю дорогу на лівій сторона без поважної причини 748 00:34:13,120 --> 00:34:16,620 ідентифікатор процесу програми ми просто запустити, унікальний ідентифікатор 749 00:34:16,620 --> 00:34:18,030 для програми ми просто бігли. 750 00:34:18,030 --> 00:34:19,738 Ми видалили, що з слайд, але 751 00:34:19,738 --> 00:34:22,190 це деяка корисна інформація тут. 752 00:34:22,190 --> 00:34:24,684 >> Давайте прокрутки до самого верху. 753 00:34:24,684 --> 00:34:25,600 Ось де ми почали. 754 00:34:25,600 --> 00:34:27,040 Так що це не все, що багато чого вихід. 755 00:34:27,040 --> 00:34:30,429 Ось, що пишуть недійсним розмір 4 на лінії 21. 756 00:34:30,429 --> 00:34:31,760 Ну, те, що було 21 лінія? 757 00:34:31,760 --> 00:34:34,500 Лінія 21 була точно це і є сенс 758 00:34:34,500 --> 00:34:37,290 що я перебуваю в валідності писати 4 байта, тому що я 759 00:34:37,290 --> 00:34:40,389 намагаються поставити цей ціле, який може бути що завгодно, 760 00:34:40,389 --> 00:34:42,370 це просто відбувається, щоб бути нулю, але я намагаюся 761 00:34:42,370 --> 00:34:44,940 покласти його на місці що не належить мені. 762 00:34:44,940 --> 00:34:50,900 Більше того, тут, 40 байт в одному блоки, безумовно, втратив у запису 1. 763 00:34:50,900 --> 00:34:56,500 Це тому, що, коли я називаю Танос тут, я ніколи не звільнить пам'ять. 764 00:34:56,500 --> 00:34:58,140 >> Так як ми можемо це виправити? 765 00:34:58,140 --> 00:35:02,970 Дозвольте мені йти вперед і бути трохи безпечніше і робити там 9, і нехай мене тут безкоштовно X. 766 00:35:02,970 --> 00:35:04,820 Це нова функція на сьогоднішній день. 767 00:35:04,820 --> 00:35:11,520 Якщо зараз я повторно зробити точковий пам'яті межу, давайте працювати Valgrind на нього знову, 768 00:35:11,520 --> 00:35:14,990 збільшити моє вікно і натисніть Enter. 769 00:35:14,990 --> 00:35:16,900 Тепер, це добре. 770 00:35:16,900 --> 00:35:19,590 Вони ховають хороші новини всього цього виходу. 771 00:35:19,590 --> 00:35:20,810 Всі блоки купи були вільні. 772 00:35:20,810 --> 00:35:23,604 Ми повернемося до того, що купи є, але ніяких витоків не можливо. 773 00:35:23,604 --> 00:35:25,520 Так що це просто ще один інструмент для вашого набору інструментів 774 00:35:25,520 --> 00:35:30,220 з якою ви можете почати зараз знайти помилки, як, що. 775 00:35:30,220 --> 00:35:34,532 >> Але давайте подивимося, що більше може піти не так тут. 776 00:35:34,532 --> 00:35:38,890 Давайте перехід зараз насправді вирішити проблему. 777 00:35:38,890 --> 00:35:42,440 Як осторонь, якщо це позбавить трохи плутанини або напруженості, 778 00:35:42,440 --> 00:35:43,430 тепер це смішно. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Так. 781 00:35:46,900 --> 00:35:49,040 Це дуже добре. 782 00:35:49,040 --> 00:35:50,890 Тому що покажчики адреси та адреси 783 00:35:50,890 --> 00:35:53,098 як правило, за угодою написано шістнадцятковому вигляді. 784 00:35:53,098 --> 00:35:54,650 Ха-ха, це смішно сьогодні. 785 00:35:54,650 --> 00:35:58,390 У всякому разі, так що давайте прямо зараз насправді вирішити проблему. 786 00:35:58,390 --> 00:36:00,840 Це було супер, супер низького рівня досі, 787 00:36:00,840 --> 00:36:03,950 і ми можемо насправді корисно речі з цих низькорівневих деталей. 788 00:36:03,950 --> 00:36:06,710 >> Таким чином, ми ввели кілька тижнів тому поняття масиву. 789 00:36:06,710 --> 00:36:09,177 Масив був хороший, тому що важко очистити наш код 790 00:36:09,177 --> 00:36:11,760 тому що, якщо ми хотіли, щоб написати Програма з декількома студентами 791 00:36:11,760 --> 00:36:15,270 або кілька імен і вдома, і гуртожитку і коледжів, і все, що, 792 00:36:15,270 --> 00:36:19,430 ми могли б зберігати все більш чисто всередині масиву. 793 00:36:19,430 --> 00:36:23,039 Але запропонувати один недолік масиву досі. 794 00:36:23,039 --> 00:36:26,080 Навіть якщо ви не страждали самі в програмі, просто інстинктивно, 795 00:36:26,080 --> 00:36:30,870 те, що це погано про масиві, може бути? 796 00:36:30,870 --> 00:36:32,337 Я чув деякі шуми. 797 00:36:32,337 --> 00:36:34,170 АУДИТОРІЯ: Це складно змінити розмір. 798 00:36:34,170 --> 00:36:36,128 Девід Малан: Важко змінити розмір. 799 00:36:36,128 --> 00:36:38,660 Ви не можете змінити розмір масиву, насправді, як такі 800 00:36:38,660 --> 00:36:43,040 в C. Ви можете виділити ще один масив, перемістити всі від старого 801 00:36:43,040 --> 00:36:45,380 в нове, і в даний час є якийсь додатковий простір, 802 00:36:45,380 --> 00:36:47,469 але це не як мова, як Java або Python 803 00:36:47,469 --> 00:36:49,760 або будь-яку кількість інших мови, з якими деякі з вас 804 00:36:49,760 --> 00:36:52,070 може бути знаком де ви можна просто продовжувати додавати речі 805 00:36:52,070 --> 00:36:53,930 нудоти до кінця масиву. 806 00:36:53,930 --> 00:36:57,880 Якщо у вас є масив Розмір 6, тобто його розмір, 807 00:36:57,880 --> 00:37:01,970 і так багато, як раніше ідея мають буфер певного розміру, 808 00:37:01,970 --> 00:37:05,940 ви повинні здогадатися з воріт який розмір ви хочете бути? 809 00:37:05,940 --> 00:37:07,880 Якщо ви вгадаєте занадто великий, ви витрачаєте простір. 810 00:37:07,880 --> 00:37:10,950 Якщо ви вгадаєте занадто малий, вам не може зберігати ці дані, принаймні, 811 00:37:10,950 --> 00:37:12,940 без багато роботи. 812 00:37:12,940 --> 00:37:18,180 >> Таким чином, сьогодні завдяки покажчиків, ми можемо почати шити разом наш власний звичай 813 00:37:18,180 --> 00:37:20,989 структури даних, і в Те, тут щось 814 00:37:20,989 --> 00:37:23,030 що виглядає трохи більше загадкові на перший погляд, 815 00:37:23,030 --> 00:37:26,440 але це те, що ми називаємо пов'язані Список, і його ім'я роду підсумовує 816 00:37:26,440 --> 00:37:26,940 це. 817 00:37:26,940 --> 00:37:29,550 Це список чисел, або в цей випадок, список номерів, 818 00:37:29,550 --> 00:37:33,480 але це може бути список що-небудь, але це пов'язано разом шляхом стрілок, 819 00:37:33,480 --> 00:37:36,380 і просто зробити припущення з тим, що техніка 820 00:37:36,380 --> 00:37:38,310 ми збираємося, щоб мати можливість зшити разом, 821 00:37:38,310 --> 00:37:42,540 зразок попкорна з різьбленням, пов'язаний списки прямокутники тут? 822 00:37:42,540 --> 00:37:43,936 Його номери? 823 00:37:43,936 --> 00:37:45,560 Що функція основна мова? 824 00:37:45,560 --> 00:37:46,350 >> АУДИТОРІЯ: Покажчик. 825 00:37:46,350 --> 00:37:47,308 >> Девід Малан: Покажчик. 826 00:37:47,308 --> 00:37:51,700 Таким чином, кожен з цих стріл тут представляє покажчик або просто адресу. 827 00:37:51,700 --> 00:37:54,590 Отже, іншими словами, якщо я хочу зберігати список номерів, 828 00:37:54,590 --> 00:37:59,040 Я не можу просто зберігати його, якщо я хочу здатність збільшуватися і зменшуватися 829 00:37:59,040 --> 00:38:00,990 мій структура даних в масиві. 830 00:38:00,990 --> 00:38:03,000 Тому мені потрібно, щоб мати трохи більш вишуканість, 831 00:38:03,000 --> 00:38:05,720 але помітити, що це картина вид припускає 832 00:38:05,720 --> 00:38:08,650 що якщо ви тільки що отримали маленькі теми підключення всі разом, 833 00:38:08,650 --> 00:38:13,100 ймовірно, це не так складно зробити простір між двома цими прямокутниками 834 00:38:13,100 --> 00:38:16,750 або два з цих вузлів, як ми почнемо називаючи їх, покласти в новий вузол, 835 00:38:16,750 --> 00:38:19,547 а потім з якоїсь нової нитки, просто канаву три вузли разом, 836 00:38:19,547 --> 00:38:22,880 перший, останній, і той, що ви тільки що вставили в середину. 837 00:38:22,880 --> 00:38:26,000 >> І дійсно зв'язаний список, на відміну від масиву, є динамічним. 838 00:38:26,000 --> 00:38:27,840 Він може рости і може скорочуватися і ви не 839 00:38:27,840 --> 00:38:32,434 повинні знати, або відходу заздалегідь, як багато даних ви збираєтеся бути зберігання, 840 00:38:32,434 --> 00:38:35,600 але, виявляється, ми повинні бути трохи обережні про те, як здійснити це. 841 00:38:35,600 --> 00:38:39,070 Отже, спочатку давайте розглянемо, як ми реалізуємо один з цих маленьких прямокутників. 842 00:38:39,070 --> 00:38:40,690 Це легко реалізувати Int. 843 00:38:40,690 --> 00:38:44,000 Ви просто говорите Int N, а потім Ви отримуєте 4 байта для Int, 844 00:38:44,000 --> 00:38:49,089 але як я можу отримати Int, назвемо його N, а потім покажчик, давайте називати його поруч. 845 00:38:49,089 --> 00:38:50,880 Ми могли б назвати це речі усе, що ми хочемо 846 00:38:50,880 --> 00:38:53,590 але мені потрібно структуру даних користувача. 847 00:38:53,590 --> 00:38:54,257 Так? 848 00:38:54,257 --> 00:38:57,020 >> АУДИТОРІЯ: Амперсанд [нерозбірливо]. 849 00:38:57,020 --> 00:39:00,940 >> Девід Малан: Так амперсанд ми будемо використовувати для отримати адресу вузла потенційно. 850 00:39:00,940 --> 00:39:02,740 Але нам потрібен ще Функція С в порядок 851 00:39:02,740 --> 00:39:06,700 щоб дати мені можливість створювати цей звичай прямокутник, цей звичай 852 00:39:06,700 --> 00:39:08,919 Мінлива, якщо хочете, в пам'яті. 853 00:39:08,919 --> 00:39:09,710 Залу: структура. 854 00:39:09,710 --> 00:39:10,626 Девід Малан: а структурою. 855 00:39:10,626 --> 00:39:14,310 Нагадаємо, минулого тижня, ми ввели структура, це відносно просте ключове слово, 856 00:39:14,310 --> 00:39:16,254 що дозволяє нам зробити такі речі, як це. 857 00:39:16,254 --> 00:39:18,420 З не прийшов з даними Структура називається студента. 858 00:39:18,420 --> 00:39:22,190 Він поставляється з Int і плавати і гольця і наприклад, але він не приходить зі студентами, 859 00:39:22,190 --> 00:39:26,750 але ми можемо створити тип даних студентом, студент структура, з цим синтаксисом 860 00:39:26,750 --> 00:39:27,250 тут. 861 00:39:27,250 --> 00:39:28,350 І ви побачите, що це знову і знову. 862 00:39:28,350 --> 00:39:30,426 Так що не турбуйтеся про запам'ятовування слів, 863 00:39:30,426 --> 00:39:33,300 але ключове слово, що це важливо, тільки той факт, що ми сказали, структура 864 00:39:33,300 --> 00:39:37,590 і тоді ми називали це студент і всередині студента було ім'я і будинок 865 00:39:37,590 --> 00:39:39,390 або загальний номер або тому подібне. 866 00:39:39,390 --> 00:39:41,980 >> І так ось сьогодні, давайте пропонувати це. 867 00:39:41,980 --> 00:39:45,240 Я додав кілька слів, але якщо я хочу здійснити цей прямокутник, що це 868 00:39:45,240 --> 00:39:48,440 отримав одночасно Int і А покажчик, ви знаєте, що я 869 00:39:48,440 --> 00:39:51,540 збирається оголосити на структуру під назвою вузол. 870 00:39:51,540 --> 00:39:55,630 Я також, всередині нього, хочу сказати, що вузол, цей прямокутник, має Int 871 00:39:55,630 --> 00:39:59,730 і ми будемо називати його п і вона має наступний покажчик. 872 00:39:59,730 --> 00:40:02,540 І це трохи багатослівний, але якщо ви думаєте про це, 873 00:40:02,540 --> 00:40:07,300 стрілки, які були на зображенні момент назад, якого типу даних? 874 00:40:07,300 --> 00:40:12,330 Де кожен з цих стрілок вказує який тип структури даних? 875 00:40:12,330 --> 00:40:14,332 Це не вказуючи тільки на міжнар на собі. 876 00:40:14,332 --> 00:40:16,165 Це вказує на Вся прямокутна річ 877 00:40:16,165 --> 00:40:18,720 і що прямокутна річ, ми сказали, називається вузлом. 878 00:40:18,720 --> 00:40:21,720 І таким чином, ми частково повинні рекурсивно визначити це таке 879 00:40:21,720 --> 00:40:26,270 що вузол, ми будемо говорити, буде містити Int під назвою п 880 00:40:26,270 --> 00:40:31,070 і покажчик називається поруч і тип структури даних, до яких 881 00:40:31,070 --> 00:40:35,770 що покажчик вказує, мабуть буде структура вузла. 882 00:40:35,770 --> 00:40:41,550 >> Так що це прикро, багатослівним і просто бути педантичним, 883 00:40:41,550 --> 00:40:44,100 причина, чому ми не можемо просто сказати, що це, що, чесно кажучи 884 00:40:44,100 --> 00:40:46,860 виглядає набагато більш читабельним, тому, що нагадаємо, що C читання 885 00:40:46,860 --> 00:40:48,710 речі зверху вниз, зліва направо. 886 00:40:48,710 --> 00:40:54,120 Це не поки ми не отримаємо крапку з комою що вузол ключове слово насправді існує. 887 00:40:54,120 --> 00:40:57,980 Так що, якщо ми хочемо мати таку циклічний посилання всередині даних 888 00:40:57,980 --> 00:41:02,120 Структура, що ми повинні зробити це, коли ми говоримо структури вузла у верхній частині, яка 889 00:41:02,120 --> 00:41:06,770 дає нам довгий шлях опису цього річ, то всередині ми говоримо структури вузла, 890 00:41:06,770 --> 00:41:09,560 а потім в самий останній лінії ми говоримо, все гаразд, С, до речі, 891 00:41:09,560 --> 00:41:12,060 просто зателефонуйте весь цей проклятий що вузол і зупинити 892 00:41:12,060 --> 00:41:14,360 використовуючи ключове слово-структуру в цілому. 893 00:41:14,360 --> 00:41:18,030 Так що це просто свого роду синтаксичний Хитрість в кінцевому рахунку, дозволяє, що нам створити 894 00:41:18,030 --> 00:41:21,370 те, що виглядає так само, як це. 895 00:41:21,370 --> 00:41:25,010 >> Так що, якщо ми припустимо тепер, ми можемо реалізувати цю річ в C, 896 00:41:25,010 --> 00:41:28,040 Як ми насправді почати обхід цього? 897 00:41:28,040 --> 00:41:32,360 Ну, справді, все, що ми повинні зробити, це ітерації зліва направо і просто 898 00:41:32,360 --> 00:41:35,960 вид вставити вузли або видаляти вузли або шукати речі там, де ми хочемо, 899 00:41:35,960 --> 00:41:39,560 але щоб зробити це, давайте йти вперед і зробити речі трохи більш реальним, тому що це 900 00:41:39,560 --> 00:41:42,560 був супер низького рівня досі. 901 00:41:42,560 --> 00:41:45,700 Хто буквально хотіли б бути першим? 902 00:41:45,700 --> 00:41:46,200 ДОБРЕ. 903 00:41:46,200 --> 00:41:47,092 Давай до. 904 00:41:47,092 --> 00:41:47,800 Як вас звати? 905 00:41:47,800 --> 00:41:48,499 >> Девід: Девід. 906 00:41:48,499 --> 00:41:49,290 Девід Малан: Девід. 907 00:41:49,290 --> 00:41:49,998 Приємно познайомитись. 908 00:41:49,998 --> 00:41:50,960 Я також. 909 00:41:50,960 --> 00:41:52,450 Добре. 910 00:41:52,450 --> 00:41:53,990 І нам знадобиться ряд 9. 911 00:41:53,990 --> 00:41:55,240 Не так добре, як по-перше, можливо. 912 00:41:55,240 --> 00:41:56,430 ОК, номер 9. 913 00:41:56,430 --> 00:41:59,667 Ряд 17, будь ласка. 914 00:41:59,667 --> 00:42:01,000 Дозвольте мені повернутися трохи далі. 915 00:42:01,000 --> 00:42:03,980 Кількість 22, будь ласка, і як про далі назад 916 00:42:03,980 --> 00:42:06,344 якщо я бачу будь-яких руки з усіма світла чи ні. 917 00:42:06,344 --> 00:42:08,010 Хтось зголосився бути прямо там. 918 00:42:08,010 --> 00:42:08,968 Ви хочете, щоб придумати? 919 00:42:08,968 --> 00:42:10,450 Ваше передпліччя примусово йде вгору. 920 00:42:10,450 --> 00:42:12,340 ОК, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 спускається. 923 00:42:15,120 --> 00:42:18,450 Хтось ще хотіли б forcefully-- Давай до. 924 00:42:18,450 --> 00:42:21,030 Фактичний громадських засадах. 925 00:42:21,030 --> 00:42:23,330 >> Так дуже швидко, якщо ви, хлопці, могли б організувати 926 00:42:23,330 --> 00:42:26,550 самі просто хотів вузли на екрані. 927 00:42:26,550 --> 00:42:27,510 Дякую. 928 00:42:27,510 --> 00:42:29,234 І ви будете 26. 929 00:42:29,234 --> 00:42:30,650 Всі правильні і швидкі введення. 930 00:42:30,650 --> 00:42:32,139 Так що я Девід, і ви також? 931 00:42:32,139 --> 00:42:32,680 Девід: Девід. 932 00:42:32,680 --> 00:42:33,721 Девід Малан: А ви? 933 00:42:33,721 --> 00:42:34,229 Джейк: Джейк. 934 00:42:34,229 --> 00:42:34,729 ГУП: Сью. 935 00:42:34,729 --> 00:42:35,229 АЛЕКС: Алекс. 936 00:42:35,229 --> 00:42:36,475 РАФАЕЛЬ: Рафаель. 937 00:42:36,475 --> 00:42:37,100 Тейлор: Тейлор. 938 00:42:37,100 --> 00:42:37,466 Девід Малан: Тейлор. 939 00:42:37,466 --> 00:42:37,590 Відмінно. 940 00:42:37,590 --> 00:42:39,810 Таким чином, ці наші волонтери сьогодні і йти вперед 941 00:42:39,810 --> 00:42:43,090 і зрушення мало що шлях, і просто йти вперед і тримати 942 00:42:43,090 --> 00:42:47,024 проведення ваші номери, як ви чи ваші Перша ознака і лівою рукою, 943 00:42:47,024 --> 00:42:48,940 йти вперед і просто реалізувати ці стрілки, тільки 944 00:42:48,940 --> 00:42:51,360 так що ваша ліва рука буквально вказуючи на те, що ви повинні вказати 945 00:42:51,360 --> 00:42:54,610 на, і дати собі деяку кімнату так, що ми можемо наочно побачити ваші руки насправді 946 00:42:54,610 --> 00:42:58,120 вказуючи, і ви можете просто вказати роду на землю в порядку. 947 00:42:58,120 --> 00:43:03,040 >> Так от у нас є зв'язаний список одного, два, три, чотири, п'ять вузлів на початковому етапі, 948 00:43:03,040 --> 00:43:05,860 і зверніть увагу, у нас є ця спеціальна покажчик на початок, хто 949 00:43:05,860 --> 00:43:09,770 ключовим, тому що ми повинні відслідковувати з усього списку довжини якимось чином. 950 00:43:09,770 --> 00:43:13,590 Ці хлопці, навіть якщо вони залишаються направо, спиною до спини в пам'яті, 951 00:43:13,590 --> 00:43:15,950 вони дійсно можуть бути в будь-якому місці в пам'яті комп'ютера. 952 00:43:15,950 --> 00:43:18,240 Таким чином, ці хлопці могли б бути стоячи на будь-якому етапі 953 00:43:18,240 --> 00:43:20,960 і це нормально, так довго, як вони насправді, вказуючи один на одного, 954 00:43:20,960 --> 00:43:22,770 але тримати речі чистий і простий, ми будемо 955 00:43:22,770 --> 00:43:25,728 просто звернути їх зліва направо, як це, але не може бути масивні проміжки 956 00:43:25,728 --> 00:43:26,790 між цими вузлами. 957 00:43:26,790 --> 00:43:30,710 >> Тепер, якщо я хочу насправді вставити деякі нове значення, давайте йти вперед і робити це. 958 00:43:30,710 --> 00:43:33,720 У нас є можливість в даний час вибрати інший вузол. 959 00:43:33,720 --> 00:43:39,820 Скажіть давайте почнемо з mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Чи буде хтось проти того Танос? 961 00:43:41,320 --> 00:43:42,280 ОК, давай до. 962 00:43:42,280 --> 00:43:42,992 Як вас звати? 963 00:43:42,992 --> 00:43:43,700 ВЕСЕЛКА: Радуга. 964 00:43:43,700 --> 00:43:44,050 Девід Малан: Радуга? 965 00:43:44,050 --> 00:43:44,810 Добре. 966 00:43:44,810 --> 00:43:46,600 Маллок Веселка. 967 00:43:46,600 --> 00:43:47,450 Давай до. 968 00:43:47,450 --> 00:43:51,610 Так що тепер ми повинні запитати себе, алгоритмічно, де ми можемо поставити 55. 969 00:43:51,610 --> 00:43:53,610 Таким чином, всі ми знаємо ,, очевидно, де вона, ймовірно, 970 00:43:53,610 --> 00:43:55,401 належить, якщо ми намагаємося щоб ця упорядковано 971 00:43:55,401 --> 00:43:58,299 і якщо ви, хлопці, може прийняти одне крок назад, тому ми не впасти 972 00:43:58,299 --> 00:43:59,590 етап, що було б здорово. 973 00:43:59,590 --> 00:44:01,420 Так насправді, Веселка, розпочати тут зі мною, 974 00:44:01,420 --> 00:44:04,200 тому що ми, як комп'ютер тепер може побачити тільки одну змінну одночасно. 975 00:44:04,200 --> 00:44:05,190 Таким чином, якщо це перший вузол. 976 00:44:05,190 --> 00:44:07,160 Зверніть увагу, що він не є вузлом, він просто покажчик, 977 00:44:07,160 --> 00:44:10,270 і ось чому він звертається, щоб бути тільки розмір покажчика, а не 978 00:44:10,270 --> 00:44:11,780 один з тих повних прямокутників. 979 00:44:11,780 --> 00:44:16,650 Отже, ми збираємося, щоб перевірити один на ітерація 55 менше, ніж 9? 980 00:44:16,650 --> 00:44:17,150 Немає. 981 00:44:17,150 --> 00:44:19,060 Є 55 менше 17? 982 00:44:19,060 --> 00:44:19,720 Немає. 983 00:44:19,720 --> 00:44:20,800 Менш 22? 984 00:44:20,800 --> 00:44:22,020 Менш 26? 985 00:44:22,020 --> 00:44:23,390 Менш 34? 986 00:44:23,390 --> 00:44:25,890 І ось тепер, очевидно, Веселка належить в кінці. 987 00:44:25,890 --> 00:44:27,270 Таким чином, щоб було ясно, і те, що був ваше ім'я, Тейлор? 988 00:44:27,270 --> 00:44:27,895 >> Тейлор: Тейлор. 989 00:44:27,895 --> 00:44:32,510 Девід Малан: Так серед Тейлор ліва рука і руки веселки тут, 990 00:44:32,510 --> 00:44:38,324 Чия рука повинна вказувати на те, що в Щоб вставити 55 в цьому списку? 991 00:44:38,324 --> 00:44:39,240 Що нам потрібно робити? 992 00:44:39,240 --> 00:44:39,700 Так? 993 00:44:39,700 --> 00:44:41,140 >> АУДИТОРІЯ: ручна Тейлора потрібно вказати лівої. 994 00:44:41,140 --> 00:44:41,680 >> Девід Малан: Точно. 995 00:44:41,680 --> 00:44:43,800 Так вставці вузла в кінці списку 996 00:44:43,800 --> 00:44:47,140 досить просто, тому що Тейлор просто повинен вказувати, а не на землі 997 00:44:47,140 --> 00:44:49,640 або ми будемо називати його порожнім, нуль є свого роду відсутність 998 00:44:49,640 --> 00:44:51,640 покажчика або спеціальний нульовий покажчик, ви 999 00:44:51,640 --> 00:44:53,740 будемо показувати з лівої руку на Веселка Веселка, а потім, 1000 00:44:53,740 --> 00:44:55,910 де, якщо ваш лівий рука, ймовірно, вказують? 1001 00:44:55,910 --> 00:44:56,570 Вниз 1002 00:44:56,570 --> 00:45:00,140 Це не добре, якщо її рука начебто указувати тут або від свого роду будь 1003 00:45:00,140 --> 00:45:00,640 яким чином. 1004 00:45:00,640 --> 00:45:02,407 Це буде розглядатися значення сміття, 1005 00:45:02,407 --> 00:45:04,240 але якщо вона вказує на деякі відомі значення, ми будемо 1006 00:45:04,240 --> 00:45:07,360 називають його нуля або нульовою, це нормально тому що у нас в цьому термін 1007 00:45:07,360 --> 00:45:09,390 і ми знаємо, що список в даний час завершена. 1008 00:45:09,390 --> 00:45:11,550 >> Так що ще один відносно простий випадок? 1009 00:45:11,550 --> 00:45:13,125 Чи можемо ми Танос 5? 1010 00:45:13,125 --> 00:45:14,010 Давай до. 1011 00:45:14,010 --> 00:45:14,782 Як вас звати? 1012 00:45:14,782 --> 00:45:15,490 Тіффані: Тіффані. 1013 00:45:15,490 --> 00:45:16,000 Девід Малан: Я вибачаюся? 1014 00:45:16,000 --> 00:45:16,470 Тіффані: Тіффані. 1015 00:45:16,470 --> 00:45:16,880 Девід Малан: Тіффані. 1016 00:45:16,880 --> 00:45:17,110 Добре. 1017 00:45:17,110 --> 00:45:19,071 Тіффані була malloced зі значенням 5. 1018 00:45:19,071 --> 00:45:19,570 Давай до. 1019 00:45:19,570 --> 00:45:23,820 Цей порівняно легко занадто, але давайте розглянемо порядок операцій в даний час. 1020 00:45:23,820 --> 00:45:25,820 Це було досить легко з Тейлором в кінці. 1021 00:45:25,820 --> 00:45:30,302 Номер 5, звичайно, менше, ніж 9, і тому ми повинні Давида, у нас є Тіффані, 1022 00:45:30,302 --> 00:45:31,260 і те, що було ваше ім'я? 1023 00:45:31,260 --> 00:45:31,680 >> Джейк: Джейк. 1024 00:45:31,680 --> 00:45:32,470 >> Девід Малан: Джейк. 1025 00:45:32,470 --> 00:45:34,300 Тіффані, Джейк, і Девід. 1026 00:45:34,300 --> 00:45:36,580 Чия рука має бути оновлена ​​в першу чергу? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Що ви хочете зробити тут? 1029 00:45:40,590 --> 00:45:45,244 Там є пара можливих шляхів, але є також один або більше неправильні способи. 1030 00:45:45,244 --> 00:45:46,620 >> АУДИТОРІЯ: Почніть з крайнього лівого. 1031 00:45:46,620 --> 00:45:47,800 >> Девід Малан: Почніть з крайнього лівого. 1032 00:45:47,800 --> 00:45:49,008 Хто крайній лівий тут тоді? 1033 00:45:49,008 --> 00:45:49,700 АУДИТОРІЯ: По-перше. 1034 00:45:49,700 --> 00:45:50,366 >> Девід Малан: ОК. 1035 00:45:50,366 --> 00:45:53,781 Так що почніть з першої і де ви хочете оновити руки Давида, щоб бути? 1036 00:45:53,781 --> 00:45:54,780 АУДИТОРІЯ: До 5. 1037 00:45:54,780 --> 00:45:55,446 Девід Малан: ОК. 1038 00:45:55,446 --> 00:45:59,026 Давид, точка, в п'яти або Тіффані тут, а зараз? 1039 00:45:59,026 --> 00:46:01,072 >> АУДИТОРІЯ: Тіффані вказує на 9? 1040 00:46:01,072 --> 00:46:04,030 Девід Малан: Совершенно, за винятком того, Бінки Глава тільки вид впав, чи не так? 1041 00:46:04,030 --> 00:46:06,820 Тому що те, що трапилося з ця картина буквально? 1042 00:46:06,820 --> 00:46:08,070 АУДИТОРІЯ: Ніщо не вказує. 1043 00:46:08,070 --> 00:46:09,945 Девід Малан: Ніщо не є вказуючи на Джейка в даний час. 1044 00:46:09,945 --> 00:46:13,360 Ми буквально осиротів 9 і 17, і ми буквально 1045 00:46:13,360 --> 00:46:18,450 витік вся ця пам'ять, бо поновлення руку Давида перше, це 1046 00:46:18,450 --> 00:46:21,660 в порядку, оскільки це правильно вказуючи на Тіффані зараз, 1047 00:46:21,660 --> 00:46:25,410 але якщо ніхто не мав завбачливо вказують на Джейка, 1048 00:46:25,410 --> 00:46:27,490 Потім ми втратили Сукупність цього списку. 1049 00:46:27,490 --> 00:46:28,200 Отже, давайте скасувати. 1050 00:46:28,200 --> 00:46:30,950 Так що це хороша річ, щоб спіткнутися, але давайте виправимо справжнє. 1051 00:46:30,950 --> 00:46:33,624 Те, що ми повинні зробити в першу чергу, а? 1052 00:46:33,624 --> 00:46:34,124 Так? 1053 00:46:34,124 --> 00:46:35,791 >> АУДИТОРІЯ: Тіффані повинна вказувати на 9? 1054 00:46:35,791 --> 00:46:37,582 Девід Малан: я не можу отримати так близько до вас. 1055 00:46:37,582 --> 00:46:38,720 Хто повинен вказати на 9? 1056 00:46:38,720 --> 00:46:39,220 >> АУДИТОРІЯ: Тіффані. 1057 00:46:39,220 --> 00:46:39,390 >> Девід Малан: Гаразд. 1058 00:46:39,390 --> 00:46:41,200 Так Тіффані повинна перша точка на 9. 1059 00:46:41,200 --> 00:46:43,550 Так Тіффані повинні прийняти на однаковим значенням 1060 00:46:43,550 --> 00:46:45,820 Давиду, який, здається, зайвим на мить, 1061 00:46:45,820 --> 00:46:48,820 але це нормально, тому що тепер, по-друге крок, ми можемо оновити руку Давида 1062 00:46:48,820 --> 00:46:52,680 щоб вказати на Тіффані, а потім, якщо ми тільки частково очистити речі 1063 00:46:52,680 --> 00:46:55,740 як ніби це свого роду весни-як, ось це правильний вставки. 1064 00:46:55,740 --> 00:46:56,700 Так відмінно. 1065 00:46:56,700 --> 00:46:57,970 Так що тепер ми майже там. 1066 00:46:57,970 --> 00:47:01,075 Давайте вставити один фінал значення як значення 20. 1067 00:47:01,075 --> 00:47:03,010 Якби ми могли Танос одна заключний добровольцем? 1068 00:47:03,010 --> 00:47:04,140 Давай до. 1069 00:47:04,140 --> 00:47:06,224 Так що це одне трохи складніше. 1070 00:47:06,224 --> 00:47:08,390 Але насправді, код ми писати, хоча і в усній формі, 1071 00:47:08,390 --> 00:47:10,610 це все одно, що купу з, якщо умови зараз, вірно? 1072 00:47:10,610 --> 00:47:12,318 Ми мали стан перевірки, якщо він належить 1073 00:47:12,318 --> 00:47:13,840 Зрештою, може бути, з самого початку. 1074 00:47:13,840 --> 00:47:15,940 Ми повинні якийсь цикл в знайти місце в середині. 1075 00:47:15,940 --> 00:47:17,400 Так давайте зробимо це з тим, що ваше ім'я? 1076 00:47:17,400 --> 00:47:17,700 >> ЕРІК: Ерік. 1077 00:47:17,700 --> 00:47:18,340 >> Девід Малан: Ерік? 1078 00:47:18,340 --> 00:47:18,660 Ерік. 1079 00:47:18,660 --> 00:47:19,368 Приємно познайомитись. 1080 00:47:19,368 --> 00:47:20,490 Отже, ми маємо 20. 1081 00:47:20,490 --> 00:47:21,220 Менше п'яти? 1082 00:47:21,220 --> 00:47:21,530 Немає. 1083 00:47:21,530 --> 00:47:22,160 Менше дев'яти? 1084 00:47:22,160 --> 00:47:22,410 Немає. 1085 00:47:22,410 --> 00:47:23,050 Менш 17? 1086 00:47:23,050 --> 00:47:23,550 Немає. 1087 00:47:23,550 --> 00:47:23,740 ДОБРЕ. 1088 00:47:23,740 --> 00:47:25,701 Він належить тут і Ваші імена знову є? 1089 00:47:25,701 --> 00:47:26,200 ГУП: Сью. 1090 00:47:26,200 --> 00:47:26,880 Девід Малан: Сью. 1091 00:47:26,880 --> 00:47:27,379 АЛЕКС: Алекс. 1092 00:47:27,379 --> 00:47:28,790 Девід Малан: Сью, Алекс, а? 1093 00:47:28,790 --> 00:47:29,290 ЕРІК: Ерік. 1094 00:47:29,290 --> 00:47:30,120 Девід Малан: Ерік. 1095 00:47:30,120 --> 00:47:32,140 Чиї руки повинні отримати оновлення в першу чергу? 1096 00:47:32,140 --> 00:47:32,930 >> АУДИТОРІЯ: Ерік. 1097 00:47:32,930 --> 00:47:33,429 ДОБРЕ. 1098 00:47:33,429 --> 00:47:35,200 Так Ерік повинен вказати на те, де? 1099 00:47:35,200 --> 00:47:35,930 У 22. 1100 00:47:35,930 --> 00:47:36,430 Добре. 1101 00:47:36,430 --> 00:47:38,180 А тепер, що буде далі? 1102 00:47:38,180 --> 00:47:40,800 Сью може вказувати на Еріка і тепер, якщо ви, хлопці, просто 1103 00:47:40,800 --> 00:47:44,077 потіснитися, який прекрасний візуально, тепер ми зробили вставку. 1104 00:47:44,077 --> 00:47:47,160 Так нехай тепер розглянемо питання, але спасибі так багато для наших волонтерів. 1105 00:47:47,160 --> 00:47:48,090 Дуже добре зроблено. 1106 00:47:48,090 --> 00:47:50,831 Ви можете зберегти ті, якщо вам подобається. 1107 00:47:50,831 --> 00:47:54,140 І у нас є прекрасний подарунок, якщо прощальний ви кожен хотів взяти стрес м'яч. 1108 00:47:54,140 --> 00:47:56,030 Дозвольте мені передати це вниз. 1109 00:47:56,030 --> 00:47:58,430 Так що винос це? 1110 00:47:58,430 --> 00:48:02,430 Це, здається, дивно оскільки ми маємо зараз 1111 00:48:02,430 --> 00:48:06,360 представила альтернативою Масив, який не так обмежені 1112 00:48:06,360 --> 00:48:07,780 на масив деякого фіксованого розміру. 1113 00:48:07,780 --> 00:48:09,380 Вони можуть рости динамічно. 1114 00:48:09,380 --> 00:48:13,220 >> Але так само, як ми бачили протягом декількох тижнів минуле, ми ніколи не отримаємо нічого безкоштовно, 1115 00:48:13,220 --> 00:48:15,740 як, безумовно, є компроміс тут. 1116 00:48:15,740 --> 00:48:18,890 Так з потенціалом зростання пов'язаний Список, це динамізм? 1117 00:48:18,890 --> 00:48:21,590 Ця здатність рости і, чесно кажучи, ми могли б зробити видалення 1118 00:48:21,590 --> 00:48:23,570 і ми могли б стиснути в міру необхідності. 1119 00:48:23,570 --> 00:48:24,710 Яку ціну ми платимо? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 У два рази більше простору, в першу чергу. 1122 00:48:30,340 --> 00:48:34,010 Якщо ви подивитеся на картину, більше не я зберігати список цілих чисел. 1123 00:48:34,010 --> 00:48:36,740 Я зберігання списку цілі плюс покажчики. 1124 00:48:36,740 --> 00:48:38,240 Так що я подвоєння кількості простору. 1125 00:48:38,240 --> 00:48:40,740 Тепер, може бути, це не така велику справу 4 байта, 8 байт, 1126 00:48:40,740 --> 00:48:43,160 але це, безумовно, може додати на великих наборів даних. 1127 00:48:43,160 --> 00:48:45,570 Що інший недолік? 1128 00:48:45,570 --> 00:48:46,070 Так? 1129 00:48:46,070 --> 00:48:48,010 >> АУДИТОРІЯ: Ми повинні пройти їх один за одним. 1130 00:48:48,010 --> 00:48:48,760 Девід Малан: Так. 1131 00:48:48,760 --> 00:48:50,260 Ми повинні пройти їх один за одним. 1132 00:48:50,260 --> 00:48:53,860 Ви знаєте, що ми відмовилися від цієї супер зручна функція квадратного кронштейна 1133 00:48:53,860 --> 00:48:57,240 позначення, більш правильно відомий як довільного доступу, 1134 00:48:57,240 --> 00:48:59,280 де ми можемо просто стрибнути до окремого елементу 1135 00:48:59,280 --> 00:49:01,470 але тепер, якщо я досі мої добровольці тут, 1136 00:49:01,470 --> 00:49:04,660 якби я хотів, щоб знайти № 22, я не можу просто 1137 00:49:04,660 --> 00:49:06,620 перейти до кронштейн-то что-то. 1138 00:49:06,620 --> 00:49:10,530 Я повинен дивитися на список, багато як наші приклади пошуку лінійно, 1139 00:49:10,530 --> 00:49:12,260 щоб знайти номер 22. 1140 00:49:12,260 --> 00:49:14,340 Таким чином, ми, здається, заплатили ціну там. 1141 00:49:14,340 --> 00:49:16,430 Але, тим не менш, ми можемо вирішити інші проблеми. 1142 00:49:16,430 --> 00:49:18,587 >> Насправді, дозвольте мені представити тільки пару візуальні ефекти. 1143 00:49:18,587 --> 00:49:20,920 Так що, якщо ви були до Їдальня Mather недавно, 1144 00:49:20,920 --> 00:49:23,320 ви пам'ятаєте, що їх стеки підносів, як це, 1145 00:49:23,320 --> 00:49:26,300 ми запозичили їх з Анненберг перед класом. 1146 00:49:26,300 --> 00:49:28,930 Таким чином, це стос тарілок, хоча, є представником насправді 1147 00:49:28,930 --> 00:49:30,860 структури даних комп'ютерної науки. 1148 00:49:30,860 --> 00:49:32,910 Існує структура даних в інформатиці 1149 00:49:32,910 --> 00:49:38,010 Відомо, як стек, який дуже красиво піддається саме це візуально. 1150 00:49:38,010 --> 00:49:41,380 Таким чином, якщо кожен з цих літаків НЕ лоток, але, як і ряд, і я хотів 1151 00:49:41,380 --> 00:49:45,010 для зберігання номера, я може поставити один тут, 1152 00:49:45,010 --> 00:49:48,320 і я міг би поставити інший сюди, і продовжити укладку число 1153 00:49:48,320 --> 00:49:53,180 на верхній частині один одного, і те, що потенційно корисним про це 1154 00:49:53,180 --> 00:49:55,450 це те, що це мається на увазі цієї структури даних? 1155 00:49:55,450 --> 00:49:58,045 Яке число я можу витягнути в першу чергу найбільш зручно? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Найбільш недавно висловився один там. 1158 00:50:03,030 --> 00:50:06,430 >> Так що це те, що ми називаємо в інформатика структура даних ЛІФО. 1159 00:50:06,430 --> 00:50:08,070 Останній прийшов, перший. 1160 00:50:08,070 --> 00:50:10,800 І ми побачимо, незабаром, чому що може бути корисним, але зараз, 1161 00:50:10,800 --> 00:50:12,200 просто розглянути власність. 1162 00:50:12,200 --> 00:50:15,158 І це частково нерозумно, якщо ви думаєте, про те, як їдальня це робить. 1163 00:50:15,158 --> 00:50:17,910 Кожен раз, коли вони чисті лотки і покласти свіжі з них на вершині, 1164 00:50:17,910 --> 00:50:22,160 ви могли б раніше чистий але зрештою дуже брудний і запорошений 1165 00:50:22,160 --> 00:50:24,360 лоток на самому дні якщо ви насправді ніколи не 1166 00:50:24,360 --> 00:50:26,820 потрапити в нижній частині, що стек, тому що ви просто 1167 00:50:26,820 --> 00:50:29,380 тримати покласти новий і чисті ті, на вершині цього. 1168 00:50:29,380 --> 00:50:31,840 Те ж саме може статися в супермаркеті теж. 1169 00:50:31,840 --> 00:50:35,450 Якщо у вас є вітрину молока і кожен раз CVS 1170 00:50:35,450 --> 00:50:37,610 або той, хто отримує більше молока, ви просто засунути молоко 1171 00:50:37,610 --> 00:50:39,880 у вас вже є на спині і Ви ставите нові попереду, 1172 00:50:39,880 --> 00:50:43,088 Ви будете мати деякі досить огидно Молоко в кінці структури даних, 1173 00:50:43,088 --> 00:50:46,390 тому що це завжди на дні або що те ж саме, це завжди на спині. 1174 00:50:46,390 --> 00:50:50,407 >> Але є ще один спосіб думати про шикуються даних і, наприклад, цей. 1175 00:50:50,407 --> 00:50:53,490 Якщо ви один з тих людей, хто любить вибудовуватися за межами Apple, магазини 1176 00:50:53,490 --> 00:50:55,610 коли новий продукт поставляється з, ви, ймовірно, 1177 00:50:55,610 --> 00:50:58,780 не використовуючи дані стека Структура, тому що ви 1178 00:50:58,780 --> 00:51:03,070 відштовхне всіх, хто знаходиться шикуються, щоб купити деякі нові іграшки. 1179 00:51:03,070 --> 00:51:06,610 Швидше за все, ви, ймовірно, з використанням які структури даних 1180 00:51:06,610 --> 00:51:10,050 або яка система в реальному світі? 1181 00:51:10,050 --> 00:51:13,493 Сподіваюся, це лінія, або більш правильно або більше британський, як, черги. 1182 00:51:13,493 --> 00:51:17,700 І виходить, чергу також Структура даних в інформатиці, 1183 00:51:17,700 --> 00:51:19,700 але черга має дуже відрізняється властивість. 1184 00:51:19,700 --> 00:51:20,820 Це не ЛІФО. 1185 00:51:20,820 --> 00:51:21,990 Останній прийшов, перший. 1186 00:51:21,990 --> 00:51:22,800 Боже упаси. 1187 00:51:22,800 --> 00:51:24,280 Це замість того, щоб FIFO. 1188 00:51:24,280 --> 00:51:26,110 По-перше, першим пішов. 1189 00:51:26,110 --> 00:51:27,970 І це добре Справедливості заради 1190 00:51:27,970 --> 00:51:30,428 звичайно, коли ви шикуються до супер рано вранці. 1191 00:51:30,428 --> 00:51:33,400 Якщо ви там спочатку, Ви хочете, щоб вийти спочатку в якості добре. 1192 00:51:33,400 --> 00:51:35,880 >> І так всі ці дані структури, черги і стеки 1193 00:51:35,880 --> 00:51:39,220 і грона інших, виявляється вас може думати про це, як тільки що масив. 1194 00:51:39,220 --> 00:51:41,820 Це масив, може бути, фіксований розмір 4, але це було б 1195 00:51:41,820 --> 00:51:44,990 бути свого роду добре, якщо ми могли б просто купа Лотки майже нескінченно високий, якщо ми 1196 00:51:44,990 --> 00:51:46,780 є, що багато підноси або цифри. 1197 00:51:46,780 --> 00:51:48,840 Так, може бути, ми хочемо, щоб використовувати зв'язаний список тут, 1198 00:51:48,840 --> 00:51:51,800 але компроміс буде потенційно, що нам потрібно більше пам'яті, 1199 00:51:51,800 --> 00:51:55,930 займає трохи більше часу, але ми не обмежують висоту стопки, 1200 00:51:55,930 --> 00:51:59,550 так само, як вітрині Мазера може обмежити розмір стека, 1201 00:51:59,550 --> 00:52:03,117 і таким чином, вони проектні рішення або варіанти, доступні для нас в кінцевому рахунку. 1202 00:52:03,117 --> 00:52:04,950 Так що з цими даними структури, ми почали 1203 00:52:04,950 --> 00:52:09,360 бачачи нові верхні межі потенційно на те, що раніше було супер швидко 1204 00:52:09,360 --> 00:52:11,260 і де ми залишимо від сьогодні і де 1205 00:52:11,260 --> 00:52:13,200 ми сподіваємося отримати в на середовище, ми будемо 1206 00:52:13,200 --> 00:52:15,740 почати дивитися на даних Структура, що дозволяє нам шукати 1207 00:52:15,740 --> 00:52:18,260 через дані в кінці часу журналу знову. 1208 00:52:18,260 --> 00:52:21,470 І ми побачили, що, пам'ятаю, в нульовій тижня і один з бінарного пошуку або розриву 1209 00:52:21,470 --> 00:52:22,180 і володарюй. 1210 00:52:22,180 --> 00:52:26,240 Це повертається, і ще краще, Святий Грааль для цього середовище 1211 00:52:26,240 --> 00:52:29,510 буде придумати з структура даних, яка працює дійсно 1212 00:52:29,510 --> 00:52:32,070 або теоретично Постійна часу, в результаті чого 1213 00:52:32,070 --> 00:52:34,760 це не має значення, скільки мільйони чи мільярди речей 1214 00:52:34,760 --> 00:52:38,470 ми маємо в структурі даних, це буде взяти нас постійний час, може бути, один крок 1215 00:52:38,470 --> 00:52:41,387 або два кроки або 10 кроків, але постійні числа кроків 1216 00:52:41,387 --> 00:52:42,970 шукати в цій структурі даних. 1217 00:52:42,970 --> 00:52:46,300 Це дійсно буде Святий Грааль але про це в середу. 1218 00:52:46,300 --> 00:52:49,045 Побачимося тоді. 1219 00:52:49,045 --> 00:52:53,704 >> [Грає музика] 1220 00:52:53,704 --> 00:56:08,448