[МУЗЫКА ГУЛЯЕ] David J. малая: Добра. Гэта CS50. І гэта пачатак тыдня 5. І, як вы, магчыма, заўважылі, частка матэрыялу становіцца трохі больш Комплекс, трохі шчыльней. І гэта вельмі лёгка, асабліва калі вы былі ў звычку на працягу некаторага часу, , Спрабуе штабнаваць ўніз найбольш што мы робім, мы кажам у класе. Але ўсвядоміць, што гэта не магчыма, ідэальнае педагагічны падыход да вывучэння такога роду матэрыялу, і матэрыял у цэлым. І таму мы рады паведаміць, што CS50 ўласную Gheng Гонг пачатку падрыхтоўкі кананічны набор нот за курс, надзея , Які з'яўляецца тое, што адзін, гэта не толькі служаць даведачна-рэсурс для разгляду матэрыялу і збіраецца назад праз матэрыял, што, магчыма, прыйдзецца бег вам у першы раз вакол, але і так, што вашы галавы можа быць больш да, чым ўніз, калі яго прыходзіць час, каб чытаць лекцыі, так што вы маглі б займацца больш удумліва, як адрозненне ад больш scribbly. З улікам сказанага, што вы знойдзеце на сайт такія дакументы, як гэта. І звярніце ўвагу, у левым верхнім куце, ёсць не толькі змест, але і часовыя коды, што адразу пераскочыць вас ў адпаведнай частцы ў відэа онлайн. І тое, што Чанг тут зрабіў з'яўляецца, па сутнасці, дакументальна што адбылося ў гэты прыватнасці лекцыя. І многія з лекцый ужо цяпер у сеткі з гэтым URL. І мы будзем працягваць размяшчаць астатнюю з тых, да канца гэтага тыдня, так што скарыстацца гэтым рэсурсам. Такім чынам, без далейшых цырымоній, мы пачалі адхіліце Пласт, які быў Радок на працягу некаторага часу. І што ж мы гаворым радок на самай справе на мінулым тыдні? Так сімвал зоркі. І знак зоркі, добра, што нічога, што на самой справе азначае? Ну, усё гэта час, калі мы ў былі выкліку функцыі, як GetString, і захоўвання так званы вяртання Значэнне GetString ў переменная-- гэта называецца з Тып string-- мы пісалі радок кода там вышэй. І гэта толькі тады, калі я бачу, мой почырк павялічваецца тут я разумею, наколькі зверскім гэта. Тым не менш, давайце выкажам здагадку, што, на правай баку , Тым не менш, разумны малюнак таго, што гэта ўжо на ўсё гэта Час з GetString. GetString, вядома, атрымлівае радок. Але што гэта сапраўды азначае? Гэта азначае, што ён атрымлівае кавалак памяці ад аперацыйнай сістэмы шляхам выкліку функцыі, называецца Таноса. Але пра гэта пазней. А потым ён запаўняе што частка памяці з літарамі карыстальнік мае ўвялі ў, за якім варта, вядома, нулявы сімвал, або зваротны слэш нуля ў самым канцы. Між тым, на левай баку з гэтай гісторыі, увесь гэты час, мы былі аб'явы зменнай, як з. І, што пераменная што зараз пачне выкліку паказальнік. Гэта не акно, усярэдзіне якога мы ставім радок, Daven, па сутнасці, а мы ставім у гэтай клетцы у левай частцы старонкі, што менавіта? Так? АЎДЫТОРЫЯ: адрас дзе ён знаходзіцца ў памяці. David J. малая: Точно. Адрас, куды Daven знаходзіцца ў памяці. І не там, дзе ўсё Daven знаходзіцца, як такой, а менавіта адрас чаго? Так? АЎДЫТОРЫЯ: Першы сімвал. David J. малая: Першы сімвал у Daven, які, у дадзеным выпадку, Я прапанаваў было адвольна і нерэальна 1, Ox1, які проста азначае, што шаснаццатковы лік 1. Але гэта, верагодна, быць нашмат больш лік што мы маглі б зрабіць з 0x ў якасці прыстаўкі, , Якая прадстаўляе шаснаццатковае характар. І таму, што мы не павінны ведаць, дзе астатнія з персанажаў Daven з'яўляюцца, таму што просты дызайн Рашэнне, якое было зроблена шмат гадоў таму? Так? АЎДЫТОРЫЯ: Backslash 0. David J. малая: Так, дакладна. Зваротная касая рыса 0 дазваляе, хоць і ў лінейнае час, каб прайсці праз радок, хады ад злева направа, з для цыклу, або некаторы час пятля, ці нешта падобнае што, і вызначыць, о, тут гэта канец гэтай канкрэтнай радка. Так толькі з адрасу ў пачатак радка, мы можам атрымаць доступ паўнату гэта, таму што ўвесь гэты час, радок толькі што быў сімвал зоркі. Так што гэта, вядома, выдатна, каб працягнуць выкарыстанне Бібліятэка CS50 і гэтая абстракцыя, так сказаць, але мы будзем пачынаем бачыць менавіта што адбывалася на пад ўвесь гэты час. Такім чынам, вы, напэўна, памятаеце гэты прыклад, таксама з мінулага разу, параўноўваць 0, які на самай справе не параўнаць. Але мы пачалі з гэтым разабрацца. Але як можа быць, перападрыхтоўкі, можа я зацікавіць каго у ружовага слана сёння, таксама выступілі Чанг? Як пра вас перад? [Неразборліва]. Падымайцеся. І ў той жа час, як вы прыдумалі, давайце разгледзець на імгненне, што гэты код на самай справе робіць. Гэта аб'явы двух зменных да зверху, з і т, і заклікаючы GetString. Гэта не вельмі зручна праграма, таму што гэта не кажа вам, што рабіць. Але давайце выкажам здагадку, што мы упорам на сакавітыя часткі. І тады мы робім, калі з роўна роўная т, ён павінен сказаць Printf, Вы ўвялі тое ж самае. Добры дзень. Як цябе завуць? Janelle: Janelle. David J. малая: Janelle, прыемна пазнаёміцца. Так ваш выклік на рука для гэтага слана з'яўляецца першым справай звяртаюць нам карціну таго, што знаходзіцца быць прадстаўленымі ў тыя першыя два лініі. Так з і т можа быць прадстаўлены як на экране? А можна проста намаляваць яго з пальцам на гэтым вялікім экране. Такім чынам, ёсць дзве палоўкі ў кожная бок гэтага ўраўненні. Так што з злева, і затым GetString справа. А тут яшчэ т на левай баку, а затым GetString справа. Так як мы можам пачаць маляванне малюнка, што ўяўляе, што адбываецца тут, у памяці, вы можаце сказаць? І дазвольце мне дазваляюць растлумачыць што вы робіце, як вы ідзяце. Janelle: ОК. Ну, па-першае, ён будзе прасіць Вам атрымаць ўваходныя радок. І было б store-- ой, прабачце. David J. малая: ОК. Добра. І гэта называецца і што? О, добра. Працягвайце ісці. Я не хацеў перапыняць. Janelle: Выбачайце. Так што гэта будзе ўваход яго ў адрас ня of-- ўпэўнены. Я не магу дакладна ўспомніць нумар, але я мяркую, што гэта было, пачынаючы з 0. David J. малая: Усё ў парадку, таму што я зрабіў лічбы ўверх, так што няма ніякага правільнага адказу. Janelle: Пачынаючы з 0 дугі. David J. малая: ОК, так элементам 0. Вядома. Janelle: І потым, калі была як проста два-letter-- David J. малая: ОК, назад да вас. Janelle: Так элемент 0, і то элемент 1 або элемент 2. David J. малая: А якая частка карціна ты малюеш прама цяпер? Заклік да GetString? Або дэкларацыя з? Janelle: Дэкларацыя з з, я веру. О, GetString, таму што гэта, быць уведзеныя ў кожнай [? плошчу. ?] David J. малая: Добра. Дакладна. Нават пры тым, што гэта эфектыўна вяртае масіў, нагадаем, калі мы вернемся радок, мы можам індэкс ў гэтай радку, выкарыстоўваючы 01 і 2. Тэхнічна, гэта, верагодна, прадстаўлена асобным адрасах, але гэта нармальна. Такім чынам, няхай, калі я магу проста хутка накіраваць туды, дзе мы спыніліся апошні раз, калі адзін з струны быў г Ь е, зваротны слэш 0, тым самым прадстаўляючы Гейба ўваход, як мы маглі б прадстаўляць з цяпер? Калі гэта памяць, гэта былі вернутыя на GetString? Janelle: было б прадстаўлена дугой? David J. малая: Пад дугой? Ну, не. Давайце проста скажам ,, графічна, дазвольце мне проста ісці наперад і лічым, што, калі гэта з, гэтая з'яўляецца вяртанне кошт GetString. І вы намалявалі гэта як 0, 1, 2, якія цалкам разумна, таму што мы можа індэксаваць ў радок, як такой. Але толькі, каб адпавядаць апошні раз, дазвольце мне ісці наперад і адвольна мяркуем, што гэта з'яўляецца адрас 1, гэта адрас 2, гэта адрас 3, і гэтак далей. І так, проста, каб быць супер ясна, што адбываецца пайсці ў з у выніку, што Першы радок кода, вы можаце сказаць? Janelle: Адрас 1? David J. малая: Точно. Так што звярніцеся 0x1. А між тым, дазвольце мне ісці наперад і дубляваць многае з таго, што вы зрабілі і дадаць свой уласны т тут. Калі б я быў набраць у Гейб зноў жа, у другі раз, пры запыце з GetString, дзе, Вядома, такі Гэбрыэл збіраецца ісці? Ну, presumably-- Janelle: Як тут? David J. малая: Так. Janelle: Ці гэта таксама ў тых жа скрынях? David J. малая: Дазвольце мне прапанаваць, так, дакладна, так у гэтых дадатковых скрынак. Але тое, што ключ зараз з'яўляецца тое, што, нават хоць я намаляваў гэтыя даволі блізка together-- 0x1, гэта з'яўляецца 0x2-- ў рэчаіснасці, гэта зараз можа быць адрас 0x10, Напрыклад, і 0x11 і 0x12, і гэтак далей. Дык вось, калі гэта так, што будзе ў канчатковым выніку тут, у т? Janelle: 0x10? David J. малая: Точно. Так 0x10. І вось цяпер, апошняе пытанне. Вы, безумоўна, павінны былі працаваць цяжкая для слана да гэтага часу. У цяперашні час, калі я падцягнуць код зноў, калі я раблю, у трэцяй лініі, калі з роўна роўная т, што я на самой справе параўнанне, што мы намалявалі тут? Janelle: Два адрасы? David J. малая: Точно. Так што я кажу, ы роўная роўная т? Іншымі словамі, гэта 1 роўная роўная 10? І, вядома, Відавочны адказ цяпер, няма. І так гэтая праграма ў канчатковым рахунку, ў друк, што, б вы сказалі? Janelle: было б, Вы ўвялі тое ж самае? David J. малая: Так што, калі з 1 і Т 10? Janelle: Вы ўвялі розныя рэчы. David J. малая: Точно. Вы ўвялі розныя рэчы. Добра. Так апладысментамі, калі б мы маглі, тут. [Апладысменты] Гэта было балюча. Я ведаю. Прыгожа зроблена. Так што цяпер давайце паглядзім, калі мы не можам дражніць адзін ад аднаго, што выпраўленне было. І, вядома, калі мы зафіксавалі это-- якія цяпер я буду прадстаўляць у green-- мы зрабілі пару паляпшэнняў тут. Па-першае, гэтак жа, як здаровага сэнсу праверыць, я першай праверкі калі з роўна нуля і т роўная нуля. І каб унесці яснасць, калі маглі б з або т быць пустым у кодзе, як гэта? Калі можа з або т быць пустым. Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Калі радок, якую карыстацкі набраны занадта доўга каб упісацца ў памяці, ці некаторыя дзіўна памежныя выпадкі, як, што, GetString, як мы ўбачым, у літаральным сэнсе сёння, у дакументацыі, кажа ён вернецца NULL як Асаблівае значэнне дазорнай, ці проста свайго роду спецыяльны сімвал гэта азначае, што тое пайшло не так. Таму мы хочам, каб праверыць што, таму што аказваецца што нуль з'яўляецца вельмі небяспечнае значэнне. Часта, калі вы паспрабуеце зрабіць тое з нуль з удзелам function--, прапусціўшы яе ў якасці ўваходных дадзеных, для instance-- гэтую функцыю можа вельмі абрынецца, а з ім, зняць ўсю праграму. Так што гэта трэцяя радок цяпер гэта проста здаровы сэнс праверыць, праверку памылак, калі вы будзеце. Гэта добрая звычка і атрымаеце нам патрапіць у любы час мы паспрабуйце выкарыстоўваць значэнне, можа, патэнцыйна, быць пустым. Цяпер, у чацвёртай радку тут, "Калі зЬгстр (S, T)," добра, што гэта такое кажаце? Ну, мы казалі, што гэта вельмі коратка імя функцыі для параўнання радкоў. І яго мэта ў жыцці, каб параўнаць яго першы аргумент супраць яго другога, але не ў плане іх адрасы, як мы зрабілі ненаўмысна момант таму з чырвоным кодам, але а параўнаць гэтыя два радкі ў па-чалавечы інтуітыўна чынам, параўноўваючы гэта, у дачыненні да таго, супраць гэтага, супраць гэтага, і затым прыпынак, калі і калі адзін або абодва маіх пальцаў парад зваротны слэш 0. Дык хто-гадоў таму рэалізаваны зЬгстр ажыццявіць для нас функцыянальнасць што мы спадзяваліся, што мы атрымалі б , Проста параўноўваючы дзве простыя значэння. Цяпер, шчыра кажучы, я трымаю малюнак усе гэтыя розныя нумары. Але рэальнасць такая, што я быў што робіць гэтыя ўверх ўвесь час. І таму дазвольце мне проста ісці наперад і штабнаваць гэтыя па-за зрабіць пункт, што, у рэшце дня і рухацца наперад, мы на самай справе не збіраецца клапаціцца аб якія адрасу рэчы на ​​самай справе ў памяці. Так што я не збіраюся рабіць гэта віды лікаў так больш, Я проста абстрактная гэта далёка трохі больш добразычлівым толькі з стрэлкамі. Іншымі словамі, калі з з'яўляецца паказальнікам, добра, давайце проста намаляваць яго, у літаральным сэнсе, як паказальнік, стрэлка ад сябе нешта іншае, і не занадта турбавацца больш пра дробязях з гэтых адрасоў якія, зноў жа, я зрабіў так ці інакш. Але мы ўбачым гэтыя адрасы, часам, пры адладцы кода. Цяпер тое ж час, гэтая праграма тут выпраўлення, вядома, што праблема, параўноўваючы гэтыя два радкі. Але мы сутыкнуліся з іншай праблемай. Гэта было з копіі запраграмаваць ў мінулы раз, у выніку чаго, я спрабаваў атрымаць выгаду толькі першы знак у радку. Але тое, што было сімптомам мы бачылі апошні раз карыстальнік ўводзіць у кошту, як Гейб ў ніжнім рэгістры, для х, Затым мы прысвоілі ёй у т, а ў трэцім радку там, і тады я паспрабаваў выгаду т кранштэйны 0? Што быў эфект змены т кранштэйны 0 тут? АЎДЫТОРЫЯ: Гэта змяніла с. David J. малая: Так, Я змяніў с, а таксама. Таму што тое, што адбываецца на самай справе? Ну, дазвольце мне ўбачыць, калі я магу чысціць да гэтай карціны, як след. Калі з, зноў жа, слова г, а, бы, е, зваротны слеш, 0, і з мы будзем працягваць малюнак як скрынка тут, але не больш за адрасоў. Давайце спыніць рэчы. Давайце проста намаляваць карціну спрасціць свет. Калі я абвяшчаю т са струнным т, што стварае гэты кавалак памяці. Плошчу, здараецца, 32 Біты ў большасці кампутараў. На самай справе, калі вы яшчэ не чулі пра кампутар, які мае 32-разрадную архітэктуру, сапраўды фантазійных казаць, што толькі азначае, што ён выкарыстоўвае 32-бітныя адрасы. І як тэхнічная бок, калі вы ніколі не задумваліся, Таму старыя кампутары, калі вы на самой справе спрабаваў суп іх з вялікім аб'ёмам аператыўнай памяці, маглі мець толькі максімум з чатырох гігабайт аператыўнай памяці, добра, што гэта таму, што, літаральна, ваш стары кампутар мог толькі Колькасць вышэй, чым 4 млрд, 4 млрд байт, таму што гэта было 32-разрадны нумары для адрасоў. Але ў любым выпадку, у гэтым прыклад, гісторыя значна прасцей. т гэта проста яшчэ адзін паказальнік, або сапраўды сімвал зоркі, ён жа радок. І як я хачу, каб абнавіць гэтую карцінку зараз з гэтай другой радку кода, пасля кропкі, шматкроп'е, шматкроп'е? Калі я раблю радок т роўная з коскі, як жа змяніць гэтую карціну? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Так. Дакладна. Я проста пакласці стралу з т скрынка па тым жа адрасе, тое ж самае першае ліст у далі. Або тэхнічна, калі гэта хлопец усё яшчэ ў 0x1, гэта як калі б я быў 0x1 тут і 0x1 тут. Але, зноў жа, хто клапоціцца аб адрасах? Гэта проста ідэя, што зараз мае значэнне. Так што гэта тое, што адбываецца тут. Так, вядома, калі вы робіце т кранштэйна 0, што абазначэнне масіва, з course-- і шчыра кажучы, гэта выглядае як ёсць масіў тут, але зараз ёсць гэтая дзіўная рэч. Ведайце, што мова праграмавання, C, прапануе Вам гэтую функцыю, у выніку чаго, нават калі Т паказальнік, або з з'яўляецца паказальнікам, Вы ўсё яшчэ можаце выкарыстоўваць, што знаёмыя, зручная квадратная дужка абазначэння, каб перайсці да першага элементу, ці другі элемент, або любы элемент што, што паказальнік накіраваны , Таму, відаць, яго гэта, як у дадзеным выпадку, паказваючы на ​​некаторы масіва. Так як жа нам гэта выправіць? Шчыра кажучы, гэта тое, дзе ён атрымаў трохі пераважнай на першы погляд. Але вось новая і палепшаная версія. Такім чынам, спачатку, я атрымліваю пазбавіцца ад бібліятэкі CS50, проста выставіць, што S сапраўды сімвал зоркі, проста сінонім. І т таксама сімвал зоркі. Але тое, што адбываецца на правая бок гэтай лініі дзе т прысвойваецца значэнне? Што такое Таноса? Што гэта STRLEN? Што такое SizeOf (сімвал)? Чаму, чорт вазьмі, робіць гэта лінія погляд настолькі складаным? Што ён робіць на высокім узроўні? Што гэта захоўванне ў т? Так? АЎДЫТОРЫЯ: Гэта вылучэнне пэўную колькасць памяці. Гэта для захоўвання, я думаю, лісты [неразборліва]. David J. малая: Выдатна. Выдатна. Гэта вылучэнне пэўнага аб'ём прасторы памяці для захоўвання, як мяркуецца, будучыя лісты. І ў прыватнасці, Таноса Таму вяртанне і што? АЎДЫТОРЫЯ: Вяртанне [неразборліва]? David J. малая: Точно. Вяртаючыся адрас гэтай памяці, які з'яўляецца мудрагелісты спосаб сказаць, вяртае адрас Першы байт гэтай памяці. Адказнасць ляжыць на мне, каб памятаць колькі памяці я на самой справе выдзелена або спытаў Таноса для. Зараз, колькі гэта? Ну, хоць ёсць шмат дужках тут, Таноса займае ўсяго адзін аргумент. І я паказаўшы STRLEN з х, так дайце мне столькі байт, колькі ёсць у с, але дадайце адзін. Чаму? Так? АЎДЫТОРЫЯ: зваротны слеш 0. David J. малая: Точно. Мы павінны зрабіць невялікае хатняе гаспадарка. Так, таму што ёсць зваротная касая рыса 0, мы б лепш памятаць, што. У адваротным выпадку, мы збіраемся стварыць радок, не мае, што асаблівая тэрмінатар. Між тым, толькі каб быць супер анал, у мяне ёсць SizeOf (сімвал), толькі ў выпадку, калі хто працуе М.Ю. Код ня на CS50 прылады, але, магчыма, на іншы кампутар у агульнай складанасці, дзе сімвалы адзін байт, па дамове, але два байт, або нешта большае, чым гэта. Гэта проста, каб быць супер, супер прэч памылак. Нават пры тым, што, у рэчаіснасці, гэта хутчэй за ўсё будзе 1. Зараз, у той час, я іду наперад і скапіяваць Радок, т кранштэйны я роўная т кранштэйн з. І я падпарадкуюся мінулым тыдні зыходны код, каб убачыць, што адбываецца. Але ключ вынас, і Таму я паставіў код зараз у зялёны, таму, што гэтай самай апошняй радкі, т кранштэйны 0 роўная ToUpper, мае эфект Капіталізацыя якая радок? T і / або з? Апошняя радок кода. Проста т, таму што адбылося на гэты раз, калі я крыху адмяніць гэты апошні крок, што здарылася ўжо, калі я называю Таноса, Я па сутнасці атрымаць кавалак памяці што мае той жа памер, што і арыгінал, таму што гэта арыфметычнае я зрабіў. Я захоўваю ў т адрасе з гэтага кавалка памяці. Нягледзячы на ​​тое, што гэта выглядае прыгожа і даволі, прыгожа і пуста, рэальнасць ёсць, тое, што мы будзем тэлефануюць, значэнні смецця тут. Гэта кавалак памяці маглі б вельмі добра былі выкарыстаныя раней, некалькі секунд, некалькі хвілін таму. Так што можа быць абсалютна нумары ці літары там, проста выпадкова. Але яны не не дзейнічае, пакуль я сам запоўніць гэты кавалак памяці з фактычнымі знакаў, як я зрабіць у тым, што цыкл там. Добра? Так што цяпер, кульмінацыя гэтыя тры прыкладу , Якія былі, здавалася б, разбіты ў апошні раз, гэты прыклад замены, гэтая функцыя працаваў у тым сэнсе, што месцамі а і б. Але гэта не спрацавала ў якім іншым сэнсе? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Калі б мне давялося выклікаць гэтую функцыю ад another-- напрыклад, з функцыі як асноўны, дзе У мяне ёсць зменная, х і у, як я зрабіў на мінулым тыдні, і той жа код, і я праходжу па х і ў каб Памяняць, а затым выклікаць Swap-- гэта, вядома, правільная версія гэта тое, што мы збіраемся see-- ён не працуе. Так што ж такое выпраўленне? Ну, так што проста быць ясна, дазвольце мне ісці наперад и-- даць мне адзін другі тут, каб убачыць калі я магу паказаць вам апошні, які будзе в-- давайце паглядзім, калі я магу знайсці гэта рэальная fast-- ОК, [неразборліва]. ОК, гэта так. Так ігнараваць каманды я проста друкаваць. Я хачу, каб атрымаць на апошняй хвіліны прыклад з мінулага разу, што ня цяпер называецца, не Своп. Дык не Своп не тое, дзе мы спыніліся ў мінулы раз, у выніку чаго, я ініцыялізацыі х 1, а ў да 2. Я затым выклікаць своп, праходзячы ў 1 і 2. А потым гэтая функцыя працаваў у пэўным сэнсе, але гэта не было ніякага пастаяннага эфект ад х і у. Так што пытанне ў руцэ, як цяпер мы на самай справе вырашыць гэтую праблему? Што такое рашэнне пад рукой? Ну, у swap.c, што новы сёння, заўважыць пару адрозненняў. х і ў з'яўляюцца аднолькавымі. Але тое, што відавочна адрозніваецца пра лінію 25? Што новага там, калі вы памятаеце, што гэта было падобна секунду назад? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Так. Так Ампэрсанд новая частка сінтаксісу не толькі ў гэтай праграме, але і ў цэлым у CS50. На сённяшні дзень, я не думаю, мы бачылі ніякіх прыкладаў ці сапраўды казалі пра іх у любым дэталь, акрамя, можа быць, прэвентыўна у раздзеле, Ампэрсанд, як гэта. Ну, атрымліваецца, Ампэрсанд з'яўляецца адным з апошніх частак новага сінтаксісу мы збіраемся даведацца. Усё гэта азначае, адрас некаторай зменнай. На які адрас ня х жыць? Але тое, што адрас не ва жыць? Таму што, калі Асноўная праблема, перш чым была, што х і ў былі перадаецца як копіі, што мы сапраўды хочам зрабіць гэта даць Пераключыць з як скарб карта, якая вядзе да дзе х і ў уласна ў аператыўнай памяці, так, каб Своп можа вынікаць, што карту і ісці туды, дзе х ці ў адзначае пляма і змяніць фактычныя значэння 1 і 2 ёсць. Так Своп трэба крыху змяніць таксама. І на першы погляд, гэта можа здаецца трохі падобны на персанаж зоркі. І гэта сапраўды так. Дык гэта паказальнік на тып дадзеных, на аснове гэтай выдзеленай частцы? Так што гэта унутр. Так што больш не Int, гэта адрас у міжнар. І сапраўды гэтак жа, бы цяпер збіраецца быць сабой адрас міжнар. Таму, калі я цяпер называем Пераключыць ад галоўнага, Я не збіраюся даваць SWAP 1 і 2. Я збіраюся даць яго як Ox-то і Ox-то, два адрасы, якія прывядуць Своп з іх фактычнымі месцах у памяці майго кампутара. Так што цяпер, мая астатняя рэалізацыя неабходна змяніць ледзь. Што, безумоўна, адрозніваюцца зараз у гэтых трох радкоў кода? Там у гэтыя праклятыя зоркі ўсе паўсюдна, усё ў парадку? Так што тут адбываецца? Так? АЎДЫТОРЫЯ: Гэта, відавочна, [неразборліва]. David J. малая: Точно. Такім чынам, у гэтым context-- і гэта не было лепшы дызайн рашэнне, па агульным прызнанні, гадоў таму. У гэтым кантэксце, у якім вы проста павінны зорку, і ў вас няма тып дадзеных, як Int, адразу налева, замест гэтага вы павінны знак роўнасці, выразна, У гэтым кантэксце, калі вы кажаце, зоркі, гэта азначае, што перайсці да адрас, які знаходзіцца ў. Выконвайце карту скарбаў, так бы мовіць. А між тым, у радку 37, гэта азначае тое ж самае. Да адраснай а, і пакласці, што там? Усё, што ў размяшчэнне, што б вызначае. Іншымі словамі, пайсці б. Атрымаць гэтую велічыню. Да і, у роўнай падпісаць, аператар прысвойвання, паставіць там гэта значэнне. Аналагічна, Int Тэмп проста унутр. Нічога не трэба мяняць аб тэмп. Гэта проста запасны шкло ад Анненберг за малаком або апельсінавым сокам. Але я павінен сказаць, пайсці ў б. Да гэтага пункта прызначэння і змясціць значэнне ў тэмпературы там. Дык што ж тады адбываецца? Калі я на самай справе назваць Памяняць гэты раз, калі гэта першы латок тут прадстаўляе Main, гэта другі латок ўяўляе падпампоўкі, калі Я праходжу амперсанда х і Ампэрсанд ў ад Майне ў Памяняць, проста каб было ясна, што гэта за фрэйм ​​стэка прыёму? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Адрас х і адрас у. І вы можаце думаць пра іх як паштовыя адрасы. 33 Оксфард-стрыт і 35 Оксфард-стрыт, і вы хочаце перамясціць два будынкі якія ў гэтых месцах. Гэта свайго роду недарэчнай ідэі, але гэта ўсё, мы маем на ўвазе па адрасе. Дзе ў свеце можна Вы знойдзеце гэтыя два цэлых? Дзе ў свеце вы можаце знайсці гэтыя два будынкі? Так што, калі, нарэшце, пасля ўсяго гэтага часу I ісці ў сённяшнім зыходнага кода і кампіляцыі Своп і запусціць ./swap, нарэшце, для Першы раз мы на самай справе бачым, што мае каштоўнасці маюць сапраўды паспяхова памяняліся. І зараз, мы можам нават узяць заўвага гэтага, скажам, у GDB. Такім чынам, дазвольце мне пайсці ў той жа файл. Дазвольце мне ісці наперад і адладжваць з ./swap. І зараз, у абмен, я пайду наперад і ўсталяваць кропку супыну ў Майне. А цяпер я пайду наперад і запусціць праграму. І зараз мы бачым свой код спыніўся на гэтай лініі. Калі я іду наперад і друк х, што я павінен убачыць тут? Гэта пытанне. Зноў сказаць? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Так выпадковыя ліку, можа быць. Можа быць, я пашанцуе, і гэта проста і прыгожа, як 0. Але можа быць, гэта некаторы выпадковы лік. У гэтым выпадку, мне пашанцавала. Гэта як раз здараецца быць 0. Але гэта сапраўды поспех, таму што не да Я увядзіце наступны, а затым раздрукаваць х мае, што радок кода, радок 19, былі выкананы. Між тым, калі я тыпу побач зноў, і раздрукаваць зараз з у, я іду да 2. Зараз, калі я тыпу побач, ён збіраецца атрымаць крыху заблытаным, таму што цяпер, Е будзе з'яўляцца на экран, як гэта было. х роўны 1. Давайце зробім гэта зноў. А цяпер, вось, дзе становіцца ўсё цікавей. Перш чым падаць слова Свопинг ці нават крок у яго, давайце трохі зазірнуць. х, зноў жа, 1. Y з'яўляецца, вядома, хутка здаровы сэнс праверыць, 2, такім чынам, не цяжка там. Але тое, што Ампэрсанд х? Адказ, гэта збольшага фанкі гледзячы. Але Int зорка ў дужках проста спосаб ВУП спосаб сказаць гэта адрас. Гэта не Int, гэта паказальнік на Int ці інакш вядомы як адрас. Што гэта вар'ятка рэч? Мы ніколі не бачылі то зусім так раней. Так што гэта адрас у майго кампутара памяць, дзе х адбываецца жыць. Гэта Ox-то. І гэта, шчыра кажучы, чаму Я пачаў маляваць стрэлкі, замест лічбаў, таму што, хто сапраўды клапоціцца што ИНТ знаходзіцца ў прыватнасці адрас вось што вялікі. Але bffff0c4, гэта ўсё Сапраўды шаснаццаткавыя лічбы, якія ад 0 да ф. Такім чынам, мы не збіраемся спыняцца занадта доўга на тое, што гэтыя рэчы. Але калі я раздрукаваць у, Вядома, я бачу 2. Але Ампэрсанд у, я бачу гэты адрас. І заўважце, для цікаўных, як далёка адзін ад аднаго знаходзяцца хну? Вы можаце ігнараваць большую частку адрасы. Чатыры байта. І гэта ўзгадняецца з нашым раней сцвярджаюць, што, наколькі вялікі з'яўляецца Int? Чатыры байта. Так што, падобна падкладцы усё ў да прыгожа, як Вы маглі б спадзявацца, у памяці. Так што цяпер, давайце проста хуткая перамотка наперад да канца гэтай гісторыі. Давайце пойдзем далей і ўвесці крок, пагрузіцца ў функцыі падпампоўкі. Зараз звернеце ўвагу, калі я друкую, гэта ідэнтычная адрасе х. Калі я друкую б, гэта ідэнтычна па адрасе у. Так што я павінен убачыць, калі я кажуць, перайсці па адрасе на? Так раздрукаваць зорка. Так зорка азначае пайсці туды, у гэтым кантэксце. Ampersand азначае тое, што адрас. Так зорка сродкі 1. І друк зорка б дае мне 2. І дазвольце мне выказаць здагадку, на дадзены момант, што па крайняй меры код, які пераходзіць да выканання цяпер можа быць разважаў праз такім чынам. Але мы будзем вяртацца да гэтай ідэі ў хуткім часе. Так гэтая версія абмен Зараз правільна і дазваляе нам, каб памяняць гэты канкрэтны тып дадзеных. Таму любыя пытанні, то на абмен? На адной з зорак? На адрас? І вы ўбачыце, з Праблема ўсталяваць 4, свайго роду, але праблема ўсталяваць 5, вызначана, як гэта рэчы карысныя і атрымаць значна больш камфортна з імі, у выніку. Усё, што заўгодна? Добра. Так Таноса, зноў жа, гэтая функцыя што толькі вылучае памяць, памяць размеркаванне. І чаму гэта карысна? Ну, увесь гэты час, Вы выкарыстоўвалі Таноса. Калі вы лічыце, цяпер, як GetString работ, па-відаць, гэта былі прасіць каго на кавалак памяці, у любы час карыстач друкуе радок ў, таму што мы, вядома, не ведаю, як персанал CS50, наколькі вялікая гэтыя радкі, што людзей збіраюцца ўвесці можа быць. Так што давайце, упершыню, пачынаюць адхіліце сабе як яна CS50 работ, шляхам пару прыкладаў што прывядзе нас ёсць. Так што, калі я адкрываю Gedit і адкрыць зсапЕ 0, мы збіраемся, каб убачыць наступны код. Scanf 0, даступныя на вэб-сайце для сёння, мае адносна невялікі лік радкоў кода тут, з 14 па 20. І давайце паглядзім, што ён робіць. Гэта аб'яўляе INT, пад назвай х. Гэта кажа нешта накшталт: колькасць калі ласка. А цяпер ён кажа, зсапЕ% я, і х. Такім чынам, ёсць куча новага матэрыялу там. Але зсапЕ, вы можаце як бы думаю як супрацьлегласць Printf. Е, вядома, якая выводзіцца ст. зсапЕ роду сканаванняў ад спажыўца, клавіятура-то ён або яна набрала. % Я сапраўды гэтак жа як Printf. Гэта азначае, чакаць карыстачу увядзіце Int. А цяпер, чаму вы думаеце, я можа быць праходжанне зсапЕ & х? Калі мэта ў жыцці зсапЕ , Каб атрымаць тое ад карыстальніка, што гэта значыць прапускаючы яго, і х, зараз? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Што б я ні, чалавечы, увядзіце ў, мой ўваход збіраецца быць захаваны ў гэтым месцы. Гэта не дастаткова, успомніць, проста прайсці ў х, таму што мы бачылі ўжо, у любы час вы прайсці толькі сырое зменную, як Int, у некаторай іншай функцыі, Безумоўна, гэта можа змяніць, што зменная, але не назаўсёды. Ён не можа мець уплыў на Майне. Гэта можна змяніць толькі сваю ўласную лакальную копію. Але калі замест гэтага вы не даць мне фактычны Int, але вы даць мне кірунак што Int, я зараз, будучы зсапЕ, безумоўна, я магу прытрымлівацца, што рашэнні і паставіць там шэраг так у вас ёсць доступ да яго таксама. Таму, калі я запусціць гэтую праграму, давайце паглядзім. Зрабіць зсапЕ 0 кропка слэш, SCANF 0. І калі я зараз увядзіце нумар як 50, дзякуй за 50. Калі я зараз увядзіце лік, як адмоўны 1, за негатыўнае 1. Цяпер я друкую шэраг як 1,5, хм. Чаму мая праграма ігнараваць мяне? Ну, таму што проста, я сказаў гэта чакаць толькі ў Int. Добра. Дык вось адна версія гэтага. Давайце рэчы на ​​прыступку вышэй і выказаць здагадку, што гэта не добра. І ў гэтым заключаецца вельмі просты прыклад пра тое, як мы можам пачаць пісаць код што іншыя людзі могуць выкарыстоўваць ці на кампраміс, рабіць дрэнныя рэчы. Так лінія 16, так падобныя па духу, перш чым, але я не абвясціўшы яго дзесятковага гэты раз. Я абвяшчаю яго сЬаг зорку, ён жа радка. Але што гэта сапраўды азначае? Так што, калі я не паказаць address-- і Я тэлефаную яго адвольна, буфер, але я мог бы назваць гэта з, каб быць simple-- а затым я зраблю гэта, растлумачце мне, калі б вы маглі, на аснове папярэдняга Логіка, што зсапЕ рабіць у радку 18, калі прапускання% з і буферам, які з'яўляецца адрас? Што такое зсапЕ, калі ўжыць Дакладнае ж логіка, як версіі 0, збіраюся паспрабаваць зрабіць тут, калі карыстач-то ў? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Scanf, па логіцы раней, збіраецца прыняць радок што чалавека, надрукаваных на машынцы в-- гэта цяпер радок, гэта не лік, па-відаць, калі ён ці яна cooperates-- і ён збіраецца паспрабаваць пакласці, што радок у памяці на любым адрас буфера паказвае. І гэта выдатна, таму што буфер сапраўды азначала, што адрас. Але я сцвярджаю, гэтая праграма глючыць ў вельмі сур'ёзны шлях, таму што значэнне буфер па змаўчанні? Што я ініцыялізацыі ў? Што частка памяці? У мяне няма, ці не так? Такім чынам, нават пры тым, што я вылучыў сімвал зоркі, які больш не называецца с, гэта замест называецца, buffer-- так давайце намалюем імя зменнай Зараз, як buffer-- калі ў мяне няма называецца GetString або Таноса тут, што фактычна азначае, што буфер толькі некаторы значэнне смецця. Цяпер што ж гэта значыць? Гэта азначае, што я сказаў зсапЕ чакаць радок ад карыстальніка. І вы ведаеце, што? Незалежна гэтая рэч паказваючы to-- і я малюю пытальнік, але ў рэчаіснасці, гэта будзе нешта накшталт Ox1, 2, 3, ці не так? Гэта некаторыя фіктыўныя значэнне, толькі здараецца, ёсць ад твару. Так, па-іншаму, гэта як быццам буфер проста паказваючы на ​​тое, у памяці. Я паняцця не маю, што такое. Так што, калі я друкую ў Gabe зараз, гэта адбываецца , Каб паспрабаваць пакласці г-А-В-Е / 0 ёсць. Але хто ведае, што гэта такое? І ў мінулым, любы раз, калі мы паспрабавалі закрануць памяці, што не належыць нам, што здарылася? Ці амаль кожны раз. Памылка сегментацыі, ці не так? Гэтая стрэлка, я паняцця не маю, дзе гэта паказваючы. гэта проста выпадковае значэнне. І, вядома, калі вы інтэрпрэтуеце выпадковае значэнне ў якасці адрасу, Вы збіраецеся перайсці на некаторыя выпадковыя прызначэння. Так Гейб сапраўды можа аварыі мая праграма ў гэтым выпадку тут. Так што мы можам зрабіць, гэта амаль гэтак жа дрэнна? Лічыце, што гэта трэці і Апошні прыклад зсапЕ. Гэтая версія лепш у якім сэнсе? Калі вы знаёмыя з папярэдняя праблема, гэта лепш. Чаму? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Добра. Так што гэта выпадак лініі 16 Лепш, у тым сэнсе, што мы відавочна выдзялення крыху памяці. Мы не выкарыстоўваем Таноса, мы выкарыстоўваем тыдзень 2 падыход проста аб'яўленні масіва. І мы ўжо казалі раней, што радок проста масіў сімвалаў, так што гэта цалкам законна. Але гэта, вядома, як Вы звернеце ўвагу, што фіксаваны памер, 16. Так што гэта праграма цалкам бяспечным, калі я друкую у радках аднаго знака, два знака радкі, 15 радкоў знакаў. Але як толькі я пачынаю набіраць 16, 17, 18, 1000 знакавыя радкі, дзе гэты радок будзе ў канчатковым выніку? Гэта будзе ў канчатковым выніку часткова тут. Але хто ведае, што яшчэ па-за межамі менавіта гэтага масіва? Гэта як калі б у мяне ёсць заявіў 16 скрынкі тут. Такім чынам, замест выцягнуць ўсе 16, мы будзем проста рабіць выгляд, што я намаляваў 16. Але калі я затым паспрабаваць прачытаць радок гэта значна больш, як 50 сімвалаў, Я збіраюся пакласці пачатак а, бы, у, г, х, у, г. І гэта, як мяркуецца, некаторыя іншыя сегмент памяці , Што, зноў жа, можа выклікаць мая праграма да краху, таму што я не папрасіў нічога больш, чым проста 16 байт. Так каго гэта хвалюе? Ну, вось бібліятэка CS50. І большасць з гэта проста як інструкцыі да верхняй. Бібліятэка CS50, увесь гэты час, была гэтую лінію ў лінію 52. Мы бачылі ЬурейеЕ, або Вы ўбачыце ЬурейеЕ ў PSET 4, які проста стварае сінонім якой сімвал зорка можа быць больш згадваецца проста як радка. Так што гэта адзін з некалькі навучальных колы мы выкарыстоўвалі таемна пад капотам. Між тым, вось функцыя, деЬспаг. Цяпер, відаць, няма цела да яго. І на самай справе, калі я буду працягваць пракрутка, я на самой справе не бачу ніякіх рэалізацый з гэтых функцый. Як для праверкі адсутнасці памылак, чаму гэта? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Так. Так што гэта файл загалоўка. І файлы загалоўкаў ўтрымліваюць прататыпы, плюс некаторыя іншыя рэчы, здаецца, як азначэнняў тыпаў. Але ў CS50.c, якую мы ніколі не даў вам шчыра, але быў у CS50 прыбора ўсе на гэты раз, глыбока ўнутры яго тэчак, заўважыць, што ёсць цэлы куча функцый тут. На самай справе, давайце пракруціць ўніз. Давайце ігнараваць большасць з іх, на дадзены момант. Але пракруціць ўніз да GetInt і паглядзець, як GetInt працуе. Дык вось GetInt. І калі вы ніколі не клапаціўся, як атрымаць Int працуе, вось яе дакументацыя. І сярод рэчаў гэта кажа, ён кажа вам, якія дыяпазоны значэнняў ён можа вярнуцца. Гэта істотна адмоўным 2000000000 да станоўчага 2000000000, плюс-мінус. І аказваецца, усё гэта Час, хоць мы ніколі не што вы праверыць яго, калі што не так, атрымліваецца, што ўсе на гэты раз, GetInt мае вяртаўся спецыяльная пастаянная, не нулявы, а INT_MAX, які Канвенцыя за ўсё ў двух праграміста. Гэта азначае тут гэта спецыяльнае значэнне. Пераканайцеся, што праверыць гэта, проста калі нешта пойдзе не так. Але мы ніколі не турбавалі с, што на сённяшні дзень, таму што зноў, гэта прызначаны для спрашчэння. Але як GetInt будуць рэалізаваны? Ну, адзін, ён не прымае ніякіх аргументаў. Мы ведаем, што. Гэта вяртае цэлае. Мы ведаем, што. Так як ён працуе пад капотам? Так што, па-відаць бясконцае пятля, па меншай меры, з'яўленне аднаго. Звярніце ўвагу, што мы выкарыстоўваем GetString. Дык вось цікава. GetInt называе наш уласны функцыя, GetString. А цяпер, чаму гэта магло б быць на самой справе? Чаму я быўшы абарончая тут у адпаведнасці 165? Што можа адбыцца ў лініі 164, каб унесці яснасць? Гэта той жа адказ, як і раней. Можа быць проста з памяці. Што-то не так з GetString, мы павінны быць у стане справіцца, што. І па гэтай прычыне я не вяртаюць нуль з'яўляецца , Што тэхнічна нулявы паказальнік. GetInt павінен вярнуць Int. Так што я адвольна вырашыў, па сутнасці, што 2000000000, плюс-мінус, збіраецца быць асаблівае значэнне, што я ніколі не можа на самой справе атрымаць ад карыстальніка. Гэта проста адно значэнне я збіраюся марнаваць прадстаўляць код памылкі. Так што цяпер, усё становіцца трохі фантазіі. І гэта не зусім тая ж функцыя як і раней, але гэта вельмі падобна. Так заўважыць, я заяўляю тут, у адпаведнасці 172, як Int N і сімвал с. І тады я выкарыстаць гэты модны лінію, Sscanf, які атрымліваецца ня скануе радок з клавіятуры. Ён стаіць існуючы радок, карыстач ужо надрукаваныя. Так што я ўжо назваў GetString, які азначае, што я ёсць радок у памяці. Sscanf з'яўляецца тое, што вы выклікаць функцыю разбору. Падобна на радок я набраў у, сімвал за сімвалам, і робіць нешта карыснае. Гэты радок захоўваецца ў лініі. І я ведаю, што толькі збіраецца рэзервовае капіраванне тут і казаць, ах, добра, Я назваў яго не з на гэты раз, але лінія. І зараз гэта трохі адрозніваецца. Але гэта фактычна азначае, па прычынах мы некалькі махаем рукамі на сённяшні дзень, што мы правяраем, каб ўбачыць, калі карыстальнік увёў у і INT і, магчыма, яшчэ адзін персанаж. Калі карыстальнік ўвёў у междунар, гэта будуць захоўвацца ў п, таму што я праходжання гэтым па адрасе, новы трук мы бачылі сёння. Калі карыстальнік набраў таксама Падобным 123x, што х збіраецца ў канчатковым выніку Ліст у персанажа ў. Зараз атрымліваецца, што Sscanf скажа мне, разумна, колькі зменных было Sscanf паспяхова ў стане запоўніць. Так па гэтай логіцы, калі функцыя Я ўпэўнены, рэалізацыі будзе GetInt, але я правяраю, патэнцыйна, для карыстальніка каб набралі ў міжнар затым-то яшчэ, што я хачу Sscanf сайт Вяртаецца значэнне сапраўды быць? Калі мэта складаецца ў тым, каб атрымаць проста Int ад карыстальніка? Так што, калі Sscanf вяртаецца 2, што гэта значыць? Карыстальнік набраў у то як, у літаральным сэнсе, 123x, якая з'яўляецца проста трызненне. Гэта ўмова памылкі, і Я хачу, каб праверыць, што. Так што, калі карыстальнік ўводзіць гэта ў, па гэтая логіка, што робіць Sscanf вярнуцца, б вы сказалі? Так ён збіраецца вярнуцца 2, таму што 123 будзе ісці сюды, і х будзе ў канчатковым выніку тут. Але я не хачу х да запаўняюцца. Я хачу Sscanf толькі дамагчыся поспеху ў запаўненне першай з зменных. І вось чаму я хочаце Sscanf вярнуць 1. І калі гэта крыху па галаве на дадзены момант, што цалкам нармальна. Зразумейце, аднак, што адно з значэння GetInt і GetString з'яўляецца тое, што мы робім па-чартоўску шмат памылак праверкі, як гэта так што на сённяшні дзень, вы можаце ў значнай ступені нічога увядзіце ў клавіятуры, і мы зловім яго. І мы, вядома ,, персанал, будзе вызначана не быць крыніцай памылкі ў вашым Праграма, таму што мы ў абароне праверка на ўсе па-дурному рэчы, якія карыстальнік можа зрабіць, як набраўшы радок, калі вы сапраўды хацелі Int. Такім чынам, для now-- мы прыйдзем назад у гэта раней long-- але ўвесь гэты час, GetString і GetInt ёсць быў пад капотам, выкарыстоўваючы гэты Асноўная ідэя адрасоў памяці. Так што цяпер, давайце рабіць рэчы трохі больш зручным для карыстальнікаў. Як вы памятаеце, з Binky апошняга time-- калі мая мыш будзе cooperate-- так у нас быў гэты код, які шчыра кажучы, даволі бессэнсоўна. Гэты код нічога не дае карысна, але гэта быў прыклад што прафесар Parlante выкарыстоўваецца для таго, каб прадстаўляць што адбываецца ў Праграма з удзелам памяці. Так што давайце пераказваць гэта гісторыя супер коратка. Гэтыя дзве першыя радкі, у Англійская, рабіць тое, што, вы можаце сказаць? Проста ў разумна чалавекам, але злёгку тэхнічныя тэрміны, прыняць ўдар. АЎДЫТОРЫЯ: [неразборліва]. David J. малая: ОК, вы ўстанаўлення адрасы для вашай х і ў зменных. Не зусім, таму што х і у не з'яўляюцца зменныя ў традыцыйным сэнсе. х і ў з'яўляюцца адрасамі ці будзе захоўваць адрас. Так давайце паспрабуем гэта яшчэ раз. Нядрэнны пачатак, хоць. Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Добра. Я думаю, што гэта трохі чысцей. Аб'яву двух паказальнікаў, два цэлых колькасці. І мы называем іх х і у. Ці, калі мы павінны былі зрабіць гэта як карціны, зноў жа, Нагадаем, зусім проста, што ўсе мы робім з гэтай першай радкі малюе акно, як гэта, з некаторым значэннем смецця ў ім, і называючы гэта х, а затым яшчэ адну скрынку, як гэта, з некаторага значэння смецця ў ім, называючы яго у. Мы заявілі два паказальнікі, якія ў канчатковым рахунку будзе захоўваць адрас у міжнар. Так што ўсё гэта ёсць. Таму, калі Бинки зрабіў гэта, гліна проста выглядала так. І Нік толькі збольшага загорнуты стрэлкі, як быццам яны не паказваючы нідзе у прыватнасці, таму, што яны проста значэння для смецця. Яны відавочна не ініцыялізуецца у любым месцы ў прыватнасці. Цяпер наступны лінія Код, нагадаем, быў гэты. Такім чынам, у досыць зручнай, але некалькі тэхнічны англійская, што гэта за радок кода робіць? Так? АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Выдатна. Гэта выдзялення кавалак памяці, што гэта памерам з міжнар. І гэта палова адказу. Вы адказалі права палова экспрэсіі. Тое, што адбываецца на левы бок знака роўнасці? Так? АЎДЫТОРЫЯ: І правапераемнікаў гэта да зменнай х? David J. малая: І правапераемнікаў гэта да зменнай х. Так Нагадаем, правая вылучае Недастаткова памяці для захоўвання Int. Але Таноса спецыяльна вяртае адрас гэтага кавалка памяці, што вы проста прапанаваў захоўваецца ў х. Так што Нік зрабіў у мінулы раз з Бинки з'яўляецца ён пацягнуў гэты паказальнік з, гліна, пазначыць зараз на белы кавалак памяці што роўна памерам з міжнар. І на самай справе, што азначала прадстаўляць чатыры байта. Зараз, у наступным радку кода зрабіў гэта, зорка х атрымлівае 42. Так 42 з'яўляецца прамым на Правая, сэнс жыцця. Левы бок, зорка х азначае? Гэта таксама можа мець gone-- гэта нармальна. Добра. АЎДЫТОРЫЯ: У прынцыпе, перайсці да [неразборліва] David J. малая: Добра. АЎДЫТОРЫЯ: [неразборліва]. David J. малая: Точно. Левы бок азначае ісці ў х. х адрас. Гэта як 33 Оксфард-стрыт, або Ox1. І зорка х азначае ісці да таго, што рашэнні і пакласці тое, што ёсць? 42. Так сапраўды, гэта менавіта тое, што зрабіў Нік. Ён пачаў з іншым, па сутнасці справы, у думках паказваючы пальцам на х, паказаным стрэлкай у белай скрынцы з правага боку бок, і прастаўлення колькасці 42 ёсць. Але тады рэчы сталі трохі небяспечна, праўда? Бинки каля страціць галаву. Зорка ў роўная 13, нешанцаванне, гэта азначае? Так зоркі ў сродкі ідуць на адрас у у. Але тое, што гэта адрас у у? Добра, гэта значэнне смецце, ці не так? Я звярнуў яго ў выглядзе знака пытання. Нік звярнуў яго ў якасці скруціўшыся абаранкам стрэлкай. І як толькі вы паспрабуеце зрабіць зорку у, кажучы пайсці туды, але не з'яўляецца законным адрас, гэта некаторыя фіктыўныя размяшчэнне, праграма збіраецца да краху. І галава Бинки збіраецца адлятаць тут, як гэта было. Так у канцы, гэтай праграмы быў проста плоскі з загана. Гэта была праграма глючыць. І гэта павінна было быць фіксаванай. І адзіны спосаб, сапраўды, гэта выправіць будзе, напрыклад, гэтая лінія, якія мы нават не дабрацца, таму што праграма разбіўся занадта рана. Але калі б мы павінны былі выправіць гэта, тое, што эфект робіць рабіць у роўным х ёсць? Ну, гэта, па сутнасці паказвае у ў любое значэнне х паказвае на. Такім чынам, у гісторыі Ніка, або гісторыя Бинки, як х і ў былі паказваючы на белы ўчастак памяці, так што, у рэшце рэшт, калі вам ў зоркі ў роўная 13 разоў, Вы ў канчатковым выніку пакласці 13 у Падыходнае месца. Такім чынам, усе гэтыя лініі зусім законным, для гэтага акрамя, калі гэта здарылася перад вамі фактычна прызначаны ск некаторы значэнне. Зараз, на шчасце, вы не павінны разважаць праз усе з гэтых відаў пытанняў па сваім меркаванні. Дазвольце мне ісці наперад і адкрыць акно тэрмінала тут і адкрыць, на імгненне, супер кароткая праграма, што таксама з'яўляецца свайго роду бессэнсоўна. Гэта непрыгожа. Гэта нічога карыснага не дасягнуць. Але гэта прадэманстраваць пытанні памяці, так што давайце зірнем. Галоўная, супер проста. Гэта, па-відаць выклікае функцыю, е, а затым вяртае 0. Гэта свайго роду цяжка сапсаваць гэта. Так Галоўная даволі добра, да гэтага часу. Так е праблематычна. І проста не пакласці шмат намаганні ў назваўшы яго тут, каб трымаць у цэнтры ўвагі на код. е мае дзве лініі. І давайце паглядзім, што зараз адбываецца. Так, з аднаго боку здесь-- і дазвольце мне зрабіць гэта ў адпаведнасці з папярэднім example--, з аднаго боку, левы бок рабіць тое, што, па-ангельску? Гэта is-- АЎДЫТОРЫЯ: Стварэнне паказальнік. David J. малая: Стварэнне паказальнік да міжнар і назваўшы яго х. Так што гэта стварэнне аднаго з гэтых скрынь Я працягваю маляваць на сэнсарным экране. А цяпер, з правага боку боку, Таноса, вядома, вылучае кавалак памяці. І каб унесці яснасць, як аб'ём памяці яго, відаць размеркавання, калі вам проста выгляд рабіць матэматыку тут? Так што гэта 40 байт. І я ведаю, што толькі таму, што я ведаю, Int, на CS50 прылады, па меншай меры чатыры байта. Так 10 разоў 4 40. Так што гэта запамінання х, адрас першага з 40 цэлых лікаў, што былі выдзелены месцы таму, да спіны, да спіны, да спіны. І вось што ключ аб Таноса. Гэта не зойме трохі памяці Тут, трохі тут, крыху тут. Гэта дае вам адзін кавалак памяці, бесперапынна, ад эксплуатацыі Сістэма. Цяпер тое, што пра гэта, х кранштэйны 10 роўны 0? Адвольнае радок кода. Гэта нічога карыснага не дасягнуць. Але цікава, таму х кранштэйны 10--? Так? АЎДЫТОРЫЯ: [неразборліва]? David J. малая: х кранштэйны 10 не павінен быць нулявым. Дэталь нуль толькі ўступае ў гульню са радкамі, у канцы радка. Але добрая думка. Наколькі вялікая ў гэтым масіве, нават хоць я вылучыў 40 байт? Гэта 0 да дзевяці, ці не так? Гэта 10 Інтс, агул. 40 байт, але 10 Інтс, індэксуюцца ад 0 да 0. Так што ж такое, што х кранштэйны 10? Гэта на самай справе некаторыя невядомае значэнне смецця. Гэта памяць, якая не належыць мне. Я не павінна дакранацца, што байт лік 41, 42, 43, 44. Я збіраюся трохі занадта далёка. І на самай справе, калі я запускаю гэта Праграма, гэта цалкам можа пацярпець крах. Але часам, нам пашанцуе. І таму толькі, каб прадэманстраваць это-- і шчыра кажучы, Вы ніколі не ведаеце, перад вамі у it-- давайце запусцім гэты. Гэта на самай справе не крах. Але калі я змяню гэта, для Асобнік, каб быць, як 1000, зрабіць гэта сапраўды наўмыснае, давайце паглядзім, калі мы можам атрымаць да краху на гэты раз. ОК, гэта не крах. Як наконт 100 тысяч? Давайце перарабіць яго, і зараз паўторна яго. Добра. Уф. Добра. Такім чынам, відавочна, зноў жа, гэта сегменты памяці, так бы мовіць, разумна вялікі, таму мы можам пашанцуе зноў і зноў. Але ў рэшце рэшт, як толькі вы атрымаеце смешна і сапраўды пайсці далёка на экране, дакрананні памяць, што сапраўды, сапраўды не належаць вам. Але, шчыра кажучы, гэта віды памылак збіраюцца каб усе цяжэй і цяжэй высветліць, па сваім меркаванні. Але, на шчасце, як праграмісты, у нас ёсць інструменты, якія дазваляюць нам зрабіць гэта для нас. Так што гэта, мабыць, адна з самых выродлівых праграм, яшчэ больш гідкі, чым выхад GDB а. Але ён заўсёды мае лінію або два, якія супер карысна. Valgrind гэта праграма, якая дапамагае Вы не адладжваць праграму, па сутнасці, але знайсці, звязаных з памяццю праблемы, у прыватнасці. Ён аўтаматычна запусціцца код для Вы і паглядзіце, па меншай меры дзве рэчы. Адзін, ты зрабіў тое выпадкова, як Touch Memory што не належыць вам? Гэта дапаможа вам знайсці тыя выпадкі. І два, гэта дапаможа Вы выявіце нешта, званае ўцечкі памяці, якія ў нас ёсць цалкам ігнаруецца, наіўна, на працягу некаторага часу і з асалодай. Але, аказваецца, усё на гэты раз, кожны раз, калі Вы выклікалі GetString ў так многія з нашых праграм, вы пытаеце аперацыйныя Сістэма для памяці, але ў вас ёсць успаміны з калі-небудзь даючы яго назад, робячы unalloc, або бясплатна, як гэта называецца. Не, таму што мы ніколі не папрасіў вас зрабіць гэта. Але ўвесь гэты час, праграмы вы пісалі ў З былі ўцечкі памяці, задаючы эксплуатацыйныя Сістэма ўсё больш і больш памяці для радкоў і яшчэ шмат чаго, але ніколі не перадаўшы яго назад. І цяпер гэта крыху з спрашчэннем, але калі вы калі-небудзь запусціць Mac або ваш кампутар на працягу досыць доўгага часу, адкрыцця шмат праграм, магчыма закрыццё праграм, і нават пры тым, што ваш кампутар не разбіўся, яна становіцца значна больш павольна, як быццам гэта сапраўды выкарыстоўваючы шмат памяці або рэсурсаў, хоць, калі вы нават не датыкаючыся да клавіятуры, якія маглі б be-- але не always-- мог быць, што праграмы вы працуеце самі уцечак памяці. І яны працягваюць пытацца АС больш і больш памяці, але забываючы пра гэта, на самай справе не выкарыстоўваць яго, але Таму прымаючы памяць ад ад іншых праграм, якія маглі б хацець яго. Дык вось ходкае тлумачэнне. Цяпер вось дзе Valgrind сайт Выхад цалкам зверскае тым, менш і зручней так. Але самае цікавае матэрыял прама тут. Ён распавядаў мне няправільны запіс аб Памер чатыры адбываецца ў гэтай праграме, У прыватнасці, на лініі 21 memory.c. Калі я іду на лінію 21, хм, там сапраўды з'яўляецца несапраўдным запісу аб памеры чатырох. Чаму памер чатыры? Ну, гэта number-- і можа быць anything-- з'яўляецца унутр. Так што гэта чатыры байта. Так што я стаўлю чатыры байта дзе яны не належаць. Вось што Valgrind на самай справе казаў мне. Акрамя таго, гэта будзе таксама скажыце мне, як мы ўбачым, як вы запусціце ў будучыні PSET, калі і калі вы ўцечка памяці, якое, хоць У мяне ёсць, таму што я назваў Таноса, але ў мяне няма на самай справе называецца, у дадзеным выпадку, свабодны, які мы ў канчатковым рахунку бачыць з'яўляецца супрацьлегласцю Таноса. Так што цяпер, як мне здаецца, апошні прыклад. Так што гэта адна крыху больш таямніцай, але гэта, магчыма, Самая галоўная прычына, каб будзьце асцярожныя з памяццю, і прычынай таго, што многія праграмы і / або вэб-сервераў, нават па гэты дзень, пераймае дрэнных хлопцаў дзе у Інтэрнэце, якія так ці інакш адпраўка фіктыўныя пакеты на сервер спрабуюць скампраметаваць вашыя рахункі, або ўзяць вашыя дадзеныя, ці проста як правіла, прымаюць за машынай. Перапаўненне буфера, а назвы, сродкі перапоўненыя ня такога Int, але буфер. І буфер толькі мудрагелісты спосаб сказаць, што гэта куча памяці. І на самай справе, я патэлефанаваў радок да буфера, замест с. Таму што, калі гэта буфер, як у тым сэнсе, YouTube, або ў любы час вы глядзіце відэа, Вы, магчыма, бачылі слова буферызацыі, кропка, кропка, кропка. Гэта неверагодна раздражняе. І гэта проста азначае, што плэер відэа спрабуе загрузіць шмат байтаў, шмат байт з відэа з Інтэрнэту. Але гэта павольна, так ён спрабуе загрузіць кучу з іх запоўніць буфер, кантэйнер, так што ў вас ёсць дастатковую колькасць байтаў, што ён можа затым паказаць вам відэа, не спыняючыся пастаянна. Але, аказваецца, можна ёсць буфер у гэты вялікі. Але паспрабуйце паставіць столькі дадзеных у гэта, і вельмі дрэнныя рэчы могуць здарыцца. Так, напрыклад, давайце паглядзім на гэты апошні тізер прыкладу. Гэта іншая праграма што, на першы погляд, нічога супер карысна не рабіць. У гэтага ёсць Асноўная функцыя што выклікае гэтую функцыю, ф. І, што функцыя, F, тут, мае масіў сімвалаў, называецца с, памер 12. І тады ён выкарыстоўвае гэта Новая функцыя называецца strncpy. Атрымліваецца, што, з гэтай простай, проста радок кода, усяго дзве лініі, мы зрабілі ўсю сваю праграму, і таму, увесь мой кампутар, і мая уліковы запіс карыстальніка, і мой жорсткі язды патэнцыйна ўразлівыя да любога хто ведае і дастаткова добра, каб запусціць гэтая праграма з пэўным каманднага радка Аргумент. Іншымі словамі, калі гэта дрэнны хлопец ставіць ўнутры argvargv [1], увёўшы на клавіятуры вельмі адмыслова сфармаванага радок, ня азбука, 123, але, па сутнасці, двайковыя сімвалы, якія ўяўляюць выкананы Код, праграма, што ён ці яна піша, з гэтай простай праграме, якая Прадстаўнік тысяч праграм што такім чынам, схільныя, адважуся сказаць, ён ці яна можа ў канчатковым рахунку, выдаліць усе файлы на цвёрдым дыску, атрымаць міргаць радок так, каб ён або яна можа ўводзіць каманды самастойна, па электроннай пошце файлы да сябе. Усё, што я магу зрабіць, ён або яна можа зрабіць з гэтым кодам. Мы не будзем дастаткова вырашыць гэта пакуль. І на самай справе, ён збіраецца прыцягнуць невялікую карціну як гэта, якое мы хутка каб зразумець усё лепш. Але на сённяшні дзень, давайце скончыцца што, як мы спадзяемся, крыху больш за зразумела XKCD жарт, пакуль мы не аднавіць у наступны раз. Добра. Убачымся ў сераду. [МУЗЫКА ГУЛЯЕ] СПІКЕР: А зараз, глыбока думкі, па Daven Фарнэме. Памяць, як скачкі ў груду залатыя лісце ў нядзелю днём. Вецер дзьме, кідаючы свой hair-- о, я сумую дні when-- [Смех]