[Музика свира] Давид Ј. Малан: Добро, ово је ЦС50 и то је почетак недеље пет. Тако данас, испод ваше место јастука, нећете наћи ништа. Али горе, требало би да пронађете ово, мали знак захвалност за сав посао који сте ставили Екипа од петнаест. Једноставно уклоните мали круг на дно да почне играјући за Остатак класе. Дакле подсетимо да, знам да је проблем или поставите четири, који је изашао овог викенда, укључује писање још једну утакмицу. Али овај пут то подразумева коришћење Стварни графички кориснички интерфејс, не текстуални интерфејс као Игра је била од петнаест. А игра која се налази испред вас, Ако још нисте видели овај следећи, изгледа мало овако. Ја ћу да одем у терминал прозор овде у ГДБ. И ја ћу ићи напред и покрените особље решење, којима можете приступити после покретања упдате 50 као и обично. Али, ја ћу да га ставите у мало тајна режим, мало ускршње јаје, такозвани Бог режим, по стављајући Бога у аргв1. И морам да пратим моје упутства, ради то у моје Проблем сет директоријум. Тако сада видите комплетну верзију у игри пробој. У ствари, то је но-руке режим. Дакле, то је заправо - одушевио иако сте можда - прилично тривијално да спроводи режим у Бога Бреакоут, за разлику од игре од петнаест, што неки од вас можда решавати за хакерске издање. У Бреакоут довољно у Бога Режим се једноставно уради шта, интуитивно са руцицама? Само нека буде једнак без обзира хоризонтални положај лопте. И тако све док не чините то пратиле цену уз лопта креће ова игра ће Никада, никада, никада пропустити лопту а ви ћете победити сваки пут. Али у хакерској овонедељном издању постоји више од Бога моду. Постоји велики број других карактеристика. Међу њима, ласери. Тако да, ако сте стварно нестрпљиви да добијете могу почети обарање цигле и неколико других. А за оне који би желели да калибрацију стандард у односу хацкер издање, видим да ове недеље је хакер је намерно издање мало више изводљиво, кажу, од Бога Режим је у игри од петнаест. Дакле, ако сте у потрази за истезање и сте у потрази за неке додатне забаве собе до роњење у ако интереса. Сада више практично, дозволите ми да од једне ствари као добро. ГДБ, што неки од вас можда још увек има дотакао лично, што је у реду. Али сада је стварно време да се навикнем да то и удобан са овим алатом јер то ће учинити ваш живот много лакше, заиста. По Роб је предавање о ГДБ пар недеља пре, сећам ГДБ да је за отклањање грешака. То је алат који вам омогућава да покренете свој Програм већ води корак по корак, линије по реду, тако да можете да око џаку, тако да видите ствари дешавају, тако које можете да одштампате вредности променљивих. Укратко, то вам даје много више снага од принтДеф ради. Сада додуше, интерфејс је прилично тајанствен. Црно-бели текстуални интерфејс за највећи део. Команде су донекле тешко да се сети на први поглед. Али, иако то може потрајати пола вас сат, сат, да је требало да унапред улагање времена у то, веруј ми. Свакако до краја семестра ће сачувати ви ред величине више време од тога. Дакле, рано у недељу ускочите И у погледу Бреакоут, знам да сте можете да урадите све док имате код дистрибуција или сопствени код у току у вашем Пст4 директоријуму. Знате да можете да покренете ГДБ / Бреакоут.. То ће отворити прозор овако. Дозволите ми да дам више на прозору терминала. И онда шта ћу да наставим и да, то није само га покренете. Ја ћу прво поставити Поинт Бреак Подсетимо, која вам омогућава да паузирате извршење на одређеном месту. Само да све буде једноставно идем да се пробије у само једној линији куцањем број један. Дозволите ми да у ствари поново отвори овај прозор јер то је све мала мала тамо. Па шта ћу сад да радим овде је ако отворим прозор терминала. Хајде, идемо тамо. Тако да сада ако се вратим у Дропбок, Пст4 и рун гдб. / пробоја ући, приметити Ја ћу да се пробије тај који је успоставио пауза тачка на линији један. А сада ћу да одем напред и тип воде. А када то урадим, приметио ништа Изгледа да се деси. Нема поп-уп. Нема графички кориснички интерфејс још. Али то је и разумљиво, јер сам буквално на линији један у мом програму. И приметио сам да сам брзо прослеђен, посебно сада на 62, јер све ствари на врху овог фајла је ствари као што су коментари и константи и незанимљив ствари за сада. Сада сам у магистралних, чини се, на линији 62. А ово је само дистрибуција код, опозив. Ако отворим ово горе што ћете, на сличан начин, у мој директоријум Поље за отпуштање у Пст4, у бреакоут.ц. И ако сам помицати доле и доле и доле, и дозволите ми да иде напред и укључите моји бројеви редова. Оно што ћете видети, ако идите доле до линија 62, је управо линија која сте паузирали смо на. Дакле, ова линија овде, 62, је где смо о томе да буде. Тако сада у ГДБ, ако ја идем напред и упишите сад следећи, унесите ће то извршава ту линију. И ето, ми имамо такозвани Г прозор. Ако се упознати са оним што ГВиндов је, да не брине. Спец ће вас упознати са тим, као и један број проход видеос уграђен у спец. Али сада хајде да ово мало интересантније. Да пређемо овај прозор преко са стране је мало. Дозволите ми да се прозор мало већи тако да могу да видим више. И сада пусти ме само напред и следеће урадити поново. А ту су и моји цигле. Ако се следеће откуца поново Сада видим лопту. И ако откуцате следећу поново Сада видим весло. И на сву срећу то није гедит стварно сарађују тако ми је показивао све што желим. Али сада, ако ја чинити опет, Следећи опет, ја сам само проглашава неке променљиве. И ја могу да одштампате било коју од ових момака. Принт цигле, графике живи. А сад ако наставим да радим Следећи, приметићете да ћу бити унутар те петље. Али, код ће се извршити баш као што ја очекујем. Дакле, када сам ударио ову функцију, Ваит Кликните за, то ће урадити буквално је. Тако ми се чинило да сам изгубио контролу преко програма. ГДБ није ми даје још један брз. Али, не брините. Иди на моју игру, кликните на дугме негде. И ето, сада прелази на линији 86. Па опет, то је од непроцењиве вредности, на крају, за отклањање грешака проблеме. Зато што буквално да прођете кроз ваш код, штампани ствари и много, много, више. Али за сада, они сами алати Требало би да вас прилично далеко. Дакле, ми смо, наравно, узимајући поглед на графици сада, одједанпут. И сада наш свет постаје мало занимљивији. И знате, можда, из неких онлајн видео да имамо ове гаћице које сте гледали као део проблема скупова. И они су пуцали, намерно, на белом позадином. А неки од њих имају наставу Стипендисти цртање неки текст о Екран који је обложио на страни њих. Али, наравно, то није све што Занимљиво у стварном свету. Ово је само слушаоница са Велики бели екран и позадина. И наш производни тим невероватна врста од чини све изгледа лепо након што се родност или облагање ништа ми или не желе. Сада само да мотивише ове недеље и Стварно, где можете ићи, на крају, у рачунарству. Не само после четири сет проблема. Али после другог курса или целе Наставни план и програм Невероватно је шта можете до ових дана, у смислу графика посебно. Неки од вас можда видели ово тече око мрежи. Али сам мислио да ћу вам показати, за само пар минута, увид у оно компјутерска технологија и шта ЦГИ, компјутерске графике може да уради ових дана са познатом песмом а можда и филм. [МУЗИКА - Лана Дел Раи, "Млади и лепи] СПИКЕР 1: То је само мало невероватно, можда, колико свеприсутан - [Апплаусе] СПИКЕР 1: Управо сам га преузети. Али, то је стварно невероватно, ја мислим, само како свеприсутна софтвера и број и алата као што то заиста јесу. Дакле, то је укус правцу у којима можете ићи. О, нема више Примена данас. Па, то је заиста трагично време с обзиром на тачку сам покушао да направи. У реду, па хајде да покрене Фусион поново. Подсети ме касније. Добро, и требало би да имају пошаљи као страну, ако би добили приметити тако. У реду, тако подсетити да је прошле недеље смо почели да одлепите ово касније познат као стринг. стринг подсећа типа података који је изјавио у ЦС50 библиотеци. И то је део обуке точкова да ће сада почети да полети. То је користан концепт рано. Али сада ће то још више занимљив и моћнији да заправо види да је испод хаубе, Стринг је управо оно, што је рекао? Да, па то је такозвани знак *. И тамо * означава да постоји нека адресу укључени. И тако, када кажете цхар * да мислим само на променљиве чији тип података Показивач сада. Чињеница да је звезда тамо само значи да сте се проглашава тзв показивач. И то показивач ће очигледно сачувате адресу, од Наравно, знак. Дакле, зашто се то смисла? Па, шта је ниска испод хаубе? Па, неко време смо говорили да ниска испод хаубе је Само х-е-л-л-о, на пример. Али, ми смо разговарали о томе како што, у суштини, низ. И низ би онда изгледа мало више овако, са сваком од ових заузима залогај. И тада смо рекли да постоји нешто посебно овде, бацксласх 0, или нулл терминатор. Дакле, све ово време, овај овде је ниска. Али стварно, стринг је заправо адреса. И адресе, као што ћемо видети, често префикс 0к конвенцијом. Шта 0к означавају? Да ли неко зна? Дакле, то само значи хексадецимални. Дакле, можда се сећате, у ствари, из ПСТ 1, верујем, један од загревања питања заправо питао хексадецималном поред бинарни и децимални. И овде је мотивација да са хексадецималном имате 16 цифара на располагању. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, затим од а, б, ц, д, е, ф. А ако се рачунају сви они горе, добијате укупно 16. Дакле, ово је у супротности са децимални, где имамо 10 цифара, 0 до девет. То је у супротности са бинарном где имамо само 0 и 1. Али на крају дана можете само представљају исте бројеве, али нешто другачије. И хексадецималном је уобичајено, јер као Испоставило се - па ћемо видети ово касније у току - чак и када се на веб програмирања у контексту ХТМЛ и бојама, хексадецималном је лепо. Јер свака цифра, испада, представља савршено четири бита. Дакле, то је само врста линија лепо горе као што ћемо видети на крају. Дакле, ово може да буде Ок123 или нешто тако, означава број 123 негде у мојој Меморија рачунара. Али, наравно, неки проблеми због тога основни имплементација. И сећам се да сам узео нож у спровођење функцију овако - сравни цртица 0 Дот ц прошле недеље, да иако је изгледало да је у праву, то једноставно није упореди тачно две жице. Ја сам бачен далеко главни, а ја сам бацио далеко коментара само да се усредсредимо на код који је од интереса овде. И то је у црвено јер је луд. Из ког разлога? Па, на врху тамо када сам објавио ниска, шта се заиста дешава испод хаубе? Па, пусти ме да се преко Екран и извући је. Тако сам изјавио, опет, Стринг с ГетСтринг. Дакле, ја ћу да наставим и сада скрене с за оно што заиста јесте. То ће бити овде квадрат. И ја ћу да тврдим да је то 32 бита. Барем то је обично, барем на ЦС50 апарата у много рачунара. Идем да га зову с. Али сада, сећам се да смо звао ГетСтринг. Дакле ГетСтринг враћа, Наравно, ниска. Ако корисник упише у х-е-л-л-о унесите ниска здраво добија вратио. И то ниска, као што смо управо рекли, завршава негде у меморији рачунара обрнуте косе са 0 на крају. Ја ћу извући ово као низа - или суседни блок карактера - да је то заправо. И сад, шта је ГетСтринг заправо враћају? Шта је ГетСтринг се враћају све ово време? Па, ми кажемо, у недељама пре, враћа ниску. Али, више технички, шта ГетСтринг повратак очигледно? ПУБЛИКА: адреса. СПИКЕР 1: адреса. Посебно се враћа адресу први залогај, шта год да је. Само наставите да користите један, два, три зато што је згодно. Она враћа адресу првог карактер у стрингу. А ми смо је прошле недеље да то је довољно. Зато што увек могу да схватим где крај стринга само итератинг преко тога, можда, и за петља или вхиле петље или нешто слично да, само у потрази за "обрнуте косе 0", Сентинел специјални карактер. И тада знамо да ниска се дешава да се од дужине - у овом случају - пет. Дакле, технички ГетСтринг шта ради се враћа Ок123 у овом случају. И онда се дешава оно што технички није да чувамо, унутар с, Ок123. На крају дана, иако то је нови концепт, показивачи, они су само променљиве. Али они се десити за складиштење битова који колективно представљају адресу. Дакле, технички све што добија чувају у с је Ок123. Али ми као људи - укључујући и данас напред - се стварно неће да брину, обично, шта стварна адреса неког меморију. То је само да низак ниво детаља на буде интелектуално занимљив. Тако ћу поништити ово. И уместо тога, још висок ниво, само реци да, када говоримо о показивачи Ја ћу само извући више разумљив стрелицу која преноси Иста идеја и сажеци далеко појединости шта је стварни Основна адреса. Сада, ако се вратимо на код, што догодило прошле недеље, ако имамо стринг т једнако ГетСтринг? Па, ако ја опет, упишите здраво овај пут ћу добити још један комад меморије. х-е-л-л-о бацксласх 0. Али, пошто сам звао ГетСтринг други пут - и ја знам из гледа изворни код ГетСтринг - чак иако је то случајност да је здраво откуцан два пута, није ГетСтринг Покушаћу да оптимизују и бити паметан. Само ће добити још један комад меморија са рачунара, што је ће бити на некој другој адреси. Хајде само да произвољно 456. И онда шта ће се то вратити? То ће вратити 456 и чувајте га у Т. Дакле, оно што се заиста дешава, на лева страна је имам други комад меморије, обично 32 бита. И тамо ће ићи Ок456. Али опет, ја не интересује ово одредјеног броја више. Само ћу да апстрактно извући га као стрела. Дакле, ово је сада ново објашњење. Али, то је исто тачно да је идеја се дешава све време. И тако онда разлог, да је ово први верзија ЦОМПАРЕ био луд прошле недеље је зашто? Када то урадите, ако ова једнака једнака Т Оно што заиста јеси испод хаубе поређења? Можете да поредите адресе. И само интуитивно, јасно, Ок123 неће једнако Ок456. Ови бројеви, они бита само су другачији. И тако стално, прошле недеље је рекао упишете различите ствари, чак и ако речи биле су речи до речи исте. Тако да ми поправи ово. У смислу лаике, шта је поправити? ПУБЛИКА: Користите функцију. СПИКЕР 1: Користите функцију. Или звезде дефинитивно укључени, већ користите функцију да уради шта? ПУБЛИКА: Да бисте упоредили конце. СПИКЕР 1: Да упоредимо конце. Дакле, основни проблем овде је да сам био с обзиром квалитет веза да се дефинише поређење њихових адреса. И наравно то је само глуп једном да разумете шта се дешава испод хаубе. Да бисте заиста упоредити везе да ли они су једнаки у начину на који људи ће размотрити две жице да буде једнака морамо да их упоредимо карактер за знак за карактер. Сада сам могао да урадим ово веома мукотрпно. Али фамилијарно, ми смо користи за петљу. И само упоредити с конзолу Ја против Т носача и. И ова конзола плус 1 против Т носача И плус 1, и тако даље, у нека врста петље. А ако приметите било која два карактера који разликују, или ако схватим да ох, с је краће или дуже од Т од Т Одмах да кажем лажна, они нису исти. Али, ако се кроз с и т и кажу Исто, исто, исто, исто, исто, крај обе жице, могу да кажем Истина, они су једнаки. Па, на срећу, пре много година неко написао за тај код нас. И они су назвали СтрЦомп за гудачки упоредите. И мада је мало контра интуитиван, СтрЦомп враћа 0 ако они две жице, С и Т су исти. Али враћа негативну вредност ако је с треба да дође пред т алфабету, позитивна вредност, ако треба да дође после т по абецедном реду. Дакле, ако сте икада желели да сортирате нешто, испада да СтрЦомп је корисно. Јер не само да да или не, једнака или не. То вам даје осећај наручивања волим моћ речника. Дакле СтрЦомп, а зарез т једнак једнака 0 значи да жице су заиста једнаки. Јер ко год да је написао ову функцију година вероватно користи за петљу или док се петља или нешто слично да се интегришу кроз знакове поново и опет и опет. Међутим, проблем је настао два овде. Ово је цопи0.ц. И два у црвеном је зато што је мањкав. И шта ми овде радимо? Па, прво сам звао ГетСтринг. И чува повратну вредност у с. Дакле, то је скоро исто као и овај горњи део слике. Али, оно што долази после тога? Па, дозволите ми да иде напред и уклоните на гомилу ово. Ми ћемо уназад у времену где смо управо имају с, што је сада у складу са једна линија горе. Проверавам. Ако је ова једнако износи 0.. Сада, брзо Узгред, када Можда ГетСтринг врати 0? Нема довољно меморије. Зар не? Ретко кад ће ово да се деси, свакако на рачунару који је Имам стотине мега или чак и свирке РАМ меморије. Али то би, у теорији, повратак 0, нарочито ако Корисник не сарађује. Постоје начини да се правим као да нема уноси нешто и трик ГетСтринг у повратку 0 ефикасно. Тако да ће то проверити за то. Јер, ако неко од вас су почели да добити, већ, грешке сегментације - који је вероватно био извор неке фрустрације - они су скоро увек резултат меморије везане грешке. Некако си забрљао у погледу показивач, чак и ако није знао било је показивач. Тако да можда изазвана сегментације Грешке Већ недељу користећи један нешто као за петљу или док петља и низ тако што ћете отићи предалеко поред границе неког низа који сте објавили, у недељу у два посебно. Можда сте то урадили, чак у проблему сет четири са Бреакоут. Иако вероватно нисте видели све звезде у дистрибутивном број за Бреакоут, испада да они ГРецт и ГОвал и друге такве ствари, они су у ствари показивачи испод хаубе. Али Стенфорд, као и ми, на неки начин крије детаљ да бар за библиотеке сврхе, слично као ми за стринг и цхар *. Али ГРецт и ГОвал и сви они ствари ви момци су или ће користити ове недеље су на крају меморијске адресе. Ви једноставно не знам. Тако да не чуди онда, можда, да ли могу кочити преко неке сегментација грешке. Али оно што је интересантно овде сада, ако након што смо проверили за 0 радимо ниска Т добија с. Па, дозволите ми да прогласи т. Ја ћу га извући као трг, 32 бита, зову Т. А онда ћу да урадим с добија. Па, шта то значи? Па, то је мало тешко замислити о да замислим мудро. Али, хајде да размислимо о шта је унутра од к? Шта је буквално унутар ове променљиве? Вредност Ок123. Дакле, када кажем ниска Т добија с, што само дословно значи узети број у с, што је Ок123 и ставио га Ок123. Или сликовито, ако некако апстрактно далеко од тог детаља има ефекат буквално раде ово као добро. Тако сада, мислим назад на прошлу недељу, када смо кренули ка капиталистичком Т. И Т је носач 0. Па, Т носача 0, иако је то показивач, можете га третирати као да То је низ, уз квадрат носач нотација. Па где је Т 0 конзола? Па, то је х. И тако, када користимо ту линију кода, горња два, што је у том ц типе.х заглавље датотеке, ту је прогласио. Ти капитализацијом ову Х. Али Наравно, то је исто тачно да је х унутар е, да тако кажем. И сада сте се променили или капитализован и оригинал и тзв копија. Зато што ниси направио копију у начин да би човек жели да буде. Дакле, шта је овде поправити, у цопи1.ц прошле недеље? Функције, тако да смо заиста могао копирајте стринг. А у основи, шта нам је потребно да уради да би копирали стринг? Па, у овој зеленој верзији овде сам урадити је прилично низак ниво. Заправо постоје функције они могу помоћи у томе. Али најосновније један, а највише позната једна, у најмању руку, ускоро ће бити познато нам је следећи - па један на првој линији кода у зеленом сада. Само сам преписао с као цхар *. Нема функционална разлика постоји. Само сам бацио ЦС50 библиотеку и Ја га зовем, који је, цхар *. Сада тачка, тачка, тачка, јер је било провјерити грешке то није занимљиво разговарати о поново. Дакле, сада је т проглашен. То је такође знак *. Тако сам нацртао квадрат на мало екран као пре. Али, на десној страни, маллоц, ми је рекао је меморија издвојити. Дакле, доделити и неки комад меморије. А колико бајтова ми заиста желе да издвоји, то изгледа? Па, с стринг дужине. Дакле, ако је здраво то је ће бити пет. Ми ћемо рећи ч-е-л-л-О. Дакле, пет бајтова. Али онда плус 1, 1 зашто? 0 карактер. Ако не оставља простора за овог момка ми Можда случајно створи ситуацију где је стринг ч-е-л-л-О. А следећи пут ГетСтринг је звао сам и укуцате, на пример, Дејвид, Д-В-И-Д, рачунар ће да мислим да је заправо је х-е-л-л-о-Д--В-И-Д јер је без паузе између тих речи. Дакле, треба ту паузу. Дакле, ми не желимо пет. Желимо шест бајтова. А ја кажем бајтова. Али, то је заиста време величина знак. Чар је технички готово Увек један бајт. Али, само да би наш број преносив, да тако кажем, тако да се ради о различити рачунари, чак и ако су можда бити нешто другачији испод хауба, ја ћу да уопштено кажу величина знак, тако да мој код ради увек. И не морам да га компајлирате само јер да надоградим рачунар или да користите нека другачија платформа. Тако да имам 6 пута већи од Чар, који се дешава да се 1. Значи, могао маллоц дај ми шест бајтова. Шта је то заправо ради? Па, да врати у време овде где смо у причи. Тако да ако се вратим овде, ја сам изјавио цхар * т зове. Сада сам позвао маллоц шест бајтова. А сада ћу да скренем тих шест бајтова баш као и низ раније. Али ја стварно не знам шта је у овом низу. Ако доделите меморију испада да Ви не можете веровати да постоји нека позната вредност тамо. Могао је да се користи нечим друго, нека друга функција, неки други линија кода који сте ви написали. Дакле, обично ћете назвати ове смеће вредности и привући их, можда, као упитника, само указује на то да смо Не знам шта је у ствари тамо. И то није страшно док нас су довољно паметни да замени оне смеће вредности са бројевима или слова које нам је стало. Дакле, у овом случају оно што ћу да урадим? Па, моја линија кода Следећи, имам четири. инт и добити 0, н добија Дужина низа е. Дакле, познато за петљу. Ја је мања или једнака Н, што је обично изнад. Али, овог пута је то намерно. И + +, а онда ја једноставно урадим Т конзола и добија с. Зато што је моја слика изгледа овако у овај тренутак, чува у т је адреса тог случајног комад меморије чије вредности су непознати. Али чим ја т брацкет 0 да ме ставља овде. И шта се на крају стигнемо тамо извући? Ми смо на крају стављајући х. Јер то је оно што је на 0 с носача. А онда иста ствар за Е, и ја, и ја, и о. н, зашто сам их кроз једнак н? Због 0 карактера. Дакле, само да буде јасно, онда, ако сам стварно избрише све што ови смеће вредности су у ствари и онда скрене у оно што ја очекујем, то је ова конзола 1, 2, 3, 4, плус то је пратећи нови лик. И сада, ако смо наставили поред тачке, тачка, тачка у овом исправна верзија и капитализована Т носач 0 ја бих, на Наравно, ово се само капитализацијом момак овде, који концептуално, је на крају циљ. Дакле, то је све показивач. А ти си их користите недељама сада у контексту жица. Али, испод хаубе су мало сложенији. Али, ако мислите о њима у овом сликовна форма предлаже да да су они Вероватно није све тако страшно као и они Можда први поглед изгледа на први поглед, посебно са таквом нову синтаксу. Сва питања о показивача, жице, или цхарс? Да? Публика: Да ли можете да се вратите на [ИНАУДИБЛЕ]? СПИКЕР 1: Наравно. ПУБЛИКА: Како то да у ваш последњи линија, ви немате * Т линију и * с у реду? Зар немаш референцу - СПИКЕР 1: Ах, стварно добро питање. Зашто не имам * Т * и С? Зато кратко, прошле недеље, као што је у нашем свап функцију, рекао сам то када имаш показивач средства путем који сте тамо као што смо урадили физички на сцени, био је у ствари употребили оператор звезда. Испоставило се да је овај трг-носач нотација је оно што ћемо назвати синтаксичких шећер, што је само секси начин рекавши да је стенографски запис за управо оно што ви описујете. Али, то је мало више интуитивно. И на ризик да то чини више компликовано него што треба да буде, шта се стварно дешава је следећи - Ако кажем * т значи да иду у адреса чува у Т. Дакле буквално, ако је т чување адреса да је х у почетку, * т значи ићи овде. Сада, шта Т носач 0 значи? Исти посао. То је само мало више корисник пријатељски да пишем. Али ја нисам завршио. Не могу само да кажем * Т * С добија. Јер шта бих се онда ради? Ја бих стављање х, х, х, х, х током целе ствари. Зар не? Јер * т идите на адресу у Т. Али, ми смо унутра у петљи. И шта ја увецава вредност, Наравно, на свакој итерацији? ја. Али, постоји могућност овде, зар не? Иако ово изгледа као да је све мало софистициранији него квадрат-носача нотацији Употребили смо неко време - дозволите ми да поништите ту моју промену х - иако је то сада постаје мало одгајивач, основна идеја, ако Т * значи овде и * т је само идите на адресу у Т. Али, оно што је адреса у Т? Број смо га користим? Као Ок456, хајде да то поново само ради разговора. Па, ако желим да се на е на Т ниска, ја само желим да одем у, у суштини, 456. Или боље речено, 457. Само морам да додам једну. Али ја могу да урадим, зар не? Јер Т, иако држим цртеж сада као стрела, то је само број, Ок456. И ако додам да је један, или више генерално, ако додам на то могу заправо се управо тамо где желим. Дакле, ако сам стварно урадити - и то је оно што се сада зове поинтер аритметика - Ја могу уклонити ову линију. Што је, искрено, мислим да јасније и мало више корисник пријатан за читање. Али то није ништа мање тачно. Ова линија кода сада користи поинтер аритметика. Она каже да се иде на адресу - без обзира на почетак т е, који је Т Плус, која је у почетку је 0, што је одлично. Јер то значи почетак т плус 1, плус 2 плус 3, и тако даље. А исто се баве с. Тако синтаксичка шећера за то. Али схватио шта се стварно дешава испод хаубе, рекао бих, је заправо корисно у себи и по себи. Зато што то сада значи да не постоји много више магија дешава испод хаубе. Не постоје ће бити много више слојева да можемо да одлепите за вас. Ово је в. И ово је програмирање. Стварно добро питање. У реду, тако да је то луд Програм сам мислио раније. своп је погрешна. Да ли изгледа да раде. Подсетимо се да је баш као са млеком и сок од наранџе - који сам почео пиће демонстрацију данашњу. Дакле, баш као и сок од наранџе и млеко, ми смо морали да користе привремена променљива, ТМП, да одржи привремено, тако да бисмо онда могли мењати своју вредност, а затим ажурирате б. Али ова функција, рекли смо, или ово програм у који је ова функција била написано је погрешно и мане, зашто? Да? ПУБЛИКА: [ИНАУДИБЛЕ]. СПИКЕР 1: Управо тако, када зовете замену - или уопште, кад сте позвати највише никакву функцију - ако су аргументи на ту функцију су примитивни, да тако кажем, и интс цхарс и дубл и сплавова, ствари без Звездице, ви пролазите у копију аргумент. Дакле, ако је 1 к и и је 2, иде да буде 1 и Б ће бити 2. Али, они ће бити различите комаде битова, различитим комадима меморија да се деси да се складиштење идентичне вредности. Дакле, ово је супер код савршен замене у А и Б. То није добро у замене - на пример прошлонедељном - к и и. Јер опет, они су у погрешном обиму. Сада, како смо ићи око поправљања ово? Морали смо да функцију погледајте мало ружнији. Али опет, размислите шта то само значи. И стварно, пусти ме, за доследност, промените једну ствар, тако да је идентичан шта смо урадили. Као што сам поменуо прошле недеље, то није случај битно где иде. У ствари, обично би ставио звездице поред имена променљиве. Али мислим да би било мало лакше да размотри * поред тип података, као што значи да је то показивач цео број у овом случају. Па, шта ја радим овде? Ја кажем, не ми дати инт следи још један инт, називајући их и Б. Дајте ми адресу неког инт. Дајте ми адресу другог инт. Позив тих адреса А и Б. А онда користите * нотацију доле доле, идите на сваку од тих адреса колико је потребно да се било или подесите вредност. Али, постоји изузетак овде. Зашто ја немам * поред тмп? Зашто не учини, на пример? Осећам се као да сам управо треба да иде све се исправи и целу ствар. Да? ПУБЛИКА: [ИНАУДИБЛЕ]. СПИКЕР 1: Нисам проглашени тмп као стринг. Дакле, ово ће прогласити, у овом случају, тмп да буде адреса на инт. Али то није оно што ја желим, за неколико разлога. ПУБЛИКА: Не желим да их замене. СПИКЕР 1: Управо тако, не желим да се замени све са тмп. тмп је само недеља-једна ствар. Све што желим је променљива да сачувате неки број. Ја чак и не брину о адресама у овом тренутку. Само ми треба 32 бита или тако да ускладишти инт. И ја желим да ставим у тим 32 бита онога што није, да тако кажем, али шта је, само да будем прецизнији. Јер, ако је адреса, * значи иди тамо и добити вредност 1. На пример, у примеру прошлонедељном или у случају Б, добијају вредност 2. Дакле, оно што се заиста дешава? Дозволите ми да нацртате слику овдје да це Само зафркавати осим део данас. Али, то ће се и даље појављивати дуже време. Овај, ја тврдим, јесте оно што је ваш рачунар меморија изгледа када покренете програма, било који програм. Када покренете програм у сам врх РАМ рачунара - тако мисле овај правоугаоник, заиста, као ваш рачунара или РАМ меморија, све 101 милијарду бајтова тога, све две милијарде бајта, сви Два гигабајта тога, без обзира што имамо је количина, Направимо га као квадрат. А ја тврдим да када покренете програм као што су Мицрософт Ворд или Цхроме или нешто слично, делићима који Мицрософт или да је Гоогле написао - у случајевима тих програма - се учитавају у меморију рачунара где се могу извршити више брзо и хранио у ЦПУ, који је мозак рачунара. И у ТАМ ускладиштени су на веома врху вашег програма, да тако кажем. Другим речима, ако је ово комад меморије, када двапут кликнете на Мицрософт Ворд, битови долазе офф хард диск. Они се учита у РАМ. И ми ћемо их набити се у самом врху овог правоугаоника концептуално. Па, остатак меморији је користити за различите ствари. На самом врху можете видети иницијализацију података и да опозове података. То има везе, углавном, са константе или глобалних променљивих да имају вредности. Али више о онима други пут. Онда имате гомилу, која Вратићемо се. Али, на дну је део који је Посебно Германе сада. То је такозвани стек. Дакле, баш као у већини било Д сали овде на кампуса, имате те тацне да само стек на врху сваке друге о којима можете ставити храну и тако то. Стека у рачунарском систему је веома слична. Осим док лежиште, као што ми користимо у трпезарија, наравно, подразумева се да носите ствари лежишта или су оквири - како ћемо их звати - у рачунара меморија се користи за држање променљиве и вредности. Дакле, оно што се заиста дешава испод хаубе? Па, дозволите ми да окренем на екрану овде. И хајде да се фокусирају само на доњи део за тренутак. Ако је доњи део мог Меморија рачунара испада када сам позовите главна функција - што се дешава, искрено, аутоматски за мене - Ја добијем комад меморије на дну моје РАМ тако кажем. И ово је место где је главни локалне променљиве ићи. То је место где аргц и аргв можда иди, а ја све променљиве прогласи унутар главни. Они завршавају на дну РАМ мог рачунара. Сада претпоставимо да је главни позиве функција Као замену, као што је то учинио прошле недеље? Па, ми смо у суштини ставили нови послужавник, нови оквир, на моју меморију. И ја ћу описати и као припадају свап функцију. Сада оно што је унутар свап? Па, на основу програма прошлонедељног и коју смо управо видели одломак из, унутар оквира свап-а, или је замена касета, шта су променљиве? Па, и б. Јер то су били њени локални аргументи, плус трећи, тмп. Па стварно, ја могу нацртати ово мало више чисто. Дозволите ми да иде напред и поништите ознаку. И дозволите ми да тврдите да знате шта? је вероватно ће завршити овде. Б ће се завршити овде. И тмп ће се завршити овде. Сада, можда наручивање бити мало другачија. Али, то је концептуално идеја. И само заједно, то је оно што зваћемо оквир свап-а, или трпезарија лежиште. А исто баве главни. Али нећу да прекраја. Али ту аргц и аргв и било својих локалних варијабли као што су кии може бити и. Па сад размислите шта се заиста дешава када зовете замену. Када позовете замену, као и извршавање кода ово, ви сте у пролазу, у бугги верзију, и Б као копије к и и. Дакле, ако ја сада знам да цртам ово на екрану - мало да се боље на ово - па прича сам рекао сам себи је у овој верзији луд, кад смо позива свап буквално пролази у А и Б као целих бројева, шта се заправо догађа? Па, шта се заправо дешава је ово. Дозволите ми да иде напред и само ундо да разјаснимо неке простора овде. Дакле, ово је мој рачунар меморија. Дакле, ако сам, на пример - стварно хајде да то овако - ако ја тврдим да је то к, складиштење вредност 1 као и прошле недеље. А ово је година, чување вредности 2. Баш као и прошле недеље. И то је главни, кад зовем замену, на тај начин себи даје приступ и Б и тмп, ја ћу да тврдим да ово је и то је 1. Ово је Б. То је 2. Ово се зове тмп. И у почетку, то има неку вредност за смеће док сам заправо у то складиште, што је 1. Онда иде напред и променити да буде шта? Б је вредност. И сада имам два овде. А онда ми је рекао нар добија тмп. Опет, баш као разум провери, трећи линија кода овде је једноставно ово један, Б добија тмп. И на крају, шта да радим? Ја идем напред и да се промени б год вредност тмп је, што је 1. Не дирај тмп поново. Али сада, проблем је што пре замене повратак, јер то није дистрибуирањем подржати неку вредност, повратка нема изјава експлицитно у њему. Шта се заправо дешава? Па, у суштини све ово сећање - У реду, очигледно воли гумица само један прст у исто време - само нестане. Сада у стварности то није иде нигде. Али, можете да мислите о томе сада као питање марака. Зато што је више заправо у употреби. И ништа не уради са тим вредностима. Дакле, у случају зелене верзије Овај код, што уместо да се буде прешао у замену? Тако адресе. Дакле, адреса и к адреса и. Дакле, ако се поново испричам ову причу последњи време, а ја заправо нерешено замену опет, али са показивачима, а то је, то као Б, а то што тмп, оно што је заправо чувају у у ово зелено верзија мог кода где Пролазим на адресе? То ће бити показивач на к. Тако да сам могао да нацртате стрелицу. Али, хајде да користите исти произвољно пример као и раније. Хајде да кажемо да је то нешто као Ок123. И то ће бити зато што Ок127 то је далеко четири бајта, јер је то инт, тако Ок127. И опет, узимам неке слободе са бројевима. Они су много мањи него што би заправо бити и у другачијем редоследу. Али, тако је слика Сада је другачије. Али када сам користити ову зелену код и ја инт тмп добити *. * А значи да урадите следеће, узети адресу коју је у и идите на њега, што је 1. И то је оно што сам тада ставио у тмп. У међувремену, у следећем реду кода Овде, * б добија, шта то значи? Па, *, па идите стигне * Б, што значи да иду тамо. А то значи да се стави вредност тамо. Коначно, последња линија кода Једноставно је рекао * б добија тмп. Дакле, Б каже иди тамо и замени га са тмп који, у овом случају, иде да се, опет, 1. И то је разлог зашто зелена верзија наш код ради, а црвена верзија никад није. То све се своди само на то како меморија се управља и где је заправо смешта у рачунара РАМ. А за сада, то је једна од ствари да стек се користи за. Питања на изглед? На тројке? Или на свап? У реду, тако маллоц, подсетимо, тако нешто урадили. Ово је супер једноставан пример. И то је био један који Бинки представио нам се, додуше прилично брзо, на крају часа. Проклетство, тамо идемо поново. Дакле, подсетити да је то пример који Бинки нас је упознао, мада нешто брзо на крају часа. И овде смо заиста маллоц по други пут. Јер, први пут смо га да створи довољно РАМ-а, издвоји довољно РАМ за складиштење ниску. Овај пут Бинки чува га једноставно. Дакле, то је само складиштење инт, очигледно. И то је потпуно у реду. Мало је чудно, искрено, да користити маллоц да издвоји један инт. Али поента је била Ницк цлаиматион заиста само исприча причу о томе шта дешава или се не дешава када да малтретирају меморију. Дакле, у овом случају, овај програм урадио неколико ствари. У првом случају овде, он изјављује показивач позвао к цео број. Тада декларише показивач зове И на инт. Она затим складишти у к, шта? Неко други сада. Шта добија чувају у складу са к Трећа линија овог програма? ПУБЛИКА: [ИНАУДИБЛЕ]. СПИКЕР 1: Па, не баш бајта, по реци. Тачније сада. Шта добија чувају у к? Адреса, мислим да сам то чуо. Па шта маллоц врати? маллоц бихевиорално додељује меморију. Али како то да приступате томе? Она враћа шта? Адреса првог бајта у меморију. Сада, ово је супер једноставно. То је само један бајт, што значи обрати ми је вратим адреса целе ствари. Тако чувају у к онда, је адреса те меморију. У међувремену, шта се даље дешава? Па заправо, идемо напред и цртам стварно брзи. Дакле, ако пређемо на екран и овде играмо ово инт * к, инт * и ће урадити шта за мене? Ја тврдим да је то само да уради овако нешто и назвати га к, и то и зову г. У међувремену, трећа линија кода је ће да издвоји величину цео број, што се дешава да се - извини ако сам рекао један пре него што сам мислио један Инт - четири бајта на типичном рачунару. Барем са ЦС50 апарата. Дакле, ово ће да издвоји то, ко зна? Негде овде. И то се чува у неким адреса вола, ко зна? Али, шта ће да се врати је то адреса. Али, ми ћемо извући ово сликовито баш као стрела тако. Сада у следећем реду * к добија 42. Шта * к значи у смислу лаике? Само иди тамо. Иди на ту адресу. Или другим речима, пратите стрелица и пут 42 тамо. Али онда се нешто лоше десило да Бинки, зар не? Подсетимо ту линију пет овде, г * добија 13, заиста несрећан број, шта урадио за нас? Па, г * значи ићи тамо. Па, то није дато Још вредност, зар не? Код нема год буде враћене на било шта. Је х смо се иницијализује на адресу. Али г проглашен до врха. Али онда зарез, без вредности је заправо ставио у њу. Тако да је фер да позове ову смеће вредности. Ко зна шта је тамо? То је остатак битова који су коришћени неком претходном линију кода у мој програм. Дакле, ако ја кажем идем тамо, то је као, Немам појма где је стрелица ће се завршити. И тада обично добити грешку сегментације. Ако случајно дереференце, тако да говоре, или идите на адресу која није заправо легитиман и број, лоше ствари се дешавају. И то је управо оно што се десило мислим да Бинки. Тако се сећате да је било прича да је Ник овде говори је иста идеја као шта Већ скренуо сам са илузијом креда на табли тамо. Кс и И су проглашени. Онда смо издвојила величину инт и складишти га у к. Онда следећи ред смо * к. То је био Ник је чаробни штапић од дереференцинг. Тај пут 42 у меморији указао к. Али, ово је место где се ствари отишао ужасно лоше. Зар не? Покушали смо да дереференце г. Али г имао неке лажне вредности, зар не? Та стрелица у доњем левом угао, није заправо указује на било шта. То је нешто што ја радим урадио овде на табли. Дакле, лоше ствари се дешавају, сегментација грешка, или грешка Бинки, у овом случају. Али ако се онда поправити да тиме Кс добија год се прича како се промене? Па, ако ја урадим к, и добија то је ефективно исто као да кажете Шта год да је, Ок-нешто ће бити исти овде, Ок-нешто. Или сликовито ћемо извући стрелицу. Дакле, овде на табли са Бинки, са следећом линијом код, * г значи ићи тамо. Где се налази? То значи овде. А кад смо ажурирали да буде 13 само укључује одлазак и писање 13 овде. Дакле, можда не у потпуности једноставан на први поглед. Али, да се подсетимо и да користе исти жаргон Бинки да је овде користи, тако Прве две алоцира показиваче, Кс и И, али не и поинтеес. И поинтеес није углавном користи термин. Али, апсолутно је показивач. Али, то је оно шта се истакла у у Бинки номенклатуре. Овај следећи ред, наравно, алоцира поинтее инт. Дакле, комад сећања - као што сам нацртао на преко десној страни тамо - и сет к једнако покажете на њега. Ово дереференцес х за складиштење 42 в меморија да се то показује у. И онда то, наравно, била лоша ствар. Пошто г није указујући на још ништа. То га поправља. Дакле, ово је још увек луд програма. Само зато што смо дува кроз код ред по ред и каже, ох добро, нека га срушити тамо. То је лоша ствар. Шансе су програм је управо ће прекинемо на тој линији. Али, ако сте били да уклоните пала построје и замените га са последња два линије тамо сте доделили - коришћењем показивача задатак - и да укаже на к као тачке т. И онда дереференце г на веома безбедан начин. Па где то нас напусти? Па, испада да је испод хаубе ЦС50 у библиотеци, показивачи су користи током. А ми ћемо заиста почети да се љушти назад да слој пре дуго. Али и то је пали, израз који неки од вас можда бити упознати са, посебно оне удобније, је заправо да је од веома популаран сајт, или стек преливања, ових дана. Али ово заправо има веома техничко значење. Сада знамо шта је стек. То је као гомиле каблова унутар једне трпезарији. Или унутар рачунара је сећању те оквире који се користе функције. Па, испоставило се да је због тога врло једноставна имплементација Меморија и оквири на такозвани стек, ви у ствари можете преузети контролу рачунарског система прилично лако. Можете да пијук у систем ако људи као да нам није писао наш код нарочито добро. Ако људи попут нас користе делове меморијских или коришћење низова - још чешће - али понекад заборавите да проверите Границе нашег низа као што можете да су се понекад, и поновио сувише далеко поред краја низа. У најбољем случају, ваш програм може само срушити. Сегментација грешка, врста је непријатно. Није сјајно, али то није нужно изузетно лоша ствар. Али, ако је ваш програм је заправо о некретнинама рачунарима корисника, ако је покренут на сајту да стварни случајни људи на интернету су ударање, допуштајући људи изазивају лоше ствари на ваш код генерално није добра ствар, јер то значи прилику да се контролу над рачунаром. И то ће да изгледа мало загонетан. Али сам мислио да те уплашим са Овај последњи пример овде. Ево примера кода. А ту је и добар Википедија Чланак који хода кроз ово детаљно. Главни имам у доњем позива Фоо, пролазећи у аргв од 1. А то је само тако да можете покрените програм и проћи произвољан улаз. А онда се проглашава трла до врха као прихватање ниску, или више прецизно, цхар *. Затим објављује низ карактера. Назовите то тампон, генерално, величине 12. Дакле, 12 знакова може да стане унутра тог низа се зове ц. И онда користи ову нову функцију, који је нов, али није тешко Разумем, копију меморије. Она копира из меморије бара, што је било променљива н прошлост, без обзира корисник откуца у аргв у 1. веку. Колико бајтова? Дужина низа од бара. Другим речима, ако корисник упише у х-е-л-л-о Ентер, Дужина низа здраво је за пет. Дакле, пет од ових бајтова ће добити копира у низу под називом Ц, који је величине 12. Али оно што корисник упише у много дужи Реч која је 13 карактера или 14 карактера или 100 карактера или више? Где ће они да иду? Па, тај рам, то лежиште у трпезарију стек, они ће ићи тамо. И само ће да почне замене остало, што је већ на тај стек, прелива стек, да се тако изразим. Дакле сликовито, мислите о томе на овај начин. Ово је само шарена верзија слика коју сам цртеж. На дну, хајде да кажемо, је главни. А на врху, што ви сада видите је оквир, боја кодирани сада, за Фоо функција зове. Али оно што је занимљиво овде о трла је да је овде његова оквир. Дакле, то је привукло баш као И урадио, али са светло плавом. А сада ово је место где 0 Ц носач иде. И ово је место где Ц носач 11 ће се завршити. Другим речима, то се дешава да се буду представљени као трг. Али ако само настави плоппинг бајтова доле - или слова - они ће до краја се на локацији 0 све до до 11 јер је 0 индексиран. Али, где је 13. карактер ће се завршити? Где је 14.? Где је 50. карактер ће се завршити? То ће да иде доле. Јер иако смо нацртана Слика са стека одрастање, адресе, испоставило се, иди из мале адресе, мала показивачи, на великим адресе. Тако да само иде горе и горе. Дакле, ако корисник упише у Добро, то је сјајно. Нема буба, нема проблема, свима сигурно. Али ако корисник упише у шта ћемо позовите супарничком код, представља као генерички, напад, напад, напад, напад, шта се може десити? Па, ако је све улазе да корисник откуцан није само неки пријатељски или увредљиво ниска знакова. То је заправо низ знакова да ако га саставили, то је заправо шифра. Можда је код који брише све датотеке на чврстом диску или шаље спам или нешто слично. Обратите пажњу на то шта је кључ је у томе да Ако лош момак има среће да прекрити црвени комад меморије - што ја нисам извлачио на моју слику, али ова слика овде Википедија има - његова тзв повратна адреса. Када се храна враћа, када своп повратак, како компјутер зна да иде од овде до овде? Или у техничком сегменту горе, како то зна да иде из свап код - 0 и 1 је да да компонује замену - Повратак на почетак? Постоји такозвани повратна адреса ускладиштене у истој стек оквира, на исто лежиште кафетерија. Дакле, ако је лош момак је довољно паметан да пут код напад, напад код, напад број, и добити довољно среће - често путем покушаја и грешке - на преписати тај црвени повратну адресу, са адресом и обавештења самом врху. Обавештење 0835Ц080. То је записано уназад до врха за разлога што можда ћемо поново. То је тај број. Дакле, ако је лош момак добија довољно срећан или је довољно паметан да замени црвени одузети од меморије са адресом код који он или она има некако убризгава у рачунар, претпостављам чији шифра ће бити враћен чим ФОО врши извршавање? Негативац Код. Дакле, код овог напада, ААА, опет, можда слати спам, може избрисати све датотеке на вашем хард диску. Али то је оно што заиста стек преливање је, или тампон преплављен, или буффер оверфлов напад. И то је невероватно, невероватно заједничко до данас са програмима писаним у Ц, Ц + +, па чак и неки други језици. На том страшном белешци, ми ћемо завршава на шалу. [Смех] Видимо се у среду. На следећем ЦС50 - Тако да сам све од диска лампи, али данас чекај, масти млека, пола телефон књига, сок од поморанџе да сам пио данас. УСБ кабл, кључ. [Музика свира]