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 Войти. 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