[Мусиц плаиинг] Давид Ј. Малан: У реду. Ово је ЦС50. И ово је почетак седмице 5. И као што сте можда приметили, неки од материјала постаје мало више комплекс, мали гушћа. И то је врло лако, нарочито ако сте били у навику за неко време, да покушава да записала највише ништа што радимо, говоримо на часу. Али схватите, то није можда идеално педагошки приступ учењу ову врсту материјала, и материјал уопште. Па ми смо задовољни да најављују да ЦС50 сопствену Гхенг Гонг је почела да се припреми канонска скуп нота за курс, нада а то је да, један, ови не само да служе као Референтни и ресурс за разматрање материјала и иде назад кроз материјал који можда има Побегли сте први пут, али је такође, тако да ваши главе могу бити горе него доле, када га дође време да лекције, тако да ћете можда ангажовати више замишљено, као насупрот више сцриббли. Уз то је рекао, оно што ћете наћи на сајт је таквих докумената као и овај. И обавештење, у горњем левом углу, ту је не само садржај, али и време кодови који Одмах ће вас скочити са одговарајућим делом у видео онлине. И оно што је урадио овде Чанг је, у суштини, документоване шта се десило у овом Посебно предавање. И многи од предавања су Већ сада онлине са овим УРЛ. И ми ћемо наставити да објавите остатак оних до краја ове недеље, тако да искористе тај ресурс. Дакле, без даљег одлагања, смо почели да ољуштити Назад слој који је био стринг за неко време. И шта смо рекли низ заправо је прошле недеље? Тако цхар звезда. И цхар звезда, добро, шта је то заправо значи? Па, све ово време, ако смо је позивање функција, попут гетСтринг, и складиштења тзв повратак Вредност гетСтринг у вариабле-- се зове С Тип стринг-- смо писање линија кода тамо горе. И то је само кад видим мој рукопис величати овде уради сам схватио колико је ово грозан. Међутим, хајде да претпоставимо да, са десне стране је, ипак, разуман опис шта је траје све ово време са гетСтринг. гетСтринг, наравно, добија низ. Али, шта то заиста значи? То значи да добија комад меморија из оперативног система позивањем функцију, под називом маллоц. Али више о томе касније. И онда се попуњава да комад меморије са словима корисник има унесе, затим, наравно, нулл карактер, или обрнута коса црта нула на самом крају. У међувремену, на левој страни ове приче, све ово време, смо декларисање променљиве, као што с. А то је променљива шта сад ће почети називајући показивач. То није кутија унутар којих ставимо стринг, Давен, по себи, већ смо ставили у том тргу на левој шта? Да? ПУБЛИКА: адреса где је налази у меморији. Давид Ј. Малан: Тачно. Адреса где Давен се налази у меморији. А не тамо где сви Давен налази, по себи, али конкретно адреса чега? Да? Публика: Први карактер. Давид Ј. Малан: Први знак у Давен, што у овом случају, Предложио сам био произвољно и нереално 1, ОКС1, што само значи хексадецимални број 1. Али то вероватно иде да буде много већи број да бисмо могли извући са 0к као префикс, представља хексадецимални карактер. И зато што не треба да знамо где је остатак ликовима Давен су, због онога што једноставан дизајн одлука која је донета пре много година? Да? Публика: Бацксласх 0. Давид Ј. Малан: Да, управо тако. Бацксласх 0 вам омогућава, иако у линеарно време, да пролазе кроз жицу, хода са лева на десно, са за петље, или време петља, или нешто слично да, и одредити, ох, овде је крај овом стринг. Тако је и са само адресу на почетак низа, можемо приступити целину то, јер све то време, стринг је управо био знак звезда. Тако да свакако је у реду да се настави са коришћењем ЦС50 библиотека и то апстракција, да тако кажем, али ми ћемо почињемо да видимо тачно Шта се дешава испод целог тог времена. Тако да се сећате овај пример, такође, од прошлог пута, упоредите 0, који није у ствари поредити. Али смо почели да решимо ово. Али, као што можда Сокови, могу ли заинтересовати некога у розе слона данас, Такође је од Цханг? Како је са тобом испред? [Неразумљиво]. Дођи горе. А у међувремену, као што сте дошли до, хајдемо размислите на тренутак шта Овај код је заправо ради. То је проглашавајући две варијабле горе врх, С и Т, и називајући гетСтринг. Ово није врло разумљив програм, јер не ти рећи шта да радиш. Али хајде да претпоставимо да смо фокусирајући се на сочне делу. И онда радимо, ако се с једнако једнако т, треба рећи принтф, сте укуцали исто. Здраво. Како се зовеш? Јанелле: Јанелле. Давид Ј. Малан: Јанелле, Драго ми је да сам вас упознао. Дакле, ваш изазов на рука за слона је да се прво нацртати слику о томе шта је су представљени у онима прва два линије. Тако с и т може бити представља начин на екрану? А ви само да га нацртам прст на том великом екрану. Тако да су два полувремена у Свака страна те једначине. Тако да ова на левој страни, а онда гетСтринг на десној страни. А ту је и Т на левој страни, а затим гетСтринг на десној страни. Па како бисмо могли почети цртање слику која представља оно што се дешава овде у меморији, би ти рекао? И пусти ме да те објасним шта радите као идете. Јанелле: У реду. Па, прво, то би се питате да добијете улазни низ. И то би сторе-- Ох, извините. Давид Ј. Малан: У реду. Добро. И то се зове то? Ох, у реду. Настави. Нисам хтео да прекидам. Јанелле: Жао ми је. Тако да би га у улаз адреса није од-- сигуран. Ја не могу да се сетим тачно броја, али ја верујем да је почевши од 0. Давид Ј. Малан: То је све у реду, јер сам бројеве горе, тако да нема правог одговора. Јанелле: Полазећи од 0 луком. Давид Ј. Малан: ОК, елемент 0. Наравно. Јанелле: А онда ако је као само две леттер-- Давид Ј. Малан: У реду, назад на вас. Јанелле: Па елемент 0, и онда елемент 1 или 2 елемент. Давид Ј. Малан: А који део слика црташ сада? Позив на гетСтринг? Односно проглашење с? Јанелле: Декларација од С, верујем. Ох, гетСтринг, јер би то се уноси у сваки [? Ареа. ?] Давид Ј. Малан: Добро. Тачно. Иако је ово ефикасно враћа низ, подсетимо, кад се вратимо низ, можемо индекс у тој стринг коришћењем 01 и 2. Технички, ово су вероватно представља по појединим адресама, али то је у реду. Претпостављам, ако могу само брз проследи где смо стали последњи пут, ако је један од жице је био г Б Е, бацксласх 0, чиме представља Габе је улаз, како да заступамо а сада? Ако је ово сећање да је враћено од гетСтринг? Јанелле: Да ли би било заступа лука? Давид Ј. Малан: Од лука? Па, не. Рецимо само, сликовито, пусти ме само напред и предлажу да, ако је то с, ово је повратак вредност гетСтринг. А ви сте нацртана ово као 0, 1, 2, која је савршено разумно, јер смо ми може индекс у стринг, као што су. Али само да буде у складу са последњи пут, пусти ме само напред и произвољно предлажу да ова је адреса 1, ово је адреса 2, ово је адреса 3, и тако даље. И тако, само да буде супер јасно шта се дешава да иду у С, као резултат тога Прва линија кода, би ти рекао? Јанелле: Адреса 1? Давид Ј. Малан: Тачно. Тако адреса 0к1. А у међувремену, пусти ме само напред и дупликат много од онога што сте урадили и додајте свој Т овде. Да сам да куцате у Габе Опет, други пут, када то буде затражено са гетСтринг, где је, наравно, Габе отићи? Па, пресумабли-- Јанелле: Као овде? Давид Ј. Малан: Да. Јанелле: Или то је такође у истим кутијама? Давид Ј. Малан: Пусти ме предлаже, да, тачно, тако да у овим додатним кутијама. Али оно што је кључно је то да, чак и иако сам извући ово прилично близу заједно-- 0к1, ово је 0к2-- у стварности, Ово сада може бити и број 0к10, на пример, и 0к11, и 0к12, и тако даље. И тако, ако је то случај, шта ће се завршити овде у Т? Јанелле: 0к10? Давид Ј. Малан: Тачно. Тако 0к10. И тако сада, последње питање. Сте, далеко, морали да раде најтеже слона до сада. До сада, ако повуците код опет, када радим, у реду три, ако с једнака једнака Т, шта сам ја заправо поређењем да смо овде извући? Јанелле: Два адресе? Давид Ј. Малан: Тачно. Тако да кажем је С једнак једнака т? Другим речима, је 1 једнак једнак 10? И наравно, Очигледан одговор је сада, нема. Па је овај програм на крају ће да штампа шта, да сте рекли? Јанелле: Да ли би било, сте укуцали исто? Давид Ј. Малан: Па ако с је 1, а т је 10? Јанелле: откуцали сте различите ствари. Давид Ј. Малан: Тачно. Откуцали сте различите ствари. У реду. Па аплауз, Ако смо могли, овде. [АППЛАУСЕ] То је било болно. Знам. Лепо урађено. Тако сада да видимо ако не можемо теасе осим што је поправити. И, наравно, када смо фиксне ово-- које сам сада ћу представљати у греен-- смо пар побољшања овде. Прво, само као разум провери, ја прво проверавам ако с једнако нула и т једнако нулл. И само да буде јасно, када ће С или Т бити нула у коду овако? Када ће с или т бити нулл. Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Уколико стринг да је корисник откуцан је сувише дугачак да стане у меморију, или неки чудно Цорнер случај тако, гетСтринг, као што ћемо видети, буквално Данас, у својој документацији, каже да ће се вратити као нулл посебан Сентинел вредност, или само нека врста посебне симбол то значи да нешто није у реду. Дакле, желимо да проверите да, јер се испоставило да је нулл је врло опасна вредност. Често, ако покушате да урадите нешто са нулл укључује фунцтион-- полагања испита као улаз за инстанце-- ту функцију Можда ће се срушити и веома, са њим, скинути цео програм. Дакле, ово трећа линија сада је само здрав разум проверити, провера грешке, ако хоћете. То је добра навика сада да уђу у било ком тренутку да покушајте да користите вредност која би, потенцијално, бити нулл. Сада, овде у четвртом реду, "Ако стрцмп (с, т)," Па, шта је то односи? Па, рекли смо да је ово веома језгровито именован функција за гудачки поређења. И његова сврха у животу је да се упореде први аргумент против њега друго, али не у смислу њихове адресе, као што смо урадили ненамерно тренутак Пре са црвеним кодом, али је уместо да поредим те две Жице у људски интуитиван начин упоређујући то, против тога, против тога, против тога, и затим заустављање ако и када се или оба прсте хитс косе црте 0. Значи неко иеарс аго спроводи стрцмп да спроведе за нас функционалности да смо се надали бисмо стекли за само поређењем две једноставне вредности. Сад искрено, стално цртеж свих ових различитих бројева. Али, реалност је, ја сам што ови горе све време. Па пусти ме само напред и написаћу ових препрека да направи тачку која, на крају дана и креће напред, нећемо стварно да брине о које се бави ствари су заиста у меморији. Дакле, ја не идем да се скрене ово врсте бројева толико више, Ја сам само апстрактна ово далеко мало више пријатељски са само стрелама. Другим речима, ако је с је показивач, Па, хајде да то драв, буквално, као показивач, стрелица показује од себе на нешто друго, и не брините превише много више о Минутиа од ових адреса што, опет, ја сам свеједно. Али видећемо те адресе, Понекад, када отклањање грешака код. Сада у међувремену, овај програм овде поправке, наравно, да проблем упоређивањем Те две жице. Али смо наишли на још један проблем. То је из копије програмирати последњи пут, чиме сам покушавао да капитализује само први знак у низу. Али оно што је симптом видели смо Последњи пут када корисник откуцан у вредности, као што Габе малим словима, за С, онда додељен С у Т, као у трећем реду тамо, а онда сам покушао да капитализује т брацкет 0? Какав је био ефекат мења т носач 0 овде? ПУБЛИКА: То је променило с. Давид Ј. Малан: Да, Променио сам с, као добро. Јер оно што се заправо дешава? Па, да видим да ли могу да чистим уп овој слици, као што следи. Ако је с је, опет, реч г, А, Б, Е, обрнута коса црта, 0, и С ћемо наставити цртеж као кутија овде, али не више адресе. Хајде немој да измишљаш. Хајде да нацртате слику да поједноставе свет. Када сам изјављујем Т са гудачки Т, то ствара ту меморију. Квадрат се дешава да се 32 бита у већини рачунара. У ствари, ако сте икада чули Рачунар има 32-битну архитектуру, Заиста Фанци-говори, да је само значи да користи 32-битне адресе. И као технички страну, Ако сте се икада запитали Зашто старији рачунари, ако заиста је покушао да их супа са много РАМ, могла само максимум четири гигабајта РАМ, па то је зато што, буквално, старог рачунара могао само рачунају чак 4 милијарди, 4 милијарде бајтова, јер је то био користите 32-битни бројеви за адресе. Али у сваком случају, у овом пример, прича много једноставније. т је само још један показивач, или Заиста цхар звезда, звани стринг. И како желим да ажурирате ову слику Сада са тим другом реду кода, после тачке, тачка, тачка? Када радим стринг Т једнако с запету, како ова слика промени? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Да. Тачно. Управо сам ставио стрелу из Т кутија на истој адреси, исто прво слово у дао. Или технички, ако је то момак је још увек на 0к1, то је као да сам имао 0к1 0к1 овде и овде. Али опет, ко мари о адресама? То је само идеја да сада битно. Дакле, то је оно што се овде дешава. Па наравно, ако не т брацкет 0, што је низ нотација, од цоурсе-- и искрено, изгледа као да је низ овде, али сада постоји ова чудна ствар. Знамо да је програмски језик, Ц, нуди ову функцију, при чему, чак и ако т је Поинтер, или с је показивач, још увек можете искористити познато, удобан Скуаре Брацкет нотација да иду у првом елементу, или други елемент, или било који елемент да је показивач указује у јер, вероватно, то је, као у овом случају, указујући на некој низ. Па како ћемо поправити ово? Искрено, ово је место где је добила мало неодољив на први поглед. Али овде је нова и побољшана верзија. Дакле, прво, ја добијам ослободити од ЦС50 библиотеке, само да изложи да с је заиста цхар звезда, само синоним. И Т је такође знак звезда. Али оно што се дешава на десна страна од те линије где је т додељена вредност? Шта је маллоц? О чему је стрлен? Шта је сизеоф (цхар)? Зашто дођавола то ради Линија изгледају тако сложена? Шта ради на високом нивоу? Шта га складиштење у Т? Да? ПУБЛИКА: То је расподелу одређена количина меморије простора. То је за складиштење, претпостављам, Писма [неразумљиво]. Давид Ј. Малан: Савршено. Савршено. То је додељивање извесна количина меморије за складиштење, по свој прилици, будућа писма. А посебно, маллоц стога враћа шта? ПУБЛИКА: Враћање [неразумљиво]? Давид Ј. Малан: Тачно. Враћању адресу тог сећања, што је фенси начин да се каже, враћа адресу Први бајт тог сећања. Терет је на мене да се сетим колико сам заправо меморије додељен или тражио маллоц за. Сада колико је то? Па, иако има много заграда одавде, маллоц узима само један аргумент. И ја прецизирајући стрлен од С, дај ми онолико бајтова колико има у С, али додајте једну. Зашто? Да? ПУБЛИКА: 0 обрнута коса црта. Давид Ј. Малан: Тачно. Морамо да урадимо мало Собарица. Због тога што постоји обрнута коса црта 0, боље да се сетим тога. У супротном, идемо да створи низ који нема ту посебну Терминатор. У међувремену, само да буде супер анал, имам сизеоф (цхар), само у случају да неко ради ми код не на ЦС50 апарата, али можда другом рачунару укупно где цхарс су један бајт, по обичају, али две бајтова, или нешто већи од тога. То је само да буде супер, супер аверзију грешака. Иако је, у стварности, то је највероватније ће бити 1. Сада, у међувремену, идем напред и копирање стринг, т носач сам једнако т конзоле с. И ја ћу одложити до прошле недеље је Соурце Цоде да види шта се дешава. Али кључ за понети, а Разлог због којег сам ставио код сада у зелено, је зато што веома последњег реда, Т носач 0 једнако тоуппер, има ефекат Цапитализинг што стринг? т и / или с? Та последња линија кода. Само Т, јер оно што је десило овај пут, ако сам нешто поништи тај последњи корак, ста је се десило, кад зовем маллоц, Ја у суштини добити комад меморије то је исте величине као оригинала, јер то је аритметичка сам. Ја складиштење у Т адресу те меморију. Иако је ово изгледа лепо и лепа, лепо и празно, реалност је да постоји, шта ћемо стално зове, вредности за смеће овде. То комад меморије може врло добро су раније коришћена, неколико секунди, пре неколико минута. Тако да апсолутно може бити број или словима, баш случајно. Али они нису валидни, док не ја попуните овај комад меморије са стварним карактера, као што сам учинити у то за петљу тамо. Све у реду? Тако да је сада, врхунац Ова три примера који су наизглед сломљен последњи пут, Овај Свап пример, ова функција радио у смислу да суаппед а и б. Али то није успело у ком другом смислу? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Ако бих да позовем ову функцију од анотхер-- на пример, из функције као главни, где Имам променљивог, Кс и И, као што сам прошле недеље, исти број, и ја проћи у к и и до Замени, а затим позовите Свап-- ово, наравно, је исправна верзија је оно што смо о томе да Југоисточна Европа није успело. Дакле, шта је поправити? Па, само да буде Цлеар, пусти ме само напред и-- дај једне секунде овде, и види ако могу да вам покажем последњи, који Биће у-- хајде да видим да ли могу наћи ово стварно фаст-- реду, [неразумљиво]. У реду, то је то. Тако игнорисати команде Само куцам. Желим да то преузме на ласт минуте пример од прошлог пута, која се сада зове бр Пребаци. Тако да нема Свап је где смо стали прошли пут, при чему сам инитиализед к на 1 и и до 2. Онда зовем Замени, пролази у 1 и 2. И онда ова функција радила у извесном смислу, али је имао стални ефекат на к и и. Па се поставља питање при руци је, како сада ми у ствари решили овај проблем? Шта је решење на дохват руке? Па, у свап.ц, који је нов и данас, приметити неколико разлика. Кс и И су исти. Али оно што је очигледно разликује линији 25? Шта је ново ту, ако се сећате како је изгледао пре другог? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Да. Тако да су амперсандс нови комад синтаксе, не само у овом програму, али уопште у ЦС50. До данас, не мислим Видели смо неке примере или стварно говорио о њима у било ком детаљ, осим, ​​можда, превентивно у одељку, амперсанд овако. Па, испоставило се да је један амперсанд од последњих комада нове синтаксе идемо да научимо. Све то значи да је адреса неке променљиве. У ком то адреса к живи? Али шта то адреса и живи? Јер ако Основни проблем пре је су се усвојен да Кс и И као копија, оно што заиста желимо да урадимо се обезбеди Замени са као благо карта која води до места где к и и заправо су у РАМ, тако да Свап може да прати ту мапу и идите где год к или и означава место и промените стварне вредности 1 и 2 тамо. Так своп треба да мало промени превише. И на први поглед, ово можда изгледа мало сличан цхар звезде. И заиста јесте. Тако да је показивач на који тип података, на основу овог истакнута делу? Тако да је Инт. Тако да више није инт, То је адреса једног Инт. И слично, б је сада иде да буде адреса инт. Дакле, када ја сада зовем Замени од главних, Нећу дати свап 1 и 2. Ја ћу да га дам као Ок-нешто и вола-нешто, две адресе које ће довести Свап својим стварним локацијама у меморији мог рачунара. Тако да сада, мој преостали имплементација мора да промени момак. Шта је очигледно другачије у ове три линије кода? Ту је те проклете звезд свуда, у реду? Дакле, шта се овде дешава? Да? ПУБЛИКА: Очигледно је [неразумљиво]. Давид Ј. Малан: Тачно. Дакле, у овом цонтект-- а то није било најбољи дизајн одлука, додуше, пре много година. У овом контексту, где само имате звезду, а ви немате тип података, попут инт, одмах лево, уместо тога имате знак једнакости, јасно, у том контексту, када кажете звезда, то значи идите на адреса која је у. Пратите благо мапа, да тако кажем. А у међувремену, у реду 37, то значи исту ствар. Идите до обрати, а ставио шта тамо? Шта год да је у локација која б прецизира. Другим речима, идите на б. Гет ту вредност. Идите на и, по једнака потпише, оператор задатак, тамо ставио ту вредност. Слично томе, инт температура је само Инт. Не треба ништа да се промени по питању темп. То је само Резервно стакло од Анненберг неко млеко или сок од поморанџе. Али, морам да кажем, идите на б. Ићи на ту дестинацију и ставио вредност у Темп тамо. Па шта се онда дешава? Када сам заправо зовем Свап овај пут, ако је Овај први траи овде представља Маин, Ова друга касета представља Свап, када Пролазим Амперсанд Кс и И амперсанд од главног до Замени, само да буде јасно, шта је ово гомила оквир пријем? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Адреса Кс и И адреса. А можете мислити од ових попут поштанске адресе. 33 Окфорд Стреет и 35 Окфорд Стреет, а ви желите да преместите две зграде који су на тим локацијама. То је нека врста смешно идеје, али то је све што подразумевамо под адресу. Где у свету не може нађете та два Интс? Где у свету можете наћи оне две зграде? Дакле, ако на крају, после све ово време сам иду у данашњем изворни код и саставити Свап и Рун ./свап, коначно, за Први пут ми заправо видимо да моје вредности су заиста је успешно заменио. И сада, ми чак може да потраје НАПОМЕНА ове у, рецимо, ГДБ. Па пусти ме у исти фајл. Пусти ме само напред и покрените ГДБ од ./свап. И сада, у Свап, ја ћу да идем напред и подесите брејк у главној. А сада ћу да одем напред и покрените програм. А сада видимо мој код застао на тој линији. Ако сам само напред и штампање к, шта треба да видим овде? То је питање. Опет кажем? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тако случајних бројева, можда. Можда ми се посрећи, а то је Леп и једноставан, као и 0. Али можда је то нека случајни број. У овом случају, ја имам среће. То само слуцајно 0. Али то је заиста срећа, јер не док не типа Нект и потом Принт к има да линија кода, ред 19, извршена. У међувремену, ако сам типа Следеће опет, и Сада одштампати и, идем да видим 2. Сада, ако се следеће откуца, то ће бити мало збуњујуће, јер сада, иф ће на појавити екран, као што је учинио. к је 1. Хајде да поновимо ово. А сада, ево где је ствари постану интересантне. Пре него што сам зовем Замени или чак корак у њега, хајде да мало завирити. к је, опет, 1. И је, наравно, брзо Санити провери, 2, тако да није тешко тамо. Али оно што је амперсанд к? Одговор, некако је фанки гледа. Али инт звезда у заградама само БДП-а начин да се каже да је ово адреса. Није инт, то је показивач на инт, или на други начин познат као град. Шта је ово луда ствар? Никада нисмо видели нешто баш као и раније. Дакле, ово је адреса у мој компјутер је Меморија где к дешава да живи. То је Ок-нешто. И ово је, искрено, зашто Ја сам почео да цртање стреле, уместо бројева, јер ко није брига да је ваш инт је у посебан адреса која је то велика. Али бфффф0ц4, ово су све заиста цифре хексадецималном који су 0 кроз ф. Дакле, ми не идемо да превише задржавати дуго о томе шта су те ствари. Али ако ја штампате и, Наравно, видим 2. Али амперсанд и, видим ову адресу. И обавештење, за радознале, колико далеко су к и и? Можете да игноришете већину адресу. Четири бајта. И то је у складу са нашим Раније тврде да колики је инт? Четири бајта. Тако да изгледа као да је све постројавања лепо, као што можете да се надам, у меморији. Тако да сада, хајде да брзо напред до краја ове приче. Идемо напред и типа корак, да зароните у Свап функцију. Сада обратите пажњу, ако сам тип А, то је идентичан адресу к. Ако сам тип Б, то је идентично на адресу и. Па шта треба да видим да ли сам кажу, идите на адресу у? Па принт звезда. Па звезда значи тамо, у том контексту. Амперсанд значи оно што је адреса. Тако стар начине 1. И штампа звезда Б ми даје 2. И дозволите ми да претпоставимо, за тренутак, да бар код који наставља да сада изврши може бити образложење кроз тај начин. Али ми ћемо поново ову идеју пре дуго. Тако да ова верзија Свап је сада тачно и омогућава да замени овај тип података. Тако да било питања тада Свап? Он стар? На адреси? И видећете, са Проблем сет 4, на неки начин, али проблем сет 5, дефинитивно, како ове ствари су корисни и да много више удобан са њима, као резултат. Било шта? У реду. Дакле маллоц је, опет, ова функција да само издваја Меморија, меморијске алокација. А зашто је то корисно? Па, све ово време, сте користили маллоц. Ако сад како размотрити гетСтринг радова, по свој прилици, то је био неко тражећи комад Меморија, било када је корисник стринг у, јер ми сигурно није знао, као што ЦС50 особље, колики ти Стрингс да људи ће откуцате може бити. Па хајде да, по први пут, почиње да пилинг назад како су ЦС50 Библиотека радови, путем неколико примера која ће нас одвести тамо. Дакле, ако сам отворим гедит и отвори сцанф 0, ћемо видети следећи код. Сцанф 0, доступно на сајту за Данас, има релативно мало линија кода Овде, 14 до 20. И хајде да видимо шта ради. Прогласи инт, зове к. Она каже нешто као, број молим. А сада се каже, сцанф% И, & к. Тако да је гомила нових ствари тамо. Али сцанф можете некако мисли као о супротност принтф. принтф, наравно, штампа на екран. сцанф врста скенирања од корисника је тастатура нешто што он или она је откуцан. % И је баш као принтф. То значи да очекују корисник унели Инт. А сада, зашто ја мислим можда пролази сцанф & Кс? Ако је сврха у животу сцанф је да се нешто од корисника, шта је значење пролази то, и Кс, сада? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Шта год да сам, људско, укуцајте, мој улаз ће бити сачувана на тој локацији. То није довољно, подсетимо, само пасс ин к, јер смо већ видели, Сваки пут када прође само сирови променљиву, као инт, на неку другу функцију, Наравно, то може да промени променљива, али не и трајно. Не може имати утицај на главном. То само може да промени своју локалну копију. Али ако, уместо тога, ви не дај ми стварни ИНТ, али ми даје упутства да инт, сада, као сцанф, сигурно, могу пратити да обратити и ставите број тамо тако да имате приступ на њега као добро. Дакле, када сам покренути овај програм, да видимо. Направите сцанф 0 дот сласх сцанф 0. И ако сам сада унесите број као 50, хвала за 50. Ако сам сада унесите број као негативно 1, за негативно 1. Сада откуцајте број као 1,5, ХМ. Зашто је мој програм ме игноришеш? Па, зато што једноставно, сам рекао је очекивати само инт. У реду. Дакле, то је једна верзија ове. Хајде да ствари усек и предложити да то није добро. И овде лежи веома једноставан пример како можемо да почнемо писања кода да други људи могу да искористе и компромис тако што лоше ствари. Дакле линија 16, толико сличне у духу раније, али ја не прогласи да је инт овај пут. Ја проглашавајући га Чар звезду, звани стринг. Али, шта то заиста значи? Дакле, ако не наведете аддресс-- и Ја то зовем произвољно, тампон, али сам могао да зовем с, бити симпле-- и онда радим ово, објасните ми, ако можеш, на основу претходна логика, шта се ради у сцанф линији 18, ако пасс% с и бафер, што је адреса? Шта је сцанф, ако примените потпуно исти као логика версион 0, ће покушати да радим овде, када је типови корисник нешто? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Сцанф, по логици раније, ће да преузме низ да људски откуцано у-- сада је стринг, то није број, вероватно, ако он или она цооператес-- и да ће покушати да стави то стринг у меморији на адреси било буффер прецизира. И ово је супер, јер бафер заиста требало да буде адреса. Али ја тврдим Овај програм је луд у веома озбиљан начин, јер оно што вредност бафер подразумевано? Шта сам инитиализед у? Који комад меморије? Нисам, зар не? Па иако сам додељен Чар звезда која се не зове с, то уместо тога зове, тако буффер-- хајде да нацртате име променљиве сада као буффер-- ако нисам зове гетСтринг или маллоц овде, то практично значи да бафер је само нека вредност смеће. Дакле, шта то значи? То значи да сам рекао сцанф очекивати стринг од корисника. И знате шта? Шта год да ово указује да-- а ја скренем знак питања, али у стварности, то ће бити нешто као ОКС1, 2, 3, зар не? То је неки лажни вредности да само се дешава да се тамо од раније. Па пут на други начин, то је као да је само бафер указује на нешто у меморији. Немам појма шта. Дакле, ако куцам у Габе сада, то ће да покуша да стави Г-А-Б-Е / 0 тамо. Али ко зна шта је то? И у прошлости, било Време смо покушали на додир меморија која не припада за нас, шта се десило? Или скоро сваки пут. Сегментација кривица, зар не? Ова стрелица, немам појма где је показивање. то је само неки случајни вредност. И наравно, ако се тумачи Рандом вредност као адресу, идете да иде у неки случајни дестинација. Па Габе заиста може срушити мој програм у овом случају овде. Дакле, шта можемо да урадимо то је скоро као лош? Сматрамо да је ово трећи и Последњи пример сцанф. Ова верзија је боља у ком смислу? Ако сте задовољни претходни проблем, то је боље. Зашто? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Добро. Тако да је овај случај од линије 16 је боље, у смислу да смо ми експлицитно доделу мало меморије. Ми не користимо маллоц, ми користимо недеља 2 приступ само проглашења низ. И ми смо рекли пре тога низ је само низ знакова, Дакле, ово је потпуно легитиман. Али то је, наравно, као што сте приметили, фиксну величину, 16. Тако да је овај програм потпуно сигуран, ако откуцате у један знак жице, два карактера Стрингс, 15 знакова Стрингс. Али чим почнем куцање 16, 17, 18, 1.000 карактера жице, где је тај низ ће се завршити? То ће завршити делимично овде. Али онда ко зна шта још је изван граница на овом низа? То је као да имам прогласила 16 кутије овде. Дакле, уместо да извуче сав 16, ми ћемо Само се претварам да сам нацртана 16. Али ако сам тада покушати да прочитам стринг То је много дуже, као и 50 карактера, Идем да почну а, б, ц, д, к, и, з. И ово је вероватно неки други сегмент меморије то, опет, може да проузрокује мој програм да се сруши, јер нисам сам тражио нешто више од само 16 бајтова. Па кога је брига? Па, ево ЦС50 библиотека. А већина је ово само као упутства горе. ЦС50 библиотека, све ово време, има ову линију у ред 52. Ми смо видели типедеф, или видећете типедеф у псет 4, који је управо ствара синоним при чему цхар звездице може бити једноставно назива стринг. Тако да је ово један од Неколико точкови обуку смо тајно користили испод хаубе. У међувремену, ево функција, гетцхар. Сада очигледно, нема тела на њега. А у ствари, ако наставим скроловање, ја стварно не видим никакве имплементација од ових функција. Као проверу исправности, зашто је то тако? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Да. Дакле, ово је заглавље датотеке. И хеадер фајлови садрже прототипова, плус неке друге ствари, чини се, као типедефс. Али у ЦС50.ц, које смо Никада вам се намах, али је био у ЦС50 апарата све Овај пут, дубоко унутар својих фолдера, Приметићете да постоји читава Гомила функција овде. У ствари, хајде да идите доле. Хајде да игноришу већина њих, за сада. Али дођите до Затамњена и видети како функционише Тоноване. Дакле, овде је Тоноване. А ако сте икада заиста стало како се инт ради, овде је његова документација. А међу стварима каже се да си ти говори шта су распони вредности може да се врати. То је у суштини негативан 2 милијарде позитивној 2 милијарде, узми или остави. И испоставило се, све ово време, иако никада нисмо да ли сте за то проверите, ако нешто крене наопако, Испоставило се да су сви овај пут, Тонированние има се враћа посебан Цонстант, НОТ НУЛЛ, већ инт_мак, што је Само програмер је конвенција. Овде значи да је посебна вредност. Постарајте се да проверите за ово, само У случају да нешто крене наопако. Али никада нисмо сметало са тим до сада, јер је опет, то треба да поједностави. Али како се спроводи Тонированние? Па, један, он узима никакве аргументе. Ми знамо да. То враћа инт. Ми знамо да. Па како то ради испод хаубе? Тако да очигледно постоји бесконачан петља, барем изглед једног. Приметићете да користимо гетСтринг. Дакле, то је интересантно. Тоноване позива наше функције, гетСтринг. А сада зашто би ово могао бити случај? Зашто се од мене дефанзивна овде у линији 165? Оно што би се могло десити у реду 164, само да буде јасно? То је исти одговор као и раније. Можда само без меморије. Нешто крене наопако са гетСтринг, морамо да будемо у стању да обради то. А разлог не вратити нулл је да, технички, нулл је показивач. Тоноване мора врати инт. Па сам произвољно сам одлучио, у суштини, да је 2 милијарде, узми или остави, иде да буде посебну вредност која никад не могу да заправо добити од корисника. То је само једна вредност идем трошити да представља код грешке. Тако да сада, ствари се отмено. И то није баш иста функција као и раније, али је врло слична. Тако приметио, овде изјављујем, у складу 172, оба инт н и цхар ц. И онда ја користим ову фанки линију, ссцанф, што се испоставило не скенира стринг са тастатуре. Стоји постојећу стринг који Корисник је већ откуцан у. Па сам већ звао гетСтринг, што значи да имам стринг у меморији. ссцанф оно што смо позвати рашчлањивање функцију. Изгледа на стринг сам откуцан, знак по знак, и ради нешто корисно. То стринг се чувају у реду. И знам да само тако што ћете резервне копије овде и говорећи, Ох, ОК, Назвао сам га не е овај пут, али ред. А сада ово је мало другачија. Али То практично значи, из разлога ми ћемо нешто махати руке у данас, да смо проверу да види ако корисник унесе и инт а можда још један лик. Уколико корисник откуцан на инт, то је ће чувати у Н, јер сам пролази ово адреси, нови трик смо данас видели. Уколико корисник такође откуцан на сличан 123к, да је к ће се завршити писмо карактера ц. Сада се испоставља да ссцанф ће ми рећи, интелигентно, Колико варијабли ссцанф успешно моћи да попуни. Па овом логиком, ако функција Ја спровођење је Тонированние, али ја проверавам, потенцијално, за корисника да је откуцан у инт затим нешто друго, шта хоћу да ссцанф вредност повратак заиста да буде? Ако је сврха је да се само инт од корисника? Дакле, ако ссцанф повратка 2, шта то значи? Корисник откуцан у нешто као, буквално, 123к, што је само глупост. То је услов грешке, и Хоћу да проверим за то. Дакле, ако је корисник то се и овој логици, шта ссцанф врате, би ти рекао? Тако да ће да се врате 2, јер је 123 ће ићи овде, и х ће се завршити овде. Али ја не желим да се х испуњен. Желим да ссцанф само успех у пуњење први од својих варијабли. Па зато сам желе да се врате ссцанф 1. А ако је ово мало изнад главе за сада, то је потпуно у реду. Схватају ипак, да је један од вредности Тоноване и гетСтринг је да ми радимо сад ово од Много грешке провере овако тако да, до сада, можете прилично уписати ништа на тастатури, и ми ћемо га ухватити. И сигурно, особље, дефинитивно неће бити извор буг у вашем Програм, јер смо у одбрани смо проверу за све глупо ствари које корисник може урадити, као куцање стринг, када ви заиста желео инт. Дакле, за сада-- ћемо доћи Назад на ово пре лонг-- али све ово време, гетСтринг и Тоноване имају била испод хаубе користећи ову Основна идеја адреса меморије. Тако да сада, хајде да ствари мало више разумљив. Као што се сећате, од прошле Бинки тиме-- ако мој миш ће тако цооперате-- имали смо овог законика, који искрено, је прилично бесмислено. Овај код постиже ништа корисно, али је пример да је професор Парланте се користи у циљу представља шта се дешава у Програм укључује меморију. Па хајде да препричава ово Прича супер кратко. Ове прве две линије, у Енглески, шта ради, да кажеш? Само у разумно људско, али благо техничком смислу, узети нож. ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: ОК, ти си успостављање адресе за ваш Кс и и променљивих. Не баш, јер Кс и И нису променљиве у традиционалном смислу. Кс и И су адресе или ће чувати адресу. Па хајде да покушамо ово још једном. Није лоше за почетак, ипак. Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Добро. Мислим да је мало чистији. Проглашавајући два показиваче, два цела броја. И ми смо их зовете Кс и И. Или ако смо били да се скрене ово као слике, опет, подсетити једноставно да све ми радимо са тим прве линије је цртање кутију овако, са неким вредношћу смећа у њему, и називајући Кс, а затим још једна кутија овако, са неким вредношћу смећа у њему, називајући га год. Ми смо прогласила две показивачи који су на крају ће сачувати адресу неког Инт. Тако да је све ту. Дакле, када Бинки ово урадио, глине баш изгледао овако. И Ник некако обузети стреле, као да они не указујући нигде посебно, јер су си само вредности за смеће. Они не експлицитно иницијализовани било где у посебно. Сада следећа линија код, подсетимо, био је то. Дакле, у разумно разумљив, али донекле техничке Енглески, шта је ова линија кода ради? Да? ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Савршено. То је додељивање комад меморија која је величина једног Инт. А то је пола одговор. Сте одговорили право половина израза. Оно што се дешава на лева страна знака једнакости? Да? ПУБЛИКА: и додељује га на променљиве Кс? Давид Ј. Малан: и додељује га до променљиве к. Тако да РЕЦАП, десну страну определи довољно меморије за складиштење инт. Али конкретно маллоц враћа адресу те комад меморије, коју сте само предложио се складишти у к. Дакле, шта Ник прошли пут са Бинки вне он вукао ту показивач напоље, глина, сада указују на белу комад меморије која је једнака са величином инт. И заиста, то је значило да представља четири бајта. Сада, следећа линија кода ово урадио, звезда х добија 42. Па 42 је једноставна на десна страна, смисао живота. Леве стране, звезда к значи шта? И то можда има гоне-- то је у реду. У реду. ПУБЛИКА: У суштини, идите на [неразумљиво] Давид Ј. Малан: Добро. ПУБЛИКА: [неразумљиво]. Давид Ј. Малан: Тачно. Лева страна значи иду у к. к је адреса. То је као 33 Окфорд Стреет, или ОКС1. И звезда к значи ићи на ту адреса и ставио шта тамо? 42. Тако заиста, то је управо оно што Ник урадио. Почео је са Би, у суштини, ментално упире прстом у к, након стрелице на белом пољу са десне стране стране, и стављање број 42 тамо. Али онда се ствари мало опасно, зар не? Бинки ће ускоро да изгуби главу. Стар И једнако 13, лошу срећу, значи шта? Тако стар и средства иду на адресу у И. Али оно што је адреса у И? У реду, то је вредност смеће, зар не? Сам га нацртао као знаком питања. Ник га нацртао као увијен стрелице. И чим покушавате да имају звезде и, говорећи тамо, али не постоји легитиман адресу, то је неки лажни локација, Програм ће да се сруши. И Бинки глава иде да лети је овде, као што је учинио. Дакле, на крају, овај програм било само стан од мана. То је био луд програма. И то треба да се поправи. А једини начин, заиста, да се поправи би, на пример, ова линија, што нисмо чак ни да, због тога што Програм срушио прерано. Али, ако смо били да поправимо ово, оно Ефекат не радите и једнаке Кс имају? Па, у суштини указује на и год вредност к је показујући на. Дакле, у причи Ницкову, или прича Бинки, оба Кс и И су показујући на бели комад меморије, тако да је, на крају, када је вас Не стар и једнака 13 опет, можете завршити стављајући 13 у одговарајућу локацију. Дакле, све ове линије су савршено легитимно, осим овог, кад се то десило пред вама заправо и додељена неку вредност. Сада на срећу, ви не морају разуму кроз све ових врста питања на свом. Пусти ме само напред и отворите уп прозору терминала овде и отвори, само на тренутак, супер кратак програм који Такође је некако бесмислено. То је ружно. То не постигне ништа корисно. Али то не показују питања меморије, па хајде да погледамо. Главни, супер једноставан. То очигледно позива функцију, ф, а затим се враћа 0. То је врста тешко неред ово. Па Главни је прилично добро, сада. Па Ф је проблематично. И једноставно није ставио много труда у њега именовања овде, да задржи фокус на кода. Ф има две линије. И хајде да видимо шта се сада дешава. Дакле, с једне стране овде-- и пусти ме да То у складу са претходна екампле-- с једне стране, лева страна је радиш оно што, на енглеском? То је-- ПУБЛИКА: Креирање показивач. Давид Ј. Малан: Креирање показивач на инт и позивајући га к. Дакле, то је стварање једног од тих кутија Стално цртање на екрану осетљивом на додир. И сада, на десној сиде, маллоц, наравно, издваја комад меморије. И само да буде јасно, како много меморије је то очигледно додељивања, ако само врста урадите математику овде? Тако да је 40 бајтова. И знам да само зато што ја знам инт, на ЦС50 апарата, најмање је четири бајта. СО 10 пута 4 је 40. Дакле, ово је чување једно к, адреса првог од 40 интс да су додељени простор назад, да подрже, да подржи, на леђа. И то је оно што је кључ у вези маллоц. То не узети мало меморије овде, мало овде, мало овде. То вам даје један комад меморије, цонтигуоусли, из пословања систем. Шта је сад ово, к носач 10 једнако 0? Произвољно линија кода. То не постигне ништа корисно. Али је интересантно, јер к брацкет 10--? Да? ПУБЛИКА: [неразумљиво]? Давид Ј. Малан: к Брацкет 10 не мора да буде нула. Нулл детаљ долази само у игру са жице, на крају стринга. Али добар мисао. Колико је велика Овај низ, чак и иако сам издвојила 40 бајта? Је 0 до девет, зар не? То је 10 Интс, укупно. 40 бајтова, али 10 интс, индексирани 0 до 0. Дакле, шта је то к Брацкет 10? То је заправо нека Непозната вредност смеће. То је меморија која не припада мени. Не треба да додирују бите број 41, 42, 43, 44. Ја сам мало идем предалеко. И заиста, ако покренути ово Програм, можда врло добро срушити. Али понекад, ми ћемо имати среће. Па само да покаже ово-- и искрено, никад се не зна пред собом зашто-- хајде да ради ово. То није стварно срушити. Али, ако ја то промени, за пример, да буде као 1000, да се то заиста намерно, да видимо ако можемо да га срушити овај пут. У реду, то није срушити. Како око 100.000? Хајде да га римејк, а сада га реприза. У реду. Фуј. У реду. Дакле, очигледно, опет, ови сегменти меморије, да тако кажем, су прилично велики, тако да можемо посрећи опет и опет. Али на крају, када сте добили смешан и стварно иду далеко на екрану, додирнете меморију који заиста, Заиста не припада вама. Али искрено, ово врсте бубе иду да се све теже и теже да схватите сами. Али на срећу, као што програмери, имамо алата који нам омогућавају да се то уради за нас. Тако да је ово, можда, један од најружнијих програма, чак ружније него гдб је излаз. Али увек има линију или два која су супер корисни. Валгринд је програм који помаже не дебуг програм, по себи, али сматрају Мемори-Релатед проблеми, конкретно. Она ће се аутоматски покренути свој код за ви и тражити најмање две ствари. Један, да ли сте нешто Аццидентал попут тоуцх меморије које не припада теби? То ће вам помоћи да пронађете те случајеве. И два, то ће вам помоћи сте пронашли нешто што се зове мемори леакс, које имају потпуно игнорисали, наивно, за неко време и блажено. Али испоставило се, сви Овај пут, кад год сте звали гетСтринг у толико наших програма, ви питате радом систем за меморију, али ли се сећате од икада давања назад, ради уналлоц или слободан, како се зове. Не, јер никада нисмо тражио да то урадите. Али све ово време, програми сте писање у Ц су цури меморију, пита радом систем за све више и више меморије за гудаче и ситница, али га никада није предаје назад. А сада ово је мало од поједностављивања, али ако сте икада покренете свој Мац или рачунар за неко време, отварање много програма, Можда затварања програма, и иако ваш рачунар није пао, постаје толико много спорије, као да то стварно користи пуно меморије или ресурси, иако, ако нисте ни додирује тастатуру, да би бити-- али није ми увијек могао бити да програми бежиш су се меморије цурења. И они стално постављају ОС више и више меморије, али заборављајући о томе, заправо не да га користите, али Стога узимање меморије далеко из других програма који би то желели. Дакле, то је уобичајена објашњења. Ево где је Валгринд излаз је у потпуности Огромна онима мање и удобније подједнако. Али занимљива ствари је у праву овде. Је мене то говори неважеће пише о величина Четири дешава у овом програму, посебно, ред 21 мемори.ц. Ако одем у ред 21, ХМ, ту заиста је неважећи врите величине четири. Зашто величине четири? Па, то и то нумбер-- може бити све-- је Инт. Тако да је четири бајта. Тако да стављам четири бајта где не припадају. То је оно што Валгринд заправо ми говори. Поред тога, такође ће реците ми, као што ћемо видети, као што покренете ово у будућем псет, ако и кад си процурела меморије, што се Имам, јер сам звао маллоц, али ја немам стварно звао, у овом случају, бесплатно, коју на крају ћемо видети је супротно од маллоц. Тако да сада, ја мислим, коначну пример. Дакле, ово је мало више волшебни, али је можда то највећи разлог да будите опрезни са меморијом, и разлог да многи програми и / или веб сервера, чак и до данашњег дана, преузима лоших момака негде на интернету који су на неки начин слање лажних пакета на сервер покушава да компромитује рачуне, или узети податке, или само обично преузме машине. Буффер оверфлов, као име сугерише, средства преливање не и ИНТ, него и бафер. А бафер је само фенси начин каже да је то гомила меморије. И заиста, звао сам стринг пре тампон, уместо с. Јер ако је то тампон, као у ИоуТубе смислу, или у било које време да гледате видео, можда сте видели реч бафер, тачка, тачка, тачка. То је невероватно нервира. А то само значи да је ваш видео плејер покушава да преузмете много бајтова, много бајтова из видео са Интернета. Али то је споро, тако да се покушава да преузмете гомилу њих да попуни бафер, контејнер, тако да имате довољно бајтова да онда може показују вам видео, без застајања стално. Али испоставило се, можете имају бафер на ово велико. Али покушајте да ставим ово много података у га, и веома лоше ствари може да се деси. Тако на пример, хајде да погледамо Овај последњи теасер једног примера. То је други програм да, на први поглед, не ради ништа супер корисно. Има главну функцију који позива ту функцију, Ф. И да је функција, Ф, овде, има цхар низ, који се зове Ц, величине 12. И онда је то користи Нова функција зове стрнцпи. Испоставило се да, са овим једноставним, Једноставна линија кода, само две линије, направили смо мој цео програм, и стога, мој цео рачунар, и мој кориснички налог, и мој хард дриве потенцијално осетљиве на било кога ко зна и довољно добар да покрене Овај програм са одређеним командне линије аргумент. Другим речима, ако је ово лош момак ставља унутар аргваргв [1] куцајући на тастатури веома специјално израђен стринг, не АБЦ, 123, али у суштини, бинарни симболи који представљају извршна код, програм који је он или она написала, са овим једноставним програмом, који је представник хиљада програма који су на сличан начин угрожени, претпостављам, он или она на крају можете да избришете све датотеке на мој хард диск, добити трепери линију тако да он или она може типа команде на своју руку, емаил све фајлове за себе. Све што могу да урадим, да или она може да уради са овим кодом. Нећемо баш решити ово још. И, у ствари, то ће укључују мало слику овако, коју ћемо ускоро ћемо доћи да разуме све боље. Али данас, хајде да заврши на шта је, надамо се, нешто разумљиво КСКЦД шала, док ми настављамо следећи пут. У реду. Видимо се у среду. [Мусиц плаиинг] ПРЕДСЕДНИК: А сада, Дееп мисли, према Давен Фарнхам. Меморија је као скакање у гомилу Голден лишће у недељу поподне. Ветар дува, бацање ваше хаир-- Ох, недостаје ми дана вхен-- [СМЕХ]