[За възпроизвеждане на музика]
>> DAVID J. Malan: Добре.
Това е CS50.
И това е началото на 5-та седмица.
И както може би сте забелязали, част от материала
става малко повече сложна, малко по-гъста.
>> И това е много лесно, особено ако сте били в навик за известно време,
да се опитва да драскам надолу най- всичко, което правим, ние Казваш, в клас.
Но осъзнавам, че не е вероятно идеалното педагогически подход
за изучаване на този вид материали, и материали в по-общ план.
И така, ние имаме удоволствието да обявят собствена Gheng че CS50 е
Гонг е започнала да подготвя каноничен набор от бележки
за курса, надеждата на което е, че един, тези
служи не само като препратка и ресурс
за преглед на материалите и ще обратно чрез материал, който може да има
вие сте избягали от първия път, но също така, че главите ви да бъдат по-
нагоре, отколкото надолу, когато го дойде време да изнася лекции,
така че можете да се ангажират по-замислено, като
за разлика от по-scribbly.
>> С това каза, какво ще намерите на сайта е такива документи, тъй като това.
И забележете, в горния ляв ъгъл, има не само на таблица на съдържанието,
но също кодове време, че веднага ще ти скочи
на съответната част във видео онлайн.
И какво Chang тук е направил е, по същество, документиран
какво се е случило в тази специално лекция.
И много от лекциите са вече онлайн сега с този URL.
И ние ще продължим да публикуваме остатъка на тези, които до края на тази седмица,
така че да се възползва от този ресурс.
>> Така че без повече шум, ние започнахме да се бели обратно
на слой, който е низ за известно време.
А какво да кажем низ всъщност е от миналата седмица?
Така Чар звезда.
И Чар звезда, добре, какво е, че наистина означава?
Е, през цялото това време, ако сме призоваваме функция,
като getString и съхранение т.нар връщането
стойност на getString в променлива-- тя се нарича
S тип string-- ние сме били писане линията на код там горе.
И това е само, когато видя моя почерк възвеличи тук
правя аз осъзнавам колко брутално е това.
>> Все пак, нека да приемем, че на дясната ръка
е, все пак, разумен изображение на това, което е
продължава всичко това време с getString.
getString, разбира се, получава низ.
Но какво значи това наистина означава?
Това означава, че той получава парче от памет от операционната система
чрез извикване на функция, наречена изчистване.
Но повече за това по-късно.
И тогава го населяват това парче на паметта
с буквите потребителят има въведена, последвано от, разбира се,
нулев характер, или обратно наклонена черта нула в самия край.
>> Междувременно, на лявата ръка на тази история, през цялото това време,
ние сме били за обявяване на променлива, като S.
И тази променлива е това, което сега ще започне да се обадите на показалеца.
Това не е една кутия вътре, от които ние поставяме низа, Дейвън, сами по себе си,
а по-скоро ще се постави в този квадрат поле отляво какво точно?
Да?
>> АУДИТОРИЯ: Адресът на където се намира в паметта.
>> DAVID J. Malan: Точно така.
Адресът на мястото, където Дейвън се намира в паметта.
И не там, където всички Дейвън се намира, сам по себе си, но по-специално на адрес
на какво?
Да?
>> АУДИТОРИЯ: Първо характер.
>> DAVID J. Malan: Първият символ в Дейвън, които, в този случай,
Аз предложих е произволно и нереалистично 1, ОХ1,
което просто означава на шестнадесетичен номер на един.
Но това вероятно ще да бъде много по-голям брой
че бихме могли да изготви с 0x като представка,
представляваща шестнадесетичен характер.
И тъй като ние не трябва да се знае къде останалата част от героите на Дейвън
са, поради което прост дизайн решение, което е станало преди много години?
Да?
>> АУДИТОРИЯ: 0 Обратно наклонена черта.
DAVID J. Malan: Да, точно така.
Обратно наклонената черта 0 позволява, макар и в линейното време, да прекосяват низ,
ходи от ляво на дясно, с за контур, или докато
контур, или нещо подобно че, и да се определи, о, тук
е края на този низ.
Така че само с адреса, на началото на низ,
можем да имаме достъп целостта на него, защото всичко това, докато,
низ е просто бил Чар звезда.
>> Така че със сигурност това е добре да се продължи да използва библиотеката CS50 и тази абстракция,
така да се каже, но ние ще Започваме да виждаме точно
какво става на под цялото това време.
Така че може би си спомняте този пример, прекалено, от последния път, да сравните 0,
които всъщност не сравнение.
Но ние започнахме да се реши този въпрос.
>> Но както може би един опреснителен, бих могъл да заинтересува някой
в розов слон днес, също направен от Chang?
Какво ще кажете вие ​​пред? [Недоловим].
Хайде нагоре.
>> И в същото време, като ви дойде, нека
помисли само за миг какво този код е всъщност прави.
Това е обявяване на две променливи нагоре отгоре, а и тона, и призова getString.
Това не е много лесен за употреба програма, защото тя не ви каже какво да правите.
Но оставим просто приемем, че сме с акцент върху сочна част.
И след това, което правим, ако S е равно на се равнява на тон, то трябва да се каже ФОРМАТ,
сте написали едно и също нещо.
Здравейте.
Как ти е името?
>> Джанел: Janelle.
DAVID J. Malan: Janelle, Приятно ми е да се запознаем.
Така че предизвикателството си в ръка за този слон
е първо да ни направи снимка на това, което е са представени в тези първи две
линии.
Така S и Т може да бъде представено как на екрана?
И вие може просто да го привлече с пръста си върху този голям екран.
>> Така че има две половини до всяка страна на това уравнение.
Така че има и от ляво, и тогава getString отдясно.
И тогава там е т в ляво, и след това getString отдясно.
И така, как бихме могли да започнем изготвяне на картината, който
представлява това, което се случва тук в паметта, бихте ли казали?
И нека да ви обясня какво правиш като отидеш.
>> Джанел: OK.
Ами, първо, би се питате можете да получите на входния низ.
И би store-- О, съжалявам.
DAVID J. Malan: OK.
Добре.
И това се нарича това?
О, OK.
Продължавай.
Не исках да ви прекъсвам.
Джанел: Съжалявам.
Така че би го вход в адреса не на-- сигурен.
Не мога точно да си спомня номера, но аз вярвам, че започваше с 0.
>> DAVID J. Malan: Всичко е наред, защото съм направил цифрите нагоре,
така че няма правилен отговор.
>> Джанел: Започвайки с 0 дъгата.
>> DAVID J. Malan: ОК, така елемент 0.
Разбира се.
>> Джанел: И след това, ако е като само две letter--
>> DAVID J. Malan: Добре, обратно към вас.
>> Джанел: Значи елемент 0 и тогава елемент 1 или елемент 2.
DAVID J. Malan: И коя част от картината рисуваш точно сега?
Призивът за getString?
Или обявяването на S?
>> Джанел: Декларацията на S, аз вярвам.
О, getString, тъй като това би бъде въведен във всяка [? площ. ?]
>> DAVID J. Malan: Добре.
Точно така.
Въпреки че това ефективно връща масив, изземване,
когато се върнем низ, ние можем индекс в които низ с помощта на 01 и 2.
Технически погледнато, това са вероятно представени от отделни адреси,
но това е добре.
>> Така че предполагам, ако мога просто бързо изпраща до мястото, където сме спрели
за последен път, ако някой от струните е ж а б д,
обратно наклонена черта 0, като по този начин представляващ Гейб вход, как бихме могли да представляват и сега?
Ако това е паметта, която е били върнати от getString?
>> Джанел: Ще бъде ли представени от дъга?
>> DAVID J. Malan: Чрез дъга?
Е, не.
Нека просто кажем, картинно, нека просто отидете напред
и да предложи, че ако това е S, този е стойността връщане на getString.
А ти нарисувал като 0, 1, 2, която е напълно разумно, защото ние
може да индексира в низа, като такива.
Но само за да бъде в съответствие с за последен път, нека вървим напред
и произволно предложа настоящото адрес е 1, това е адрес 2,
този адрес е 3, и така нататък.
И така, само за да бъде супер ясно, какво става
да отида в и в резултат на това първа линия на код, бихте ли казали?
>> Джанел: Адрес 1?
>> DAVID J. Malan: Точно така.
Така отговори 0x1.
А междувременно, нека вървим напред и дублират много от това, което сте направили
и добавете моя собствен тон тук.
Ако трябва да въведете в Габе отново, за втори път,
когато бъдете подканени с getString, къде, разбира се, е Гейб ще отида?
Е, presumably--
>> Джанел: Както тук?
DAVID J. Malan: Да.
Джанел: Или тя също е в същите кутии?
DAVID J. Malan: Позволете ми да предложа, да, точно, така че в тези допълнителни приставки.
Но това, което е ключ сега е, че дори макар че аз съм съставен тези доста близо
together-- 0x1, този се 0x2-- в реалност,
това сега може да бъде адрес 0x10, например, и 0x11 и 0x12,
и така нататък.
И така, ако това е така, какво ще се свърши тук, в тон?
>> Джанел: 0x10?
DAVID J. Malan: Точно така.
Така 0x10.
И така, сега, последен въпрос.
Вие, от далеч, трябваше да работят на най-трудното за един слон до този момент.
До сега, ако аз спра кода отново, когато го направя, в третия ред
ако а е равно равнява тон, това, което аз съм всъщност сравняващи че сме изготвен тук?
>> Джанел: Двете адресите?
DAVID J. Malan: Точно така.
Така че аз казвам, че е S равно равно на тон?
С други думи, е равен 1 равна на 10?
И разбира се, очевиден отговор е сега, не.
И така тази програма е в крайна сметка ще отпечата какво бихте казали?
>> Джанел: Би ли било, сте написали едно и също нещо?
>> DAVID J. Malan: Така че, ако а е 1 и т е 10?
>> Джанел: Вие въвели различни неща.
>> DAVID J. Malan: Точно така.
Въведените от вас различни неща.
Добре.
Така че един кръг от аплодисменти, ако можехме, тук.
[APPLAUSE]
Това беше болезнено.
Знам.
Браво.
Така че сега нека да видим дали не можем да дразни, освен това, което беше уговорката.
И разбира се, когато се оправихме това-- което сега ще представлява в green--
ние направихме няколко подобрения тук.
Първо, точно като здрав разум проверите, аз съм първата проверка
ако S е равно на нула и т е равен нула.
И само за да бъде ясно, когато биха могли S или т е нищожен в код по този начин?
Когато може да е или тон са нулеви.
Да?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Точно така.
Ако низът, че потребителят въвели в е твърде дълго
за да се поберат в паметта, или някои странен ъгъл случай като този,
getString, както ще видим, буквално днес, в своята документация,
Казва, че ще се върне нула като специална стойност страж,
или просто нещо като специален символ това означава, че нещо се е объркало.
Така че ние искаме да се провери за това, защото се оказва,
че нула е много опасно стойност.
>> Често, ако се опитате да направите нещо с нищожна, включваща function-- го прехвърляха
като вход, за instance-- тази функция може много ще се срине, а с него,
се вземат определени целия си програма.
Така че този трети ред сега е просто здрав разум покажат, проверка за грешки, ако щете.
Това е добър навик, сега за нас, за да получите във всеки път, когато
опитате да използвате стойност, която би могла потенциално да бъде нула.
>> Сега, в четвъртата линия тук, "Ако strcmp (S, T)," добре,
какво е това предвид?
Е, ние казахме, това е много кратко и ясно наречена функция за сравняване на низове.
И неговата цел в живота е да се сравни първия си аргумент срещу него на второ място,
но не и по отношение на техните адреси, както направихме неволно момент
Преди с червения код, но по-скоро да се сравняват тези две
струни в човешки интуитивното начин чрез сравняване на това, срещу това,
срещу това, срещу това, и След спиране, ако и когато един
или и двете от пръстите ми хитове наклонена черта 0.
Така че, преди някой година, изпълнявани strcmp за изпълнение за нас функционалността
че се надявахме, че ще са придобили чрез просто сравняване на две прости ценности.
>> Сега, честно казано, аз продължавам рисунка Всички тези различни номера.
Но реалността е, че аз съм бил извършването на тези нагоре през цялото време.
И така, нека просто отидете напред и драскат тези навън
да се направи точка, че в края на ден и се движат напред,
ние не сме наистина ще се грижи за какво се занимава неща са всъщност
в памет.
Така че аз не отивам да се направи това видове номера вече толкова много,
Аз съм просто това абстрактно далеч малко по-приятелски само с стрели.
>> С други думи, ако S е указател, добре, нека просто да го изготви, буквално,
като показалка, стрелка, сочеща от себе си за нещо друго,
и не се тревожи твърде много повече за на дреболии на тези адреси
което, отново, аз направих така или иначе.
Но ние ще видим тези адреси, Понякога, когато отстраняване на грешки код.
>> Сега Междувременно, тази програма тук поправки, разбира се,
този проблем чрез сравняване тези две струни.
Но ние се блъсна в друг проблем.
Това беше от копието програмирате за последен път,
при което, аз се опитвах да се възползва само първия знак в низ.
Но това, което е симптом видяхме последния път, когато
потребител напечатани в стойност, като Гейб с малки букви, за S,
тогава ние назначен и в тон, като в третия ред,
и след това аз се опитах да капитализира тона скоба 0?
Какъв беше ефектът от промяна на тона скоба 0 тук?
>> АУДИТОРИЯ: Той се е променил с.
>> DAVID J. Malan: Да, Промених S, както добре.
Защото това, което наистина се случва?
Ами, нека да видя дали мога да почистите тази картина, както следва.
>> Ако S е, отново, думата грама, А, В, Е, наклонена черта, 0 и S
ние ще продължим рисунка като кутия тук, но не повече адреси.
Нека спрат да правят нещата.
Нека просто да се направи снимка опростяване на света.
>> Когато Декларирам тон с низ тон, че създава това парче от памет.
Square се случва да бъде 32 битове в повечето компютри.
В действителност, ако някога сте чували за компютър с 32-битова архитектура,
наистина фантазия-говори, че просто означава, че той използва 32-битови адреси.
И като технически настрана, ако някога сте се чудили
защо по-стари компютри, ако действително Опитах се да ги супа с много RAM,
може да има само максимум от четири гигабайта RAM,
добре, че е така, защото, буквално, само стария си компютър може
счита за висока 4 милиард, 4 милиарда байта,
защото той е използвал 32-битов номера за адреси.
>> Но във всеки случай, в този Например, историята е много по-просто.
т е просто още една показалка, или наистина Чар звезда, известен още като низ.
И как искам да се актуализира тази снимка сега с тази втора линия на код,
след точката, DOT, Дот?
Когато правя низ тон е равен и запетая, как се променя тази картина?
Да?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Да.
Точно така.
Просто сложи една стрела от т кутия на същия адрес,
същото първата буква даде.
Или технически, ако това човек все още са най 0x1,
това е като че ли имах 0x1 тук и 0x1 тук.
Но пак, на кого му пука и за адресите?
Това е просто идеята, че сега има значение.
Така че това е, което се случва тук.
Така че, разбира се, ако го направите тон скоба 0, което е масив нотация,
на course-- и честно казано, тя изглежда като има масив тук,
но сега там е това странно нещо.
Знайте, че на езика за програмиране, C, Ви предлага тази функция,
при което, дори ако т е показалка, или S е указател,
все още можете да използвате, че запознати, комфортен квадратна скоба
обозначение, за да отидете на първия елемент, или втория елемент, или всеки елемент
че тази показалка сочи да, тъй като се предполага, че тя
е, като в този случай, сочейки към някои масив.
>> Така че как можем да поправя това?
Честно казано, това е мястото, където има малко поразителен на пръв поглед.
Но тук е нова и подобрена версия.
>> Така че, на първо място, аз съм се отървете от библиотеката CS50,
само за да изложи, че е наистина е Чар звезда, просто синоним.
И Т е също знак звезда.
Но това, което се случва в дясната страна на тази линия
където т е назначен на стойност?
>> Какво е изчистване?
Какво е strlen?
Какво е sizeof (Чар)?
Защо, по дяволите, прави това Онлайн поглед толкова сложна?
Какво го прави най-високо ниво?
Какво да го приберете в тон?
Да?
АУДИТОРИЯ: Тя е за разпределяне на определено количество памет пространство.
Това е да се съхранява, предполагам, писма [недоловим].
>> DAVID J. Malan: Perfect.
Perfect.
Това разпределяне на определен размер на памет
да се съхранява, Предполага се, че бъдещите букви.
И по-специално, изчистване Затова се връща какво?
>> АУДИТОРИЯ: Връщането на [недоловим]?
DAVID J. Malan: Точно така.
Връщането на адреса на тази памет, който е един луксозен начин на казвайки:
връща адреса на първият байт на тази памет.
Отговорността е на мен да си спомня колко памет аз всъщност
разпределени или попита за изчистване.
>> Сега колко е това?
Е, въпреки че има много скоби тук,
изчистване отнема само един аргумент.
И аз съм като посочва strlen на S, така че да даде мен като много байта, тъй като има в S,
но добави един.
Защо?
Да?
>> АУДИТОРИЯ: Обратно наклонената черта 0.
DAVID J. Malan: Точно така.
Трябва да направя малко домакинска работа.
Така че, тъй като има една наклонена черта 0, можем по-добре да се помни, че.
В противен случай, ние ще да създадете низ, който
не разполага с този специален терминатор.
>> В същото време, само за да бъде супер анален секс, имам sizeof (Чар),
само в случай, че някой работи ми код не на CS50 уреда,
но може би на друг компютър общо където символа
са един байт, по силата на споразумение, но два байта, или нещо по-голямо от това.
Това е само за да бъде супер, супер чувствителни към грешки.
Въпреки че, в действителност, това е най-вероятно ще бъде 1.
>> Сега, междувременно, да отида напред и да копирате низ, т скоба и се равнява на тон скоба ите.
И аз ще се отложи за миналата седмица изходен код, за да видим какво става.
Но ключовият храна за вкъщи, и причина сложих кода сега в зелено,
е така, защото, че последната линия, т скоба 0 равнява toupper,
има ефекта на капитализиране които низ?
т и / или S?
Този последен ред код.
>> Просто тон, защото това, което е се случи този път,
ако съм леко връщане че последна стъпка, какво се е случило е, когато аз наричам изчистване,
I същество получите парче от паметта който е със същия размер като на оригинала,
защото това е аритметиката аз го направих.
Аз съм съхраняване в тона на адреса на това парче на паметта.
Въпреки че това изглежда добре и красива, хубава и празен,
Реалността е, че има, какво ще Обаждаха се, ценности боклук тук.
Това парче на паметта много мощ и са били използвани преди,
няколко секунди, преди няколко минути.
Така че може да бъде абсолютно номера или букви там, просто случайно.
Но те не са валидни, докато не се пренесат това парче на паметта
с действителните символи, като I направи в тази линия за там.
Добре ли си?
>> Така че сега, кулминацията на тези три примера
, които са били привидно разбити за последен път, този Swap например, тази функция
работил в смисъл, че разменят а и б.
Но той не работи в какъв друг смисъл?
Да?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Точно така.
Ако аз трябваше да се обадя на тази функция от another-- например,
от функция като основен, където Имам променлива, X и Y, както аз
миналата седмица, същия код, и минавам с х и у
за да сменяте, и след това се обадете Swap-- това, разбира се, е правилната версия
е това, което ние сме на път да see-- той не работи.
Така че каква е уговорката?
>> Е, така че просто да бъде ясно, нека да вървим напред
и-- ми даде милион секунда тук, и да видим , ако мога да ви покажа последната, която
ще бъде в-- нека да видим дали мога да намеря Това реално fast-- OK, [недоловим].
ОК, ето го.
Така че игнорира командите аз съм просто пишете.
Искам да извлечете най- последната минута пример
от последния път, който сега се нарича не Swap.
>> Така че не Swap е мястото, където бяхме последния път,
при което, аз инициализира х 1 и Y до 2.
След това аз наричам Swap, минавайки през една и две.
И тогава тази функция работил в някакъв смисъл,
но той не е имал постоянен осъществяване на х и у.
Така че въпросът на ръка е, как сега можем действително да решите този проблем?
Какво е решението на една ръка разстояние?
>> Е, в swap.c, който е нов и днес, забележите няколко разлики.
X и Y са еднакви.
Но това, което е ясно различен за линията 25?
Какво ново има, ако си спомняте това, което изглеждаше като преди една секунда?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Да.
Така амперсанди са ново парче синтаксис, не само в тази програма,
но също така и по-общо в CS50.
Към днешна дата, аз не мисля, че сме виждали някакви примери
или наистина говори за тях във всеки подробности, различни от, може би, изпреварващо
в раздел, амперсанд като този.
Е, оказва се, е един амперсанд от последните парчета от новия синтаксис
отиваме да се учи.
Всичко това означава, че е адрес на някои променливи.
На какъв адрес се х живеят?
Но какъв адрес е у живееш?
Защото, ако на фундаментален проблем пред
е, че х и у са били преминали като копия, това, което наистина искам да направя
се предоставят Swap с подобно съкровище карта, която води до мястото, където X и Y всъщност
са в паметта, така че Swap могат да следват тази карта
и отиде до мястото, където X или Y марка на място и промяна на действителните стойности 1 и 2
там.
>> Така Swap трябва да се промени малко прекалено.
И на пръв поглед, това може да изглежда малко подобна на Чар звезда.
И наистина това е така.
Така че е указател към какъв тип данни, въз основа на това подчертано част?
Така че това е едно цяло число.
>> Така че вече не е едно цяло число, това е адреса на вътр.
И също така, б сега ще да бъде адрес на Int.
Така че, когато аз сега наричаме Swap от Main, Аз няма да дам Swap 1 и 2.
Отивам да го даде като Ox-нещо и Ox-нещо,
два адреса, които ще доведат Swap на действителните им места
в памет на моя компютър.
>> Така че сега, моята останалата изпълнение трябва да се промени леко.
Какво е очевидно различен сега в тези три реда код?
Има тези проклети звезди всички над мястото, нали?
И така, какво става тук?
Да?
>> АУДИТОРИЯ: Това е очевидно [недоловим].
>> DAVID J. Malan: Точно така.
Така в този context-- и това не е най-доброто решение дизайн, разбира се,
преди години.
В този контекст, когато просто трябва една звезда,
а вие не разполагате с тип данни, като INT, веднага на ляво,
вместо да имате знак за равенство, ясно, В този контекст, когато ти казват, звезда,
това означава, че отиде до адрес, който е в.
Следвайте карта на съкровище, така да се каже.
>> А междувременно, в съответствие 37, това означава, че едно и също нещо.
Отидете на адрес А и сложи това там?
Каквото и да е в място, което се посочва, б.
С други думи, отидете да б.
Вземи тази стойност.
Отидете на и на равен подпише, оператора за присвояване,
поставя тази стойност там.
>> По същия начин, вътр темп е просто вътр.
Нищо не трябва да се промени за темп.
Това е просто резервна стъкло от Annenberg за малко мляко или портокалов сок.
Но аз трябва да кажа, отидете на б.
Отиди до тази дестинация и постави стойност за температура там.
И така, какво се случва след това?
Когато аз всъщност наричаме Разменени това време, ако тази първа тава тук представлява Main,
тази втора тава представлява Swap, когато Минавам амперсанд X и Y амперсанд
от Main да сменяте, само за да бъде ясно, какво е това стека рамка приемната?
Да?
>> АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Точно така.
Адресът на X и адреса на Y.
И вие можете да мислите за тях като пощенски адреси.
33 Oxford Street и на 35 Oxford Street, а вие
искат да се преместят двете сгради , които са в тези места.
>> Това е нещо като смешна идея, но това е всичко, което имаме предвид с адрес.
Къде в света може да да намерите тези две цели числа?
Къде по света може да ви намерите тези две сгради?
Така че, ако най-накрая, след като през цялото това време аз отидете в днешния изходния код и да съставят
Swap и бягай ./swap, най-накрая, за първо време имаме всъщност виждаме, че
моите ценности са наистина е заменил успешно.
И сега, ние дори може да вземе бележка за това в, да речем, GDB.
>> Така че нека да отидат в един и същи файл.
Нека да вървим напред и да стартирате GDB на ./swap.
И сега, в Swap, аз отивам да напред и да зададете точка на прекъсване в Main.
И сега, аз отивам да напред и стартирайте програмата.
И сега виждаме, моя код спря на тази линия.
>> Ако отида напред и печат х, какво трябва да видя тук?
Това е един въпрос.
Отново Кажи?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Значи случайни числа, може би.
Може би ще имаме късмет, и това е хубаво и просто, като 0.
Но може би това е някакъв случаен номер.
В този случай, аз имам късмет.
Тя просто се случва да бъде 0.
Но това наистина е късмет, защото не и докато не
въведете следващата и след това да отпечатате х има, че ред с код, линия 19, е изпълнена.
>> В същото време, ако пиша следващия път, и сега разпечатате г., аз отивам да видя 2.
Сега, ако пиша следващия, тя ще получи малко объркващо, защото сега,
на ФОРМАТ ще се появи на екрана, като го е направил. х е 1.
>> Да го направим отново.
И сега, тук е мястото, където нещата стават интересни.
Преди да се обадите Swap или дори стъпка в него, нека да отнеме малко повече поглед.
X е, отново, 1.
Y е, разбира се, бързо разсъдъка покажат, 2, така че не е трудно там.
Но това, което е амперсанд х?
Answer, това е вид фънки търси.
Но звездата INT в скоби е само начин да се каже това на БВП е един адрес.
Това не е едно цяло число, това е указател към ПНА, или иначе известни като адрес.
>> Какво е това нещо лудо?
Ние никога не съм виждал нещо съвсем като преди.
Така че това е адресът в компютъра ми спомен от където х случва да живеят.
Това е Ox-нещо.
И това е, честно казано, защо Аз започнах да рисувам стрели,
вместо на номера, защото, който наистина го е грижа
че вашият INT е в особено адрес, който е толкова голям.
Но bffff0c4, това са всички наистина шестнадесетични цифри,
които са от 0 до F.
>> Така че ние няма да се спирам твърде дълго на това, което тези неща са.
Но ако разпечатате г., Разбира се, аз виждам два.
Но амперсанд г., виждам този адрес.
И забележете, за любопитните, колко далеч един от друг, са х и у?
Можете да игнорирате по-голямата част на адреса.
Четири байта.
И това е в съответствие с нашата твърдят, че по-рано колко голям е INT?
Четири байта.
Така че тя изглежда като облицовка всичко е нагоре добре, колкото може да се надява, в паметта.
>> Така че сега, нека просто бързо напред до края на тази история.
Да вървим напред и да напишете стъпка, да се потопите в функцията Swap.
Сега забележите, ако напишете, че е идентичен на адреса на х.
Ако I тип Б, тя е идентична на адреса на Y.
Така че, какво трябва да видя дали мога Ще кажа, отидете на адреса на?
Така отпечатате звезда.
Така звезда означава, отидете там, в този контекст.
Ampersand означава, какъв е адреса на.
Така звездни средство 1.
И печат звезда б ми дава 2.
>> И нека да приемем за момента, че най-малко код, който
продължава да изпълнява сега може да бъде мотивирано чрез по този начин.
Но ние ще преразгледаме тази идея преди дълго.
Така че тази версия на Swap сега е правилно и позволява
ни да сменяте този конкретен тип данни.
>> Така че каквито и да било въпроси, то на Swap?
На звезда?
На адрес?
И вие ще видите, с проблем зададете 4, нещо,
но проблемът комплект 5, определено, как тези неща са полезни и да получите много повече
комфортно с тях, като резултат.
Каквото и да е?
Добре.
Така изчистване е, отново, тази функция че просто заделя памет, памет
разпределение.
И защо е полезно това?
Е, през цялото това време, сте използвали изчистване.
Ако смятате, че сега как getString работи, вероятно, това е
е да питаш някого за парче памет, по всяко време на видовете потребителски низ
в, защото ние със сигурност не знам, както и служители CS50,
колко е голям тези струни, че хората ще могат да се окажат.
>> Така че нека да, за първи път, да започнат да Отлепете как CS50 библиотека работи,
чрез няколко примера че ще ни доведе там.
Така че, ако се отвори Gedit и да се отворят scanf 0,
ние отиваме, за да видите следния код.
Scanf 0, предоставена на уеб сайта за Днес има относително няколко реда код
тук, от 14 до 20.
И нека да видим какво прави.
Той декларира INT, наречен X.
Той казва нещо подобно, брой моля.
И сега тя казва, scanf% I, и х.
Така че има един куп нови неща там.
>> Но scanf, можете да вид мисля на като противоположност на ФОРМАТ.
ФОРМАТ, разбира се, отпечатва на екрана.
scanf вид сканиране от потребителя клавиатура нещо, което той или тя е въвел.
>> % И е точно като ФОРМАТ.
Това означава, че очакваме потребителя да напишете вътр.
И сега, защо аз мисля, може да се минава scanf & X?
Ако целта в живота на scanf е да се получи нещо от страна на потребителя,
какво е значението на тя минава, и X, сега?
Да?
>> АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Точно така.
Каквото и да съм, човекът, въведете в, моят принос ще бъде записан на това място.
Това не е достатъчно, спомням, просто да премине в X, защото вече сме виждали,
всеки път, когато се премине само на сурово променлива, като междинно съединение, в някои други функции,
Разбира се, това може да промени това променлива, но не постоянно.
Тя не може да има ефект върху Main.
Тя може да се промени само собствените си локално копие.
Но ако вместо това, те не го правят дай ми застроена ПНА,
но ти ми даде указания на че INT, аз сега, като scanf,
Със сигурност мога да следва, че адрес и постави редица там
така че да имате достъп до него, както добре.
>> Така че, когато стартирате тази програма, да видим.
Направете scanf 0 точки черта, scanf 0.
И ако сега аз въведете номер като 50, благодаря за 50.
Ако сега напишете брой като отрицателен 1, за отрицателен 1.
Сега въведете число като 1.5, хм.
Защо програмата ми ме игнорират?
Ами, защото просто, казах тя да се очаква само едно цяло число.
Добре.
Така че това е една версия на това.
Нека вземем нещата с една степен и предложи, че това не е добро.
И тук се крие един много прост пример как можем да започнете да пишете код
че други хора могат да използват или компромис от извършването на лоши неща.
Така линия 16, така че подобен в дух преди,
но аз не съм го обявява INT това време.
Аз съм го обявява Чар звезда, известен още като низ.
>> Но какво значи това наистина означава?
Така че, ако не посочите address-- и Аз съм го нарече произволно, буфер,
но можех да го наричат ​​S, за да бъде simple-- и след това да направите това, да ми обясни,
ако можеш, основани на предишната логика, това, което се прави scanf в ред 18,
ако пас% S и буфер, който е адрес?
Какво е scanf, ако се прилагат точно същата логика като версия 0,
Ще се опитаме да направим тук, когато на видове потребителски нещо в?
Да?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Точно така.
Scanf, от логиката по-рано, ще отнеме низ
че човешкото напечатани в-- сега това е низ,
това не е число, вероятно, ако той или тя cooperates--
и тя ще се опита да сложи това низ в памет на каквото и адрес
буфер уточнява.
И това е страхотно, защото буфер наистина трябваше да бъде адрес.
>> Но аз твърдя, тази програма е бъгав в много сериозен начин, защото каква стойност е
буфер по подразбиране?
Какво съм инициализира в?
Какво парче на паметта?
Аз не съм, нали?
>> Така че, въпреки че аз съм разпределена Чар звезда, която вече не се нарича S,
Вместо това, той се нарича, buffer-- така нека се направи името на променливата
сега като buffer-- ако не съм наречен getString или изчистване тук,
това на практика означава, че буфер е просто някаква стойност боклук.
>> Сега какво означава това?
Това означава, че аз съм казал на scanf да се очаква низ от потребителя.
И знаеш ли какво?
Каквато и да е това нещо, което сочи да-- и аз привличам въпросителен знак,
но в действителност, тя ще бъде нещо като ОХ1, 2, 3, нали?
Това е някаква фиктивна стойност, която току-що се случва да бъде там от преди.
Така че, казано по друг начин, това е сякаш буфер е само
сочейки към нещо в паметта.
Нямам представа какво.
>> Така че, ако напишете в Габе сега, това ще да се опита да сложи г-а-б-д / 0 там.
Но кой знае, какво е това?
И в миналото, всеки път, когато съм се опитвал да се докоснат
памет, която не принадлежи за нас, какво се е случило?
Или почти всеки път.
Сегментация вина, нали?
>> Тази стрелка, нямам представа къде е посочващо. това е просто някаква случайна стойност.
И разбира се, ако се тълкува произволна стойност като адрес,
ти започваш да отидете някои случайни дестинация.
Така че Гейб наистина биха могли катастрофа програмата ми в този случай тук.
>> И така, какво можем да направим, това е почти толкова лошо?
Помислете за това трето и последен пример на scanf.
Тази версия е по-добре в какъв смисъл?
Ако сте доволни от предишния проблем, това е по-добре.
Защо?
>> АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Добре.
Така че този случай на ред 16 е по-добре, в смисъл
че сме изрично разпределяне на паметта.
Ние не използвате изчистване, ние сме с помощта на седмица 2
подход от просто обявяване на масив.
И сме казвали преди, че низ е само набор от символи,
така че това е напълно законно.
Но това е, разбира се, като ви, имайте предвид, фиксиран размер, 16.
>> Така че тази програма е напълно безопасен, ако напишете
в една символни низове, два характер конци, 15 символни низове.
Но веднага след като започнете да пишете 16, 17, 18, 1000 символни низове,
Къде е този низ ще свърши?
Това ще свърши частично тук.
Но тогава кой знае какво друго е извън границите
на този масив?
>> Това е като че ли съм обявен 16 кутии тук.
Така че вместо да извади всички 16, ние ще просто се преструвам, че съм изготвен 16.
Но ако след това се опитайте да се чете низ това е много по-дълго, като 50 знака,
Отивам да започне въвеждането A, B, C, D, X, Y, Z.
И това е вероятно друг сегмент памет
че, отново, може да причини моята програма за катастрофата,
защото аз не съм поискал нещо повече от само 16 байта.
>> Така че, на кой му пука?
Е, тук е библиотеката CS50.
И повечето от това е просто като инструкции до върха.
Библиотеката CS50, през цялото това време, е имал тази линия в линия 52.
Видяхме typedef, или ще видите typedef
в pset 4, който само създава синоним с което Чар звезда може да бъде повече
просто по-низ.
Така че това е един от най- няколко помощни колела
сме използвали тайно под предния капак.
>> В същото време, тук е функцията, getchar.
Сега изглежда, че няма орган, който да него.
И всъщност, ако продължа превъртане, аз всъщност не
виждам никакви реализации на тези функции.
За проверка здрав разум, защо е това?
>> АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Да.
Така че това е заглавната част на файла.
И заглавни файлове съдържат прототипи, плюс някои други неща, изглежда,
като typedefs.
Но в CS50.c, което сме Никога не ви е дал окончателно,
но е бил в CS50 уреда всички този път, дълбоко в своите папки,
забележите, че има цяла куп функции тук.
>> Всъщност, нека да превъртите надолу.
Да се ​​игнорира повечето от тях, за сега.
Но превъртете надолу до getInt и да видим как работи getInt.
Така че тук е getInt.
И ако някога наистина се грижи как да получите вътр работи, тук е неговата документация.
И сред нещата, тя казва, е, че ви казва
какво обхватът на стойностите, то могат да се върнат.
Това е по същество негативно 2 милиарда на положителна 2 милиарда, или да се даде.
>> И се оказва, че всичко това време, въпреки че никога не сме
е да проверите за него, ако нещо се обърка,
Оказва се, че всички този път, getInt има
е връщане на специален постоянно, не нула,
а int_max, който е конвенция просто програмист.
Това означава, че тук е специална стойност.
Уверете се, за да проверите за това, просто в случай, че нещо се обърка.
Но ние никога не съм притеснявана с че до този момент
защото отново, този има за цел да опрости.
>> Но как getInt се реализира?
Е, един, това отнема без аргументи.
Ние знаем, че.
Тя връща вътр.
Ние знаем, че.
Е, как става това под капака?
>> Така че е очевидно безкраен контур, най-малко от един вид.
Забележете, че ние използваме getString.
Така че това е интересно. getInt призовава нашата собствена функция, getString.
И сега, защо може това да е случаят?
Защо съм отбранителен тук в съответствие 165?
Какво би могло да се случи, в съответствие 164, само за да бъде ясно?
Това е един и същ отговор, както преди.
Може да бъде само от паметта.
Нещо се обърка с getString, ние трябва да бъде в състояние да се справят с това.
И причината не се върна нищожна е че, технически, нула е указател.
getInt трябва да се върне на вътр.
Така че аз съм произволно реши, по същество,
че 2 милиарда, или да се даде, ще да бъде на специална стойност, че аз никога не може да
се получи в действителност от страна на потребителя.
Това е само стойността една Отивам за губене да представлява код за грешка.
>> Така че сега, нещата стават малко фантазия.
И това не е съвсем същата функция както и преди, но това е много подобен.
Така забележите, аз декларирам, тук, в съответствие 172, както на междинно съединение N и пепел в.
И тогава аз използвам този фънки линия, sscanf, който се оказва,
не сканирате низ от клавиатурата.
Той се намира на съществуващ низ, който потребителят вече е въвел инча
Така че аз вече призова getString, които означава, че трябва низ в паметта.
sscanf е това, което бихте наричаме функция разбор.
Той поглежда към низ Нямам въвели в, знак по знак,
и върши нещо полезно.
Това низ се съхранява в линия.
И аз знам, че само като отидете резервно копие тук и каза, о, добре,
Аз го нарича не и този път, но линия.
>> И сега това е малко по-различна.
Но това на практика означава, по причини, ние до известна степен ще размахва ръцете ни в днес,
че ние сме проверка, за да вижте, ако потребителят въвели в
и Int а може би и друг характер.
Ако потребителят въвели в едно цяло число, това е ще трябва да се съхранява в N, защото съм
Кончината на адрес, на нов трик видяхме днес.
Ако потребителят също написали По подобен 123x, че X
ще се окажете на писмо по характер в.
>> Сега се оказва, че sscanf ще ми кажете, интелигентно,
колко променливи е sscanf успешно може да се запълни.
Така че от тази логика, ако функцията Аз съм по прилагането, е getInt,
но аз съм проверка, евентуално за потребителя
да сте написали в INT последвано от нещо друго,
какво искам sscanf е върнатата стойност наистина да бъде?
Ако целта е да се получи само едно цяло число от потребителя?
>> Така че, ако sscanf връща 2, какво означава това?
Потребителят въвели в нещо подобно, буквално,
123x, което е просто глупост.
Това е състояние на грешка, и Искам да проверя за това.
>> Така че, ако видовете потребителски това, от тази логика, какво прави sscanf върне,
бихте ли казали?
Така че няма да се върне 2, защото на 123 е да отида в тук,
и Х няма да свърши тук.
Но аз не искам на Х, за да се пълни.
Искам да sscanf само да успеят в запълване на първия от неговите променливи.
И така, това е защо аз искам sscanf да върне един.
>> И ако това е малко над главата за момента, това е напълно наред.
Осъзнайте, обаче, че една от най- стойности на getInt и getString
е, че ние правим един чесало на Много от проверка за грешки като тази, така
че, към днешна дата, можете доста много напишете нещо на клавиатурата,
и ние ще го хванем.
И ние със сигурност, на персонал, със сигурност няма да
да бъде източник на грешка в програма, защото ние сме в защита
проверка за всички глупавият неща, които един потребител може да се направи,
като пишете низ, когато Наистина ли искаше вътр.
Така че за сега-- ние ще дойдем към тази преди long--
но през цялото това време, getString и getInt имат
било под капака с помощта на тази основната идея на адреси на паметта.
>> Така че сега, нека да направим нещата малко по-лесен за употреба.
Както може би си спомняте, от Binky последно time-- ако моята мишка ще cooperate-- така
имахме този код, който честно казано, е доста безсмислен.
Този код се постига нищо полезен, но това е пример
че професор Parlante се използва, за да представляват
какво се случва в програма, включваща памет.
>> Така че нека да преразкаже това история супер кратко.
Първите два реда, в Английски, правя това, което ще ви кажа?
Само в разумни хора, но малко технически термини, да вземе хладно оръжие.
АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Добре, вие сте за създаване адреси за вашата х и у променливи.
Не съвсем, защото X и Y не са променливи в традиционния смисъл на думата.
X и Y са адреси или ще се съхранява адрес.
Така че нека да се опитаме още веднъж.
Не е лошо начало, все пак.
Да?
>> АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Добре.
Мисля, че е малко по-чист.
Деклариране две насоки, две числа.
И ние ги нарича х и у.
Или ако трябва да се направи това като картина, отново,
спомням съвсем просто, че всички правим с това на първа линия
привлича кутия като този, с някаква стойност боклук в него,
и го нарече X, а след това друга кутия като този,
с някаква стойност боклук в него, наричайки го у.
Ние сме обявен два насоки, които в крайна сметка
ще се съхранява адреса на вътр.
Така че това е всичко, което съществува.
>> Така че, когато Бинки направи това, глина просто изглеждаше така.
И Ник просто вид увит стрелките,
като че ли те не сочи никъде по-специално, защото те са просто
стойности за боклук.
Те не са изрично инициализира навсякъде в частност.
>> Сега на следващия ред на код, изземване, беше това.
Така че в разумно-лесен за употреба, но малко по-технически английски език,
каква е тази линия на код правиш?
Да?
>> АУДИТОРИЯ: [недоловим].
>> DAVID J. Malan: Perfect.
Това разпределяне на парче от памет, която е с размерите на вътр.
И това е половината от отговора.
Ти отговори на правото половина на експресията.
Какво се случва на лявата страна на знака за равенство?
Да?
АУДИТОРИЯ: И правоприемници да променливата X?
>> DAVID J. Malan: И правоприемници да променливата х.
Така че да се набележи, дясната страна Разпределя достатъчно памет за съхранение на вътр.
Но изчистване специално връща адреса
на това парче на паметта, до която сте Просто предложен получава съхраняват в х.
>> Така че това, което Ник миналия път с Бинки е той повлече че показалеца навън, калта,
да отбележа сега в бяло парче на паметта , който е равен на размера на Int.
И наистина, това означава, да представлява четири байта.
>> Сега, на следващия ред на код Направих това, звезда х получава 42.
Така че 42 е недвусмислен относно: дясната страна, смисъла на живота.
Лявата страна, звезда х означава какво?
Това също може да има gone-- това е ОК.
OK.
>> АУДИТОРИЯ: По принцип, отидете на [недоловим]
DAVID J. Malan: Добре.
АУДИТОРИЯ: [недоловим].
DAVID J. Malan: Точно така.
Лявата страна означава, отидете на х.
X е адрес.
Това е като 33 Oxford Street, или ОХ1.
И звезда х означава, отидете на тази адрес и сложи това там?
42.
>> Така че наистина, това е точно това, което е направил Ник.
Той започна с от, по същество, умствено
сочейки с пръст X, следвайки стрелката
към бялата кутия от дясната страна страна, и въвеждане на номер 42 там.
Но след това нещата станаха по- малко опасно, нали?
Binky е на път да загуби главата си.
>> Star г. се равнява на 13, лош късмет, какво означава това?
Така звездни у средства отиват на адреса в у.
Но това, което е адресът в Y?
Добре, това е стойност боклук, нали?
Аз го привлече като въпросителен знак.
Ник го привлече като навита стрелка нагоре.
И веднага щом се опитате да направи звезда г., заявявайки, отидете там,
но там не е легитимна адрес, че е някакъв фалшив място,
програмата ще се срине.
И главата Binky се случва да лети тук, както го е направил.
>> Така че в края на краищата, тази програма Беше просто неуморно недостатък.
Това беше програма бъги.
И това трябва да бъде фиксиран.
И единственият начин, наистина, да се поправи ще бъде, например, тази линия,
които ние дори не се получи да, защото програмата се разби твърде скоро.
Но ако трябва да се определи това, което ефект прави това у равни х имат?
Е, че по същество той изтъква г. в каквото стойност х е сочеше.
>> Така че в историята на Ник, или история Binky е, както
X и Y са сочеше бялото парче на паметта,
така че най-накрая, когато се звезда г. се равнява на 13 отново,
ти свърши поставяне 13 в на подходящо място.
Така че всички тези линии са напълно легитимна, с изключение на тази,
когато това се случи, преди да всъщност у назначен някаква стойност.
>> Сега за щастие, не знаеш Трябва да разсъждаваме през всички
на тези видове проблеми на вашия собствен.
Нека да вървим напред и да се отвори до терминален прозорец тук
и да се отворят, само за момент, супер кратка програма, която
също е нещо безсмислено.
Това е грозно.
Тя не постига нищо полезно.
Но това не доказва въпроси на паметта, така че нека хвърлим един поглед.
>> Main, супер проста.
Тя очевидно призовава функция, F, и след това се връща 0.
Това е малко трудно да се забъркваш това.
Така Main е доста добър, досега.
>> Така е е проблематично.
И просто не е пускал много усилия, за да го нарича
тук, за да се запази акцентът върху кода.
F има две линии.
И нека да видим какво се случва сега.
Така от една страна тук-- и нека да
това съответства на предишната example-- от една страна,
лявата ръка е прави това, което на английски?
Той е--
АУДИТОРИЯ: Създаване на показалеца.
DAVID J. Malan: Създаване на показалеца на вътр и призова тя х.
Така че това е създаването на една от тези кутии Продължавам рисуване върху сензорния екран.
И сега, от дясната страна страна, изчистване, разбира се,
е разпределението на парче на паметта.
И само за да бъде ясно, как много памет е очевидно
разпределяне, ако просто вид направите по математика тук?
>> Така че това е 40 байта.
И аз знам, че само защото знам, че един ПНА, на CS50 уреда, най-малко,
е четири байта.
Така 10 пъти 4 е 40.
Така че това е съхраняване на х, адресът на първия от 40 цели числа, които
са били разпределени пространство назад, да архивирате, за да архивирате и да върне.
>> И това е, което е ключово за изчистване.
Тя не взема малко памет тук, малко тук, малко тук.
Тя ви дава едно парче от паметта, Последователно, от оперативната
система.
>> Сега какво ще кажеш за това, х скоба 10 е равно на 0?
Произволен ред код.
Тя не постига нищо полезно.
Интересно е обаче, защото х скоба 10--?
Да?
>> АУДИТОРИЯ: [недоловим]?
>> DAVID J. Malan: х конзола 10 не трябва да бъде нула.
Детайл Нулевата идва само в игра със струни, в края на низ.
Но една добра мисъл.
>> Колко голям е този масив, дори че съм разпределена 40 байта?
Това е от 0 до девет, нали?
Това е 10 цели числа, обща.
40 байта, но 10 цели числа, индексирани от 0 до 0.
>> Така че това, което е, че х скоба 10?
Това е всъщност някои неизвестна стойност боклук.
Това е памет, която не принадлежи на мен.
Аз не трябва да се докосва, че байт номер 41, 42, 43, 44.
Аз съм леко отива твърде далеч.
>> И наистина, ако стартирате тази програма, може много добре катастрофа.
Но понякога, да имаме късмет.
И така, само за да покаже, това-- и честно казано,
никога не се знае, преди да се it-- нека да стартирате тази.
Той всъщност не се срине.
>> Но ако мога да променя това, за Например, за да бъде като 1000,
да направи това наистина умишлено, нека да видим
ако мога да я блъсне този път.
Добре, че не се срине.
Какво ще кажеш за 100 000?
Нека си го преправи, а сега го изпълнете отново.
OK.
Пфу.
Добре.
Така че, както изглежда, отново, те сегменти на паметта, така да се каже,
са разумно голям, за да можем да извадим късмет отново и отново.
Но в крайна сметка, след като се нелепо и наистина да отиде далеч на екрана,
докоснете памет, която наистина, наистина не принадлежи на вас.
>> Но честно казано, това видове буболечки ще
да бъде по-трудно и по-трудно да разбера по своему.
Но за щастие, като програмисти, ние имаме инструменти, които ни позволяват да се направи това за нас.
Така че това е, може би, една на най-грозните програми,
дори по-грозна от изхода на GDB.
Но тя винаги е на линия или две, които са супер полезни.
>> Valgrind е програма, която помага не трасира програма, сам по себе си,
но намери свързани с паметта проблеми, по-специално.
Тя автоматично ще тичам вашия код за вас и за най-малко две неща изглеждат.
One, направи нещо случайно като докосване памет
които не принадлежат към вас?
Тя ще ви помогне да намерите тези случаи.
>> И второ, това ще помогне да намерите нещо, наречено
изтичане на памет, които имаме напълно игнорирани, наивно,
за известно време и блажено.
Но се оказва, че всички това време, когато
сте нарича getString в толкова много от нашите програми,
питаш оперативните система за памет,
но имате някакви спомени някога го дава
обратно, правиш unalloc, или безплатно, както се нарича.
Не, защото никога не сме Помолих те да го направят.
>> Но през цялото това време, програмите сте писали в C
са изтичане на памет, иска от експлоатация
система за повече и повече памет за струнни и какво ли не,
, но никога не я подаде обратно.
И сега това е малко на опростяване,
но ако някога сте тичам вашия Mac или вашия компютър за известно време, отваряне
много програми, може би затваряне програми,
и въпреки, че си Компютърът не е разбил,
това е все така много по-бавно, като че ли е наистина
използва много памет или ресурси, макар,
ако не сте дори докосване на клавиатурата,
които биха могли да е-- но не можех always-- бъде, че програмите, които пускате
самите те имат изтичане на памет.
И те продължават да питат операционната система за повече и повече памет, но забравят за него,
всъщност не го използвате, но Затова като памет далеч
от други програми, които биха могли да го искат.
Така че това е една обща обяснение.
Сега тук е мястото, където е Valgrind продукция е напълно
брутално с тези по-малко и повече, така комфортно.
Но интересното неща е точно тук.
Той ми казва невалиден запис на размер четири случва в тази програма,
по-специално, в ред 21 от memory.c.
>> Ако отида в ред 21, хм, там наистина е невалиден запис с размер четири.
Защо размер четири?
Е, това номера му и го може да бъде anything-- е вътр.
Така че това е четири байта.
Така че аз съм като четири байта където те не принадлежат.
Това е, което Valgrind всъщност ми казваше.
Освен това, тя също така ще кажи ми, както ще видим,
като стартирате тази в бъдещ pset, ако и когато сте изтекла памет, която наистина
Имам, защото аз съм наречен изчистване, но аз не съм в действителност
нарича, в този случай, безплатно, който в крайна сметка ще видим
е обратното на изчистване.
>> Така че сега, мисля, че един последен пример.
Така че това е малко по- тайнствена, но това е може би
най-голямата причина да бъдете внимателни с памет,
и поради това, че много програми и / или уеб сървъри, дори и до днес,
са придобити от лошите момчета някъде в интернет, които са по някакъв начин
изпращане на фалшиви пакети за вашия сървър се опитва да компрометира вашите сметки,
или да вземат данните си, или просто обикновено поеме машина.
Буфер преливане, като име подсказва, средства
прелива не пад, но буфер.
И буфер е само един луксозен начин да се каже, че е един куп памет.
>> И наистина, обадих низ преди буфер, вместо на S.
Защото, ако това е буфер, в смисъла на YouTube,
или всеки път, когато гледате видео, може би сте виждали думата буфериране,
DOT, DOT, точка.
Това е изключително досадно.
И това просто означава, че вашата видео плейър
се опитва да изтегли жребий байтове, много байта
от видео от интернет.
Но това е бавен, така че тя се опитва да изтеглите един куп от тях
за попълване на буфер, контейнер, така че имате достатъчно байта, че може след това
ви покажа видеото, без пауза постоянно.
Но се оказва, можете да има буфер за този голям.
Но се опита да сложи толкова много данни в него, и много лоши неща могат да се случат.
Така например, нека да разгледаме този последен тийзър на пример.
Това е друга програма които, на пръв поглед,
не направи нищо супер полезни.
Той си има Основна функция който призовава тази функция, ф.
И тази функция, е, тук има Чар масив, наречен C, на площ 12.
И след това е използването на този нова функция, наречена strncpy.
>> Оказва се, че с тази проста, прост ред код, само на две линии,
които сме направили през целия си програма, и следователно, цялата моя компютър,
и моя потребителски акаунт, и ми е трудно карам потенциално уязвими към никого
който знае и е достатъчно добър, за да стартирате тази програма с определен командния ред
аргумент.
С други думи, ако този лош човек поставя във вътрешността на argvargv [1], като напишете
в клавиатурата много специално изработени низ, не ABC, 123, но по същество,
двоични символи, които представляват изпълним код, програма, която той или тя пише,
с тази проста програма, която е представител на хиляди програми
, които са по подобен начин уязвими, смея да кажа, той или тя може в крайна сметка да изтриете всички
файловете на твърдия си диск, да получат мига бързо, така че той или тя може да
въведете команди на техните собствени, Изпратете имейл до всички файлове за себе си.
Всичко, което мога да направя, той или тя може да направи с този код.
>> Ние няма да разрешат съвсем на това.
И в действителност, тя ще се включва малко картина
като това, което ние скоро ще дойде да се разбере, толкова по-добре.
Но за днес, нека да приключи на това, което е, да се надяваме, малко по-
разбираемо XKCD шега, докато не се възобнови следващия път.
Добре.
Ще се видим в сряда.
>> [За възпроизвеждане на музика]
>> Лектор: И сега, дълбоко мисли, по Дейвън Farnham.
Паметта е като скок в купчина златни листа в неделя следобед.
Вятър, мята си hair-- ох, аз пропуснете ден когато--
>> [СМЯХ]