>> [Музички]
>> Дејвид Џ MALAN: Сите право ова е CS50 и ова е почеток на неделата пет.
Така, денес, под вашиот седиште перници, не ќе најде ништо.
Но погоре, треба да се најде овие, малку знак на благодарност за
сите на работа што ќе се стави во играта на Петнаесет.
Едноставно отстранување на мал круг на дното за да почнат да играат за
Остатокот од класа.
>> Па се потсетиме на тоа, или знаат дека проблемот во собата четири, кој излезе овој викенд,
вклучува пишување друга игра.
Но овој пат тоа вклучува користење на вистински графички кориснички интерфејс, а не
текстуална интерфејс како Игра на Петнаесет беше.
И играта кој е пред вас, ако не сум сеуште видено овој следната,
изгледа малку нешто како ова.
Одам да одам во мојата терминал прозорец тука во gdb.
И јас одам да се оди напред и да ја стартувате персонал решение, кое можете да пристапите
после водење ажурирање 50, како и обично.
>> Но јас ќе одам да го стави во малку тајната на владата, малку велигденско јајце,
т.н. Бог на владата, од страна на ставање Бога во argv1.
И морам да ги следам моите сопствени насоки, тоа трчање во мојата
Проблемот постави директориум.
Па сега ќе видите една целосна верзија на играта на Збег.
Всушност, ова е не-раце на владата.
Па тоа е всушност -
wowed иако можеби ќе биде -
прилично тривијална да се спроведе Бог на владата во Збег, за разлика Игра на Петнаесет,
што некои од вас може да се справуваат со за хакер издание.
>> Во Збег е доволно во Бога владата едноставно да го направи она што,
интуитивно со гребло?
Само го прават тоа еднаков на она што го хоризонтална положба е посед на топката.
И толку долго како го правиш ова заклучани со топката се движи Оваа игра ќе
никогаш, никогаш, никогаш пропушти топката и ќе победи во секое време.
>> Но, во хакер издание оваа недела таму е повеќе од само Бог режим.
Има голем број на други функции.
Меѓу нив, ласери.
Така што ако навистина се нестрпливи да може да почне соборување на тули
и уште неколку други.
И за оние од вас кои би сакале да калибрирање стандард наспроти хакер
издание, можам да видам дека оваа недела хакер издание намерно е
малку повеќе doable, да речеме, од Бога владата беше со играта на Петнаесет.
>> Значи, ако сте во потрага за истегнување и сте во потрага за некои дополнителни забава
карактеристики прават нурне во ако на интерес.
Сега е повеќе практично, дозволете ми да истакнам надвор една работа, како и.
GDB, кој некои од вас не можат да имаат уште допре лично, што е во ред.
Но сега е навистина време да се навикнеш со овој и удобно со оваа алатка
затоа што тоа ќе го направи вашиот живот многу полесно, навистина.
>> На предавање на Rob за GDB неколку недели, да се потсетиме
дека GDB е дебагерот.
Тоа е алатка која ви овозможува да се кандидира на вашиот програмата, но се кандидира тоа, чекор по чекор, линија
по линија, така што можете да ѕиркаат наоколу, така што ќе видите работи што се случуваат, па
дека можете да печатите од вредности на променливи.
На кратко, тоа ви дава многу повеќе моќ отколку printDef прави тоа.
>> Сега очигледно, интерфејс е прилично таинствени.
Црно и бело текстуални интерфејс во најголем дел.
Командите се малку тешки да се запамети во прв.
Но, иако тоа би можело да ве однесе половина еден час, еден час, да се стави тоа однапред
инвестиција на време во неа, верувајте ми.
Сигурно до крајот на семестар тоа ќе заштедите можете редот на големина повеќе
време од тоа.
>> Толку рано во недела нурне внатре
И во однос на Збег, знаете дека ви да го направите тоа толку долго колку што имаат
дистрибуцијата код или свој код во тек во вашиот Pst4 директориум.
Знаете дека можете да го извршите gdb. / Збег.
>> Ова се случува да се отвори прозорец вака.
Дозволете ми да се даде повеќе на терминален прозорец.
А потоа она што јас ќе одам да се оди напред и не, тоа не е само да ја стартувате.
Одам прво да постави брејк потсетиме, кој ви овозможува да го паузирате
извршување на одредено место.
>> Само да го задржи нешта едноставно Одам да се пробие на линија еден само со внесување
број еден.
Дозволете ми да всушност повторно да се отвори овој прозорец бидејќи тоа е добивање на
малку мал таму.
Значи она што јас сум сега се случува да го направите тука е ако јас отвори ми терминален прозорец.
Ајде, таму ќе одиме.
>> Па сега ако одам назад кон Dropbox, Pst4 и да ја стартувате gdb. / Збег влезат, информации
Одам да се скрши една да го поставите пауза точка на линијата еден.
И сега ќе одам да се оди напред и тип работи.
И кога правам, забележуваат ништо чини да се случи.
>> Нема pop-up.
Нема графички кориснички интерфејс уште.
Но тоа е разбирливо, бидејќи јас сум буквално на линија еден во мојата програма.
И ќе забележите дека јас сум брз проследени, посебно сега до 62, бидејќи сите
работи на врвот на оваа датотека е работи како коментари и константи и
неинтересен нешта за сега.
>> Па сега јас сум внатрешноста на главниот, се чини, на линијата 62.
И ова е само дистрибуција код, се потсетиме.
Ако го отворам ова горе со одење, на сличен начин, во мојата капка кутија директориум во Pst4,
во breakout.c.
И ако јас движете се надолу и надолу и надолу, и дозволете ми да оди напред и да се сврти на
мојата линија броеви.
>> Она што јас ќе видиме, ако јас движете надолу за да линија 62, е токму линија која
ние сме паузира натаму.
Па оваа линија тука, 62, е каде ние сме за да биде.
Па сега во GDB, ако одам напред и да напишеш сега следно, внесете тоа се случува да
изврши таа линија.
И Voila, имаме т.н. g прозорец.
Ако запознаени со она што GWindow е, а не да се грижите.
На спец ќе ве запознаам со неа, како што и голем број на Можи видео
вградени во спецификации.
>> Но сега да се направи овој малку поинтересна.
Дозволете ми да се преселат овој прозорец над на страна малку.
Дозволете ми да го направи прозорецот малку поголеми, така што можам да видам многу повеќе.
>> И сега дозволете ми да оди напред и направете го следното повторно.
И таму се моите тули.
Ако сум тип следната повторно сега гледам топката.
И ако сум тип следната повторно сега гледам на гребло.
>> И за среќа овој gedit не е навистина соработува со покажување ме
сè што сакате.
Но, сега, ако го направам следната повторно, Следниот повторно, јас сум само
прогласување на некои променливи.
И можам да се печати некој од овие момци надвор.
Печати тули, отпечатоци животи.
>> И сега, ако јас продолжи да го стори следната, забележите дека јас ќе бидам
внатре во тоа јамка.
Но го кодот се случува да се изврши токму онака како што се очекува.
Па кога ќе се погоди оваа функција, Чекај за клик, тоа се случува да направи
тоа буквално тоа.
Па јас како да ја загуби контролата во текот на програмата.
>> GDB не ми создава уште една линија.
Но не и да се грижите.
Оди до мојата игра, кликнете некаде.
>> И Voila, сега продолжува со линија 86.
Значи, повторно, тоа е од непроценливо значење, во крајна линија, за дебагирање проблеми.
Бидејќи вие буквално може да влезете низ вашиот код, печатење работи надвор и многу,
многу, многу повеќе.
Но, за сега, овие алатки сам треба да добиете прилично далеку.
>> Па ние сме, се разбира, земајќи изглед на Графика сега, одеднаш.
И сега нашиот свет добива малку повеќе интересно.
А ти знаеш, можеби, од некои од видеа онлајн, кои ги имаме овие
шорцеви дека сте биле гледање како дел од проблемот комплети.
>> И тие сте биле застрелани, намерно, против бела позадина.
А некои од нив имаат настава Соработници цртање некој текст на
екран, кој е позлати на страната на нив.
Но, се разбира, ова не е сето она што интересно во реалниот свет.
Ова е само една аула со голем бел екран и позадина.
И нашите неверојатни производство тим кој вид на прави сè изгледа убаво
по факт од сечење надвор или обковани ништо
тоа го правиме или не сакаат.
>> Сега само да се мотивираат оваа недела и навистина, каде можете да отидете, во крајна линија,
со информатиката.
Не само по проблемот постави четири.
Но по друг курс или на целата наставниот план тоа е неверојатно она што може да
овие денови во однос на графика, а особено.
>> Некои од вас можеби го виделе ова тече околу онлајн.
Но мислев дека сум ти покажам, за само неколку минути, еден поглед на она што
компјутерската технологија и она што CGI, компјутерска графика може да направи овие денови
со познат песна а можеби и филм.
>> [Музика - LANA DEL Реј, "Млади и убави]
>> ЗВУЧНИК 1: Тоа е само малку неверојатно, можеби, само како
сеприсутно -
>> [Аплауз]
>> ЗВУЧНИК 1: Јас само да го симне.
Но, тоа е навистина неверојатно, мислам, само како сеприсутно софтвер и кодот и
алатки вака навистина сме.
Па тоа е вкусот на насоката во кои можете да отидете.
Ох, не повеќе Уред денес.
Па, тоа е всушност трагичен времето со оглед на точка Јас само се обидоа да ги направи.
>> Сите во право, па ајде да започне Фузија повторно.
Потсетете ме подоцна.
Сите во право, а вие треба да го имаме e-mail како настрана, ако не добие
забележите како тоа.
Сите во право, па се потсетиме дека минатата недела почнавме да лупам назад овој
подоцна познат како стринг.
>> низа сеќава на податочен тип кој е прогласена во CS50 библиотека.
И тоа е дел од обуката тркала дека сега ќе почнат да ги тргнеме.
Тоа беше корисен концепт рано.
Но, сега тоа се случува да добиете повеќе интересни и помоќни да
всушност да се види дека под хауба, стринг е само она, не ни кажа?
>> Да, па тоа е т.н. char *.
И * таму означува дека има некој вид на адреса вклучени.
И така, кога ќе се каже char * само значи променлива чија тип на податок е
покажувачот сега.
Фактот дека тука е ѕвезда има само значи дека сте за прогласување на
т.н. покажувач.
И дека покажувачот ќе се очигледно чување на адресата на, на
Се разбира, знак.
>> Сега, зошто го прави ова има смисла?
Па, она што е стринг под хаубата?
Па, за некое време ние сме биле велејќи дека низа под капакот на моторот е
само ж-е-л-л-о, на пример.
>> Но ние разговаравме за тоа како се, во суштина, низа.
И низа тогаш ќе се погледне малку повеќе вака, со секоја од овие
преземањето на залак.
И тогаш ние рековме дека има нешто посебно врати тука,
обратна коса црта 0, или нула терминатор.
>> Така што сите тоа време, овој овде е стринг.
Но, навистина, стринг е всушност адреса.
И адреси, како што ќе видиме, често се со префикс 0x со конвенција.
Што значи 0x се означи?
Дали некој знае?
>> Па тоа само значи хексадецимален.
Па можеби ќе се потсетиме, всушност, од PST 1, верувам, еден од загревање
прашања, всушност, го прашале за хексадецимални еквиваленти во прилог на
бинарни и децимални.
И мотивација тука е дека со хексадецимален имате 16
цифри ви стои на располагање.
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, проследено од страна на а, б, в, г, д, ѓ.
>> И ако смета сите оние нагоре, ќе добие вкупно 16.
Значи ова е во контраст со децимала, каде имаме 10
цифри, од 0 до девет.
Тоа е во контраст со бинарни каде што ние едноставно имаат 0 и 1.
>> Но на крајот на денот може да се само претставуваат ист број, но
малку поинаку.
И хексадецимален е заедничко, бидејќи како што се испоставува - и ние ќе ја видите оваа
подоцна во текот - дури и кога ќе го добиеме за веб програмирање во контекст на
HTML и кодови на боја, хексадецимален е убаво.
Бидејќи секоја цифра, се испоставува, претставува четири битови совршено.
Па тоа само вид на линии убаво како што ние на крајот ќе видиме.
Така што ова може да биде Ox123 или нешто како што, означувајќи адреса 123
некаде во внатрешноста на мојата компјутер меморија.
>> Но, се разбира, некои се јавуваат проблеми затоа што на овој основните
имплементација.
И се сети дека го зедов прободе во спроведување на функција како ова -
споредуваат цртичка 0 точка в минатата недела, дека иако тоа изгледаше како да е
право, тоа едноставно не се споредуваат две жици правилно.
>> Сум фрлени главни, и јас сум фрлен намалува коментари само да се фокусира во на
на кодот кој е од интерес тука.
И тоа е во црвено, бидејќи тоа е кабриолет.
За што причина?
>> Па, на врвот таму кога ќе прогласи низа, што беше навистина се случува
под хаубата?
Па, дозволете ми да одам во текот на екран тука и да подготви тоа.
Па јас декларирани, повторно, Стринг и GetString.
>> Па ќе одам да се оди напред сега и подготви s за она што навистина е.
Тоа се случува да биде еден квадратен тука.
И јас одам да се тврди дека тоа е 32 бита.
Барем тоа обично е, барем на CS50
апаратот во многу компјутери.
Одам да го наречеме s.
>> Но, сега се сети дека ние наречен GetString.
Па GetString се враќа, се разбира, низа.
Ако корисникот видови во ж-е-л-л-о внесете стрингот здраво добива се врати.
И дека низа, како што штотуку го кажав, завршува некаде во меморијата на вашиот компјутер
со обратна коса црта 0 на крајот.
Ќе се подготви овој како низа - или соседни блок од ликови -
дека тој навистина е.
>> И сега, она што е GetString всушност се враќаат?
Што има GetString се враќаат сето ова време?
Па, ние се каже, во недели пред, го враќа стринг.
Но повеќе технички, она што го прави GetString враќање очигледно?
>> ПУБЛИКАТА: Еден адреса.
>> ЗВУЧНИК 1: Еден адреса.
Поточно тоа се враќа на адресата на првиот залак, што и да е.
Јас само ги користите еден, два, три затоа што тоа е удобен.
>> Тоа се враќа на адресата на првиот карактер во стрингот.
И ние минатата недела рече дека тоа е доволно.
Затоа што ние секогаш може да дознаам каде на крајот од стрингот само со
процесирањето над неа, можеби, со за јамка или додека јамка или нешто слично
тоа, само потрага по "обратна коса црта 0", посебните стража карактер.
>> И тогаш знаеме дека стрингот се случува да биде со должина -
во овој случај -
пет.
Толку технички она што GetString не е го враќа Ox123 во овој случај.
И технички она што потоа се случува е дека ние чување, внатрешноста на с, Ox123.
На крајот на денот, иако ова е нов концепт, покажувачи, тие се
само променливи.
Но тие се случи да ја запази битови кои колективно претставуваат адреса.
Толку технички сите тие добива се чуваат во s е Ox123.
>> Но ние како луѓе -
вклучувајќи денес па натаму -
не се навистина се случува да се грижи, обично, она што вистински адресата е
на некои парче на меморија.
Тоа е само на ниско ниво на детали за да биде интелектуално интересна.
Па ќе одам да го вратите ова.
И наместо тоа, повеќе високо ниво, само велат дека кога ние зборуваме за покажувачи
Одам да само да привлече повеќе user-friendly стрелките кој го спроведува
истата идеја и извадоци намалува деталите на она што вистински
Клучен адреса е.
>> Сега ако ние се вратиме на код, што се случи минатата недела, ако имаме низа т
еднакво GetString?
Па, ако јас повторно, тип во здраво овој пат јас ќе одам да се добие
друг парче на меморија.
ж-е-л-л-о обратна коса црта 0.
>> Но, бидејќи се јавив GetString по втор пат -
и знам дека ова од гледање на изворниот код за GetString - дури и
иако тоа е случајно дека здраво беше внеле во двапати, GetString не е
ќе се обидат да се оптимизира и да биде умен.
Тоа е само ќе добие уште една парче на меморија од компјутер, кој е
ќе биде на друга адреса.
Ајде да самоволно речеме 456.
>> И тогаш што е тоа нема да се врати?
Тоа се случува да се вратат 456 и таа продавница во т.
Значи она што е навистина се случува, на левата страна е Јас имам друг парче
на меморија, 32 бита обично.
И таму се случува да си Ox456.
Но, повторно, јас не сум заинтересиран за овие особено броеви веќе.
Јас сум само ќе апстрактно подготви тоа како стрела.
>> Па ова е сега нов објаснување.
Но, тоа е исто точно идеја дека е се случува сето ова време.
И така од причина тогаш, дека оваа прва верзија на споредите беше грешка
минатата недела е зошто?
Кога ќе го направите ако е еднакво на еднаква т што си ти навистина
под хауба споредување?
>> Ти си споредување на адреси.
И само интуитивно, јасно, Ox123 нема да еднакви Ox456.
Тие бројки, тие битови се само различни.
>> И толку доследно, минатата недела рече ќе напишете различни нешта, дури и ако
зборови беа непроменети копии на истиот.
Па ние го надминете овој.
Во однос на Едноставен, она што беше на фикс?
>> ПУБЛИКАТА: Користете функција.
>> ЗВУЧНИК 1: Користете функција.
Или ѕвезди се дефинитивно вклучени, туку се користи функцијата, за да го направи она што?
>> ПУБЛИКАТА: Да се ​​споредуваат жици.
>> ЗВУЧНИК 1: Да се ​​споредуваат жици.
Значи основниот проблем тука беше дека сум бил само со оглед на
квалитетот на жици да бидат дефинирани од страна на споредба на нивните адреси.
И очигледно тоа е само глупава сега еднаш да се разбере она што се случува
под хауба.
Вистински да се споредуваат стрингови за да се види дали тие се еднакви во начинот на кој човекот
ќе ја разгледа две жици да бидат еднакви ние треба да ги споредат карактер за
карактер за карактер.
>> Сега јас би можеле да имаат направено овој многу tediously.
Но familiarly, ние сме користење на за телефонска линија.
И само се споредуваат на заградата з против т заградата јас.
Додади заградата јас плус 1 против т заградата i плус 1, и така натаму, во внатрешноста
некој вид на јамка.
И ако јас самото место било два лика кои разликуваат или ако сфаќам дека ooh, а е
пократок од т или подолго од т Јас веднаш може да се каже лажни,
тие не се исти.
>> Но, ако јас се добие преку s и t и да каже исти, исти, исти, исти, исти, крајот на
двете жици, можам да кажам точно, тие се еднакви.
И ете, благодарејќи, пред неколку години некој напиша дека кодот за нас.
>> И тие го нарече StrComp за гудачки споредуваат.
И иако тоа е малку контра интуитивен, StrComp враќа 0 ако тие
две жици, S и T се исти.
Но тоа се враќа негативна вредност, ако е треба да дојде пред т по азбучен ред или
позитивна вредност, ако тоа треба да дојде по т по азбучен ред.
>> Па ако некогаш сакате да се најде нешто, излегува дека StrComp е корисно.
Поради тоа што не само велат да или не, еднакви или не.
Тоа ви дава чувство на нарачување како речник сила.
Па StrComp, а запирка т еднаква на еднакво 0 значи дека
стрингови се навистина еднакви.
Бидејќи секој кој го напиша оваа функција години се претпоставува дека се користат за јамка
или додека јамка или нешто слично да се интегрираат во текот на ликовите повторно
и повторно и повторно.
>> Но проблемот два настана тука.
Ова беше copy0.c.
И двете во црвено е затоа што тоа е недостатоци.
И што правиме овде?
Па, прво се јавив GetString.
И јас се чуваат на повратната вредност во с.
Така што е прилично многу исти како ова горниот дел на сликата.
>> Но она што доаѓа после тоа?
Па, дозволете ми да оди напред и да се ослободи на целиот куп на ова.
Ние ќе ја премотам касетата во времето до каде ние само имаат s, која е сега во согласност со
линија една до таму.
>> Јас се провери.
Ако е еднаква еднаква на 0.
Сега, брз страна на белешка, кога GetString може да се врати 0?
Таму не е доволно меморија.
Нели?
>> Тоа е редок дека ова ќе се случи, сигурно на компјутер, кој е
доби стотици megs или дури и свирки на RAM меморија.
Но тоа би можело, теоретски, да се вратите 0, особено ако
корисникот не соработуваат.
Има начини да се преправаат како да не имаат влезните ништо и трик
GetString во враќањето 0 ефективно.
>> Па затоа се случува да се провери за тоа.
Затоа што ако некој од вас почнаа да добие, веќе, сегментација грешки -
која најверојатно е извор на некои фрустрации -
тие се речиси секогаш резултат на меморија поврзани со грешка.
Некако сте збркана во однос на покажувач, дури и ако не се сетив
имаше покажувач.
Така што може да се предизвикани сегментација грешки како уште една недела користење
нешто како за телефонска линија или време јамка и низа со одење предалеку
минатото на границите на некои низа што можете декларирани, во недела две во
особено.
>> Можеби сте го сториле тоа, дури и во проблемот постави четири со Збег.
И покрај тоа што најверојатно не го виделе било ѕвезди во дистрибуцијата кодот за
Збег, излегува дека оние GRect и GOval и други такви работи,
тие се всушност совети под хауба.
>> Но Стенфорд, како нас, вид на крие кои се наоѓаат детали барем за библиотеките
цели, слично како што го правиме за гудачки и знак *.
Но GRect и GOval и сите оние работите вие ​​момци се или ќе биде со користење на
оваа недела се во крајна линија меморија адреси.
Ти едноставно не го знаат тоа.
>> Па тоа не е изненадувачки тогаш, можеби, што може да прегрешавам некои
сегментација грешки.
Но она што е интересно тука сега, ако откако ќе се провери за 0 правиме
низа т добива s.
Па, дозволете ми да се изјасни т.
Одам да го нацрта тоа како плоштад, 32 бита, го нарекуваат т.
А потоа јас ќе одам да направите добива s.
>> Па, она што значи тоа?
Па, тоа е малку тешко да се размислува во врска со тоа се слика мудар.
Но ајде да размислиме за она што е внатре на X?
Што е буквално во внатрешноста на оваа променлива?
Вредноста Ox123.
>> Значи, кога велам низа т добива с, дека само буквално значи преземат број
во s, која е Ox123 и го стави Ox123.
Или сликовито, ако јас вид на абстрактна далеку од тоа детално го има
ефект на буквално прави тоа како добро.
>> Па сега, се сетам на минатата недела, кога Тргнавме кон капиталистичката Т јас
направив Т заградата 0.
Па, Т заградата 0, иако тоа е покажувачот, можете да го третираат како иако
тоа е низа, со квадратна заградата нотација.
>> Па каде е Т заградата 0?
Па, тоа е часот.
И така, кога ние ги користиме таа линија на кодот, две горниот, која е во таа в type.h
хедер датотека, тоа е каде тоа е декларирана.
Сте Капитализиране на овој Х Но, на Се разбира, тоа е исто точно ж тоа е
внатрешноста на s, така да се каже.
Па сега сте се промениле или капитализирани и на оригинални и
т.н. копија.
Затоа што не си се направи копија во начинот на кој човекот би сакале да биде.
>> Значи она што беше на фикс тука, во copy1.c минатата недела?
Функции, па ние би можеле, всушност, копија на стрингот.
И фундаментално, она што ние треба да се се направи со цел да ја копирате стринг?
>> Па, во овој зелена верзија тука сум случува да се направи тоа прилично ниско ниво.
Таму се всушност функции тие може да помогне со ова.
Но повеќето основни една, а најмногу запознаени, барем, наскоро ќе биде
познат на нас, е следното -
па на првата линија на код во зелена сега.
>> Јас само rewrote s како char *.
Нема функционални Разликата таму.
Јас само фрли CS50 библиотека и Јас сум нарекувајќи она што е, char *.
>> Сега точка, точка, точка, бидејќи имаше некои грешка проверка тоа не е
Интересно е да се зборува за повторно.
Па сега т е декларирана.
Тоа не е премногу е char *.
Па јас привлече малиот плоштад на на екранот како порано.
>> Но, од десната страна, Примерок, што рековме е меморија распредели.
Па одвои парче на меморија.
И колку бајти кога ние всушност сакате да ги распредели, дали тоа да изгледа?
>> Па, стринг должина на С.
Па ако е здраво, тоа е ќе биде пет.
Ние ќе каже ж-е-л-л-о.
Па пет бајти.
>> Но, тогаш плус 1, зошто 1?
На 0 лик.
Ако ние не ја напушти собата за овој човек ние случајно може да се создаде ситуација
каде што низа е ж-е-л-л-о.
И тогаш следниот пат GetString е наречена и јас напишеш во, на пример,
David, Д-а-V-i-г, компјутерот се случува да се мисли дека е, всушност,
ж-е-л-л-о-г-а-V-i-г бидејќи има без пауза помеѓу овие зборови.
>> Па ние треба што пауза.
Значи ние не сакаме пет.
Ние сакаме шест бајти.
>> И бајти велам.
Но, тоа е навистина време големина на знак.
Технички знак е речиси секогаш еден бајт.
>> Но само за да се направи нашиот код пренослив, така да се каже, така што таа работи на
различни компјутери, дури и ако тие би можеле да биде поинаква под
хаубата, јас ќе одам да генерички велат големина на знак, така што
мојот код секогаш работа.
И јас не треба да го прекомпајлирате само бидејќи јас надополни мојот компјутер или да ги користите
некои различни платформи.
>> Па јас имам 6 пати поголема од големината на char, кој се случува да биде 1.
Па тоа значи дека Примерок би можеле да ми даде шест бајти.
Што е тоа што всушност прави?
Па, дозволете ми да се тркалаат назад во времето овде до каде сме во приказната.
>> Значи, ако јас се вратиме тука, јас сум прогласи на char * наречен т.
Јас сум сега се нарекува Примерок за шест бајти.
И сега ќе одам да се подготви оние шест бајти исто како и низа порано.
Но јас навистина не знам што е внатре во оваа низа.
>> Ако алоцира меморија излегува дека не можете да верувате дека има некои
позната вредност таму.
Тоа би можело да се користи од страна на нешто друг, некои други функции, некои други
линија на кодот кој ти напиша.
Па ние генерално ќе го нарекуваме овие ѓубре вредности и да подготви нив, можеби, како
прашалници, само покажува дека ние не знам што е всушност таму.
И тоа не е голема работа толку долго како што ние се доволно паметни за да ги избрише оние
ѓубре вредности со броеви или знаци дека ние се грижиме за.
>> Значи во овој случај она што сум јас ќе направам?
Па, мојата линија на кодот следната, имам четири.
int i добиете 0, n добива стринг должина на С.
Толку познат за телефонска линија.
I е помала или еднаква на n, кои обично се погоре.
>> Но овој пат тоа е намерно.
Јас + +, и тогаш јас едноставно не правете т заградата јас добива s.
Затоа што мојата слика како изгледа тоа во овој момент, се чуваат во t е
адресата на која случаен парче од меморијата чии вредности се непознатото.
Но штом јас не т заградата 0 што ме става тука.
>> И што завршува до добивање привлечени таму?
Ние заврши ставање часот.
Бидејќи тоа е она што е во е заградата 0.
А потоа истото за Е, и л и ј, и o.
>> n, зошто јас одат нагоре преку еднаков на n?
Поради 0 лик.
Па само да бидат јасни, а потоа, ако јас всушност избрише она што овие ѓубре
вредности се и тогаш всушност се подготви во она што го очекуваме, ова е и заградата 1, 2,
3, 4, плус тоа е заостанува нов лик.
>> Па сега ако ние го продолживме минатото на точка, точка, точка во овој правиот верзија
и капитализирана t заградата 0 Би, на Се разбира, се Капитализиране само оваа
човек овде, кој концептуално, на крајот беше целта.
Значи тоа е сите покажувачот е.
>> И сте биле да ги користите за неколку недели сега во контекст на жици.
Но под хаубата тие се малку посложени.
Но, ако мислите дека за нив во овој сликовно форма предлагам дека тие се
веројатно не е толку страшно како што Првиот може да изгледа на прв поглед,
особено со такви нови синтакса.
Било какви прашања на покажувачи, жици, или знаци?
Да?
>> ПУБЛИКАТА: Можете ли да се вратиме на [нечујни]?
>> ЗВУЧНИК 1: Секако.
>> ПУБЛИКАТА: Па како дојде во вашиот последен линија, ќе немаат * T линија
и * а во линија?
Не имаш врска со -
>> ЗВУЧНИК 1: Ах, навистина добро прашање.
Зошто не можам да имаат * т и * а?
Бидејќи кратко, минатата недела, како и во нашата разменуваат функција, јас реков дека кога
имаш покажувач на средства од страна на кој и да одите таму, како ние го сторивме
физички на сцената, беше да се, всушност, користете ѕвезда оператор.
>> Излезе дека овој плоштад-заградата нотација е она што ќе го наречеме синтаксички
шеќер, кој е само секси начин на велејќи дека тоа е стенографија нотација за
токму она што го опишувате.
Но тоа е малку повеќе интуитивна.
И на ризик за правење на ова се чини дека повеќе покомплицирано отколку што треба да биде,
она што навистина се случува овде е следното -
Ако кажам * T тоа значи да одат во на адреса чуваат во т.
>> Значи буквално, ако т е чување адресата на која часот
на почетокот, * T средства одат овде.
Сега, она што не т заградата 0 значи?
Исто точно нешто.
Тоа е само малку повеќе корисник пријателски да пишувам.
>> Но, јас не сум се направи уште.
Јас не може само да се каже * T добива * s.
Затоа што она што јас ќе се прави тогаш?
Би се стави ж, ж, ж, ж, ж во текот на целата работа.
Нели?
>> Бидејќи * T е да отидете на адреса во т.
Но ние сме внатрешноста на јамка.
И она што вредност сум јас зголемување,, се разбира, на секоја итерација?
i.
>> Но, има можност тука, нели?
Иако ова се чувствува како тоа е добивање малку пософистициран
од квадратни загради нотација ние сме се користи за некое време -
дозволете ми да го вратите мојот часот промена таму -
иако ова е сега добивам малку познавач, основната идеја, ако * T
значи тука и * т е само одат на адреса во т.
>> Но она што беше на адреса во т?
Бројот ние ги користите?
Како Ox456, ајде да донесат дека назад само за доброто на дискусијата.
Па, ако сакате да добиете на e во т стринг, сакам само да одат,
во суштина, 456.
>> Или подобро кажано, 457.
Јас само треба да додадете една.
Но, можам да го направите тоа, нели?
Бидејќи т, иако јас се задржи цртеж тоа сега како стрела, тоа е само
број, Ox456.
И ако можам да додадете една до тоа, или повеќе Општо земено, ако јас можам да додадете на тоа што можам
всушност точно каде сакам.
Значи, ако јас всушност го сторат тоа -
и ова е она што сега се нарекува покажувачот аритметички -
Можам да ги отстраните оваа линија.
Што е, искрено, мислам појасно и малку повеќе корисник пријателски да се прочита.
Но, ова не е помалку точни.
>> Оваа линија код сега е со користење покажувачот аритметика.
Тоа е велејќи дека оди на по обраќањето на -
без оглед на почетокот на t е, кој е т плус i, која на почетокот
е 0, што е одлично.
Бидејќи тоа значи дека на почетокот на t плус 1, плус 2, плус 3, и така натаму.
И истиот договор, со s.
>> Па синтаксички шеќер за ова.
Но разбирање на она што навистина се случува под капакот на моторот, јас би рекол,
е всушност корисно во себе и за себе.
Бидејќи тоа значи дека сега не е многу повеќе магија се случува
под хауба.
Таму не се случува да биде многу повеќе слоеви кои ние кора може да се врати за вас.
Ова е в.
И ова е програмирање.
Навистина добро прашање.
>> Сите во право, па ова беше тоа што кабриолет програма јас мислеше порано.
swap беше недостатоци.
Ако не чини да работат.
Потсетиме дека исто како и со млеко и на сок од портокал - што почнав
пиење демонстрација денес.
Значи исто како и на сок од портокал и на млекото, ние не треба да се користи
привремена променлива, мали, да се одржи привремено, така што ние би можеле да потоа
промена на својата вредност, а потоа ажурирање б.
>> Но оваа функција, што рековме, или овој програма во која оваа функција беше
напишано е погрешно и со недостатоци, зошто?
Да?
>> ПУБЛИКАТА: [нечујни].
>> ЗВУЧНИК 1: Точно, кога ти се јавам трампа -
или поопшто, кога ќе јавете се повеќето било функција -
ако аргументи за таа функција се примитивен, така да се каже, ints и карактери
и двојки и плови, работи без ѕвезди, кои поминуваат во еден примерок од
на аргумент.
Па ако x е 1 и y беше 2, се случува да биде 1 и б ќе биде 2.
Но тие се случува да се биде различен парчиња на битови, различни делови од
меморија што се случи да биде чување идентични вредности.
>> Па овој код е супер совршен на Замена на a и b.
Тоа не е добар во Замена -
во пример минатата недела -
x и y.
Затоа пак, тие се во погрешна опсегот.
>> Сега, како сме се обратите за одредување тоа?
Ние требаше да се направат функцијата изгледа малку погрда.
Но, повторно, сметаат дека она што ова само значи.
>> И всушност, остави ме, за доследност, промените нешто па тоа е идентична со
она што го направија.
Како што споменав минатата недела, тоа не го прави важно каде оди.
Всушност, типично ќе се стави на ѕвездичката до името на променливата.
Но, мислам дека тоа ќе биде малку полесно да се разгледа на * до
податочен тип како што значи дека е покажувач до int во овој случај.
>> Па што сум јас тука?
Сакам да кажам дека не ми даде int проследено со уште еден број,
нарекувајќи ги a и b.
Ми даде адресата на некоја Инт.
Ми даде адресата на друг Инт.
Се јавите на оние обраќа a и b.
>> И потоа со помош на * нотација надолу подолу, одат на секоја од тие адреси
колку што е потребно или да се или наместете ја неговата вредност.
Но, има исклучок тука.
Зошто не можам да имаат * до мали?
Зошто не можам да го направите ова, на пример?
Таа се чувствува како да сум само треба да одат сите надвор и да ги поправа целата работа.
Да?
>> ПУБЛИКАТА: [нечујни].
>> ЗВУЧНИК 1: Јас не го прогласија tmp како стринг.
Па ова ќе прогласи, во овој случај, на мали за да биде на адресата на инт.
Но тоа не е сосема она што сакам, за неколку причини.
>> ПУБЛИКАТА: Вие не сакате да ги трампа.
>> ЗВУЧНИК 1: Точно, не сакам да се разменуваат со ништо со мали. tmp е само
недела-еден нешта.
Се што сакам е променлива за складирање на некои број.
Јас дури и не се грижат за адреси во овој момент.
>> Јас само треба 32 бита или така да се сместат на инт.
И јас сакам да се стави во оние 32 бита она што не е во, така да се каже, но
она што е во една, само за да бидеме попрецизни.
Затоа што ако еден е на адреса, * средство одат таму и да добијат вредност 1.
На пример, во примерот од минатата недела или во случај на b, ја добиете вредноста на 2.
>> Значи она што е навистина се случува?
Дозволете ми да нацрта слика дека тука ќе само одгатнат дел на денешницата.
Но, ова ќе продолжат да се појавуваат за сосема извесно време.
>> Ова, тврдам, е она што на вашиот компјутер меморија како изгледа кога ќе ја стартувате
програма, секоја програма.
Кога ќе ја стартувате програмата во самиот врв на RAM меморија на вашиот компјутер - така мисли на
овој правоаголник, навистина, како вашиот компјутер RAM меморија или мемориски, сите 101
милијарда бајти од неа сите две милијарди бајти, сите два гигабајти на тоа,
без оглед на количината што треба е, ајде да нацрта како правоаголник.
И тврдам дека кога ќе ја стартувате програмата како што е Microsoft Word или Хром
или нешто слично, на битови кои Microsoft или дека Google напишал -
во случаите од овие програми -
се вчитуваат во меморијата на вашиот компјутер каде што тие можат да се извршат повеќе
брзо и хранат во процесорот, кој е мозокот на компјутерот.
>> И во ТАМ тие се чуваат на самиот врвот на својата програма, така да се каже.
Со други зборови, ако ова е парче сеќавање, кога ќе кликнете два пати на
Microsoft Word, битови се исклучување на хард дискот.
Тие се натоварена во RAM меморија.
А ние ќе ги бутам во самиот врв на овој правоаголник концептуално.
>> Добро, остатокот од вашата меморија е се користат за различни нешта.
Во самиот врв гледате иницијализирам податоци и деиницијализира податоци.
Ова мора да се направи, во најголем дел, со константи или глобални променливи
кои имаат вредности.
Но повеќе за оние некое друго време.
>> Тогаш го имате грамада, која ние ќе се вратам на.
Но на дното е делот кој е особено germane во моментов.
Тоа е т.н. оџак.
Значи исто како и во повеќето било D сала тука на кампусот, имате овие коцки кои
само магацинот на врвот на секоја друга на која можете да ставите храна и какво ли не.
Магацинот во компјутерски систем е многу сличен.
Освен со оглед на послужавник, како ние ги користиме во на мензата, се разбира, е наменета
да ги работите на коцки или рамки -
како што ќе им се јавам - во компјутерот меморија се користи да се одржи
променливи и вредности.
>> Значи она што навистина се случува под хаубата?
Па, дозволете ми да флип над на екранот овде.
И ајде да се фокусира само врз основа на долниот дел за момент.
Ако ова е крајна дел од моето меморија на компјутерот што излезе, кога јас
повик на функција главните - што се случува, искрено,
автоматски за мене -
Можам да добијам парче од меморијата на дното на моето RAM меморија, така да зборува.
И ова е местото каде што главните е локални променливи оди.
Тоа е каде што argc и argv можеби оди, и сите променливи јас
декларираат во внатрешноста на главниот.
Тие завршуваат на дното на RAM меморија на компјутерот ми е.
>> Сега да претпоставиме дека главната повици функција како трампа, како што тоа го правеше минатата недела?
Па, ние во суштина стави нова послужавник, нова рамка, врз мојата парче на меморија.
И јас одам да се опише ова како кои припаѓаат на swap функција.
>> Сега она што е внатре на swap?
Па, врз основа на програмата од минатата недела и онаа што само што видов извадок од,
внатрешноста на рамката трампа, или на трампа на послужавник, се она што променливи?
Добро, a и b.
Бидејќи тоа беа нејзините локални аргументи, плус една третина, мали.
Значи, навистина, би можел да се подготви овој малку повеќе демонтирани.
Дозволете ми да оди напред и да го вратите на етикетата.
И дозволете ми да тврдат дека знаеш што?
>> на е веројатно нема да заврши тука.
Б се случува да се заокружи тука.
И мали се случува да се заокружи тука.
Сега, на нарачување може да биде малку поинаква.
Но концептуално ова е идеја.
>> И само колективно, тоа е она што ние ќе го наречеме рамка трампа, или
јадење-сала лента.
И истиот договор со главната.
Но јас нема да ја прецрта тоа.
Но тоа е каде argc и argv и било нејзините локални променливи како x и y
може да биде толку добро.
>> Па сега сметаат дека она што навистина се случува кога ќе се јавите, swap.
Кога ќе се јавите, swap, извршување на кодот како ова, ти си поминува во, во
кабриолет верзија, a и b како копии на x и y.
Значи, ако го правам сега се подготви овој на екранот -
мора да се подобри во ова -
Значи приказната јас бев кажувам за себе беше во овој кабриолет верзија, кога ние
јавете се разменуваат поминува во буквално a и b како цели броеви, она што навистина се случува?
>> Па, она што навистина се случува е тоа.
Дозволете ми да оди напред и да го вратите само да се расчистат некои простор тука.
Па ова е меморија на компјутерот ми е.
>> Па ако имам, на пример -
всушност да го сториме тоа на овој начин -
ако тврдам дека ова е x, чување вредност 1 исто како и минатата недела.
И ова е Y, чување на вредноста 2 Исто како и минатата недела.
И ова е главниот, кога ќе се јавам, swap, на тој начин себе си даваат пристап до и
б и мали, јас ќе одам да се тврди дека ова е и ова е 1.
>> Ова е б.
Ова е 2.
Ова се нарекува мали.
>> И на почетокот, таа има некои ѓубре вредност додека јас всушност сместат во неа,
што е 1.
Тогаш ќе одам напред и да се промени на да се биде што?
Б е вредност.
>> Па сега имам две овде.
И тогаш рече б добива мали.
Повторно, само како здрав разум провери, третиот линија код овде е едноставно ова
еден, б добива мали.
>> И така на крај, она што можам да направам?
Јас одам напред и промена b за да биде она што вредноста на мали е, што е 1.
Јас не го допрат мали повторно.
>> Но сега, проблемот е најкраток трампа се враќа, бидејќи тоа не е предавање
се врати некои вредност, нема враќање изјава експлицитно во неа.
Она што всушност се случува?
Па, во суштина сето ова меморија -
Добро, очигледно гума сака само еден прст во време -
само исчезнува.
>> Сега, во реалноста тоа не е никаде да одиме.
Но можете да мислам на тоа сега како прашалници.
Затоа што тоа е веќе всушност е во употреба.
И ништо не е направено со тие вредности.
>> Така што во случај на зелениот верзија на овој законик, што наместо да се биде
донесен во трампа?
Така се обраќа.
Па на адреса на x и на адреса на y.
Значи, ако ние повторно кажам оваа приказна за последен време, и јас всушност подготви трампа повторно,
но со покажувачи, ова е само, овој се б, и ова се мали, она што е
всушност се чуваат во во оваа зелена верзија на мојата код каде јас сум поминува
во адреси?
>> Тоа се случува да биде покажувач до x.
Па можев да се подготви стрела.
Но, ајде да ги користат истите арбитрарни пример како порано.
Да речеме дека ова е нешто како Ox123.
И ова се случува да биде Ox127 бидејќи тоа е четири бајти далеку, бидејќи тоа е
int, па Ox127.
>> И повторно, јас сум преземање на некои слободи со броеви.
Тие се многу помали отколку што би всушност ќе биде и во различен редослед.
Но тоа е како на сликата сега е поинаква.
>> Но кога јас го користам оваа зелена код и јас не int мали добиете * a.
* Средство да го направите следново, да ги преземе обрати дека е во и да одат во неа,
што е 1.
И тоа е она што потоа го ставаат во мали.
Во меѓувреме, во следната линија на кодот тука, * а добива б, што значи тоа?
>> Добро, * а, па повелете тука добива * б, што значи одиме таму.
А тоа значи стави на вредноста до таму.
Конечно, последната линија на кодот едноставно рече * б добива мали.
>> Па b вели одиме таму и пребришете го со tmp која, во овој случај, се случува
да биде, повторно, 1.
И ова е причината зошто на зелена верзија на нашиот код дела, додека на црвениот
верзија никогаш не го правеше.
Сето тоа само се сведува на тоа како меморија е раководен и каде тоа е
всушност поставен во компјутер RAM меморија.
И сега за сега, и тоа е една од работите дека оџакот се користи за.
>> Прашања во врска со изгледот?
На совети?
Или на swap?
>> Сите во право, па Примерок, се потсетиме, направи нешто како ова.
Ова беше супер едноставен пример.
И тоа беше оној кој Binky воведе нас да, иако доста
брзо, на крајот од класа.
Мајката, таму ќе одиме повторно.
>> Па се потсетиме дека ова е пример дека Binky ни воведе, иако
нешто брзо на крајот од класа.
И тука ние се користи Примерок навистина по втор пат.
Бидејќи првиот пат кога ние го користи за да се создаде доволно RAM меморија, доделат доволно RAM
за чување низа.
>> Овој пат Binky го чуваат едноставни.
Па тоа е да ги чувате само на int, очигледно.
И тоа е сосема во ред.
Тоа е малку чудно, искрено, да користете Примерок да одвои една Инт.
Но поентата на claymation на Nick беше навистина само раскаже приказната за тоа што
се случува или не се случува кога ви малтретираат меморија.
>> Значи во овој случај, оваа програма направи неколку работи.
Во првиот случај тука, тоа се декларира покажувач наречен X до Инт.
Таа потоа изјавува покажувач наречен y до Инт.
Таа потоа продавници во х, што?
Некој друг сега.
Што добива чуваат во х според третата линија на оваа програма?
>> ПУБЛИКАТА: [нечујни].
>> ЗВУЧНИК 1: Па, не сосема бајти, по се каже.
Бидеме попрецизни сега.
Што добива чуваат во X?
На адреса, мислам дека јас го слушнав.
>> Значи она што не Примерок се вратат?
Примерок behaviorally доделува парче меморија.
Но, како тоа ви даде пристап до него?
Го враќа она што?
На адресата на првиот бајт во парче на меморија.
>> Сега, ова е супер едноставен.
Тоа е само еден бајт, што значи дека решавање ние сме добивање назад е
адресата на целата работа.
Па се чуваат во х тогаш, е адресата на тоа парче на меморија.
Во меѓувреме, она што се случува следно?
Така всушност, ајде да одиме напред и да подготви ова вистински пост.
>> Значи, ако одиме во текот на екранот тука и играме ова int * x и int * y
се случува да го направи она што за мене?
Тврдам дека тоа е само случува да се направи нешто како ова и го нарекуваат X, и
ова и го нарекуваат г.
Во меѓувреме, третата линија на кодот е ќе ги распредели со големина на int,
кој се случува да биде - Жал ми е ако кажам дека еден пред Мислев еден int -
четири бајти на еден типичен компјутер.
Барем со CS50 апаратот.
>> Значи ова се случува да се распредели тоа, кој знае?
Некаде надвор тука.
И ова е зачуван во некои адреса Волот, кој знае?
Но, она што се случува да се врати е таа адреса.
Но ние ќе се подготви овој сликовито како само стрела како тоа.
>> Сега во следната линија * x добива 42.
Што значи * x значи во однос лаик?
Само оди таму.
Оди на таа адреса.
Или со други зборови, следете ги стрелка и го стави 42 таму.
Но, тогаш нешто лошо се случи да Binky, нели?
>> Потсетиме дека линијата пет овде, * y добива 13, навистина несреќен број,
не она што за нас?
Добро, * y средства одат таму.
Па, ова не е дадено вредност, сепак, нели?
Кодот не мора y се иницијализиран на ништо.
Имавме x се иницијализира на адреса.
Но y беше прогласен до врвот.
Но, тогаш точка-запирка, нема вредност беше всушност се стави во неа.
Па тоа е фер да се јавите оваа ѓубре вредност.
Кој знае што е таму?
Тоа е остаток од битови кои биле користени од страна на некои претходни линија код во
мојата програма.
>> Значи, ако јас кажам одат таму, ова е како, Јас немам идеја каде овој стрелката е
случува да се заокружи.
И тоа е кога можете обично добие сегментација вина.
Ако случајно сте dereference, така да се зборува, или одам во адреса што не е
всушност легитимен адреса, лоши работи се случуваат.
>> И тоа е токму она што се случи да се размислува Binky.
Па се потсетиме дека приказната дека Ник беше кажувам тука е истата идеја како што
Сум подготвен со илузијата на креда на табла таму.
X и Y се објавени.
>> Тогаш ние доделени на големината на на int и чуваат тоа во х.
Тогаш следната линија што го правевме * x.
Ова беше магично стапче на Nick на dereferencing.
Кои се стави 42 во меморијата истакнато од страна х.
>> Но, ова е местото каде што работи отиде ужасно погрешна.
Нели?
Се обидовме да dereference y.
Но y имаше некои лажни вредност, нели?
>> Дека стрелка во долниот лев рака агол, не е
всушност укажува на ништо.
Тоа е вид на прави она што јас направив тука на табла.
Толку лоши работи се случуваат, сегментација вина, или Binky вина, во овој случај.
>> Но ако ние потоа одреди дека со тоа х добива y како го прави приказната промена?
Па, ако го направам х добива y, тоа е ефикасно иста како вели
што е ова, Волот-нешто се случува да биде ист тука,
Вол-нешто.
Или сликовито ќе привлече стрела.
>> Па еве на табла со Binky, со следната линија на
код, * y значи одиме таму.
Каде е таму?
Тоа значи овде.
>> И кога ќе се ажурира дека за да биде 13 тоа само вклучува одат и
пишување 13 тука сега.
Па можеби не целосно јасна на прв поглед.
Но да повториме и да ги користат истите жаргон дека Binky е користење тука, па
првите две алоцирање на покажувачи, x и y, но не pointees.
И pointees не е генерално се користи терминот.
Но покажувачот апсолутно е.
Но тоа е она што се вперени на во номенклатурата Binky е.
>> Овој следната линија, се разбира, доделува на int pointee.
Значи парче на меморија - како што јас привлече во текот на на десната страна таму - и во собата
x еднаква на точка за тоа.
Ова dereferences на X да ја запази 42 во меморија дека тоа е покажувајќи кон.
А потоа ова, се разбира, е лоша работа.
Затоа што у не беше посочувајќи во ништо сеуште.
Ова го поправа.
Значи ова е уште кабриолет програма.
Само затоа што ние сме дува низ кодот линија по линија и велејќи, ох добро,
нека се сруши таму.
Тоа е лоша работа.
Шансите се на програмата е само случува да прекине целосно на таа линија.
Но, ако сте во ситуација да се отстрани се урна редат и да го замени со последните две
линии таму ќе додели -
користење на покажувачот задача - Y да се укаже x како точка т.
А потоа можете dereference y во многу безбеден начин.
>> Значи, каде што го прави ова ни остави?
Па, излегува дека под хауба во CS50 библиотека, покажувачи се
се користи во текот на.
И ние всушност ќе почне да лупам назад тој слој пред долго.
Но, се покажа премногу, израз кој некои од вас може да биде запознаен со тоа,
особено оние кои се чувствуваат поудобно, е всушност онаа на многу популарен
веб-сајт, или магацинот претекување, овие денови.
>> Но тоа всушност има многу техничка смисла.
Ние сега знаеме она што магацинот е.
Тоа е како да магацинот на коцки внатрешноста на мензата.
>> Или во внатрешноста на вашиот компјутер меморија својот тие рамки
кои се користат од страна на функции.
Па, излегува дека поради тоа многу едноставна имплементација на
меморија и рамки на т.н. магацинот, всушност можете да ја преземат контролата
на компјутерски систем прилично лесно.
Можете да се пробие во еден систем ако луѓето како нас не имаат напишано нашиот код
особено добро.
>> Ако луѓето како нас ги користат парчиња на меморија или употреба низи -
дури и почесто -
но понекогаш заборавајте да ја проверите границите на нашите низа како што може да
имаат себе си понекогаш, и потврди начинот на кој премногу далеку минатото на крајот на низата.
Во најдобар случај, вашата програма само може да се сруши.
Сегментација на вина, вид на срамно.
Не се големи, но тоа не е нужно енормно лоша работа.
>> Но, ако вашата програма е всушност вистинска компјутерите на корисниците, ако тоа е водење
на веб-сајт кој вистински случајни луѓе на интернет се притискање, допуштајќи
луѓе предизвикаат лоши нешта на вашиот код е генерално не е добра работа, бидејќи
тоа значи можност да се земе контрола на компјутерот.
И ова се случува да се погледне малку криптичната.
Но мислев дека сум те плашам со овој последен пример тука.
>> Еве еден пример од код.
И има добри Википедија статија која шета низ
ова во повеќе детали.
Имам главната на дното повик foo, минувајќи во argv од 1.
И тоа е само така што ќе може ја стартувате програмата и да го положат
произволна влез.
>> А потоа foo е прогласена до врвот како прифаќање на стринг, или повеќе
поточно, еден знак *.
Таа потоа изјавува низа од карактери.
Наречи го тоа тампон, поопшто, на големина 12.
Па 12 карактери можат да се вклопуваат во внатрешноста на таа низа наречен в.
>> А потоа го користи овој нов функција, кој е нов, но не е тешко да
се разбере, меморија копија.
Тоа копии на меморијата од бар, кој беше на променливата минатото n, без оглед на
корисникот внесе во argv 1 во в.
Колку бајти?
На стринг должина на бар.
>> Значи со други зборови, ако корисникот видови во ж-е-л-л-о Enter, стринг должина
на здраво е пет.
Па пет од оние бајти се случува да се копирани во низата наречена в, кои
е од големина 12.
Но, она што на корисникот видови во многу подолг збор кој е 13 карактери или 14
карактери или 100 карактери или повеќе?
>> Каде се тие случува да одам?
Па, таа рамка, која послужавник во јадење-сала магацинот,
тие се случува да одам таму.
И тоа е само случува да се започне пребрише други работи кои се веќе
на тој магацинот, се потопуваат магацинот, така да се каже.
>> Толку сликовито, мислам дека на овој начин.
Ова е само шарени верзија на сликата ние сме биле цртање.
На дното, да речеме, е главен.
И на врвот, она што го гледате сега е рамката, боја кодирани сега, за
функција наречена foo.
Но она што е интересно во врска со foo е дека тука е неговата рамка.
Па тоа е подготвени онака како што не, но во светло сина.
А сега ова е местото каде што в заградата 0 оди.
И ова е местото каде што в заградата 11 се случува да се заокружи.
>> Со други зборови, тоа се случува да биде претставен како плоштад.
Но ако сте само задржи plopping бајти надолу - или знаци - тие се случува да се стави крај
во локација 0 целиот пат до до 11, бидејќи тоа е 0 индексираат.
>> Но, каде е на 13-ти карактер случува да се заокружи?
Каде е 14-ти?
Каде е 50-карактер случува да се заокружи?
>> Тоа се случува да продолжувам да одам надолу.
Бидејќи иако ние сме подготвени на слика со магацинот расте нагоре,
адреси, излегува, оди од мали адреси, мали
покажувачи, до големи адреси.
Па тоа само држи се случува нагоре и нагоре.
>> Значи, ако на корисникот видови во Здраво, тоа е одлично.
Нема бубачки, нема проблем, безбедно на сите.
Но, ако на корисникот видови во она што ние ќе јавете се контрадикторна код, претставен
генерички како, напад, напад, напад, напад, она што може да се случи?
>> Па, ако сите на внесување дека корисникот напишан во не е само некои пријателски
или навредувачки низа од карактери.
Тоа е всушност низа од карактери дека ако го состави,
што всушност е код.
Можеби тоа е код кој ги брише сите додадени фајлови на вашиот хард диск или праќа спам
или нешто слично.
Забележите дека она што е Клучот тука е дека ако лошо момче доби доволно среќни да
пребришете црвено парче на меморија -
што јас не се подготви за мојата слика, но оваа слика Википедија тука има -
нејзините т.н. враќање адреса.
>> Кога храната се враќа, кога swap се враќа, како не на компјутер знаат да одат од
до тука за да овде долу?
Или во тек сегмент погоре, како не го знае за да одат од трампа
код - на 0 и 1 е кои ја сочинуваат трампа -
Назад во главното?
Има т.н. враќање адреса чуваат во истата магацинот рамка, на
исто кафетеријата лента.
>> Па ако на лошо момче е умен доволно за да стави напад код, напад код, напад
кодот, и да добијат доволно среќни -
често преку обиди и грешки - до пребришете дека црвено враќање адреса,
со адреса и информации самиот врв.
Забележите 0835C080.
Тоа е напишано наназад до врвот за причини ние можеби ќе се враќате.
Ова е тој број.
>> Па ако на лошо момче добива доволно среќни или е доволно паметни да ја пребришете црвена
лента на меморија со адреса на код кој тој или таа има некако
инјектира во вашиот компјутер, погоди чија кодот ќе бидат вратени
штом foo е направено извршување?
>> На лошо момче го кодот.
Па овој напад код, ААА, повторно, можеби испрати спам, би можеле да ги избришете сите датотеки
на вашиот хард диск.
Но тоа е она што навистина магацинот претекување е, или тампон пребрзувањето, или
buffer overflow напад.
>> И тоа е неверојатно, неверојатно заеднички на овој ден со програми напишани во
C, C + +, и дури и некои други јазици.
На тој страшен белешка, ние ќе заврши со шега.
>> [Смеа]
>> Те гледам во средата.
На следната CS50 -
Па јас сум сите надвор од дискот светилки денес, но чекај, масти бесплатно млеко, половина на телефонот
книга, сок од портокал што го испив денес.
USB кабел, клуч.
>> [Музички]