[Музыка Прайграванне] Дэвід Дж. малая: Добра гэта CS50 і гэта пачатак тыдня пяць. Такім чынам, сёння пад вашым падушкі сядзення, Вы нічога не знойдзеце. Але перш, вы павінны знайсці іх, маленькі знак нашай удзячнасці за Усе працы, якія вы паклалі у гульню пятнаццаць. Проста выдаліце ​​маленькі круг на ніжняй часткі, каб пачаць гуляць на Астатняя частка класа. Таму нагадаем, што, ці ведаеце, што задачу, пастаўленую чатыры, якія выйшлі ў гэтыя выхадныя, ўключае ў сябе напісанне іншую гульню. Але на гэты раз ўключае ў сябе выкарыстанне фактычны графічны інтэрфейс карыстача, не тэкставы інтэрфейс, як Гульня Пятнаццаць было. І гульня, якая ляжыць перад вамі, Калі вы яшчэ не бачылі гэта наступны, выглядае крыху нешта накшталт гэтага. Я збіраюся ісці ў мой тэрмінал вокны тут, у GDB. І я збіраюся ісці наперад і запусціце Супрацоўнікі рашэнне, якое вы можаце атрымаць доступ пасля запуску абнаўлення 50, як звычайна. Але я збіраюся паставіць яго ў маленькую тайнага рэжыму, трохі велікоднае яйка, так званы рэжым Бога, па ставіць Бога ў argv1. І я павінен прытрымлівацца сваім уласным кірунках, запусціць яго ў маім ўласным Праблема ўсталяваць каталог. Такім чынам, зараз вы бачыце поўную версію ў гульні прарыву. На самай справе, гэта не рукі-рэжыме. Так гэта на самай справе - пабіў, хоць вы маглі б быць - даволі проста рэалізаваць рэжым Бога ў Breakout, у адрозненне ад гульні пятнаццаці гадоў, які некаторыя з вас маглі вырашацца для хакера выдання. У Breakout досыць у Бога рэжыме, каб проста рабіць тое, што, Інтуітыўна з вяслом? Толькі зрабіце гэта ўсё роўна гарызантальнай пазіцыі шара. І да тых часоў, як вы робіце гэта ў нагу з мячом перамяшчэння гэтая гульня будзе ніколі, ніколі, ніколі не прапусціць мяч і вы будзеце выйграваць кожны раз. Але ў хакерам выданне гэтым тыдні ёсць больш, чым проста рэжым Бога. Там, шэраг іншых магчымасцяў. Сярод іх, лазераў. Так што калі вы сапраўды турбуецеся вы можа пачаць збіваць цэглу і некаторыя іншыя. А для тых з вас, хто хацеў бы каліброўкі стандартным супраць хакераў выданні, я бачу, што на гэтым тыдні хакерам выданне свядома з'яўляецца трохі больш выканальнай, скажам, чым Бог Рэжым гульні быў з пятнаццаці гадоў. Так што калі вы шукаеце расцяжэння і Вы шукаеце некаторыя дадатковыя весела Асаблівасці робяць апусканне ў калі яны ўяўляюць цікавасць. Зараз больш практычна, я хацеў бы адзначыць на адну рэч, а таксама. GDB, які некаторыя з вас, магчыма, яшчэ закранула асабіста, і гэта добра. Але цяпер сапраўды час, каб прывыкнуць да гэтага і зручна з дапамогай гэтай прылады таму што гэта зробіць вашу жыццё значна прасцей, па-сапраўднаму. На лекцыі Адзежа на GDB пара тыдняў назад, нагадаем GDB, што гэта адладчык. Гэта інструмент, які дазваляе запускаць праграмы, але запусціць яго крок за крокам, лінія за радком, так што вы можаце капацца, так што вы бачыце, што адбываецца, так што што вы можаце раздрукаваць Значэнні зменных. Карацей кажучы, гэта дае вам значна больш, энергіі, чым PRINTDEF робіць. Зараз па агульным прызнанні, інтэрфейс даволі складаных. Чорна-белы тэкставы інтэрфейс па большай частцы. Каманды некалькі цвёрдым памятаць у першую чаргу. Але нават калі гэта можа заняць палову , Гадзіну, каб пакласці, што авансам выдаткі часу ў яго, паверце мне. Вядома, да канца семестра яна выратуе Вы на парадак больш часу, чым гэта. Так што ў пачатку тыдня пачаць цалі І з пункту гледжання Breakout, ведаю, што вы можа зрабіць гэта пры ўмове, што ў вас ёсць Код размеркавання або ваш уласны код ў прагрэс у вашай Pst4 каталог. Ведайце, што вы можаце запусціць GDB. / Прарыве. Гэта збіраецца адкрыць такое акенца. Дазвольце мне прывесці сябе больш з акна тэрмінала. І тады тое, што я збіраюся ісці наперад і зрабіць, гэта не проста запусціць яго. Я буду першым ўсталяваць кропку супыну Нагадаем, якая дазваляе зрабіць паўзу выкананне ў пэўным месцы. Проста, каб не ўскладняць Я збіраюся разарваць на адной лініі, проста набраўшы нумар адзін. Дазвольце мне на самай справе зноў адкрыць гэта акно , Таму што гэта становіцца трохі маленькія там. Так што я зараз збіраюся зрабіць тут Калі я адкрываю маё акно тэрмінала. Давай, там мы ідзем. Дык вось, калі я вярнуся ў Dropbox, Pst4 і запусціць GDB. / прарыву увядзіце, заўважыць Я збіраюся разбіць адну для ўстаноўкі кропку супыну першай лініі. А цяпер я пайду наперад і тып запуску. І калі я раблю, нічога не заўважаюць , Здаецца, здараецца. Там няма ўсплываў. Там няма графічнай карыстацкі інтэрфейс яшчэ. Але гэта зразумела, таму што я літаральна на адной лініі ў маёй праграме. І заўважце, што я хутка перасылаць, адмыслова зараз да 62, так як усе матэрыял у верхняй часткі гэтага файла рэчы, як каментары і канстант і нецікавых рэчаў на дадзены момант. Так што цяпер я ўнутры асноўнага, здаецца, у радку 62. І гэта толькі размеркаванне Код, нагадаем. Калі я адкрыю гэтую, ідучы, гэтак жа, у маё падзенне ў поле Каталог Pst4, у breakout.c. І калі я пракруціць ўніз і ўніз і ўніз, і дазвольце мне ісці наперад і ўключыць Мае нумары лініі. Што я буду бачыць, калі я пракруціць ўніз да радок 62, дакладна такая лінія, якая мы спыніліся на. Так што гэтая лінія тут, 62, з'яўляецца дзе мы збіраемся быць. Так што цяпер у GDB, калі я іду наперад і ўвядзіце Цяпер наступнае, увядзiце яго збіраецца выканаць гэтую лінію. І вуаля, у нас ёсць так званы г акна. Калі незнаёмыя з тым, што GWindow ёсць, няма пра што турбавацца. Спецыфікацыі пазнаёміць вас з ёй, як а таксама шэраг праходжанне відэа убудаваныя ў спец. Але цяпер давайце зробім гэта крыху больш цікавым. Дазвольце мне перамясціць гэта акно над ў бок няшмат. Дазвольце мне зрабіць акно трохі больш, такім чынам я магу ўбачыць больш. А цяпер дазвольце мне ісці наперад і зноў рабіць далей. І ёсць мае цэглу. Калі я друкую наступны раз цяпер я бачу мяч. І калі я друкую наступны раз цяпер я бачу, вясло. І на шчасце, гэта не Gedit сапраўды супрацоўнічаюць, паказваючы мне усё, што захачу. Але цяпер, калі я раблю наступны раз, Далей яшчэ раз, я проста Аб'яву некаторых зменных. І я магу надрукаваць любы з гэтых хлопцаў. Друк цэглы, адбіткі жыццяў. І цяпер, калі я працягну рабіць Далей звярніце ўвагу, што я буду Унутры гэтага цыклу. Але код будзе выконваць дакладна так, як я чакаю. Таму, калі я ударыў гэтую функцыю, пачакайце для мышы, яна будзе рабіць што гэта літаральна. Так што я, здавалася, страціў кантроль на праграму. GDB не дае мне іншую радок. Але не хвалюйцеся. Перайсці да маёй гульні, пстрыкніце ў любым месцы. І вуаля, цяпер ён пераходзіць да лініі 86. Такім чынам, яшчэ раз, гэта неацэнна, у канчатковым рахунку, для адладкі праблем. Таму што вы можаце літаральна пакрокава кода, друк рэчы і многае, многае, многае іншае. Але цяпер, гэтыя інструменты толькі вы павінны атрымаць даволі далёка. Так што мы, вядома, зірнуць Графіка на цяпер, усё раптоўна. І цяпер наш свет становіцца трохі больш цікавай. І вы ведаеце, можа быць, ад некаторых з відэа ў Інтэрнэце, што ў нас ёсць гэтыя шорты, якія Вы глядзелі як частка праблемы мностваў. І яны былі расстраляныя, свядома, на белым фоне. І некаторыя з іх маюць вучэнне Стыпендыяты зрабіць некаторыя тэксту на экран, які абклаў на баку іх. Але, вядома, гэта яшчэ не ўсё, што цікавае ў рэальным свеце. Гэта ўсяго толькі лекцыйны зала з вялікі белы экран і фон. І наш дзіўны роду вытворчых каманды з прымушае ўсё выглядаць прыгожай постфактум, абрэзка з накладанне ці нічога мы робім ці не хочуць. Цяпер проста матываваць на гэтым тыдні і сапраўды, дзе вы можаце пайсці, у канчатковым рахунку, з інфарматыкай. Не толькі пасля таго, як праблема ўсталяваць чатыры. Але пасля таго, як іншы курс або цэлай вучэбная праграма гэта дзіўна, што вы можаце зрабіць у гэтыя дні з пункту гледжання графіка ў прыватнасці. Некаторыя з вас, магчыма, бачылі гэтую обцяканьне онлайн. Але я думаў, што я пакажу вам, усяго за пару хвілін, убачыць тое, што камп'ютэрныя тэхналогіі і тое, што CGI, камп'ютэрнай графікі можна зрабіць у гэтыя дні са знаёмай песняй і, магчыма, фільм. [MUSIC - Лана-дэль-Рэй, "Маладыя і прыгожыя] Выступоўца 1: Гэта проста трохі дзіўнае, мабыць, толькі, як ўсюдыісны - [Апладысменты] Выступоўца 1: Я проста запампаваў яго. Але гэта сапраўды дзіўна, я думаю, проста як усюдыісная праграмнае забеспячэнне і кода і інструменты, як гэта на самай справе. Дык вось густ кірунку у якім вы можаце ісці. О, не больш бытавой сёння. Ну, гэта на самай справе трагічная часу дадзены момант я проста паспрабаваў зрабіць. Добра, давайце запусцім Fusion зноў. Нагадаць пазней. Усё ў парадку, і вы павінны ёсць электроннай пошты, як у баку, калі вы ўсё ж такі заўважыце падобнае. Добра, нагадаем, што на мінулым тыдні мы пачалі гэтую адхіліце пазней вядомы як радок. радок нагадвае тып дадзеных, што гэта абвешчаны ў CS50 бібліятэкі. І гэта частка падрыхтоўкі колаў што цяпер пачнуць ўзлятаць. Гэта была карысная канцэпцыя, на ранніх стадыях. Але цяпер ён збіраецца атрымаць больш цікавым і больш магутнымі, каб сапраўды бачым, што пад капотам, радок з'яўляецца толькі тое, што, ці не так сказана? Так, так што гэта так званы сімвал *. І там * пазначае, што ёсць нейкі адрас удзел. І таму, калі вы кажаце, сімвал * вы проста азначаць, зменную з тыпам дадзеных Цяпер паказальнік. Той факт, што там ёсць зоркі проста азначае, што вы аб'яўляеце так званы паказальнік. І, што паказальнік будзе відно захаваць адрас, з Вядома, голец. Цяпер, чаму гэта мае сэнс? Ну, што гэта радок пад капотам? Ну, на працягу некаторага часу мы казалі што радок пад капотам толькі ч-е-л-л-о, напрыклад. Але мы ўжо казалі пра гэта, як які з'яўляецца, па сутнасці, масіў. А шэраг будзе выглядаць трохі больш як гэта, з кожнай з гэтых займаючы ўкусу. А потым мы ўжо казалі, што ёсць нешта асаблівае сюды, 0 зваротную касую рысу, або нулявы канчатак. Так што ўвесь гэты час, гэта тут была радок. Але на самай справе, радок фактычна адрасе. І адрасы, як мы ўбачым, часта прэфікс 0x па пагадненні. Што абазначаюць 0x? Хто-небудзь ведае? Так што гэта проста азначае шаснаццатковае. Такім чынам, вы, магчыма, памятаеце, на самай справе, ад Pst 1, я лічу, адна з размінкі пытанняў на самай справе пытанне аб шаснаццатковым фармаце ў дадатак да двайковай і дзесятковай. І матывацыя тут з'яўляецца тое, што з шаснаццатковым ў вас ёсць 16 лічбы ў вашым распараджэнні. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а затым на A, B, C, D, E, F. А калі палічыць усіх тых, уверх, Вы атрымліваеце ў агульнай складанасці 16. Такім чынам, гэта ў адрозненне дзесятковай, дзе ў нас ёсць 10 лічбаў, ад 0 да дзевяці. Гэта ў адрозненне ад двайковага дзе мы проста 0 і 1. Але ў рэшце рэшт вы можаце проста ўяўляюць сабой тыя ж лічбы, але некалькі інакш. І шаснаццаткавыя з'яўляецца агульным, таму што як атрымліваецца - і мы ўбачым, гэта на больш позніх стадыях - нават тады, калі мы атрымліваем на вэб-праграмавання ў кантэксце HTML і каляровыя коды, шаснаццатковым добрая. Таму што кожная лічба, аказваецца, ўяўляе сабой чатыры біта выдатна. Так што гэта толькі часткова ліній прыгожа як мы ў канчатковым выніку ўбачыць. Так што гэта можа быць ці нешта Ox123 так, які пазначае адрас 123 дзесьці ўнутры майго памяці кампутара. Але, вядома, узнікаюць некаторыя праблемы з-за гэтага асноўнага ажыццяўленне. І памятайце, што я прыняў удар на рэалізацыі функцыі, як гэта - параўнаць працяжнік 0 кропка C на мінулым тыдні, што хоць здавалася, што было Правільна, гэта проста не параўнаць два радкі правільна. Я выкінуў асноўных і я кінуў ад каментароў проста сфакусавацца на код, які ўяўляе цікавасць тут. І гэта ў чырвоным, таму што ён памылковы. Па якой прычыне? Ну, у верхняй там, калі я заявіў, радком, тое, што адбываецца на самай справе пад капотам? Ну, дазвольце мне перайсці да Прыведзены тут экран і зрабіць гэта. Такім чынам, я заявіў, зноў жа, Радок з GetString. Так што я збіраюся ісці наперад і цяпер маляваць з такой, якая яна на самай справе. Гэта збіраецца быць квадратнай тут. І я збіраюся сцвярджаць, , Што гэта 32-бітнае. Па крайняй меры, гэта звычайна бывае, па меншай меры, на CS50 Прыбор ў вялікай колькасці кампутараў. Я буду называць яго з. Але цяпер нагадаем, што мы GetString называецца. Так GetString вяртаецца, вядома, радок. Калі карыстальнік ўвядзе ў ч-е-л-л-о, увядзіце Радок прывітанне атрымлівае вярнуўся. І гэты радок, як мы толькі што сказалі, заканчваецца дзесьці ў памяці кампутара з зваротнай касой рысы 0 у канцы. Я намалюю гэта як масіў - ці бесперапынны блок сімвалаў - што яна на самай справе. І цяпер, што GetString на самай справе вяртанне? Што GetString вяртаўся ўвесь гэты час? Ну, скажам так, у тыдні да, яна вяртае радок. Але больш тэхнічна, тое, што робіць GetString вяртання па-відаць? АЎДЫТОРЫЯ: адрасу. SPEAKER 1: адрасу. У прыватнасці, яна вяртае адрас самы першы ўкус, што гэта такое. Я проста працягваць выкарыстоўваць адзін, два, тры таму што гэта зручна. Яна вяртае адрас першага знакаў у радку. І мы на мінулым тыдні заявіў, што якая з'яўляецца дастатковай. Таму што мы заўсёды можам высветліць, дзе канца радка проста ітэрацыі гэта, можа быць, з для пятлю або пятлю, ці нешта накшталт , Што проста шукае "зваротны слэш 0", спецыяльны сімвал дазорцы. І тады мы ведаем, што радкі здараецца, даўжынёй - у дадзеным выпадку - пяць. Так што тэхнічна робіць GetString гэта вяртае Ox123 ў гэтым выпадку. І тэхнічна, што адбываецца, з'яўляецца тое , Што мы захоўваем, ўнутры з, Ox123. У рэшце рэшт, нават калі гэта з'яўляецца новай канцэпцыяй, паказальнікі, яны гэта проста зменныя. Але яны адбываюцца для захоўвання бітаў, якія разам уяўляюць адрасе. Так што ўсё, што яны тэхнічна атрымлівае захоўваецца ў ы з'яўляецца Ox123. Але мы, як людзі - у тым ліку сёння наперад - сапраўды не будзе клапаціцца, звычайна, што фактычны адрас некаторых кавалак памяці. Гэта проста нізкі ўзровень дэталізацыі быць інтэлектуальна цікавым. Так што я збіраюся адмяніць гэта. І замест таго, больш высокі ўзровень, проста сказаць , Што, калі мы гаворым аб паказальніках Я збіраюся проста прыцягнуць больш зручных стрэлку, якая перадае ж ідэю і абстрагуюцца звесткі аб тым, што фактычная асноўны адрас. Цяпер, калі мы вернемся да кода, што адбылося на мінулым тыдні, калі ў нас ёсць радок T GetString роўна? Ну, калі я яшчэ раз, увядзіце прывітанне на гэты раз я іду, каб атрымаць іншы ўчастак памяці. ч-е-л-л-о 0 зваротную касую рысу. Але таму што я тэлефанаваў GetString ў другі раз - і я ведаю гэта, гледзячы на Зыходны код для GetString - нават тым, што гэта выпадкова, што прывітанне быў набраў у два разу, не GetString будзе спрабаваць аптымізаваць і быць разумным. Гэта проста будзе атрымаць іншы кавалак памяці з кампутара, які будзе па іншым адрасе. Давайце проста скажам, адвольна 456. А потым што ён збіраецца вярнуцца? Гэта збіраецца вярнуць 456 і захоўваць яго ў т. Так што ж адбываецца на самай справе, на Левы бок у мяне ёсць іншы кавалак памяці, 32 біт звычайна. І там будзе ісці Ox456. Але зноў жа, я не зацікаўлены ў гэтых пэўных лікаў больш. Я проста хачу, каб абстрактна намаляваць яго, як страла. Так што гэта цяпер новае тлумачэнне. Але гэта сапраўды такі жа ідэяй, што гэта што адбывалася ўвесь гэты час. І так прычыне, тое, што гэты першы версія параўнанне было дрэнна, на мінулым тыдні, чаму? Калі вы гэта зробіце, калі з роўна роўна т, што ты па-сапраўднаму пад капотам параўнання? Вы параўноўваеце адрасоў. І гэтак жа, інтуітыўна, зразумела, Ox123 не збіраецца роўнае Ox456. Гэтыя лічбы, гэтыя біты проста розныя. І так паслядоўна, на мінулым тыдні ён сказаў ўвесці розныя рэчы, нават калі Словы былі даслоўна тое ж самае. Такім чынам, мы гэта выправіць. З пункту гледжання непрафесіяналы, што было выправіць? АЎДЫТОРЫЯ: Выкарыстоўвайце функцыю. Выступоўца 1: Выкарыстоўвайце функцыю. Або зоркі вызначана уцягнуты, але выкарыстаць функцыю для чаго? АЎДЫТОРЫЯ: для параўнання радкоў. Выступоўца 1: для параўнання радкоў. Такім чынам, асноўная праблема тут была што я проста разглядзе Якасць радкоў, якія будуць вызначаны параўнанне іх адрасамі. І, відавочна, гэта толькі цяпер яшчэ нямыя Вы разумееце, што адбываецца пад капотам. Каб па-сапраўднаму параўноўваць радкі, каб убачыць, калі яны роўныя ў тым, што чалавечы будзе разглядаць два радкі роўнымі мы павінны параўнаць іх характар ​​для знак у знак. Цяпер я мог бы зрабіць гэта вельмі стомна. Але фамільярна, мы выкарыстаннем цыклу. І проста параўнайце з кранштэйнам Я супраць т кранштэйна я. з кранштэйнам я плюс 1 т супраць кранштэйны я плюс 1, і гэтак далей, усярэдзіне нейкі завесы. І калі я вызначаю любых двух знакаў, якія адрозніваюцца, або калі я разумею, што ох, з з'яўляецца карацей, чым т або больш, чым т Я магу адразу сказаць, ілжыва, яны не тое ж самае. Але калі я атрымліваю праз з і т і сказаць жа, тое ж самае, тое ж самае, тое ж самае, тое ж самае, у канцы абедзве радкі, я магу сказаць, праўда, яны роўныя. Ну, на шчасце, некалькі гадоў назад нехта пісаў, што код для нас. І яны назвалі гэта StrComp для параўнання радкоў. І хоць гэта крыху лічыльніка інтуітыўна, StrComp вяртае 0, калі гэтыя два радкі, з і т аднолькавыя. Але яна вяртае адмоўнае значэнне, калі з павінны прыйсці да T алфавіце або станоўчае значэнне, калі ён павінен прыйсці, пасля т у алфавітным парадку. Так што, калі вы хочаце ўладзіць нешта, аказваецца, што StrComp карысна. Таму што гэта не проста сказаць Так ці не, роўныя ці не. Гэта дае вам пачуццё заказу як слоўнік моцы. Так StrComp, з коскі T роўная роўна 0 азначае, што радкоў сапраўды роўныя. Таму што той, хто пісаў гэтую функцыю гадоў таму мяркуецца, выкарыстоўвалі для завесы або пятлю, ці нешта накшталт таго інтэграваць па персанажаў зноў і зноў і зноў. Але праблема ўзнікла два тут. Гэта было copy0.c. І абодва ў чырвоным таму што гэта недахопы. І што ж мы тут робім? Ну, па-першае, я патэлефанаваў GetString. І я захаваў вяртаецца значэння ў с. Так што гэта ў значнай ступені гэтак жа, як гэта верхняя частка карціны. Але што будзе пасля гэтага? Ну, дазвольце мне ісці наперад і пазбавіцца цэлай кучай гэтым. Мы перамоткі ў часе туды, дзе мы толькі што ёсць с, які ў цяперашні час у адпаведнасці з лініі аднаго там. Я правяраю. Калі з роўным роўная 0. Зараз, хуткае нататка боку, калі GetString можа вяртаць 0? Там не хапае памяці. Дакладна? Гэта рэдкае, што гэта адбудзецца, вядома, на кампутары, які ёсць сотні мегабайт або нават гігабайтамі аператыўнай памяці. Але гэта можа, у тэорыі, вярнуцца 0, асабліва калі Карыстальнік не супрацоўнічае. Там у спосабы прыкінуцца, што ў вас няма уведзеных трук і нічога GetString да вяртання 0 эфектыўна. Так што гэта, каб праверыць гэта. Таму што, калі любы з вас пачалі атрымаць, ужо, памылкі сегментацыі - які, верагодна, была крыніца некаторага расчаравання - тыя амаль заўсёды вынік з пра памылку памяці. Як-то вы пераблыталіся ў дачыненні да паказальнік, нават калі вы не разумееце, было паказальнікам. Такім чынам, вы, магчыма, індукаваных сегментацыі няспраўнасці яшчэ ў адну тыдзень выкарыстання нешта накшталт цыкла або ў той час як пятлю і масіў, заходзіць занадта далёка міма межы некаторых масіў, які Вы заявілі ў тыдзень у дзве прыватнасці. Вы маглі б гэта зрабіла нават у праблемных ўсталяваць чатыры з прарыву. Хаця вы, верагодна, не бачылі любой зоркі ў размеркаванні код Breakout, атрымліваецца, што тыя, GRect і GOval і іншыя падобныя рэчы, тыя фактычна з'яўляюцца паказальнікамі пад капотам. Але Стэнфард, як і мы, як тыя шкуры што падрабязна па меншай меры для бібліятэк мэтах, гэтак жа, як мы робім для струнных і сімвал *. Але GRect і GOval і ўсе гэтыя рэчы вы, хлопцы, ці будзе выкарыстоўваць На гэтым тыдні, у канчатковым рахунку адрасоў памяці. Вы проста не ведаеце. Так што не дзіўна і тое, мабыць, што вы маглі б спатыкнуцца некаторых памылкі сегментацыі. Але што цікава, вось цяпер, Калі пасля праверкі на 0 мы робім Радок T атрымлівае с. Ну, дазвольце мне абвясціць T. Я збіраюся намаляваць яго ў выглядзе квадрата, 32 біт, назавем яго T. А потым я збіраюся зрабіць атрымлівае с. Ну, што ж гэта значыць? Ну, гэта трохі цяжка думаць Пра гэта прадставіць мудрым. Але давайце падумаем аб што ўнутры х? Што літаральна ў гэтую зменную? Значэнне Ox123. Таму калі я кажу T атрымлівае радок з, што толькі літаральна азначае ўзяць лік ў с, што Ox123 і паклаў яго Ox123. Ці графічна, калі я як бы абстрактным ад якіх падрабязна ён мае Эфект літаральна робіць гэта таксама. Так што цяпер, узгадайце, калі на мінулым тыдні мы прыступілі да капіталістычнага T. Я T зрабіў кранштэйны 0. Ну, T кранштэйны 0, нават калі гэта паказальнік, вы можаце разглядаць яго як быццам гэта масіў, з квадратным дужкі. Дык дзе T 0 кранштэйны? Ну, гэта гадзіну. І таму, калі мы выкарыстоўваем гэты радок кода, Два верхніх, што ў гэтым з type.h Выява загалоўка, вось дзе яны абвешчаныя. Вы капіталізацыі гэтай H. Але, Вядома, гэта сапраўды такі ж вось г Усярэдзіне з, так бы мовіць. І вось цяпер вы змянілі або капитализируются як арыгінальную і так званыя копіі. Таму што вы не зрабіць копію чынам, што чалавеку хацелася б яе бачыць. Дык што ж выпраўленне тут, У copy1.c на мінулым тыдні? Функцыі, так што мы маглі фактычна скапіяваць радок. І прынцыпова, што ж нам трэба, каб зрабіць для таго, каб скапіяваць радок? Ну, у гэтым зялёным версію тут я збіраецца зрабіць гэта даволі нізкім узроўні. Ёсць на самай справе функцыі яны маглі б дапамагчы з гэтым. Але самае асноўнае, прычым найбольш знаёмая, па меншай меры, у хуткім часе будзе знаёмы нам, наступны - так што на першай лініі кода ў зялёны гэтага часу. Я проста перапісаў з, як сімвал *. Там няма функцыянальнага розніцы няма. Я проста выкінуў CS50 бібліятэку і Я тэлефаную яго, якое гэта, сімвал *. Цяпер кропка, кропка, кропка, таму што былі апрацоўку памылак, што не Цікава казаць аб зноў. Так што цяпер Т абвешчаны. Гэта таксама сімвал *. Так што я звярнуў на маленькай плошчы Экран, як раней. Але, з правага боку, Malloc, мы сказалі гэта памяць вылучыць. Так што вылучыць некалькі кавалак памяці. І колькі байт мы на самай справе хочам вылучыць, яна здаецца? Ну, даўжыня радка с. Так што калі гэта прывітанне гэта будзе пяць. Мы скажам, ч-е-л-л-о. Так пяць байт. Але тады плюс 1, то чаму 1? Сімвал 0. Калі мы не пакідаюць месцы для гэтага хлопца мы можа выпадкова стварыць сітуацыю, , Дзе знаходзіцца радок ч-е-л-л-о. А потым наступны GetString час Я патэлефанаваў і ўвесці, напрыклад, Дэвід, D - V-I-д, кампутар будзе думаць, што ёй на самай справе ч-е-л-л-о-д-а-у-і-D, таму што ёсць Без перапынку паміж гэтымі словамі. Так што нам трэба, што перапынак. Такім чынам, мы не хочам, пяць. Мы хочам шэсць байт. І я кажу байт. Але гэта сапраўды час памер знакаў. Тэхнічна сімвал амаль заўсёды адзін байт. Але толькі, каб зрабіць наш код партатыўны, так бы мовіць, так што ён працуе на розных кампутарах, нават калі яны могуць быць крыху іншай пад капот, я збіраюся агульным кажуць памер так, каб сімвал мой код заўсёды працуе. І я не прыйдзецца перакампіляваць гэта проста таму што я абнавіць мой кампутар або выкарыстоўваць некалькі розных платформаў. Так што я атрымаў 6 разоў больш сімвал, які бывае 1. Так, каб сродкі маглі Malloc даць мне шэсць байт. Што гэта на самай справе рабіць? Ну, дазвольце мне вярнуцца ў часе тут туды, дзе мы знаходзімся ў гісторыю. Так што, калі я вярнуся сюды, я абвясціў сімвал * званыя Т. Я цяпер называецца Malloc працягу шасці байтаў. А цяпер я збіраюся зрабіць гэтыя шэсць байт як масіў раней. Але я на самой справе не ведаю, што гэта ўнутры гэтага масіва. Калі вы вылучыць памяць аказваецца, што Вы не можаце давяраць, што ёсць некаторыя Вядомае значэнне там. Гэта можна было б выкарыстоўваць на нешта інакш, некаторыя іншыя функцыі, некаторыя іншыя радкі кода, які вы напісалі. Так што мы звычайна называем гэтым смеццем значэння і прыцягнуць іх, можа быць, як пытальныя знакі, толькі пра тое, што мы Не ведаю, што на самой справе там. І гэта не вялікае справа, пакуль мы дастаткова разумныя, каб перазапісаць смецце значэння з нумарамі або сімвалы, якія нас цікавяць. Таму ў дадзеным выпадку тое, што я збіраюся рабіць? Ну, мая радок кода Далей, у мяне ёсць чатыры. Int я атрымліваю 0, п атрымлівае даўжыня радка с. Так знаёмая цыклу. Я менш або роўная п, які звычайна вышэй. Але на гэты раз гэта наўмысна. Я + +, а потым я проста раблю т кранштэйна я атрымлівае с. Таму што мая карціна выглядае як гэта ў гэты момант захоўваецца ў т з'яўляецца адрас гэтага выпадковага блок памяці , Значэння якіх невядомыя. Але як толькі я раблю т кранштэйна 0, які ставіць мяне тут. І тое, што заканчвае тым, што цягне туды? Мы ў канчатковым выніку пакласці ч. Таму што гэта тое, што стаіць на кранштэйне з 0. А потым тое ж самае для е і л і л і а. N, чаму не пайшоў праз роўная п? З-за 0 характару. Так проста быць ясна, то, калі я на самой справе сцерці ўсе гэтыя смецця значэння, а затым фактычна маляваць у тое, што я чакаў, гэта з кранштэйнам 1, 2, 3, 4, плюс які заднім новы характар. І вось цяпер, калі мы працягнем міма кропкі, кропка, кропка ў гэтым правільная версія і капіталізаваць кранштэйны Т +0 я б, Вядома, быць капіталізацыі толькі ў гэтым хлопец тут, што ў прынцыпе, у канчатковым рахунку мэта. Так што ўсё паказальніка. І ты выкарыстаў іх на працягу тыдня Цяпер у кантэксце радкоў. Але пад капотам яны трохі больш складанай. Але калі вы думаеце пра іх у гэтым нагляднай форме я прапаную, каб яны верагодна, не ўсё так страшна, як яны можа здацца на першы погляд, Асабліва з такой новы сінтаксіс. Любыя пытанні па паказальніках, радкоў або знакаў? Да? Залы: Ці можна вярнуцца назад у [неразборліва]? Выступоўца 1: Вядома. АЎДЫТОРЫЯ: Так як жа ў вашай самай апошняй лініі, у вас няма лініі T * і A * S ў лініі? Ці няма ў вас спасылкі на - Выступоўца 1: Ах, вельмі добрае пытанне. Чаму ў мяне няма і Т * A * S? Так коратка, на мінулым тыдні, як і ў нашай памяняць функцыі, я сапраўды казаў, што, калі ў вас ёсць паказальнік сродак, з дапамогай які Вы ідзяце туды, як мы зрабілі фізічна на сцэне, быў на самай справе выкарыстоўваць зорку аператара. Аказваецца, што гэтая квадратных дужак абазначэння, што мы назавем сінтаксічных цукар, які знаходзіцца ўсяго ў сэксуальны спосаб кажуць, што гэта скарочаная запіс менавіта тое, што вы апісваеце. Але гэта крыху больш інтуітыўным. І ў той рызыка прыняцця гэтага здаюцца больш складаней, чым яна павінна быць, тое, што адбываецца на самай справе тут з'яўляецца наступнае - Калі я скажу, што T * азначае пайсці ў адрасе, захаванне ў т. Так літаральна, калі Т захоўвання адрас гэтай г Першапачаткова * T сродкі ідуць сюды. Такім чынам, што ж т кранштэйна 0 азначае? Сапраўды такі ж рэчы. Гэта проста трохі больш карыстальнікаў дружалюбны пісаць. Але я яшчэ не скончыў. Я не магу проста сказаць * T * атрымлівае с. Таму што тое, што я буду рабіць тады? Я б пакласці Н, Н, Н, Н, Н на працягу ўсяго гэтага. Дакладна? Таму што Т * перайсці па адрасе ў т. Аднак мы ўнутры цыклу. І якое значэнне я прырашчэння, Вядома, на кожнай ітэрацыі? я. Але ёсць магчымасць Тут, праўда? Нават калі гэта адчувае, як яна становіцца трохі больш складанай чым квадратных дужак мы выкарыстоўвалі на працягу некаторага часу - дазвольце мне адмяніць мой г змена там - хоць гэта цяпер становіцца трохі аматар, асноўная ідэя, калі T * азначае тут і * т толькі перайсці па адрасе ў т. Але тое, што адрас у т? Чысла мы працягваць выкарыстоўваць? Як Ox456, давайце вярнуць гэта толькі дзеля абмеркавання. Ну, калі я хачу атрымаць на е ў T радкоў, я проста хачу ісці, Па сутнасці, 456. Ці, хутчэй, 457. Мне проста трэба, дадайце адзін. Але я магу зрабіць гэта, ці не так? Паколькі т, хоць я захаваць малюнак яго цяпер, як страла, гэта проста лік, Ox456. І калі я дадам, што адзін або больш Як правіла, калі я дадам я да таго, я магу на самой справе атрымаць менавіта там, дзе я хачу. Так што, калі я на самой справе зрабіць гэта - і гэта тое, што цяпер называецца арыфметыка паказальнікаў - Я магу выдаліць гэтую лінію. Што, шчыра кажучы, я думаю, што ясней і больш зразумелым карыстачу чытаць. Але гэта не менш правільна. Гэты радок кода зараз выкарыстоўвае арыфметыкі паказальнікаў. Гэта кажа пайсці ў пасля выступу - незалежна ад пачатку т у тым, які з'яўляецца T Plus I, які першапачаткова роўна 0, і гэта выдатна. Паколькі гэта азначае пачатак т плюс адзін, плюс два, плюс 3, і так далей. І тое ж самае справу з с. Так сінтаксічны цукар для гэтага. Але разуменне таго, што адбываецца на самай справе пад капотам, я б сказаў, на самай справе карысна само па сабе. Таму што гэта азначае цяпер значыць не значна больш магіі адбываецца пад капотам. Там не будзе шмат больш пласты, якія мы можам адхіліце для вас. Гэта с. І гэта праграмаванне. Вельмі добрае пытанне. Добра, так што гэта было тое, што дзіцячая калыска праграма, якую я меў на ўвазе раней. своп быў сапсаваны. Калі сапраўды падобна на працу. Нагадаем, што гэтак жа, як з малаком і Апельсінавы сок - які я пачаў пітной сённяшняй дэманстрацыі. Гэтак жа, як з апельсінавым сокам і малако, мы павінны выкарыстоўваць часовую зменную TMP, правесці часова, так што мы маглі тады змяніць яго значэнне, а затым абнавіць б. Але гэтая функцыя, мы сказалі, ці гэта Праграма, у якой гэтая функцыя была напісана было няправільна, і недахопы, то чаму? Да? АЎДЫТОРЫЯ: [неразборліва]. Выступоўца 1: Сапраўды, калі вы называеце своп - ці, больш абагульнена, калі называюць самым любую функцыю - калі аргументы для гэтай функцыі з'яўляюцца прымітыўных, так бы мовіць, цэлыя і сімвалы і парным разрадах і плавае, то, без зоркі, вы праходзіце ў копію аргумент. Так што калі х быў 1 і ў 2 было, збіраецца быць 1 і B будзе 2. Але яны збіраюцца быць рознымі кавалкамі бітаў, розныя порцыі памяці, якія, здараецца, захоўванне аднолькавыя значэння. Так што гэты код з'яўляецца супер дасканалы пры перапампоўванню і б. Гэта нікуды не падыходзіць пры перапампоўванню - у прыкладзе на мінулым тыдні - х і у. Таму што зноў жа, яны у няправільнай вобласці. Цяпер, як мы ісці аб фіксацыі гэтага? Мы павінны былі зрабіць функцыю выглядаць трохі больш гідкі. Але, зноў жа, разгледзім, што гэта проста азначае. А на самай справе, дазвольце мне, для паслядоўнасці, змяніць адну рэч так што гэта ідэнтычна тое, што мы толькі што зрабілі. Як я ўжо казаў на мінулым тыдні, ён не мае значэння, дзе ён ідзе. На самай справе, Вам трэба будзе паставіць зорачку побач з імем зменнай. Але я думаю, было б крыху лягчэй разгледзець * побач Тып дадзеных у тым сэнсе, што гэта паказальнік да цэлалікавай ў гэтым выпадку. Так што я тут раблю? Я кажу, што мне не даюць цэлалікавай рушыў услед яшчэ адзін Інтэлект, называючы іх А і Б. Дайце мне адрас Int. Дайце мне адрас іншага Int. Патэлефануйце гэтыя адрасы А і В. А затым з дапамогай абазначэння ўніз * ніжэй, перайдзіце да кожнага з гэтых адрасоў па меры неабходнасці або атрымаць ці ўсталюйце яго значэнне. Але ёсць выключэнне. Чаму я не * побач з TMP? Чаму я не рабіў гэтага, напрыклад? Такое пачуццё, што я б проста ісці ўсё , І выправіць усё гэта. Да? АЎДЫТОРЫЯ: [неразборліва]. Выступоўца 1: Я не заявілі TMP ў выглядзе радка. Так што гэта будзе аб'явіць, у дадзеным выпадку, TMP быць адрас Int. Але гэта не зусім тое, што я хачу, па некалькіх прычынах. Залы: Вы не хочаце, каб памяняць іх месцамі. Выступоўца 1: Сапраўды, я не хачу, каб памяняць нічога з TMP. TMP проста тыдзень-адзін матэрыял. Усё, што я хачу, з'яўляецца зменнай захоўваць некаторы лік. Я нават не клапоцяцца пра адрасы у гэты момант. Мне проста трэба 32 біт або таму для захоўвання Int. І я хачу паставіць у гэтых 32 біт ўсё, што не ў, так бы мовіць, але пра што ідзе, проста каб быць больш дакладным. Таму што, калі гэта адрас, * азначае, пайсці туды і атрымаць значэнне 1. Напрыклад, у прыкладзе на мінулым тыдні або ў выпадку Б, атрымаем значэнне 2. Так што ж адбываецца на самай справе? Дазвольце мне намаляваць карціну тут, што толькі дражніць адзін ад аднаго часткі сёння. Але гэта будуць працягваць з'яўляцца на працягу досыць доўгага часу. Гэта, я сцвярджаю, тое, што ваш кампутар памяці выглядае, калі вы запускаеце праграмы, любой праграмы. Калі вы запускаеце праграму на самым версе аператыўнай памяці кампутара - так што думаю гэтага прамавугольніка, па-сапраўднаму, так як ваш кампутара аператыўная памяць ці памяць, усе 101 мільярд байт зь яе ўсе два мільярды байт, усе два гігабайта гэта, незалежна ад колькасці ў вас ёсць, намалюем яго ў выглядзе прамавугольніка. І я сцвярджаю, што, калі вы запускаеце праграму як Microsoft Word або Chrome або што-небудзь падобнае, біты, Microsoft або Google, што напісаў - у выпадках гэтых праграм - загружаюцца ў памяць кампутара дзе яны могуць быць выкананы больш хутка і падаецца ў працэсар, які з'яўляецца мозгам кампутара. І ТАМ яны захоўваюцца ў самым версе вашай праграмы, так бы мовіць. Іншымі словамі, калі гэта кавалак памяці, калі вы двойчы пстрыкніце на Microsoft Word, біты прыходзяць з жорсткага дыска. Яны загружаюцца ў аператыўную памяць. І мы будзем штурхаць іх на самым версе гэтага прамавугольніка канцэптуальна. Ну, астатняе ваша памяць выкарыстоўваць для розных рэчаў. На самым версе вы бачыце ініцыялізацыі дадзеных і ініцыялізацыі дадзеных. Гэта звязана, па большай частцы, пры канстантамі або глабальныя зменныя якія маюць значэння. Але больш на тых у іншы раз. Тады ў вас ёсць куча, якая мы будзем вяртацца. Але на дне часткі, якая Асабліва дарэчныя прама цяпер. Гэта так званы стэк. Гэтак жа, як у большасці любых D зала тут, на кампуса, у вас ёсць тыя латкі, якія проста стэк-над адзін аднаго на якім Вы можаце пакласці ежу і яшчэ шмат чаго. Стэк ў кампутарнай сістэме вельмі падобныя. За выключэннем у той час як латок, як мы выкарыстоўваем у сталовай, вядома, маецца на ўвазе несці рэчы латкоў або кадры - як мы будзем называць іх - у кампутары памяці выкарыстоўваецца для захоўвання зменных і іх значэнняў. Так што ж на самай справе адбываецца пад капотам? Ну, дазвольце мне перавярнуцца на экран тут. І давайце засяродзімся толькі на Ніжняя частка на імгненне. Калі гэта ніжняя частка мой памяці кампутара аказваецца, калі я выклікаць функцыю асноўнага - што адбываецца, шчыра кажучы, аўтаматычна для мяне - Я атрымліваю кавалак памяці ў глыбіні маёй памяці, так бы мовіць. І тут гэта асноўны лакальныя зменныя ісці. Гэта месца, дзе ARGC ARGV і, можа быць, ісці, і я ўсё зменныя абвясціць ўнутры асноўнага. Яны ў канчатковым выніку на дне аператыўнай памяці майго кампутара. Зараз выкажам здагадку, што асноўным выклікае функцыю як своп, як гэта было на мінулым тыдні? Ну, мы, па сутнасці паставіў новы латок, Новы кадр, на мой кавалак памяці. І я збіраюся апісаць гэта як якія належаць своп функцыі. Цяпер, што ўнутры своп? Таксама, на аснове праграмы на мінулым тыдні і той, які мы толькі што бачылі ўрывак з, ўсярэдзіне фрэйма свопу, або свопу Латок, гэта тое, што зменныя? Ну, а, б. Таму што тыя былі свае мясцовыя аргументы, а таксама трэці, TMP. Так на самай справе, я мог бы звярнуць на гэта трохі больш акуратна. Дазвольце мне пайсці далей і адмяніць этыкетцы. І дазвольце мне сцвярджаць, што вы ведаеце, што? , Верагодна, будзе ў канчатковым выніку тут. B скончыцца тут. І TMP скончыцца тут. Цяпер, упарадкаванне можа будзе трохі адрознівацца. Але канцэптуальна гэта ідэя. І толькі калектыўна, гэта тое, што мы будзем называць кадр свопу, або сталовай латок. І тое ж самае справу з асноўным. Але я не буду, што перамаляваць. Але вось дзе і ARGC ARGV і любыя сваіх лакальных зменных, як х і ў можа быць таксама. Такім чынам, цяпер разгледзім, што адбываецца на самай справе пры выкліку swap. Пры выкліку своп, як выкананне кода гэта, вы перадаеце, у версію з памылкамі, а і б таксама копіі х і у. Таму, калі я цяпер раблю такі на экране - павінен лепш на гэта - так што гісторыя, якую я распавядаў пра сябе быў у гэтай версіі багі, калі мы патэлефануеце памяняць які праходзіць у літаральным А і В як цэлыя лікі, што на самой справе адбываецца? Ну, тое, што адбываецца на самай справе складаецца ў наступным. Дазвольце мне ісці наперад і проста адмяніць растлумачыць некаторыя месцы тут. Так што гэта мая памяць кампутара. Так што, калі ў мяне, напрыклад, - на самай справе давайце зробім гэта такім чынам - Калі я сцвярджаю, што гэта X, захоўвання значэнне 1, як і на мінулым тыдні. І гэта ў, захоўвання значэнні 2 так жа, як на мінулым тыдні. І гэта з'яўляецца галоўным, калі я тэлефаную свопу, тым самым даючы сабе доступ да і B і TMP, я збіраюся сцвярджаць, што гэта і гэта 1. Гэта б. Гэта два. Гэта называецца TMP. А першапачаткова, яна мае некаторыя смецця значэнне пакуль я фактычна не захоўваеце ў ім, якой роўная 1. Тады я іду наперад і змяніць тое, што? Б значэння. І вось зараз у мяне ёсць два тут. І тады мы сказалі б атрымлівае TMP. Зноў жа, як і санітарнай праверкі, трэці радок кода тут проста гэта Адзін з іх, B атрымлівае TMP. І вось, нарэшце, што мне рабіць? Я іду наперад і змяніць б быць усё, што Значэнне TMP з'яўляецца, што 1. Я не дакранаюся TMP зноў. Але цяпер, праблема ў тым, як толькі своп вяртаецца, таму што гэта не ўручаць вярнуць частку кошту, няма вяртання каманда відавочна ў ім. Што на самай справе адбываецца? Ну, па сутнасці, уся гэтая памяць - ОК, па-відаць любіць гумка толькі адзін палец за адзін раз - проста знікае. Зараз на самай справе гэта не нікуды не дзенешся. Але вы можаце думаць пра гэта Цяпер ў выглядзе знакаў пытання. Таму што гэта ўжо не фактычна выкарыстоўваецца. І нічога не робіцца з гэтымі значэннямі. Такім чынам, у выпадку з зялёным версіі гэты код, а не тое, што ў цяперашні час перайшла ў своп? Так адрасы. Такім чынам, адрас х і адрас у. Таму, калі мы пераказаць гэтую гісторыю адзін апошні час, і я на самой справе зрабіць своп зноў, але з паказальнікамі, што з'яўляецца, гэта быццё B, і гэты які з'яўляецца TMP, што на самай справе захоўваецца ў у гэтым зялёным версія майго кода, дзе я перадаю у адрасах? Гэта збіраецца быць паказальнікам на х. Так што я мог намаляваць стрэлку. Але давайце выкарыстоўваць той жа адвольны Напрыклад, як раней. Давайце казаць, што гэта нешта накшталт Ox123. І гэта будзе, таму што Ox127 гэта чатыры байта далёка, таму што гэта Інтэлект, такім Ox127. І зноў жа, я бяру некаторыя вольнасці з нумарамі. Яны нашмат менш, чым яны былі б сапраўды можа быць і ў іншым парадку. Але гэта, як карціна Зараз іншае. Але калі я выкарыстоўваю гэтую зялёную код і я дзесятковага TMP атрымаць *. * Сродак зрабіць наступнае, вазьмі -Адрас, у і ісці да яе, якой роўная 1. І вось што я пасля гэтага пакласці ў TMP. Між тым, у наступным радку кода Тут * атрымлівае B, што гэта значыць? Ну, *, так што ісці тут атрымлівае * B, што азначае пайсці туды. А гэта значыць, паставіць значэнне там. Нарэшце, апошняя радок кода проста сказаў * B атрымлівае TMP. Так Б кажа пайсці туды і перазапісаць яго з TMP, які ў гэтым выпадку будзе быць зноў 1. І вось чаму зялёная версія Нашы працы кода, у той час як чырвоныя версія ніколі не рабіў. Усё гэта проста зводзіцца да таго, памяць кіруецца і, дзе гэта фактычна размешчаных у вашай аператыўнай памяці кампутара. І на дадзены момант, гэта адна з рэчаў, што стэк выкарыстоўваецца для. Пытанні па фармаце? На паказальнікі? Або на своп? Добра, Malloc, нагадаем, зрабіў нешта накшталт гэтага. Гэта было вельмі просты прыклад. І гэта быў той, які Binky прадставіў нас, хоць і даволі хутка, у канцы класе. Чорт вазьмі, там мы ідзем зноў. Такім чынам нагадаць, што гэта быў прыклад Бинки прадставіў нас, хоць і некалькі хутчэй у канцы класе. І тут мы выкарыстоўвалі сапраўды Malloc ў другі раз. Таму што першы раз, калі мы выкарыстоўвалі яго для стварыць дастатковы аб'ём аператыўнай памяці, вылучыць дастатковы аб'ём аператыўнай памяці для захоўвання радка. На гэты раз Binky трымалі яго простым. Так што гэта толькі для захоўвання Інтэлект, па-відаць. І гэта цалкам нармальна. Гэта крыху дзіўна, шчыра кажучы, для выкарыстоўваць Malloc вылучыць адну Int. Але сутнасць Claymation Ніка была на самай справе проста распавесці гісторыю пра тое, што адбываецца ці не адбываецца пры Вы дрэнна звяртацца з памяццю. Такім чынам, у гэтым выпадку гэтая праграма зрабіў некалькі рэчаў. У першым выпадку тут, ён аб'яўляе паказальнік на X называецца Int. Затым ён аб'яўляе паказальнік называецца г да Int. Затым ён захоўвае ў X, то якія? Нехта зараз. Што захоўваецца ў X у адпаведнасці з Трэцяя радок гэтай праграмы? АЎДЫТОРЫЯ: [неразборліва]. Выступоўца 1: Ну, не зусім байт, за, кажуць. Дакладней цяпер. Што захоўваецца ў X? Адрас, я думаю, што я чуў. Такім чынам, што ж Malloc вярнуцца? Malloc паводніцкіх вылучае кавалак памяці. Але як гэта дасць вам доступ да яго? Яна вяртае што? Адрас першага байта у блок памяці. Цяпер, гэта супер проста. Гэта ўсяго толькі адзін байт, што азначае, рашэння мы вяртаемся з'яўляецца адрас цалкам. Так што захоўваць у х, то, гэта адрас гэтага блока памяці. Між тым, што адбываецца далей? Таму на самай справе, давайце ісці наперад і адзначыць гэта вельмі хутка. Так што калі мы ідзем да экрана тут і мы гуляем на гэта дзесятковага * X і Y дзесятковага * збіраецца рабіць тое, што для мяне? Я сцвярджаю, што гэта толькі збіраецца зрабіць нешта накшталт гэтага і назавем яго X, і гэта і называюць яго у. Між тым, у трэцяй радку кода збіраецца вылучыць памер Інтэлект, які, аказваецца, - шкада, калі я сказаў, аднаго да Я меў на ўвазе адну Int - чатыры байта на тыповым кампутары. Па крайняй меры, з CS50 прыбора. Так што гэта збіраецца вылучыць ён, хто ведае? Дзе-то тут. І гэта захоўваецца на некаторай Адрас Ox, хто ведае? Але тое, што збіраецца атрымаць вярнуўся у тым, што адрасы. Але мы будзем маляваць гэтым наглядна як толькі стрэлка падобнае. Зараз у наступным радку * X атрымлівае 42. Што азначае х * з пункту гледжання непрафесіяналы? Проста ідзеце туды. Перайсці на гэты адрас. Ці, іншымі словамі, прытрымлівайцеся стрэлкамі і пакласці 42 там. Але потым здарылася нешта дрэннае да Бинки, ці не так? Нагадаем, што лінія тут пяць, * Y атрымлівае 13, сапраўды нешчаслівым лікам, зрабіў тое, што для нас? Ну, у * сродкі ідуць туды. Ну, гэта не было дадзена Значэнне ж, ці не так? Код не можа ў быцця ініцыялізаваць ні да чаго. Мы х ініцыялізацыі ў адрас. Але ў быў абвешчаны наверсе. Але тое кропка з коскі, ніякай каштоўнасці быў на самай справе пакласці ў яго. Так што гэта справядліва назваць гэты смецце значэння. Хто ведае, што там? Гэта рэшткі біты, якія былі выкарыстаныя некаторымі папярэднімі радок кода ў маёй праграме. Так што, калі я кажу, ідуць там, гэта як, Я паняцця не маю, дзе гэтая стрэлка будзе ў канчатковым выніку. І вось, калі вы звычайна атрымаеце памылку сегментацыі. Калі вы выпадкова разнаймення, так кажуць, або перайдзіце на адрас, які ня на самай справе законны адрас, дрэнныя рэчы здараюцца. І гэта менавіта тое, што адбылося думаць Бинки. Таму нагадаем, што гісторыя, якую Нік быў кажу тут была тая ж ідэя, што Я намаляваў з ілюзіяй мелам на дошцы там. X і Y былі абвешчаныя. Затым выдзелена памер Цэлалікавых і захоўваць яго ў х. А ў наступным радку мы зрабілі * х. Гэта была чароўная палачка Ніка разнаймення. Пасля гэтага ўсе 42 у памяці паказаў на х. Але гэта тое, дзе рэчы пайшло жудасна няправільна. Дакладна? Мы паспрабавалі разнаймення у. Але ў некаторых было няправільнае значэнне, ці не так? Гэта стрэлку ў левым ніжнім куток, не паказваючы на ​​самай справе ні да чаго. Гэта накшталт таго, што я раблю зрабіў тут на дошцы. Так што дрэнныя рэчы здараюцца, сегментацыя віна, або Binky віна, у гэтым выпадку. Але калі мы затым выправіць, што, робячы х атрымлівае ў як жа гісторыя зменаў? Ну, калі я раблю X атрымлівае Y, гэта фактычна тое ж самае, як кажуць б гэта ні было, нешта Ox- будзе тое ж самае тут, Ox-то. Ці вобразна мы будзем маляваць стрэлкі. Дык вось на дошцы з Бинки, з наступнага радка з кода, * У азначае пайсці туды. Дзе там? Гэта значыць, тут. І калі мы абнаўляем, што быць 13 ён проста залучае рух і напісанне 13 тут і цяпер. Таму, магчыма, не цалкам простая на першы погляд. Але каб успомніць і выкарыстоўваць той жа жаргон Бинки, што выкарыстаў тут, так што Першыя дзве вылучыць паказальнікі х і у, але не pointees. І не pointees як правіла, выкарыстоўваецца тэрмін. Але паказальнік зусім. Але гэта тое, што на які паказвае У наменклатуры на Бинки. У наступным радку, вядома, вылучае цэлалікавай pointee. Так што частка памяці - як я прыцягнуў больш за на Правая частка там - і набор х роўна кропцы да яго. Гэта разыменовывает х для захоўвання 42 у памяці, якія ён паказвае ў. І тады гэта, вядома, было дрэнна. Таму што у не паказваючы нічога яшчэ. Гэта фіксуе гэта. Так што гэта яшчэ багі праграмы. Проста таму, што мы, што дзьме праз код радок за радком і кажуць, ды добра, хай гэта крах там. Гэта дрэнная рэч. Рознагалоссі праграма проста будзе перапыніць наогул на гэты радок. Але калі вы выдалілі разбіўся лініі і замяніць яго з апошнімі двума лініі ёсць вы прызначаеце - выкарыстаннем прысвойвання паказальніка - Y каб яна паказвала на X як кропка т. І тады вы разнаймення у ў вельмі бяспечны спосаб. Дык дзе ж гэта нам дае? Ну, атрымліваецца, што пад капотам CS50 ў бібліятэцы, паказальнікі выкарыстоўваюцца ва ўсім. І мы на самай справе пачаць чысціць таму, што пласт у хуткім часе. Але аказваецца, таксама выраз, Некаторыя з вас могуць быць знаёмыя з, асабліва больш камфортным, на самай справе, што з вельмі папулярнай вэб-сайт, або перапаўненне стэка, у гэтыя дні. Але гэта на самай справе мае вельмі тэхнічнае значэнне. Цяпер мы ведаем, што стэк. Гэта як чаркі латкоў Усярэдзіне сталовай. Або ўнутры вашага кампутара сваёй памяці тыя кадры , Якія выкарыстоўваюцца функцый. Ну, атрымліваецца, што з-за таго, што вельмі просты рэалізацыі памяць і кадраў на так званым стэк, вы можаце ўзяць пад свой кантроль вылічальнай сістэмы даволі лёгка. Вы можаце ўзламаць сістэмы, калі людзі як мы не напісалі наш код асабліва добра. Калі такія людзі, як нам выкарыстоўваць кавалкі памяці або выкарыстоўваць масівы - Яшчэ часцей - але часам забудзьцеся праверыць Межы нашага масіва, як Вы маглі у сябе часам, і паўторным занадта далёка за межы масіва. У лепшым выпадку, ваша праграма можа проста пацярпець крах. Памылка сегментацыі, добры няёмка. Ня выдатны, але гэта не абавязкова вельмі дрэнна. Але калі ваша праграма на самай справе на рэальным кампутарах карыстальнікаў, калі ён працуе на сайт, які фактычна выпадковыя людзі ў інтэрнэце б'юць, дазваляючы людзі ініцыююць дрэнныя рэчы на ​​ваш код як правіла, не вельмі добра, паколькі гэта азначае, што магчымасць прыняць кантроль над кампутарам. І гэта будзе выглядаць трохі загадкавым. Але я думаў, што я з вас палохаць апошні прыклад. Вось прыклад кода. І ёсць добры Вікіпедыі артыкул, якая ідзе праз гэта больш падрабязна. У мяне ёсць асноўная на ніжняй пакліканне Foo, перадаючы агду 1. І гэта менавіта так, што вы можаце запусціць праграму і прайсці адвольны ўвод. А потым Foo абвешчаны наверсе як прыняцце радком, або больш Дакладней, сімвал *. Затым ён аб'яўляе масіў знакаў. Назавем гэта буфер, у цэлым, памер 12. Так 12 знакаў можа змясціцца ўнутры гэтага масіва называецца C. І тады ён выкарыстоўвае гэтую новую функцыю, , Якое з'яўляецца новым, але не цяжка разумею, памяць копію. Ён капіюе памяць, з бара, які быў пераменная н мінулым, незалежна ад карыстач увёў у ARGV 1 у с. Колькі байтаў? Даўжыня радкі з бара. Такім чынам, іншымі словамі, калі карыстальнік ўводзіць ч-е-л-л-о Enter, даўжыня радка прывітанне з раўняецца пяці. Так што пяць з гэтых байт збіраецца атрымаць капіюецца ў масіў з імем С, што мае памер 12. Але тое, што карыстальнік ўводзіць у значна даўжэй слова, якое 13 сімвалаў ці 14 знакаў або 100 знакаў ці больш? Дзе яны будуць ісці? Ну, гэта кадр, то гэты латок У сталовай стэку, яны збіраюцца, каб пайсці туды. І гэта толькі збіраецца пачаць перазапіс іншыя рэчы, якія ўжо ў стэк, перапоўненыя стэк, так бы мовіць. Так графічна, думаць пра гэта такім чынам. Гэта ўсяго толькі маляўнічая версія карціну мы малюю. У ніжняй частцы, скажам, з'яўляецца асноўным. І на вяршыні, што вы бачыце зараз ў кадры колерам цяпер, Функцыя называецца Foo. Але што цікава, вось пра Foo з'яўляецца тое, што вось яго рамкі. Так ён малюецца гэтак жа, як я зрабіў, але ў светла-блакітных. А цяпер гэта, дзе З кранштэйнам 0 ідзе. І гэта дзе з кранштэйнам 11 будзе ў канчатковым выніку. Іншымі словамі, гэта здараецца быць прадстаўлены ў выглядзе квадрата. Але калі вы проста трымаць шлёп байт ўніз - або сімвалы - яны збіраюцца ў канец па месцы знаходжання да 0 усё, аж да да 11, таму што гэта 0 індэксавацца. Але дзе ж 13. Характару будзе ў канчатковым выніку? Дзе 14-й? Дзе 50-й сімвал будзе ў канчатковым выніку? Гэта будзе працягваць ісці ўніз. Таму што нават калі мы намалявалі карцінкі з стэк рос, адрасы, аказваецца, ідуць ад невялікі адрасы, невялікія паказальнікаў, на вялікі адрасоў. Так што проста працягвае ісці ўверх і ўверх. Такім чынам, калі карыстальнік ўводзіць прывітанне, гэта выдатна. Не памылка, не праблема, бяспечнай для ўсіх. Але калі карыстальнік ўводзіць у тым, што мы будзем называюць спаборнасць код, намаляваны увогуле як, атака, атака, атака, атака, што можа адбыцца? Добра, калі ўсе ўваходныя што карыстач набраў у гэта не проста сяброўскі або абразлівыя радкі знакаў. На самай справе гэта паслядоўнасць сімвалаў што калі ён быў скампіляваны, на самай справе гэта код. Можа быць, гэта код, які выдаляе ўсе файлы на вашым цвёрдым дыску або рассылае спам ці нешта накшталт гэтага. Звярніце ўвагу, што тое, што ключавым тут з'яўляецца тое, што Калі дрэнны хлопец пашанцавала дастаткова, каб перазапісаць чырвоным кавалак памяці - якія я не абапірацца на маю карціну, але гэтая карціна Вікіпедыі тут ёсць - яго так званы зваротны адрас. Калі ежа вяртаецца, калі вяртаецца абмен, якім кампутарам ведаць, каб перайсці ад сюды, каб тут? Ці ў тэхнічным сегменце наверсе, як ён ведае, каб перайсці ад свопу код - 0 і 1 у , Якія складаюць своп - Вярнуцца на галоўную? Там у так званым зваротным адрасам захоўваецца ў тым жа кадры стэка, на той жа латок кафетэрыі. Так што калі дрэнны хлопец досыць разумны, каб пакласці атакуючы код, код атакі, атакі код, і вам абавязкова пашанцуе дастаткова - часта метадам спроб і памылак - да перазапісу, што чырвоны зваротны адрас, з адрасам і апавяшчэння на самым версе. Звярніце ўвагу 0835C080. Яна напісана наверсе таму для Прычыны мы, магчыма, перагледзець. Гэта гэта лік. Так што калі дрэнны хлопец атрымлівае пашанцавала ці досыць разумны, каб перазапісаць чырвоным паласа памяці з адрасам код, які ён ці яна нейкім чынам ўводзіцца ў кампутар, адгадайце, чые Код збіраецца быць вернутыя як толькі Foo робіцца выканання? Дрэннага хлопца кода. Так што гэта шкоднасны код, AAA, зноў жа, можа рассылаць спам, можа выдаліць усе файлы на вашым цвёрдым дыску. Але гэта тое, што сапраўды перапаўненне стэка ёсць, ці перапаўненне буфера або перапаўнення буфера атакі. І гэта неверагодна, неверагодна часта па гэтай дзень з праграмамі, напісанымі на C, C + +, і нават некаторыя іншыя мовы. У той страшны ўвагу, мы заканчвацца жарты. [Смяецца] Убачымся ў сераду. На наступным CS50 - Так што я ўвесь вольны дыскавая лямпаў сёння, але пачакай, абястлушчанага малака, палова тэлефонаў Кніга, апельсінавы сок што я піў сёння. USB кабель, гаечным ключом. [Музыка Прайграванне]