[Музички]
>> Дејвид Џ MALAN: Во ред.
Ова е CS50.
И ова е почеток на недела 5.
И како што може да се забележи, некои од материјалот
е добивање малку повеќе комплекс, малку погусти.
>> И тоа е многу лесно, особено ако сте биле во навика за некое време,
дека се обидува да драсканица долу поголемиот ништо да правиме, ние велиме во класата.
Но сфати дека не е можеби идеален педагошки пристап
за учење на овој вид на материјал, и материјални поопшто.
И така ние сме среќни да објави свој Gheng дека CS50 на
Гонг почна да се подготви канонски сет на белешки
за курсот, со надеж дека ќе што е тоа што, еден, овие
не само што служи како референца и ресурси
за разгледување на материјали и ќе назад преку материјалот кој може да има
сте избегале прв пат околу, но исто така, така што вашите глави може да биде повеќе
до од долу, кога доаѓа време да се одржи предавање,
така што ќе може да се вклучат повеќе смислено, како
за разлика од повеќе scribbly.
>> Со тоа, вели, она што ќе најдете на на веб страната е овие документи што е оваа.
И известување, во горниот лев агол, има не само содржината,
но исто така и време кодови кои веднаш ќе ви скокаат
на соодветниот дел во видеото на интернет.
И она што Чанг тука има направено е, во суштина, е документирано
она што се случи во овој особено предавање.
И многу од предавањата се веќе онлајн сега со овој URL.
И ќе продолжи да ја објавите на остатокот на тие до крајот на оваа недела,
па ги искористат предностите на тој ресурс.
>> Значи без понатамошно ado, почнавме да лупам назад
слој кој е стринг за некое време.
И што да кажеме низа всушност е минатата недела?
Така знак ѕвезда.
И знак ѕвезда, добро, што не значи дека навистина?
Па, сето ова време, ако ние сме повикува функција,
како getString, и чување т.н. враќање
вредноста на getString во variable-- се вика
s Вид string-- ние сме биле пишување на линија на кодот до таму горе.
И тоа е само кога ќе видам мојот ракопис зголемува тука
направи Сфаќам колку крволочен е оваа.
>> Сепак, да претпоставиме дека, на десната страна
е, сепак, разумен опис на она што е
се случува сето ова време со getString.
getString, се разбира, добива низа.
Но, она што не значи дека навистина?
Тоа значи дека добива парче на меморија од оперативниот систем
со повик на функција, наречен Примерок.
Но повеќе за тоа подоцна.
А потоа се населува дека парче на меморија
со буквите корисникот има внеле во, проследено со, се разбира,
нула карактер, или обратна коса црта нула на самиот крај.
>> Во меѓувреме, на левата страна на оваа приказна, сето ова време,
ние сме прогласување на променлива, како е.
И таа променлива е она што сега ќе започне повикувајќи покажувач.
Тоа не е кутија во внатрешноста на кој ќе стави стринг, Daven, само по себе,
туку го ставаме во која плоштад кутијата лево што точно?
Да?
>> ПУБЛИКАТА: Адресата на каде што е лоцирана во меморијата.
>> Дејвид Џ MALAN: Токму така.
Адреса на каде Daven се наоѓа во меморијата.
А не каде што сите Daven се наоѓа, само по себе, но конкретно адреса
на што?
Да?
>> ПУБЛИКАТА: Прво карактер.
>> Дејвид Џ MALAN: Првиот знак во Daven, која, во овој случај,
Предложив беше произволно и нереално 1, Ox1,
што само значи дека хексадецимално број од 1.
Но тоа е веројатно нема да се биде многу поголем број
дека ние може да се подготви со 0x како префикс,
претставува хексадецимално карактер.
И затоа што ние не треба да се знае каде остатокот од ликовите на Daven
се, поради тоа што едноставен дизајн одлука донесена пред многу години?
Да?
>> ПУБЛИКАТА: 0 Обратна коса црта.
Дејвид Џ MALAN: Да, точно.
Обратна коса црта 0 ви овозможува, иако во линеарно време, да напречни низа,
пешачење од лево кон десно, со за телефонска линија, или време
јамка, или нешто слично тоа, и да се одреди, ох, тука
е крајот на овој особено низа.
Па само на адресата на почетокот на стринг,
можеме да пристапите на интегритет на тоа, бидејќи сето ова време,
низа штотуку бил знак ѕвезда.
>> Па тоа е секако во ред да продолжите со користење на на CS50 библиотека и оваа апстракција,
така да се каже, но ние ќе почнуваат да се види точно
она што се случува под целото ова време.
Така што може да се сети овој пример, исто така, од последниот пат, да ги споредиме 0,
кои всушност не се споредуваат.
Но почнавме да се реши ова.
>> Но, како што можеби бакшиш, може да се интересира некој
во розова слон денес, исто така, направени од страна на Чанг?
Како за вас пред? [Беззвучен].
Ајде до.
>> А во меѓувреме, како што излезе, да
сметаат за само еден миг она што овој код е всушност прави.
Се прогласува две променливи до врвот, s и t, и повикувајќи getString.
Ова не е многу пријателски за корисниците на програмата, поради тоа што не ви каже што да прави.
Но ајде да претпоставиме дека сме фокусирајќи се на сочно дел.
А потоа и да правиме, ако е еднаква на е еднаква на T, тоа треба да се каже printf,
сте ја внеле истото.
Здраво.
Што е вашето име?
>> Janelle: Janelle.
Дејвид Џ MALAN: Janelle, убаво да ви се исполнат.
Па вашиот предизвик рака за овој слон
е прво да ни нацрта слика на она што е се застапени во оние првите два
линии.
Па s и t може да биде претставен како на екранот?
А вие само може да се подготви со го прстот на овој голем екран.
>> Така што двете половини на секоја страна од таа равенка.
Така што на лево и тогаш getString десно.
А потоа, тука е т на левата страна, а потоа getString десно.
Па како може да почнеме цртање слика која
го претставува она што се случува тука во меморијата, што би рекол?
И дозволете ми да ви објаснам што правиш, како ви одат.
>> Janelle: Добро.
Па, прво, тоа ќе се бара да се добие влез стринг.
И тоа ќе store-- Ох, извинете.
Дејвид Џ MALAN: Добро.
Добро.
И ова се нарекува што?
О, во ред.
Продолжувам да одам.
Јас не значи да се прекине.
Janelle: За жал.
Значи тоа ќе влез го во на адреса не of-- сигурни.
Јас не точно може да се сети на бројот, но јас верувам дека тоа беше почнуваат со 0.
>> Дејвид Џ MALAN: Тоа е во ред, бидејќи не сум направил броеви нагоре,
па нема вистинскиот одговор.
>> Janelle: Почнувајќи од 0 лак.
>> Дејвид Џ MALAN: Добро, така елемент 0.
Сигурен.
>> Janelle: И потоа, ако беше како само две letter--
>> Дејвид Џ MALAN: Добро, назад кон вас.
>> Janelle: Значи елемент 0 и тогаш елемент 1 или елемент 2.
Дејвид Џ MALAN: А кој дел од сликата ви се цртеж во моментов?
Повик за getString?
Или изјава на ОК?
>> Janelle: Декларацијата на, јас верувам.
О, getString, бидејќи тоа би се внесуваат во секој [? површина. ?]
>> Дејвид Џ MALAN: Добро.
Токму така.
Иако ова ефикасно враќа низа, да се потсетиме,
кога ќе се вратиме низа, може да се индекс во таа низа користење на 01 и 2.
Технички, овие се веројатно претставен од страна на индивидуални адреси,
но тоа е во ред.
>> Па претпоставувам, ако можам само брзо проследи до каде што застанавте
Последен пат, ако еден од конците беше g а б е,
обратна коса црта 0, а со тоа претставува Габе на влез, како можеме да ги претставуваат на сега?
Ако ова е меморија што е се вратени од страна на getString?
>> Janelle: Дали тоа ќе биде претставен од страна на лак?
>> Дејвид Џ MALAN: Со лак?
Па, бр.
Да речеме, сликовито, дозволете ми да оди напред
и предложи дека, ако ова е, овој е повратната вредност на getString.
И сте подготвени тоа како 0, 1, 2, кој е совршено разумни, затоа што
може да индексира во низа, како што се.
Но, само за да бидат во согласност со Последниот пат, дозволете ми да оди напред
и произволно да предложи дека овој е адреса 1, ова е адреса 2,
ова е адресата 3, и така натаму.
И така, само за да биде супер јасно, што се случува
да се оди во ОК како резултат на тоа првата линија на кодот, дали би рекле?
>> Janelle: Адреса 1?
>> Дејвид Џ MALAN: Токму така.
Па се обрати 0x1.
А во меѓувреме, дозволете ми да оди напред и да дупликат многу од она што сте го направиле
и додадете свој т тука.
Ако јас да напишете во Габе повторно, по втор пат,
кога ќе бидете известени со getString, каде што, се разбира, е Габе ќе одат?
Па, presumably--
>> Janelle: Како овде?
Дејвид Џ MALAN: Да.
Janelle: Или тоа е, исто така, во истата кутии?
Дејвид Џ MALAN: Дозволете ми предложи, да, точно, така што во овие дополнителни кутии.
Но, она што е клучот сега е дека, дури и иако сум подготвен овие прилично блиску
together-- 0x1, ова е 0x2-- во реалноста,
ова сега може да биде адреса 0x10, на пример, и 0x11, 0x12 и,
и така натаму.
И така, ако тоа е случај, она што се случува да се заокружи тука во т?
>> Janelle: 0x10?
Дејвид Џ MALAN: Токму така.
Па 0x10.
И така сега, конечниот збор.
Имате, од далеку, морале да работат на Најтешко за слон досега.
До сега, ако јас се повлече до кодот повторно, кога јас го правам тоа во согласност три,
ако е еднаква еднаква на T, она што сум јас, всушност, споредување дека ние сме подготвени овде?
>> Janelle: Двете адреси?
Дејвид Џ MALAN: Токму така.
Значи сакам да кажам дека е S еднаков еднаква на т?
Со други зборови, е 1 еднаков еднаков на 10?
И, се разбира, на Очигледен одговор сега е, бр.
И така оваа програма е во крајна линија случува да се печати што, би рекол?
>> Janelle: Дали тоа ќе биде, сте ја внеле истото?
>> Дејвид Џ MALAN: Значи, ако s е 1 и t е 10?
>> Janelle: Внесовте различни нешта.
>> Дејвид Џ MALAN: Токму така.
Сте ја внеле различни нешта.
Во ред.
Па аплауз, Доколку би можеле овде.
[Аплауз]
Тоа беше болно.
Знам.
Убаво направено.
Па сега ајде да видиме ако не можеме да одгатнат што фикс е.
И, се разбира, кога ќе се дефинира this-- што сега ќе ги претставуваат во green--
ние направивме неколку подобрувања тука.
Прво, само како здрав разум провери, јас сум првата проверка
ако е еднаква на нула и т е еднаква на нула.
И само за да биде јасно, кога би можеле да s или t биде нула во кодот вака?
Кога може s или t биде нула.
Да?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Токму така.
Дали стрингот што корисникот внесе во е премногу долго
да се вклопат во меморија, или некои чуден агол случај како што,
getString, како што ќе видиме, буквално Денес, во неговата документација,
вели дека ќе се врати нула како посебна стража вредност,
или само вид на посебен симбол тоа значи дека нешто не беше во ред.
Затоа сакаме да се провери за тоа, затоа што се испоставува
дека нула е многу опасна вредност.
>> Често, ако се обидете да направите нешто со нула вклучува function-- поминува
како влез, за ​​instance-- таа функција Многу може да се сруши и со тоа,
ги симнат целиот вашата програма.
Значи ова третата линија сега е само здрав разум провери, грешка проверка, ако сакате.
Тоа е добра навика сега за ни да се влезе во било кое време ние
обидете да го користите вредност која може, потенцијално, е нула.
>> Сега, во четвртиот ред тука, "Ако strcmp (s, t)," добро,
што е тоа што се однесуваат на?
Па, ние изјави дека ова е многу посочно именуван функција за низа споредба.
И нејзината цел во животот е да се споредуваат својот прв аргумент против неа второ,
но не во смисла на нивните адреси, како што беше ненамерно момент
пред со црвено, но наместо да се споредуваат овие две
жици во човечки интуитивен начин со споредување на тоа, против ова,
против ова, против ова, и тогаш запирање дали и кога еден
или и двете на прстите хитови обратна коса црта 0.
Па некој пред неколку години спроведува strcmp да се спроведе за нас функционалноста
што се надевавме ние би го добиле само со споредување на два едноставни вредности.
>> Сега искрено, ги чувам за цртање сите овие различни броеви.
Но, реалноста е, јас сум бил со што овие на целиот пат.
И така дозволете ми да оди напред и драсканица овие од
да се направи точка дека, на крајот на денот и се движи напред,
ние не сме навистина се случува да се грижи за што се однесува на работите се всушност
во меморијата.
Па јас не одам да се подготви овие видови на броеви толку многу повеќе,
Јас сум само апстрактен овој далеку малку повеќе пријателски со само стрели.
>> Со други зборови, ако е покажувач, добро, ајде да го нацрта тоа, буквално,
како покажувач, стрела покажувајќи од себе на нешто друго,
и не грижете се премногу повеќе за на minutia на овие адреси
кои, пак, составен во секој случај.
Но ќе видиме оние адреси, понекогаш, кога дебагирање код.
>> Сега во меѓувреме, оваа програма тука поправки, се разбира,
тој проблем со споредување овие две жици.
Но, ние се стрча во еден друг проблем.
Ова беше од копија програма последен пат,
при што, јас се обидував да профитираат само првиот карактер во низа.
Но, што е симптом видовме последен пат кога
корисникот внесе во вредност, како Gabe со мали букви, за с,
тогаш ние доделен s во т, како и во третиот ред таму,
а потоа се обидов да профитираат т заградата 0?
Што беше ефектот на менување т заградата 0 овде?
>> ПУБЛИКАТА: Тоа се промени е.
>> Дејвид Џ MALAN: Да, Ја променив с, како и.
Затоа што она што е навистина се случува?
Па, дозволете ми да видам дали можам да се чисти до оваа слика, како што следи.
>> Ако е, пак, зборот г, a, b, e, обратна коса црта, 0, а s
ние ќе продолжиме цртеж како кутија тука, но не повеќе адреси.
Ајде да престанеме да ги правиме работите.
Ајде да нацрта слика поедноставување на светот.
>> Кога јас т прогласи со низа т, што создава дека парче од меморијата.
Плоштад се случува да биде 32 битови во повеќето компјутери.
Всушност, ако некогаш сте слушнале за компјутер има 32-битна архитектура,
навистина фенси-зборувам, дека само значи дека го користи 32-битна адреси.
И како технички настрана, Ако некогаш сте се запрашале
зошто постари компјутери, ако навистина се обиде да ги супа со многу RAM меморија,
само би можеле да имаат максимално од четири гигабајти RAM меморија,
и тоа е затоа што, буквално, вашиот стар компјутер може само
се смета како високо како 4 милијарди долари, 4 милијарди бајти,
бидејќи тоа беше користење на 32-битна броеви за адреси.
>> Но, во секој случај, во овој пример, приказната е многу поедноставно.
t е само уште еден покажувач, или навистина знак ѕвезда, ака стринг.
И како сакам да ја ажурирате оваа слика сега со тоа втора линија на кодот,
по точка, точка, точка?
Кога правам низа т еднаква на точка-запирка, како не се промени оваа слика?
Да?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Да.
Токму така.
Јас само се стави стрела од т поле, за да на истата адреса,
исто првата буква во дал.
Или технички, ако овој човек се 'уште се на 0x1,
тоа е како да сум имал 0x1 0x1 тука и тука.
Но, повторно, кој се грижи за адреси?
Тоа е само идејата дека сега е важно.
Значи ова е она што се случува тука.
Па се разбира, ако го направите Т заграда 0, кое е низа нотација,
на course-- и искрено, тоа изгледа како има низа овде,
но сега има ова чудно нешто.
Знаат дека програмскиот јазик, Ц, ви нуди оваа функција,
при што, дури и ако t е покажувач, или s е покажувач,
сеуште можете да го користите дека познато, удобно квадратни заграда
нотација да одат на првиот елемент, или на вториот елемент, или било кој елемент
дека тоа стрелката е да се покажува да, бидејќи, веројатно, тоа
е, како во овој случај, покажувајќи кон некои низа.
>> Така како ние да го надминете овој?
Искрено, ова е местото каде што доби малку преголема на прв поглед.
Но, тука е нова и подобрена верзија.
>> Значи прво, јас сум добивање на ослободи од библиотеката CS50,
само да се изложуваат дека е навистина на знак ѕвезда, само синоним.
И t е исто така знак ѕвезда.
Но, она што се случува во десната страна на таа линија
каде што t е доделен на вредност?
>> Што е Примерок?
Она што е strlen?
Што е sizeof (знак)?
Зошто е грижам прави ова линија изглед толку сложен?
Што го прави тоа на високо ниво?
Што е тоа чување во т?
Да?
ПУБЛИКАТА: Тоа е доделување на одредена количина на меморија.
Тоа е за чување, претпоставувам, писма [Беззвучен].
>> Дејвид Џ MALAN: Совршена.
Совршена.
Тоа е доделување на одреден износот на мемориски простор
за чување, веројатно, во иднина писма.
А особено Примерок Затоа се враќа што?
>> ПУБЛИКАТА: Враќање на [Беззвучен]?
Дејвид Џ MALAN: Токму така.
Враќање на адресата на таа меморија, , која е фенси начин да се каже,
се враќа на адреса на првиот бајт од таа меморија.
Обврска е на мене да се сеќавам колку меморија Јас всушност
наменети или побарано Примерок за.
>> Сега колку е тоа?
Па, и покрај тоа што е многу загради тука,
Примерок зема само еден аргумент.
И јас сум специфицирање strlen на ОК, па им даде мене како многу бајти како што постојат во с,
но да додадете еден.
Зошто?
Да?
>> Публика: 0 обратна коса црта.
Дејвид Џ MALAN: Токму така.
Ние го добивме да се направи малку домаќинство.
Па затоа има обратна коса црта 0, подобро е да се запамети дека.
Во спротивно, ние ќе да се создаде низа која
не дека имаат посебни терминатор.
>> Во меѓувреме, само за да биде супер анален, јас sizeof (знак) имаат,
само во случај некој работи ми код не на CS50 апаратот,
но можеби друг компјутер целосно каде карактери
се еден бајт, од конвенцијата, но две бајти, или нешто поголемо од тоа.
Тоа е само за да биде супер, супер Аверс да грешки.
Иако, во реалноста, тоа е најверојатно ќе биде 1.
>> Сега, пак, одам напред и да ја копирате стринг, т заградата јас еднаква на т заградата е.
И јас ќе се одложи на минатата недела изворен код за да види што се случува.
Но клучот готова брза и Причина јас го кодот сега во зелено,
е затоа што многу последната линија, т заградата 0 еднаква toupper,
има ефект на Капитализиране кој стринг?
t и / или s?
Дека последната линија на код.
>> Само T, бидејќи она што е се случи ова време,
ако јас малку го вратите тој последен чекор, што се случи е, кога ќе се јавам Примерок,
Јас во суштина се добие парче од меморијата која е иста големина како и оригиналот,
затоа што тоа е аритметичка го направив.
Јас сум чување во т адреса на тоа парче од меморијата.
Иако ова изгледа убаво и убава, убаво и празно,
реалноста е тука е, она што ние ќе ги повикуваат, ѓубре вредности тука.
Дека парче на меморијата би можело многу и се користат пред,
неколку секунди, пред неколку минути.
Па таму би можело да биде апсолутно броеви или писма таму, само случајно.
Но тие не се валидни, се додека не себеси се доверат ова парче на меморија
со вистински знаци, како што стори во таа за телефонска линија таму.
Во ред?
>> Па сега, кулминација на овие три примери
кои беа навидум скршени последен пат, оваа swap пример, оваа функција
работел во смисла дека тоа заменети a и b.
Но тоа не работи во она што другите смисла?
Да?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Токму така.
Ако јас да се јавите на оваа функција од another-- на пример,
од функција како главен, во која I имаат променлива, x и y, како што
минатата недела, истиот код, и јас помине во x и y
да се разменуваат, а потоа побарајте Swap-- ова, се разбира, е правиот верзија
е она што ние сме за да see-- тоа не работи.
Значи она што е лек?
>> , Па така само за да бидат јасно, дозволете ми да оди напред
and-- ми даде една секунда тука, и види ако можам да ви го покаже последната, која
ќе биде in-- да видиме дали можам да најдам оваа реална fast-- ред, [Беззвучен].
Добро, таму е.
Значи игнорира команди Јас сум само пишување.
Сакам да пристапат последен момент пример
од последниот пат, кој сега се нарекува нема Swap.
>> Па нема Трампа е местото каде што што застанавте последен пат,
при што, јас се иницијализира x 1 и y до 2.
Јас тогаш јавете се разменуваат, поминува во 1 и 2.
А потоа оваа функција работел во некоја смисла,
но тоа немаше постојана ефект на x и y.
Значи, прашањето на дофат на раката е, како сега ние всушност го надминете овој проблем?
Што е решение во рака?
>> Па, во swap.c, кој е нов и денес, забележите неколку разлики.
x и y се исти.
Но, она што е јасно различни за линија 25?
Што е ново таму, ако се сеќавате она што изгледаше како пред една секунда?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Да.
Па ampersands се нова фигура на синтаксата не само во оваа програма,
но исто така и генерално во CS50.
До денес, јас не мислам дека видовме примери
или навистина разговаравме за нив на било кој детали, освен, можеби, превентивно
во дел, симболот вака.
Па, излегува симболот е еден на последната парчиња нови синтакса
ние си оди за да се научат.
Сето тоа значи е адреса на некои променлива.
На која адреса е x во живо?
Но, она што се адреса у живо?
Бидејќи ако Основниот проблем, пред
беше дека x и y се што се пренесува како копии, она што навистина сакате да го направите
е обезбеди Трампа со како богатство мапа која води до местото каде што x и y, всушност,
се во RAM меморија, така што Swap може да се следи таа мапа
и да одат каде x или y го означува место и промена на вистинските вредности 1 и 2
таму.
>> Па Трампа треба да се промени малку премногу.
На прв поглед, ова може да чини малку слични на знак ѕвезда.
И навистина е.
Па е покажувач кон тоа каков тип на податоци, врз основа на овој истакнат дел?
Па тоа е int.
>> Па веќе не е int, тоа е адресата на некоја int.
И слично, б сега оди да биде на адресата на int.
Значи, кога јас сега го нарекуваат Трампа од Мајна, Јас не одам за да даде Трампа 1 и 2.
Одам да го даде како Вол-нешто и Волот-нешто,
две адреси кои ќе доведат Swap нивните вистински локации
во меморијата на компјутерот ми е.
>> Па сега, мојата останатите имплементација треба да се промени тад.
Што е очигледно различни сега во овие три линии на код?
Има тие проклети ѕвезди сите насекаде, во ред?
Значи она што се случува овде?
Да?
>> ПУБЛИКАТА: Тоа е очигледно [Беззвучен].
>> Дејвид Џ MALAN: Токму така.
Така што во овој context-- и тоа не беше најдобар дизајн одлука, очигледно,
пред неколку години.
Во овој контекст, каде што едноставно мора ѕвезда,
и немате тип на податоци, како int, веднаш кон лево,
наместо да имаат еднаков знак, јасно, во овој контекст, кога ќе се каже ѕвезда на,
тоа значи дека се оди на адреса, кој е во.
Следете ги богатство карта, така да се каже.
>> А во меѓувреме, во согласност 37, тоа значи дека истото.
Одат на адреса на, и го стави она таму?
Што и да е на локација која б одредува.
Со други зборови, одете на б.
Се добие таа вредност.
Оди на и, според еднакви потпише, задачата на операторот,
стави таа вредност таму.
>> Слично на тоа, int температура е само int.
Ништо не треба да се промени за Темп.
Тоа е само резервни стакло од Annenberg за малку млеко или сок од портокал.
Но, јас не треба да се каже, одете на б.
Оди до таа дестинација и стави вредност во temp таму.
Значи она што се случува тогаш?
Кога јас всушност повик трампа овој пат, ако оваа прва послужавник тука претставува Главно,
оваа втората лента претставува Трампа, кога Поминувам симболот x и y симболот
Од главниот на трампа, само за да бидат јасни, што е ова магацинот рамка примање?
Да?
>> ПУБЛИКАТА: [Беззвучен].
Дејвид Џ MALAN: Токму така.
Адресата на x и адресата на y.
И можете да мислам на овие како на поштенските адреси.
33 Оксфорд Стрит и 35 Оксфорд Стрит, и ќе
сакаат да се движат на две згради кои се во тие локации.
>> Тоа е вид на смешно идеја, но тоа е сè што ние подразбираме под адреса.
Каде во светот може да ќе најдете овие два ints?
Каде во светот може да ви најдете овие две згради?
Значи, ако конечно, по сето ова време јас одат во денешното изворниот код и ги собира
Swap и да ја стартувате ./swap, конечно, за прв пат ние всушност да се види дека
моите вредности имаат навистина се заменети успешно.
И сега, ние дури и може да потрае забелешка на ова во, да речеме, gdb.
>> Значи, дозволете ми да одат во иста датотека.
Дозволете ми да оди напред и да ја стартувате gdb на ./swap.
И сега, во Трампа, јас ќе одам да се оди напред и постави брејк во главниот.
И сега ќе одам да се оди напред и да ја стартувате програмата.
И сега гледаме мојот код застана на таа линија.
>> Ако одам напред и печатење x, она што треба да се види тука?
Тоа е прашање.
Кажам повторно?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Значи случајни броеви, можеби.
Можеби и јас ќе имаат среќа, а тоа е убав и едноставен, како 0.
Но, можеби тоа е некој случаен број.
Во овој случај, среќата ми се насмевна.
Тоа едноставно се случува да биде 0.
Но, тоа е навистина среќа, бидејќи не додека не
тип следната, а потоа печати x вели дека линија код, линија 19, бил погубен.
>> Во меѓувреме, ако сум тип следната повторно, и сега испечатите y, јас ќе одам да се види 2.
Сега, ако сум тип следната, тоа се случува да се добие малку збунувачки, бидејќи сега,
на printf се случува да се појави на на екранот, како што тоа го правеше. x е 1.
>> Да го направиме тоа повторно.
А сега, еве каде работите се интересни.
Пред да се јавите Трампа или дури и чекор во неа, да потрае малку ѕиркаат.
x е, повторно, 1.
Y е, се разбира, брзо разумност провери, 2, не е толку тешко таму.
Но она што е симболот X?
Одговор, тоа е вид на фанки гледа.
Но int ѕвезда во загради е само начин на велејќи дека ова БДП е на адреса.
Тоа не е int, тоа е покажувач на int, или на друг начин познат како адреса.
>> Што е ова лудо нешто?
Ние никогаш не сум видел нешто како овие.
Значи ова е адресата во мојот компјутер меморија каде x се случува да се живее.
Тоа е Волот-нешто.
И ова е, искрено, зошто Сум почнаа да повлекуваат стрели,
наместо броеви, бидејќи кој навистина се грижи
дека вашата int е во одредена адреса, кој е толку голем.
Но bffff0c4, тие се сите навистина хексадецимални цифри,
кои се од 0 до f.
>> Значи ние не се случува да се живее премногу долг на она што тие нешта се.
Но, ако јас испечатите y, се разбира, гледам 2.
Но, симболот y, гледам оваа адреса.
И известување, за љубопитни, колку далеку сме x и y?
Можете да се игнорира повеќето од адресата.
Четири бајти.
И тоа е во согласност со нашите порано тврдат дека колку е голема е int?
Четири бајти.
Така што изгледа како сè е поставата до убаво, како што може да се надеваат дека, во меморијата.
>> Па сега, ајде да брзо напред до крајот на оваа приказна.
Ајде да одиме напред и да внесете чекор, да се нурне во Трампа функција.
Сега забележите, ако јас внесете, тоа е идентична со адреса на x.
Ако сум тип б, тоа е идентична на адресата на y.
Значи она што треба да се види дали сум велат, одете на адреса на?
Па печати ѕвезда на.
Па ѕвезда значи одиме таму, во овој контекст.
Симболот значи она што е на адреса на.
Така глуми средство 1.
И печатење ѕвезда б ми дава 2.
>> И дозволете ми да се претпостави, во моментот, дека барем на код кој
продолжува да се изврши сега може да биде образложени преку тој начин.
Но, ние ќе го ревидира оваа идеја пред долго.
Па оваа верзија на Трампа е сега точно и овозможува
ни да се разменуваат со овој конкретен тип на податок.
>> Па било какви прашања тогаш Трампа?
На ѕвезда?
На адресата на?
И ќе се види, со Проблемот поставени 4, на некој начин,
но проблемот поставени 5, дефинитивно, како овие работите се корисни и да добијат многу повеќе
удобно со нив, како резултат.
Нешто воопшто?
Во ред.
Па Примерок е, пак, оваа функција дека само доделува меморија, меморија
распределба.
И зошто е ова корисно?
Па, сето ова време, сте биле со Примерок.
Ако сметате сега како getString дела, веројатно, тоа е
се прашува некој за еден дел од меморија, во секое време корисникот видови низа
во, бидејќи ние сигурно не знам, како CS50 персонал,
колкав оние жици дека луѓето се случува да напишеш може да биде.
>> Значи, да, за прв пат, почнуваат да се кора назад како CS50 библиотека дела,
по пат на неколку примери што ќе не води таму.
Значи, ако јас се отвори gedit и ќе отвори scanf 0,
ние сме случува да се види на следниов код.
Scanf 0, достапни на веб за Денес, има релативно неколку линии на код
тука, 14 преку 20.
И да видиме што тоа го прави.
Изјавува еден int, наречени Х.
Тоа кажува нешто како, број ве молам.
И сега се вели, scanf% i, и х.
Значи има еден куп на нови работи таму.
>> Но scanf, можете вид на може да се мисли на како спротивност на printf.
printf, се разбира, отпечатоци на екранот.
scanf вид на скенови од корисникот тастатура нешто што тој или таа има отчукува.
>> % I е исто како printf.
Ова значи очекуваме корисникот да напишеш еден int.
И сега, зошто мислиш дека може да се поминува scanf & X?
Ако целта во животот на scanf е да се добие нешто од корисникот,
она што е значењето на поминува, и x, сега?
Да?
>> ПУБЛИКАТА: [Беззвучен].
Дејвид Џ MALAN: Токму така.
Што и да, човекот, тип во, мојата влез се случува да се спаси на тоа место.
Тоа не е доволно, да се потсетиме, само помине во x, бидејќи видовме веќе,
секој пат кога ќе помине само суровини променлива, како int, на некои други функции,
Секако, тоа може да го промени тоа променлива, но не засекогаш.
Тоа не може да има ефект на Main.
Тоа само може да ги промени своите сопствени локална копија.
Но, ако, наместо тоа, ти не ми даде вистински int,
но ми даде насоки за дека int, јас сега, се scanf,
сигурно, јас може да се следи дека решавање и стави голем број таму
па имате пристап до него, како и.
>> Па кога ќе ја извршите оваа програма, ајде да видиме.
Направи scanf 0 точка коса црта, scanf 0.
И ако јас сега напишете број како 50, благодарение на 50.
Ако јас сега напишете број како негативни 1, за негативно 1.
Јас сега напишете број како 1,5, НВ.
Зошто мојата програма ме игнорираат?
Па, затоа што, едноставно, му реков тоа да се очекува само int.
Во ред.
Па тоа е една верзија на ова.
Ајде да се работи до еден степен и предложи дека тоа не е добро.
И тука лежи еден многу едноставен пример за тоа како ние може да почнат да пишување код
дека другите луѓе може да го експлоатира или компромис со тоа лоши работи.
Па линија 16, па слични во духот пред,
но јас не сум прогласување int тоа време.
Јас сум прогласување знак ѕвезда, ака стринг.
>> Но, она што не значи дека навистина?
Значи, ако јас не наведете address-- и Јас сум нарекувајќи произволно, тампон,
но јас може да се нарече тоа е, да се биде simple-- а потоа јас го направите ова, објасни ми,
ако може, врз основа на претходно логика, она што се прави во согласност scanf 18,
ако помине% s и тампон, која е адресата?
Што е scanf, ако се применуваат на точно истата логика како верзија 0,
ќе се обидат да го направите тука, кога корисникот видови нешто во?
Да?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Токму така.
Scanf, логиката порано, се случува да се земе на низа
дека човечкиот внесе in-- тоа е сега стринг,
тоа не е број, веројатно, ако тој или таа cooperates--
и тоа се случува да се обидат да се стави дека низа во меморијата на она адреса
тампон одредува.
И ова е голема, бидејќи тампон навистина треба да претставува адреса.
>> Но тврдам оваа програма е кабриолет во Многу сериозен начин, затоа што она што вредност е
тампон стандардно?
Што сум се иницијализира во?
Што парче на меморија?
Јас не имаат, нели?
>> Па иако сум распределуваат знак ѕвезда, која веќе не се вика с,
тоа е наместо вика, па buffer-- ајде да привлече името на променливата
сега како buffer-- ако не сум наречен getString или Примерок тука,
што ефективно значи дека тампон е само некои ѓубре вредност.
>> Сега што значи тоа?
Тоа значи дека имам кажано scanf да се очекува низа од корисникот.
И знаете што?
Без оглед на тоа нешто е да се покажува to-- и јас се подготви прашалник,
но во реалноста, тоа се случува да биде нешто како Ox1, 2, 3, нели?
Тоа е некој лажен вредност која само се случува да биде таму од порано.
Па стави на друг начин, тоа е како да тампон е само
укажувајќи на нешто во меморијата.
Јас немам идеја што.
>> Значи, ако сум тип во Габе сега, тоа се случува да се обидат да се стави г-а-б-е / 0 таму.
Но кој знае што е тоа?
И во минатото, било време се обидовме да се допре
меморија која не припаѓа за нас, што се случи?
Или речиси во секое време.
Сегментација на вина, нели?
>> Оваа стрела, јас немам идеја каде тоа е посочувајќи. тоа е само некои случајни вредност.
И, се разбира, ако се толкуваат случаен вредност како адреса,
ви се случува да одат на некои случајни дестинација.
Па Габе навистина може да се сруши мојата програма во овој случај.
>> Така што можеме да го направите тоа е речиси толку лоша?
Сметаат дека оваа трета и конечна пример на scanf.
Оваа верзија е подобра во која смисла?
Ако сте удобно со претходниот проблем, ова е подобро.
Зошто?
>> ПУБЛИКАТА: [Беззвучен].
Дејвид Џ 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.
Сега, очигледно, нема тело до неа.
И во Всушност, ако јас ги лизгање, јас не, всушност,
види било имплементации на овие функции.
Како разумност проверка, зошто е тоа така?
>> ПУБЛИКАТА: [Беззвучен].
Дејвид Џ MALAN: Да.
Значи ова е хедер датотека.
И насловот датотеки содржи прототипови, плус некои други нешта, се чини,
како typedefs.
Но, во CS50.c, кој го никогаш не сте дадена целосно,
но е во CS50 апаратот сите овој пат, длабоко во своите папки,
забележите дека има цела куп на функции тука.
>> Всушност, ајде да дојдете долу.
Ајде да го игнорира повеќето од нив, за сега.
Но, движете надолу за да getInt и да видиме како getInt работи.
Па тука е getInt.
И ако некогаш навистина се грижи како да се int работи, тука е неговата документација.
А меѓу работите вели дека е тоа ви кажува
што се движи на вредности може да се врати.
Тоа е во основа негативни 2 милијарди на позитивни 2 милијарди, дава или зема.
>> И излегува, сето ова време, иако ние никогаш не сум
се да се провери за тоа, ако нешто тргне наопаку,
излегува дека сите овој пат, getInt има
се враќаат посебен константна, не нула,
туку int_max, што е конвенција само програмерот.
Тоа значи тука е посебна вредност.
Бидете сигурни да се провери за ова, само во случај нешто тргне наопаку.
Но, ние никогаш не сум пречи со тоа до денес,
бидејќи повторно, овој е со цел да се поедностави.
>> Но, како getInt се спроведува?
Па, еден, тоа трае без аргументи.
Ние знаеме дека.
Го враќа int.
Ние знаеме дека.
Па, како тоа функционира под хаубата?
>> Па таму е очигледно бесконечен јамка, барем на изглед на една.
Забележете дека ние сме со користење getString.
Па тоа е интересно. getInt ги повикува нашите сопствени функција, getString.
И сега, зошто може ова да биде случај?
Зошто сум се дефанзивна тука во линија 165?
Што може да се случи во согласност 164, само за да биде јасно?
Тоа е истиот одговор како порано.
Само може да биде надвор од меморија.
Нешто тргне наопаку со getString, ние мора да бидат способни да се справи со тоа.
И не ми се врати нула е дека, технички, нула е покажувач.
getInt мора да се врати int.
Па јас произволно одлучи, во суштина,
дека 2 милијарди долари, или дава да потрае, се случува да биде посебна вредност што никогаш не може да
всушност од страна на корисникот.
Тоа е само една вредност Одам да губите да ја претставува код за грешка.
>> Па сега, работите се малку фенси.
И тоа не е сосема иста функција како и досега, но тоа е многу сличен.
Значи забележите, изјавувам тука, во согласност 172, и двете на int n и знак c.
И тогаш јас го користам оваа фанки линија, sscanf, кој излегува
не скенира низа од тастатурата.
Таа стои на постоечка стринг корисникот веќе чука со.
Па јас веќе се нарекува getString, која значи имам низа во меморијата.
sscanf е она што би нарекуваат парсирање функција.
Тоа изгледа на низа сум внеле во, карактер по карактер,
и не нешто корисно.
Кои се чуваат во низа линија.
И знам дека само со одење се врати тука и велат, ох, во ред,
Јас го нарече не е тоа време, но линија.
>> А сега ова е малку поинаква.
Но ова ефективно значи, од причини ние на некој начин ќе се бранува нашите раце и денес,
што се проверка на види дали на корисникот внесе во
и int, а можеби и друг карактер.
Ако корисникот внесе во int, тоа е ќе треба да се чуваат во N, бидејќи јас сум
поминува ова со адреса, нов трик што видовме денес.
Ако корисникот, исто така, ја внеле во како 123x, дека x
се случува да се заокружи со писмо карактер в.
>> Сега излегува дека sscanf ќе ми каже, интелигентно,
колку променливи беше sscanf успешно може да се пополни.
Значи со таа логика, ако функцијата Јас сум спроведување е getInt,
но јас сум проверка, потенцијално, за на корисникот
да се внесе во int проследено со нешто друго,
Што сакам sscanf на повратната вредност навистина да биде?
Ако целта е да се добие само int од корисникот?
>> Значи, ако sscanf враќа 2, што значи тоа?
На корисникот внесе во нешто како, буквално,
123x, што е само глупости.
Тоа е некоја грешка, и Сакам да се провери за тоа.
>> Значи, ако на корисникот видови во ова, од страна на оваа логика, она што го прави sscanf врати,
ќе каже?
Па затоа се случува да се врати 2, затоа што 123 ќе одат во тука,
и x се случува да се заокружи тука.
Но, јас не сакате х да се полнат.
Сакам да sscanf само да се успее во пополнување прв од ваков променливи.
И така тоа е причината зошто јас сакаат sscanf да се врати 1.
>> И ако ова е малку над главата за момент, тоа е сосема во ред.
Реализира сепак, дека една од вредности на getInt и getString
е дека ние сме прави подлец на многу грешка проверка вака така
дека, до денес, можете да доста внесете нешто во вашата тастатура,
и ние ќе го фатат.
И ние секако, персонал, ќе дефинитивно не
да биде извор на грешка во вашиот програмата, бидејќи ние сме одбраната
проверка за сите глупави работи кои на корисникот може да го направи,
како пишување стринг, кога навистина сакаше int.
Значи за now-- ќе дојдеме назад во оваа пред long--
но сето ова време, getString и getInt имаат
е под хауба со користење на овој Основната идеја на адресите на меморија.
>> Па сега, ајде да се направат нештата малку повеќе user-friendly.
Како што може да се сети од Binky последен time-- ако мојот глушец ќе cooperate-- така
имавме оваа код, што искрено, е прилично бесмислен.
Овој код се постигнува ништо корисно, но тоа беше примерот
дека професорот Parlante се користи со цел да се претставуваат
она што се случува во програма вклучува меморија.
>> Значи, да ја раскажам оваа Приказната супер кратко.
Овие првите две линии, во Англиски, го направи она, ќе ти кажам?
Само во разумно човечки, но малку технички термини, земе прободе.
ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Добро, ти си за основање адреси за вашиот x и y варијабли.
Не сосема, бидејќи x и y не се променливи во традиционална смисла.
x и y се адресите или ќе ги чува адреса.
Па ајде да се обидеме ова уште еднаш.
Не е лош почеток, иако.
Да?
>> ПУБЛИКАТА: [Беззвучен].
Дејвид Џ MALAN: Добро.
Мислам дека тоа е малку почист.
Прогласување два покажувачи, два цели броја.
И ние сме ги повикувам x и y.
Или ако ние требаше да се подготви ова како на сликата, повторно,
потсетиме сосема едноставно дека сите ние сме прави со првата линија
е цртеж кутија како оваа, со некои ѓубре вредност во него,
и нарекувајќи x, и потоа друго поле како овој,
со некои ѓубре вредност во него, нарекувајќи y.
Ние сме прогласени за две совети кои на крајот
ќе ги чува адресата на некоја int.
Па тоа е сите таму.
>> Па кога Binky направи ова, глина изгледаше вака.
И Ник само вид на заврши на стрели,
како да не се покажува секаде особено, затоа што тие се само
ѓубре вредности.
Тие не се експлицитно иницијализира насекаде, а особено.
>> Сега следната линија на код, да се потсетиме, беше тоа.
Значи во разумно пријателски за корисниците, но некако технички англиски јазик,
што е оваа линија на код се прави?
Да?
>> ПУБЛИКАТА: [Беззвучен].
>> Дејвид Џ MALAN: Совршена.
Тоа е распределба на парче на меморија која е со големина на int.
И тоа е половина од одговорот.
Одговоривте право половина на изразување.
Што се случува на левата страна на знак за еднаквост?
Да?
ПУБЛИКАТА: И доделува до променлива x?
>> Дејвид Џ MALAN: И доделува до променлива x.
Значи да повториме, десната страна Доделува доволно меморија за складирање на int.
Но Примерок посебно враќа адреса
на тоа парче од меморијата, кои сте само предложени добива чуваат во х.
>> Па што Ник минатата време со Binky е тој влече дека покажувачот надвор, глина,
да се истакне сега во бело парче на меморија дека е еднаква на големината на int.
И навистина, тоа е со цел да претставуваат четири бајти.
>> Сега, на следната линија на кодот го направи ова, ѕвезда x добива 42.
Па 42 е јасна на десната страна, значењето на животот.
Лева страна, ѕвезда x значи што?
Дека не би можеле да имаат gone-- тоа е во ред.
Во ред.
>> ПУБЛИКАТА: Во основа, одете на [Беззвучен]
Дејвид Џ MALAN: Добро.
ПУБЛИКАТА: [Беззвучен].
Дејвид Џ MALAN: Токму така.
Левата страна значи одат во х.
x е адреса.
Тоа е како 33 Оксфорд Стрит, или Ox1.
И ѕвезда x значи оди на тоа решавање и го стави она таму?
42.
>> Па навистина, тоа е токму она Ник не.
Тој започна со од страна, во суштина, ментално
покажувајќи со прстот во x, следниве стрелката
на белата кутија на десната страна страна, и ставање на број 42 таму.
Но, потоа работите доби малку опасна, нели?
Binky е за да се изгуби главата.
>> Ѕвезда y еднаква на 13, лоша среќа, значи што?
Па ѕвезда y средства одат на адреса во y.
Но, она што е адресата во y?
Добро, тоа е ѓубре вредност, нели?
Јас го привлече како знак прашалник.
Ник го привлече како завиткан стрела.
И веднаш штом ќе се обидат да направи ѕвезда y, велејќи дека се оди таму,
но не е легитимен адреса, тоа е некој лажен локација,
на програмата ќе се сруши.
И главата Binky е случува да летаат надвор овде, како го направив тоа.
>> Па на крајот, оваа програма беше само рамни надвор пукнатина.
Тоа беше кабриолет програма.
И тоа треба да се поправи.
И единствениот начин, навистина, за да го поправам ќе биде, на пример, оваа линија,
кои ние дури и не се стигне до, бидејќи на програмата се урна прерано.
Но ако ние требаше да го надминете овој, што ефект не прави y еднаков х имаат?
Па, тоа во суштина укажува на y што вредност е да се покажува на х.
>> Па во приказната Ник, или приказна Binky, и двете
x и y се покажува на бело парче од меморијата,
така што, конечно, кога ќе се го глуми у еднаква на 13 повторно,
ќе заврши ставање во 13 соодветната локација.
Значи сите овие линии се совршено легитимни, освен овој,
кога тоа се случило пред да всушност y доделен некоја вредност.
>> Сега за среќа, не го стори треба да се причина со сите
на овие видови на прашања на своја.
Дозволете ми да оди напред и да се отвори до терминален прозорец тука
и се отвори, за само еден миг, супер кратка програма што
, исто така, е вид на бесмислени.
Тоа е грда.
Тоа не се постигне нешто корисно.
Но, тоа не се покаже прашања меморија, па ајде да ги разгледаме.
>> Главната, супер едноставен.
Тоа очигледно повикува функција, f, а потоа се враќа 0.
Тоа е вид на тешко да се плеткаме ова.
Па Главно е прилично добар, досега.
>> Значи f е проблематична.
И едноставно не се стави многу напор во тоа именување
тука, за да се задржи фокусот на кодот.
ѓ има две линии.
И ајде да видиме што сега се случува.
Значи од една страна here-- и дозволете ми да го направи
ова во согласност со претходните example-- од една страна,
на левата страна е прави, на англиски јазик?
Тоа is--
ПУБЛИКАТА: Креирање на покажувачот.
Дејвид Џ MALAN: Креирање на покажувачот на int и нарекувајќи го х.
Така што е создавање на една од оние кутии Продолжувам да цртате на екранот на допир.
И сега, на десната страна страна, Примерок, се разбира,
наменува парче на меморија.
И само за да бидат јасни, како колку меморија е очигледно
распределба, ако само вид направете математика тука?
>> Така што е 40 бајти.
И знам дека само затоа што знам на int, на CS50 апаратот, во најмала рака,
е четири бајти.
Значи 10 пати 4 е 40.
Значи ова е чување на х, адресата на првиот од 40 ints дека
се распределени простор назад, да се врати, да се врати, да се врати.
>> И тоа е она што е клучот за Примерок.
Тоа не презема со малку меморија тука, малку тука, малку тука.
Тоа ви дава една парче на меморија, contiguously, од оперативниот
систем.
>> Сега, она што за ова, x заградата 10 е еднакво на 0?
Произволни линија код.
Тоа не се постигне нешто корисно.
Но, тоа е интересно, бидејќи x заградата 10--?
Да?
>> ПУБЛИКАТА: [Беззвучен]?
>> Дејвид Џ MALAN: x заграда 10 не мора да биде нула.
Нула детали само доаѓа во игра со стрингови, на крајот од стрингот.
Но и добра мисла.
>> Колкава е оваа низа, дури и иако сум доделени 40 бајти?
Тоа е од 0 до девет, нели?
Тоа е 10 ints, вкупно.
40 бајти, но 10 ints, индексирани од 0 до 0.
>> Па што е тоа што x заградата 10?
Тоа е, всушност, некои непознат ѓубре вредност.
Тоа е меморија која не припаѓа на мене.
Јас не треба да се допираат, кој бајт број 41, 42, 43, 44.
Одам малку предалеку.
>> И, навистина, ако јас ја извршите оваа програма, тоа многу добро може да се сруши.
Но, понекогаш, ќе добиете среќа.
И така само за да се покаже this-- и искрено,
никогаш не знаеш пред да се it-- ајде да ја извршите оваа.
Тоа всушност не несреќата.
>> Но, ако јас се промени тоа, за пример, да биде како 1000,
да се направи ова навистина намерно, ајде да видиме
ако може да се добие таа да се сруши тоа време.
Добро, тоа не несреќата.
Како за 100.000?
Ајде да се преобразиме, и сега повторување.
Во ред.
Phew.
Во ред.
Значи очигледно, повторно, овие сегменти на меморија, така да се каже,
се разумно голема, така што можеме ќе имаат среќа повторно и повторно.
Но на крајот, откако ќе добиете смешно и навистина одат далеку на екранот,
те допрам меморија која, навистина, навистина не му припаѓа на вас.
>> Но, искрено, овие видови на грешки се случува
да биде потешко и потешко да дознаам за своја.
Но, за среќа, како програмери, ние имаме алатки кои ни овозможуваат да го стори тоа за нас.
Значи ова е, можеби, еден на најгрдото програми,
дури и погрда од излез gdb е.
Но секогаш има линија или две, кои се супер корисни.
>> Valgrind е програма која ви помага не debug програма, само по себе,
но се најде меморија поврзани со проблеми, конкретно.
Тој автоматски ќе се кандидира на вашиот код за вас и со нетрпение за најмалку две работи.
Еден, не ќе се направи нешто случајно како допир меморија
кои не припаѓаат на вас?
Тоа ќе ви помогне да најдете овие случаи.
>> И второ, тоа ќе ви помогне ќе најдете нешто што се нарекува
меморија протекување, која имаме целосно игнорирани, наивно,
за некое време и блажено.
Но, се покажа, сите овој пат, кога
сте се нарекува getString во толку многу од нашите програми,
ги повикуваш на оперативниот систем за меморија,
но имате било какви сеќавање на постојано давајќи
назад, прави unalloc, или бесплатно, како што се вика.
Не, бидејќи ние никогаш не сум побара да го стори тоа.
>> Но, сето ова време, програмите сте биле пишување во C
се протекување меморија, поставување на оперативниот
систем за повеќе меморија за жици и какво ли не,
но никогаш не ја делат назад.
А сега ова е малку на симплификација,
но ако некогаш сте се кандидира на вашиот Mac или вашиот компјутер за некое време, отворање
многу програми, можеби затворање програми,
и иако вашиот компјутер не се урна,
тоа е добивање на толку многу побавно, како да тоа е навистина
со користење на многу меморија или ресурси, иако,
ако не сте дури и допирање на тастатура,
кои би можеле да be-- но не можев always-- да биде дека сте водење програми
самите имаат меморија протекување.
И тие го чуваат бара од оперативниот систем за повеќе и повеќе меморија, но заборавајќи за тоа,
всушност не го користите, но Затоа земајќи меморија далеку
од други програми кои би можеле да го сакаат тоа.
Па тоа е заеднички објаснување.
Сега тука е местото каде Valgrind на Излезот е целосно
крволочен на оние помалку и поудобно слично.
Но интересен работи е во право тука.
Тоа е ми кажуваше невалиден запишување на големина четири случува во оваа програма,
особено, во линија 21 од memory.c.
>> Ако одам во линија 21, НВ, има навистина не е валиден запишување на големината четири.
Зошто големина четири?
Па, ова number-- и може да биде anything-- е int.
Така што е четири бајти.
Па јас сум ставање четири бајти каде што не припаѓам.
Тоа е она што Valgrind е, всушност, ми кажуваше.
Покрај тоа, исто така ќе кажи ми, како што ќе видиме,
како да го извршите ова во иднина pset, ако и кога сте протекоа меморија, која навистина
Имам, бидејќи јас сум се нарекува Примерок, но јас не се всушност
вика, во овој случај, слободна, кои на крајот ќе види
е спротивно на Примерок.
>> Па сега, мислам дека конечната пример.
Така што ова е малку повеќе таинствениот, но тоа е можеби
најголемата причина за да се биде внимателен со меморијата,
и од причина што многу програми и / или веб-сервери, дури и до денешен ден,
се преземени од страна на лошите момци некаде на интернет, кои се на некој начин
испраќање на лажни пакети на вашиот сервер обидувајќи се да компромис вашата сметки,
или ги вашите податоци, или само генерално преземе машина.
Buffer overflow, како сугерира името, значи
преполнети не е int, но тампон.
И тампон е само стилизиран начин на велејќи дека тоа е еден куп на меморија.
>> И навистина, се јавив низа пред тампон, наместо на.
Бидејќи ако тоа е тампон, како во смисла на YouTube,
или било кое време гледате видео, Можеби сте виделе зборот визуелниот,
точка, точка, точка.
Тоа е неверојатно досадни.
И тоа само значи дека дека вашиот видео плеер
се обидува да го симнете многу на бајти, многу бајти
од видео од интернет.
Но тоа е бавен, па се обидува да го симнете еден куп од нив
за да се пополни пуфер, сад, така што имате доволно бајти дека може тогаш
ви го покаже видео, без откажеш постојано.
Но, се покажа, можете да имаат тампон на оваа голема.
Но, обидете се да се стави ова многу податоци во , и многу лоши работи може да се случи.
Така на пример, ајде да погледнеме оваа последна закачка на пример.
Ова е уште една програма кои, на прв поглед,
не прави ништо супер корисни.
Тоа доби Основната функција која повикува таа функција, ѓ.
И таа функција, f, тука, има на знак низа, наречен C, на големина 12.
И тогаш тоа е со користење на овој нова функција наречена strncpy.
>> Излегува дека, со овој едноставен, едноставна линија код, само две линии,
што сме го направиле целата мојата програма, и затоа, целиот мој компјутер,
и мојата корисничка сметка, и мојот хард вози ранлива на секој
кој знае и е доволно добра да се кандидира оваа програма со одреден командната линија
аргумент.
Со други зборови, ако тоа лошо момче става во внатрешноста на argvargv [1] со внесување на
на тастатура многу специјално стокмено стринг, не abc, 123, но во суштина,
бинарни симболи кои претставуваат извршна кодот, програма со која тој или таа го напиша,
со оваа едноставна програма, која е претставник на илјадници програми
кои се слично ранливи, daresay, тој или таа може конечно да ги избришете сите
датотеки на мојот хард диск, да добијат трепка брзо, така што тој или таа може да
тип команди за свој, е-маил на сите датотеки за себе.
Нешто што можам да направам, тој или таа може да се направи со овој законик.
>> Ние не сосема ќе се реши овој уште.
И всушност, тоа се случува да вклучат малку слика
вака, која наскоро ќе се да се разбере сите на подобро.
Но, за денес, да се стави крај на што е, се надевам, малку повеќе
разбирливо XKCD шега, додека не се продолжи следниот пат.
Во ред.
Ќе видите во средата.
>> [Музички]
>> Говорник: И сега, длабоко мисли, од Daven Farnham.
Меморија е како скокање во купот на златни листови во недела попладне.
Ветер, исфрлила hair-- ох, јас го пропушти дена when--
>> [Смеа]