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