[Музыка Прайграванне] Дэвід Дж. малая: Добра. [Смяецца] З вяртаннем. Гэта CS50. А гэта ў канцы тыдня пяць. І да гэтага часу, у нас у значнай ступені прымаюць як належнае, што існуе гэты кампілятар, Clang, што Вы былі выкліку праз гэты іншы інструмент пад назвай Зрабіце што так ці інакш чароўна пераўтворыць зыходны код у аб'ектны код, нулі і адзінкі што кампутары CPU, цэнтральны Працэсар, на самой справе разумее. Але, аказваецца, ёсць лік, якое адбываецца пад капотам у паміж уваходам і выхадам. І я хацеў бы прапанаваць, што мы плоць , Што ў некалькі больш падрабязна ў гэтыя чатыры кроку, ёсць нешта, званае папярэдняй апрацоўкі, то называецца кампіляцыя, якую мы бачылі, тое, што называецца мантаж, і нешта, званае звязванне. Так да гэтага часу, у некаторых з нашых Праграмы, якія мы мелі рэзкі ўключае. У апошні час у нас было некалькі рэзкіх вызначае для канстант. Вось і атрымліваецца, што тыя рэчы, якія пачынаюцца з хэш-сімвала ці сімвал фунта папярэдне працэсара дырэктыў. Гэта проста мудрагелісты спосаб сказаць, што гэта радок кода, якая на самой справе пераўтворыцца ў нешта яшчэ, перш чым Кампутар нават спрабаваць канвертаваць праграму ў нулі і адзінкі. Напрыклад, рэзкае ўключае ў сябе стандартныя Ўводу / высновы. Ч, у значнай ступені толькі сродкі ідуць наперад, захапіць змест файлаў stdio.h і ўстаўляць іх прама там. Дык не нулёў і адзінак на той момант яшчэ. Гэта сапраўды проста замену. І гэта будзе зроблена ў час так званай стадыі папярэдняй апрацоўкі, пры рэальна працаваць Clang або адмыслова Зрабіце ў большасці выпадкаў. Так што ўсё гэта адбывалася першы аўтаматычна да гэтага часу. Затым наступае этап кампіляцыі. Аднак мы ўжо спрошчана кампіляцыі. Кампіляцыя праграмы на самай справе азначае прыняць яго ад чаго-то, як C, Зыходны код мы пісалі, што на у тое, што называецца зборкай. Мова асэмблера больш нізкім узроўні мову, які, на шчасце, мы не будзем маюць шмат нагода напісаць у гэтым семестры. Але гэта на самым нізкім узроўні ў сэнсе, што вы ў літаральным сэнсе пачаць пісаць складаць і адымаць і множцеся, і загрузіць з памяці і захавання ў памяці, вельмі простыя інструкцыі, якія кампутар, пад капотам, на самой справе разумее. Нарэшце, мантаж займае гэтую мову да нулёў і адзінак, што мы былі апісання да гэтага часу. І сапраўды, нарэшце, ёсць так званыя стадыі кампаноўкі, якія мы гл. праз хвіліну, якая спалучае ў сабе Вашай нулёў і адзінак і нулёў тыя, іншыя людзі, перш чым Вы стварылі. Так што улічыце гэта супер просты праграмы. Менавіта з Тыдня 1. Ён проста сказаў: Hello World, на экране. Мы беглі праз гэтую Clang. Ці мы прапусціў яго праз Зрабіце які бег Clang. І выдаецца ў момант часу, калі некаторых нулёў і адзінак. Але, аказваецца, ёсць прамежкавым этапе. Калі я іду сюды - ой, не хачу ўбачыць яго яшчэ. Калі я іду сюды, каб мой прыбор і я адкрываю hello.c, тут што ж праграмы. І тое, што я збіраюся рабіць у тэрмінале вокны тут я збіраюся запусціць Clang, а не рабіць, што аўтаматызуе ўсе чатыры гэтыя крокі для нас. І я збіраюся зрабіць ляск-S і Затым hello.c а затым увядзіце. І я атрымліваю хуткае мігценне зноў, і гэта добра. І цяпер у крыху большы вокны, Я збіраюся адкрыць Gedit тут. І я збіраюся адкрыць файл, які, Аказваецца, называецца гэтая hello.s утрымлівае, што на мове асэмблера Якім я казаў раней. І гэта тое, што называецца зборкі мовай, даволі нізкім узроўні інструкцый, якія Intel CPU ці што гэта такое, што знаходзіцца ўнутры разумее. І МАУ для руху. выклік для тэлефануйце, вельмі нізкім узроўні функцыі. саб для адымаць. Таму, калі ў вас ёсць пэўная ўнутры працэсара вашага кампутара, што робіць яго розныя, у параўнанні з іншымі працэсарамі рынку, якія інструкцыі ён разумее і часта, наколькі эфектыўна ён у тым, як хутка гэта пры выкананні некаторых гэтых інструкцый. Зараз падрабязней пра гэта, вы можаце ўзяць Увосень наступнага CS61 ў каледжы. Але тут у нас ёсць, напрыклад, некалькі ідэнтыфікатары, якія могуць выглядаць знаёма. hello.c гэта назва праграмы. . Тэксту - існуе не так шмат цікавага ёсць толькі цяпер, нагадаем, што тэкст сегменце, па стане на панядзелак, то, дзе ў памяці вашай праграмы фактычна сканчаецца. Так што, па меншай меры цьмяна знаёмыя там. Тут, вядома, згадка нашай галоўнай функцыі. Пракруткі ўніз, гэта ставіцца да рэчаў званых рэгістрамі, вельмі маленькія кавалкі памяці ўнутры вашага фактычнага працэсара. І калі я нават пракруціць ўніз Акрамя таго, я бачу нейкі ўскоснае згадка пра ASCII. І там, сапраўды, у тым, што радкі, Прывітанне, коска, свету. Так карацей кажучы, гэта была адбываецца для вас, аўтаматычна, пад капотам ўсяго гэтага часу. І тое, што адбывалася на самай справе адзін раз вы запусціце Clang, або шляхам Пераканайцеся, што вы атрымліваеце першае, з зыходнага кода, так званы асэмблера. Тады Clang з'яўляецца пераўтварэнне гэтая зборка Мова да нулёў і адзінак. І гэта слайд, які мы пачалі наша абмеркаванне ў Тыдні 0 за - , А затым на 1 тыдзень. І, нарэшце, гэтыя нулі і адзінкі ў спалучэнні з нулямі і адзінкамі з гэтых бібліятэк мы прымалі само сабой разумеецца, як Standard I / O або Бібліятэка радок ці нават CS50 бібліятэкі. Такім чынам, каб намаляваць гэтую карціну больш Візуальна, у нас ёсць hello.c. І гэта, вядома, выкарыстоўвае Е функцыянаваць сказаць, прывітанне свет. Этап кампіляцыі займае яго да , Што файл, які мы толькі што бачылі hello.s, нават хоць гэта звычайна выдаляюцца аўтаматычна. Але гэта код зборкі ў сярэдзіне кроку. А потым, калі мы збіраем зборкі мову, так бы мовіць, што, калі вы атрымаць гэтыя нулі і адзінкі. Такім чынам, мы эфектыўна павялічана на сёння тое, што мы прымаем як належнае, значыць ісці зыходным кодам у аб'ектны код. Але, нарэшце, зараз, калі ж карціну - давайце засунуць яго на левай баку. І заўважце, што ў верхняй частцы маецца Я згадаў stdio.h. Гэта файл, які мы ўключылі амаль ва ўсіх праграмы, якія мы напісалі. І гэта файл, змесціва якога атрымаць копію ўставілі, эфектыўна на вяршыні вашага кода. Але, аказваецца, што на кампутары Сістэма недзе, ёсць меркавана stdio.c файл, які нехта напісаў гадоў таму, што рэалізуе ўсе функцыі, якія былі абвешчаныя ў stdio.h. Зараз на самай справе гэта, верагодна, не на вашы Mac або ПК або нават у CS50 прыбор сырой код C. Хтосьці ўжо складзены яго і ўключыў . O файла або аб'ектыўнага кода. файл, які звязаны з агульным бібліятэцы , Якая была папярэдне ўстаноўлена і скампіляваныя для вас. Але выкажам здагадку, што сапраўды існуе на нашым кампутары stdio.c паралельна з Clang. Вашага кода складаецца і сабраны. stdio.c 'з кодам складаецца i сабраны, так што гэты самы апошні кроку, тут, унізе, трэба як-то спасылка, так бы мовіць, вашы нулёў і адзінак з яго ці яе нулёў і адзінак у адну Простая праграма, якая ў канчатковым рахунку, называецца проста Hello. Дык вось усё гэта магія што адбывалася да гэтага часу. І будзе працягваць прымаць гэтыя працэсаў само сабой разумеецца, але разумею, ёсць шмат цікавых падрабязнасцей адбываецца пад там. І гэта тое, што робіць ваш кампутар з Intel Inside Асабліва выразна. Так што на гэтай ноце, калі вы хацелі б далучыцца да нас на абед у гэтую пятніцу, сапраўды ідзеце звычайным cs50.net/rsvp месцы, 1:15 вечара ў гэтую пятніцу. А зараз некалькі аб'яваў. Таму ў нас ёсць добрыя навіны. І ў нас ёсць дрэнныя навіны. Пачнем з некаторых добрая навіна. [Стогны] Добра. Ну, тэхнічна гэта свята, таму гэта не столькі падарунак ад нас. Але тады дрэнная навіна, вядома. [Стогны] Я правёў шмат часу на гэтыя анімацыі. [Смяецца] Там будзе разгляд сесіі наступны панядзелак. Гэта збіраецца быць у 5:30 вечара. Мы будзе нагадваць вам пра ўсе гэтыя дэталі па электроннай пошце на курсы сайт ўсяго за пару дзён. Ён будзе зняты і даступныя неўзабаве пасля гэтага. Так што калі вы не можаце зрабіць, што ў панядзелак ноччу слот, не хвалюйцеся. Раздзелы на наступным тыдні таксама будзе засяродзіцца на разглядзе для віктарыны. Калі ваш падзел у панядзелак, які Сапраўды універсітэце свята, мы будзем да гэтага часу сустракаюцца ў раздзеле. Калі вы проста не можаце зрабіць, што раздзел, таму што вы збіраецеся прэч, гэта нармальна. Наведайце нядзелю ці ў аўторак ці падзелу наладзіцца на секцыі Джэйсана, які даступныя ў Інтэрнэце. Так, больш за дрэнныя навіны. Так, згодна з праграмай, у нас ёсць лекцыі ў наступную пятніцу. Але добрая навіна - Відавочна, што я правёў занадта шмат часу на гэта. [Смяецца] Мы зачыніць Наступныя лекцыі ў пятніцу. Так што будзе падарунак для нас, так што вы можа сапраўды быць у добрай адтэрміноўкай паміж гэтым тыдні, і два тыдні праз. Так што не лекцыі на наступным тыдні, толькі малюсенькі маленькая віктарына, за якую вы павінны быць становіцца ўсё больш ўсхваляваны. Такім чынам, давайце звернем увагу на тое, што сапраўды больш візуальных і больш захапляльным і, каб падрыхтаваць глебу за тое, што будзе на гарызонце ўсяго за пару тыдняў. Пасля першай віктарыны, паспрабуем зрабіць цэнтры нашага набору задачы да іншай дамена канкрэтнай праблемы, што і ў судзе або для бяспекі ў цэлым. На самай справе, традыцыя з гэтай праблемай Набор для мяне адным з навучанне членаў Садружнасці і ЦС ісці праз Кампус прымаючы некаторыя фатаграфіі ідэнтыфікуюцца але невідавочныя людзей, месца або рэчы, то кожны год я нейкім чынам атрымалася выпадкова выдаліць ці пашкодзіць лічбавых карт памяці , Што знаходзіцца ўнутры нашай камеры. Але ніякае грандыёзнае прадпрыемства. Я магу пайсці далей і падключыць , Што ў мой кампутар. Я магу зрабіць судова вобраз яго, так сказаць, шляхам капіявання і нулёў тыя, ад гэтага карта памяці, няхай гэта будзе сваёй SD карты або кампактныя флэш-карты ці усё, што вы добра знаёмыя. І тады мы зможам перадаць гэта. Таму задача наперадзе, сярод іншых рэчы для вас, будзе пісаць C код, які аднаўляе цэлы букет У фармаце JPEG для мяне і паказаў будзе тых людзей, месцаў або рэчаў. І мы будзем таксама казаць, у гэтай задачы ўсталёўваць і ў апошнія дні, пра графікі ў цэлым. Мы выкарыстоўвалі іх, вядома, для вырвацца. Але вы, здаецца, само сабой якія разумеюцца існуюць гэтыя высокія паняцці ўзроўню прастакутнікаў і авалаў. Але пад капотам ёсць пікселі. І вы павінны былі пачаць думаць аб тых. Ці вы для P-4 набору павінны думаць з нагоды разрыву паміж цаглінамі, як Вы хутка мяч рухаецца па экран для вырвацца. Так што гэта паняцце кропкі на экране, што гэта ўступаюць у гульню ўжо. Цяпер тое, што вы бачыце, аднак, з'яўляецца тое, што Вы атрымліваеце на экране кампутара. Калі вы калі-небудзь назіралі за некаторымі добрымі або Тэлевізар дрэнна, напэўна яны ў значнай ступені разглядаць аўдыторыю як технофобы , Якія сапраўды ня шмат ведаю пра вылічэннях. І таму гэта вельмі лёгка для паліцыі Дэтэктыў сказаць, ці не так чыста, што для мяне? Або ўзмацніць, правільна? Павышэнне, як гудзенне слова ў Найбольш любое злачынства, звязанае шоў. А рэальнасць ў тым, калі вы бераце вельмі размытыя карціны падазраваны рабіў нешта дрэннае, вы не можаце проста паляпшаць яе. Вы не можаце павялічваць бясконца. Вы не можаце бачыць бляск у чыіх-небудзь вачэй, якія ўчынілі, што канкрэтнае злачынства, нягледзячы на Распаўсюджанасць гэтага па тэлевізары. І вось з гэтым давайце матываваць маючых адбыцца задачу, пастаўленую з зірнуць на некалькі канцэртаў, з якімі вы могуць быць знаёмыя. [Прайграванне відэа] -OK. Зараз давайце атрымаць добры погляд на вас. -Трымайце яго. Выканаць свае словы назад. -Пачакай хвіліну. Пераход права. -Там. Замарозіць гэта. -На ўвесь экран. -OK. Замарозіць гэта. Зацягнуць на што, а? -Вектар у на гэтага хлопца на заднім коле. -Павялічыць прама тут, на гэтым месцы. -З правільным абсталяваннем, які адлюстроўваецца могуць быць павялічаны і заточаныя. -Што гэта? -Гэта праграма павышэння. -Ці можаце вы зразумець, што любыя? -Я не ведаю. Давайце паляпшаць яе. -Павышэнне раздзеле A-6. -Я падвысіла дэталях і - -Я думаю, што дастаткова для павышэння. Адпусціце яе, каб малюнак на экране кампутара. -Павышэнне адлюстраванне ў яе вочы. -Давайце запусцім гэта праз Video Enhancement. -Эдгар, можа вы зможаце палепшыць гэта? -Пачакай. -Я працую над гэтым адлюстраваннем. Хто-то-адлюстравання. Рэфлексія. -Там у адлюстраванні асобы чалавека. -Адлюстраванне. -Там у адлюстраванні. -Павялічыць на люстэрку. -Вы можаце ўбачыць адлюстраванне. -Ці можаце вы павысіць імідж адсюль? -Можа вы зможаце палепшыць яго прама тут? -Ці можаце вы палепшыць яго? -Ці можаце вы палепшыць яго? -Мы можам павялічыць гэта? -Ці можаце вы палепшыць яго? -Пачакай секунду, я буду павышэння. -Павялічыць у дзверы. -X10. -Zoom. [Смяецца] -Засяленне -Пачакай, пачакай. -Стоп. -Паўзу. -Паварот на 75 градусаў вакол вертыкальная калі ласка. [Смяецца] -Стоп, і назад у частку аб дзверы. -Ёсць ўзмацняльнік малюнка якія могуць растравыя? -Можа быць, мы можам выкарыстоўваць Прадип Sen Метад бачыць у вокнах. -Гэта праграмнае забеспячэнне з'яўляецца сучасным. -Значэнне значка выключаны. -Пры правільным спалучэнні алгарытмаў. -Ён узяў асвятлення алгарытмы на наступны ўзровень, і я магу выкарыстоўваць іх, каб паляпшэнню дадзенага фатаграфіяй. Блакіроўку на і павялічыць Z-восі. -Enhance. -Enhance. -Enhance. Ад замярзання і павышэння. [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] Дэвід Дж. малая: Так пастаўленай задачы 5 з'яўляецца тое, што ляжыць наперадзе. Так мы хутка атрымаць лепшае разуменне аб тым, калі і чаму вы можаце і наша не можа павысіць такім чынам. Але спачатку, давайце вернемся нашай увагі некаторых з блокаў мы будзем павінны быць у стане распавесці гэтую гісторыю. Таму нагадаем, што мы звярнулі на гэта фота Панядзелак і трохі на мінулым тыдні. І гэта апісвае структуру рэчы ў памяці вашага кампутара, калі запуску некаторых праграм. Тэхналогій сегменце наверсе, нагадаем, адносіцца фактычнаму нулёў і адзінак , Якія складаюць вашу праграму. Там на ўзроўні ніжэй за таго, некаторыя ініцыялізаваць або неинициализированных дадзеных, якія звычайна ставіцца да рэчаў, як канстанты або радкі або глабальных зменных, якія маюць было абвешчана загадзя. Там у кучы, але мы прыедзем Вярнуцца да гэтага крыху пазней. А тут яшчэ ў стэку. Многае, як стос талерак у кафетэрыі, гэта дзе атрымлівае памяці слаістай і кожны раз, калі слаістай Вы робіце тое, што ў праграме? Што такое стэк для выкарыстання? Да? Выклік функцыі. Кожны раз, калі вы выклікаеце функцыю, гэта надаецца стужкі памяці для сваіх лакальныя зменныя або яго параметраў. І графічна, мы бачым, што з кожным Функцыя называецца паслядоўным, калі званкі званкі C B D званкі, яны атрымліваюць слаістай ў стэк. І ў кожнай з гэтых кавалачкаў памяць з'яўляецца па сутнасці унікальны аб'ём за гэта функцыя, якая, вядома, праблематычна, калі вы хочаце перадаць ад адной функцыі да іншай часткі дадзеных, якія вы хочаце мутаваць ці змяніць. Так што ж было наша рашэнне дазваляе Функцыя прадстаўлена адным стэкам кадр для змены памяці ўнутры іншага кадра стэка? Як гэтыя два размаўляць адзін з адным? Такім шляхам паказальнікаў або адрасоў якія, зноў жа, проста апісаць, дзе ў памяць, у якасці канкрэтнага ўкусу лік, канкрэтны значэнне можа быць знойдзена. Так ўспомнім мінулы раз таксама мы працягвалі гісторыю і паглядзеў на даволі багі праграмы. І гэтая праграма глючыць на працягу некалькіх прычын, але самым трывожным з'яўляецца адным , Паколькі яна не праверыць, якія? Так, гэта не ў стане праверыць уваход. Прабачце? Калі гэта больш, чым 12 знакаў. Так што вельмі спрытна, пры выкліку memcopy, які, як вынікае з назвы, проста копіі памяці з другога аргументу ў свой першы аргумент. Трэці аргумент, вельмі спрытна, з'яўляецца праверыць, каб пераканацца, што вы не капіяваць больш, у дадзеным выпадку даўжыня Бар, колькасць знакаў, ў пункт прызначэння, які гэтая Масіў C. Але праблема ў тым, што тое, C Калі само па сабе не дастаткова вялікі справіцца з гэтым? Вы збіраецеся скапіяваць нумар з байт, якія вы атрымалі. Але што вы на самай справе маюць больш байт, чым у вас ёсць пакой для? Ну, гэтая праграма вельмі проста дурное слепа працягвае браць усё, што гэта дадзена, прывітанне зваротную касую рысу 0 выдатна, калі радок кароткае Дастаткова, як і пяць знакаў. Але калі гэта на самай справе ці 12 сімвалаў 1200 знакаў, мы бачылі ў апошні раз што вы толькі збіраецеся, каб цалкам перазапісу памяці, не належыць вам. І горшым выпадку, калі Вы перапісваеце, што чырвоная частка там, што мы называлі зваротны адрас - гэта толькі, калі кампутар аўтаматычна, для вас, за сцэны, защипами ад 32-бітнае значэнне, якое нагадвае ён па якім адрасе ён павінен вярнуцца, калі Фу, гэта іншае функцыі, робіцца выкананне. Гэта крошкі хлеба родаў на які вяртаецца. Калі вы перазапісаць, што, магчыма, калі вы дрэнны хлопец, можа можа патэнцыйна ўзяць на сябе чыйсьці кампутар. І вы, безумоўна, крах яго ў большасці выпадкаў. Зараз гэтая праблема толькі пагаршаецца як мы пачалі казаць аб памяці кіравання ў цэлым. І Malloc, размеркавання памяці, з'яўляецца функцыі, якія мы можам выкарыстоўваць, каб вылучыць памяці, калі мы не ведаем загадзя што мы, магчыма, спатрэбіцца некаторы. Так, напрыклад, калі я вярнуся да прыбора тут. І я адкрываю за апошнія hello2.c час Нагадаем гэтай праграме, якая выглядала трохі нешта накшталт гэтага, ўсяго тры лініі - назваць сваё імя, затым імя радкі, на левым баку, роўна GetString. А потым мы яго раздрукаваць, імя карыстальніка. Так што гэта было супер проста праграмай. Каб было ясна, дазвольце мне ісці наперад і зрабіць прывітанне-2. Я збіраюся зрабіць кропка слэш прывітанне-2. Назаві сваё імя - Давіда. Enter. Добры дзень Давіда. Гэта падобна на працу OK. Але тое, што адбываецца на самай справе пад капотам тут? Давайце спачатку адхіліце некалькі слаёў. Струнны гэта проста сінонім мы ў зразумеў, для чаго? Char зоркі. Так што давайце зрабіць яго крыху больш таемныя але больш тэхнічна правільна, што гэта гэта сімвал зоркі, якая азначае, што імя, ды, з'яўляецца зменнай. Але тое, што назвы крамаў з'яўляецца адрасам сімвал, які адчувае сябе крыху дзіўна таму што я вяртаюся радок. Я вяртаюся некалькі сімвалы не знак. Але, вядома, вам трэба ўсяго толькі першы Чара адрас ўспомніць, дзе ўсю радок у тым, што чаму? Як жа вызначыць, дзе канец Радок ведаючы самага пачатку? Зваротная касая рыса нуля. Так што з гэтымі двума ключы вам высветліць, Перад пачаткам і канцом любы радок значыць, да таго часу, пакуль яны правільна складзены з гэтай нулявы тэрмінатар, што зваротная касая рыса нуля. Але гэта выклікае GetString. І аказваецца, што GetString ўвесь гэты час быў выгляд падман для нас. Ён рабіў гэта праца, каб быць упэўненым, атрымліваю радок ад карыстальніка. Але дзе, што памяць было прыходзяць? Калі мы вернемся да карціны тут і ўжываць вызначэнне ад усяго хвіліну таму, што стэк, дзе памяці ідзе, калі функцыі выклікаюцца, Па гэтай логіцы, калі вы выклікаеце GetString, а затым я друкую ў D - V-I-D Enter, дзе D - V-I-D зваротны слэш нулявы захоўваецца на аснове гісторыя, якую мы распавялі нам далёка? Гэта, здавалася б, у стэк, праўда? Пры выкліку атрымаць радок, якую Вы атрымаеце кавалачак памяці ў стэку. Так што само сабой зразумела, што D - V-I-D зваротны слеш нуль захоўваецца там у стэку. Але пачакайце, GetString вяртаецца гэты радок, так бы мовіць, што азначае гэта паднос з кафетэрыя бярэцца з стэка. І мы ў мінулы раз казаў, што як толькі Функцыя вяртае, і вы бераце, што латок, так бы мовіць, з стэка, што Вы можаце выказаць здагадку аб рэшткі што памяць? Я, вядома, перакроілі іх як знакі пытання таму што яны фактычна сталі невядомыя значэння. Яны могуць быць выкарыстаны паўторна, калі некаторыя Наступны функцыя выклікаецца. Іншымі словамі, калі мы, аказваецца, для захоўвання - Я намалюю хуткую карціну Тут чаркі. Калі мы, здараецца, маляванне ніжняй маёй памяці сегмента, і мы будзем казаць што гэта месца памяці займаюць асноўны і, магчыма, аргумент З і Arg V і ўсё астатняе, у праграме, калі GetString называецца, Меркавана GetString атрымлівае кавалак памяці тут. А потым D - V-I-D-то заканчваецца ў гэтую функцыю. І я збіраюся спрашчаць. Але давайце выкажам здагадку, што яго D - V-I-D зваротны слеш нуля. Так што гэта колькасць байт, якія выкарыстоўваюцца ў рамка для GetString. Але як толькі GetString куды вяртаюцца, мы у мінулы раз казаў, што гэтая памяць больш Тут усё становіцца - Woops! - усё становіцца эфектыўна выдаленыя. І мы можам думаць пра гэта цяпер, калі пытанне знакі, таму што хто ведае, што адбываецца, каб стаць гэтай памяці. На самай справе, я вельмі часта выклікаюць функцыі акрамя GetString. І як толькі я называю некаторыя іншыя функцыі, чым GetString, можа быць, не ў дадзенай праграмы мы проста глядзелі на, але некаторыя іншыя, безумоўна, некаторыя іншыя Функцыя можа ў канчатковым выніку надаецца гэта наступнае месца ў стэку. Таму ён не можа быць, што GetString крам D - V-I-D ў стэк, таму што я неадкладна страціць да яго доступ. Але мы ведаем, што яны GetString вяртае толькі што? Гэта не вяртанне да мне шэсць знакаў. Тое, што гэта сапраўды было вяртанне мы заключаем, апошні раз? Адрас першага. Так ці інакш, калі вы назвалі GetString, гэта вылучэнне блока памяці для Радок, тып і карыстальнікі Затым зваротны адрас з яго. І атрымліваецца, што, калі вы хочаце функцыя прызначана для размяшчэння памяці ў гэтым шляхі і вярнуцца да чалавека, які называецца гэтую функцыю, адрасы што частка памяці, вы абсалютна Не можаце пакласці яго ў стэк у дно, таму што функцыянальна гэта проста Не збіраюся стаць вашым вельмі хутка, так што вы можаце здагадацца, дзе Мы, верагодна, збіраецца кінуць яе замест гэтага, так званага кучы. Так што паміж ніжняй часткай вашай памяці аўтара планіроўка і верхняй частцы памяці аўтара макет цэлую кучу сегментаў. Адным з іх з'яўляецца стэк, і правы вышэй яна ў кучы. І куча гэта проста іншы кавалак памяці, якая не выкарыстоўваецца для функцый калі яны называюцца. Ён выкарыстоўваецца для доўгатэрміновай памяці, калі Вы хочаце адну функцыю, каб захапіць некаторыя памяці і ўмець, каб павесіць на яго без страты кантролю над ім. Цяпер вы можаце, магчыма, неадкладна бачыць, што гэта не абавязкова дасканалы дызайн. Як ваша праграма на выдзеленую памяць стэк, ці, як вы называеце ўсё больш і больш функцый, ці, як вы размяркоўваеце памяць у кучы з Malloc як ад GetString робіць, што выразна здаецца непазбежнай праблемай? Права. Як факт, што гэтыя стрэлкі накіраваны адзін на аднаго не абяцае нічога добрага. І на самай справе, мы маглі б вельмі хутка краху Праграма ў любую колькасць спосабаў. На самай справе, я думаю, мы маглі б мець зрабіў гэта выпадкова адзін раз. А калі не, давайце зробім гэта Цяпер наўмысна. Дазвольце мне ісці наперад і напісаць супер хутка праграма пад назвай dontdothis.c. А цяпер я пайду сюды і рабіце рэзкіх ўключаюць stdio.h. Аб'явім функцыі Foo бярэ аргументаў, якія не зьяўляюцца пазначаецца а таксама несапраўднымі. І адзінае, што Foo збіраецца зрабіць, гэта выклік Foo, які, верагодна, не разумная ідэя, але хай будзе так. Ent асноўныя сілы. Цяпер адзінае, што асноўным будзе проста выклікаць Foo, а таксама. І проста дзеля задавальнення, я пайду наперад і скажу, Е "Прывітанне ад Foo ". ОК. Так што калі б я не зрабіў ні адной памылкі, Зрабіць dontdothis кропка слэш. І давайце зробім гэта ў вялікай акне - кропка слэш, dontdothis. Пойдзем. Ой-ой. Мяркуючы па ўсім, вы можаце зрабіць гэта. Чорт вазьмі. ОК. Пачакайце. Заставайцеся на сувязі. Хіба мы - Мы сапраўды выкарыстоўвалі яго зрабіць. [Уздыхае] Я ведаю, але я думаю, што мы проста выдаліў гэта. Ну, так. Чорт вазьмі. Вырашыце гэтую Роб. Што? Гэта вельмі проста. Так, мы звярнуліся адключэння аптымізацыі. Добра, стаяць да спаткання. Цяпер я адчуваю сябе лепш. ОК. Добра. Так што давайце перакампіляваць - Зрабіць вас dontdothis. Магчыма, вам прыйдзецца пераназавіце яго ў dothis.c праз хвіліну. Там мы ідзем. Дзякуй. ОК. Таму той факт, што я друкаваў нешта было на самай справе проста запаволенне працэсу з дапамогай якога мы дасягнулі б гэтай кропцы. ОК. Фу! Так што ж адбываецца на самай справе? Прычына ёсць, гэтак жа, як у баку, з'яўляецца рабіць што-небудзь у тэрмінах ўваходных і Выхад як правіла, больш павольна, таму што вы павінны напісаць сімвалы экран, ён мае для прагорткі. Так Карацей кажучы, калі б я на самой справе здарылася так нецярплівыя, мы павінны былі б бачылі гэта канчатковы вынік, а таксама. Цяпер, калі я атрымаў язду друку UPS, мы бачым яго адразу ж. Дык чаму ж гэта адбываецца. Ну, простае тлумачэнне, вядома, з'яўляецца тое, што Foo напэўна, не варта быць, якая называе сябе. Цяпер у агульных рысах, гэта Рэкурсія. І мы думалі, што праз пару тыдняў назад рэкурсіўных добра. Рэкурсія гэтага чароўнага спосабу выказаць сябе супер коратка. І ён проста працуе. Але ёсць ключавы асаблівасцю ўсіх рэкурсіўных праграм мы казалі пра і паглядзеў на да гэтага часу, якія было тое, што ў іх было што? Базавы варыянт, які быў некаторы жорстка зададзены выпадку, сказаў у некаторых сітуацыях не называйце Foo, што відавочна не ў дадзеным выпадку. Так што ж адбываецца на самай справе з пункту гледжання гэтай карціне? Ну, калі называе асноўным Foo, ён атрымлівае кавалачак памяці. Калі Foo Foo называе, ён атрымлівае кавалачак памяці. Калі Foo Foo называе, ён атрымлівае кавалачак. Ён атрымлівае зрэз. Ён атрымлівае зрэз. Таму што Foo ніколі не вяртаўся. Мы ніколі не атрымалася знішчыць адной з тых, кадраў з стэка. Так што мы, што дзьме праз кучу, ня кажучы ўжо хто ведае што яшчэ, і мы выйсці з рамак нашай так званы сегмент памяці. Памылка сегментацыі ісці ілжывым. Так што рашэнне ёсць ясна, не рабі гэтага. Але больш за гэтага вынікае, што, так, там зусім некаторы мяжа, нават калі яна не вызначана, пра тое, як многія функцыі, вы можаце патэлефанаваць у Праграма, колькі разоў функцыя можа называць сябе. Таму, нават калі мы прапаведавалі рэкурсіі так як гэта патэнцыйна чароўная рэч Пару тыдняў таму для Sigma функцыі, і калі мы атрымліваем дадзеныя структур і CS50, вы ўбачыце іншыя прыкладанняў для яго, гэта не абавязкова лепшая рэч. Таму што, калі функцыя выклікае саму сябе, называе сябе, нават калі ёсць падставы выпадку, калі вы не трапілі, што базавы сцэнар для званкоў або 1000 10 000 званкоў, па Тады вы, магчыма, не будзе хапаць месца на так званым стэку і націсніце некаторых іншых сегментаў памяці. Так што гэта таксама дызайн кампраміс паміж элегантнасцю, а таксама паміж ўстойлівасць Вашай прыватнасці ажыццяўленне. Так што ёсць яшчэ адзін недахоп ці Іншы момант, на тое, што мы рабілі да гэтага часу. Калі я патэлефанаваў GetString - Дазвольце мне вярнуцца ў прывітанне-2. Звярніце ўвагу, што я тэлефаную GetString, які вяртае адрас. І мы сцвярджаем сёння, што адрас з'яўляецца з кучы. І цяпер я, раздрукуйце Радок па гэтым адрасе. Але мы ніколі не называлі супрацьлегласцю GetString. Мы ніколі не былі calll функцыі, як ungetstring, дзе вы руку гэтай памяці. Але, шчыра кажучы, мы, верагодна, павінна было быць. Таму што калі мы ўвесь час пытаюся кампутары на памяць, у якасці такога чалавека, як GetString але ніколі не аддаваць яго, вядома, , Што таксама не можа не прывесці да праблемы якога мы не хапіць памяці. І на самай справе, мы можам глядзець на гэтыя праблемы з новым інструментам, выкарыстанне якіх трохі загадкавымі, каб надрукаваць. Але дазвольце мне ісці наперад і плёскацца яго на экране праз хвіліну. Я збіраюся ісці наперад і працаваць Valgrind з параметрам, першая каманда лініі аргументам з'яўляецца імя гэтай праграмы прывітанне-2. І на жаль, гэта Выхад жудасна комплекс не дарма. Такім чынам, мы бачым усё, што беспарадак. Дэвід выказаць сваё імя. Так вось праграма на самай справе працуе. І зараз мы атрымліваем гэтага выхаду. Так Valgrind падобны па духу GDB. Гэта не адладчык як такой. Але гэта праверка памяці. Гэта праграма, якая будзе працаваць ваша праграму і сказаць вам, калі б вы спыталі Кампутар для памяці і ніколі не перадаў яго назад, тым самым гэта азначае, што ў вас ёсць ўцечка памяці. І ўцечкі памяці, як правіла, дрэнна. І вы гэта карыстальнікі кампутараў маюць , Верагодна, адчуваў гэта, ці ёсць у вас Mac або ПК. Вы калі-небудзь выкарыстоўвалі кампутар для у той час, а не ў некалькіх перазагрузкі дзён, ці вы толькі што атрымалі шмат праграм, якія працуюць, і гэтая чортава штука запавольваецца да поўнай прыпынку, або па крайняй меры гэта супер раздражняе ў выкарыстанні, таму што усё толькі што супер павольна. Зараз гэта можа быць любую колькасць прычын. Гэта можа быць бясконцы цыкл, памылка ў Код хтосьці, ці, прасцей кажучы, ён можа азначаць, што вы выкарыстоўваеце больш памяці, ці спрабуюць, чым вашы Кампутар на самай справе. А можа быць, ёсць памылка ў некаторых праграм што працягваць прасіць памяці. Браўзэры на працягу многіх гадоў былі сумна вядомыя гэтым, просячы больш і больш памяці але ніколі не ўручаць яго назад. Вядома, калі ў вас ёсць толькі канчатковае аб'ём памяці, вы не можаце спытаць бясконцую колькасць раз для частка гэтай памяці. І тое, што вы бачыце тут, хоць зноў выхад Valgrind з'яўляецца залішне складаным, каб зірнуць на Па-першае, гэта самая цікавая частка. Куча - выкарыстоўваецца пры выхадзе. Такім чынам, вось які аб'ём памяці якія выкарыстоўваюцца ў кучу на Час майго праграма выходзіла - па-відаць шэсць байтаў ў адным блоку. Так што я збіраюся махаць рукамі на тое, што блок. Падумайце, гэта ўсяго толькі кавалак, больш тэхнічны тэрмін для кавалка. Але шэсць байт - Якія шэсць байтаў, былі ўсё яшчэ ў выкарыстанні? Менавіта так. D - V-I-D зваротную касую рысу нуля, пяць лісты Назва плюс нулявы канчатак. Так што гэта праграма Valgrind заўважыў, што я папрасіў шэсць байтаў, па-відаць, спосаб GetString, але не даў іх назад. І на самай справе, гэта можа быць не так відавочна, калі мая праграма не тры ліній, але гэта 300 радкоў. Так што мы можам на самай справе даць іншую каманду лініі аргумент Valgrind да зрабіць яго больш падрабязным. Гэта крыху раздражняе, каб памятаць. Але калі я раблю - давайце паглядзім. Уцечка - Ці было гэта ўцечка - нават не памятаю што гэта ад рукі. - Праверка герметычнасці роўнае поўнай. Так, дзякуй. - Праверка герметычнасці роўнае поўнай. Enter. Тое ж праграмы. Калі ласка, увядзіце Дэвіда зноў. Цяпер я бачу, крыху больш падрабязна. Але ніжэй кучы рэзюмэ, якое ідэнтычная чатыры - ах, гэта збольшага добра. Цяпер Valgrind фактычна шукае крыху больш складана ў сваім кодзе. І ён кажа, што, па-відаць, Malloc на лініі - Мы змяншэння. У радку - мы не бачым, якую лінію ён ёсць. Але Malloc з'яўляецца першым вінаватым. Там у блогу ў Malloc. Усё ў парадку? ОК, няма. Дакладна? Я патэлефанаваў GetString. GetString мому Malloc. Так што радок кода відаць вінаватыя за тое, вылучыў гэтую памяць? Давайце выкажам здагадку, што той, хто пісаў Malloc было вакол дастаткова доўга, што гэта не іх віна. Так што гэта, напэўна, маё. GetString ў cs50.c - так што гэта файл дзесьці ў кампутары - у лінію 286, здаецца, быць вінаватым. Зараз давайце выкажам здагадку, што была CS50 вакол на працягу прыстойнае колькасць часу, таму мы таксама бясхібным. І так, напэўна, не ў GetString што памылка ляжыць, а ў прывітанне-2.c лініі 18. Такім чынам, давайце зірнем на тое, што гэтая лінія была 18. Ох. Так ці інакш гэтая лінія не абавязкова багі, як такой, але менавіта па гэтай прычыне за гэтым ўцечкі памяці. Так супер проста, што б інтуітыўна быць рашэнне тут? Калі мы просім памяці, ніколі не былі аддаваць яго, і гэта, здаецца, праблема, таму што з цягам часу мой кампутар можа не хапіць памяці, можа запаволіць ўніз, дрэнныя рэчы могуць здарыцца, ну, што простае інтуітыўнае рашэнне? Проста дайце яму спіну. Як вы вызваліць гэтую памяць? Ну, на шчасце, гэта даволі проста проста сказаць свабоднае імя. І мы ніколі не рабілі гэтага раней. Але вы можаце істотна думаць бясплатна як супрацьлегласць Malloc. Бясплатны з'яўляецца супрацьлегласцю вылучэнне памяці. Так што цяпер дазвольце мне перакампіляваць. Зрабіць прывітанне-2. Дазвольце мне запусціць яго зноў. Добры дзень-2 Давіда. Так што, падобна на працу ў сапраўды гэтак жа. Але калі я вярнуся ў Valgrind і паўторна запусціць што ж каманда на маёй нядаўна складзена праграма, набор тэксту на маё імя як раней - Ніца. Куча рэзюмэ - выкарыстоўваецца на выхадзе - нулявых байт у нулявыя блокі. І гэта супер добра, усё куча блокаў былі вызваленыя. Уцечкі не магчымыя. Так ідзе ўверх, а ня з задачай ўсталяваць 4, але з задачай ўсталяваць 5, судова-медыцынскай экспертызы і далей, гэта таксама стане Мера правільнасці сваіх праграмы, ці няма ў вас ёсць або не маюць уцечак памяці. Але, на шчасце, вы можаце не толькі разважаць праз іх інтуітыўна, якая з'яўляецца, мабыць, лёгкая для невялікіх праграм але цяжэй для вялікіх праграм, Valgrind, для тых буйных праграм, можа дапамагчы вам вызначыць канкрэтнай задачы. Але ёсць адна праблема якія могуць паўстаць. Дазвольце мне адкрыць гэты файл тут, які, Зноў жа, некалькі простым прыкладзе. Але давайце засяродзімся на тым, што гэта робіць праграма. Гэта называецца memory.c. Мы апублікуем гэта пазней сёння ў ZIP зыходнага кода сёння. І заўважце, што ў мяне ёсць функцыя называецца F, які не прымае да аргументаў і нічога не вяртае. У радку 20, я мабыць аб'яву паказальнік на цэлалікавых і назваўшы яго х. Я задаю з'яўляецца вяртанне Значэнне Malloc. І гэтак жа, каб быць ясным, колькі байтаў раніцы Я, верагодна, вяртання з Malloc у гэтай сітуацыі? Верагодна, 40. Дзе вы гэта ўзялі? Ну, калі вы памятаеце, што цэлалікавай часта 4 байта, па меншай меры, ён знаходзіцца ў Прыбор, у 10 разоў 4, відавочна, 40. Так Malloc вяртаецца адрас кавалак памяці і захоўвання, што У канчатковым рахунку, рашэнне х. Такім чынам, каб было ясна, што Затым адбываецца? Ну, дазвольце мне вярнуцца нашым карціна тут. Дазвольце мне не проста намаляваць ніжнюю частку майго памяці кампутара, дазвольце мне ісці наперад і прыцягнуць ўвесь прастакутнік, прадстаўляе ўсе мае аператыўнай памяці. Мы скажам, што стэк на дно. І ёсць сегмент тэксту ў неинициализированную дадзеных. Але я проста хачу, каб гэтыя абстрактныя іншыя рэчы далёка, як кропка, кропка кропка. Я проста хачу, каб звярнуцца да гэтага ў выглядзе кучы ў верхняй часткі. А потым у ніжняй частцы гэтай карціны, прадстаўляць асноўныя, я збіраюся даць яму кавалачкі памяці ў стэку. Для F, я збіраюся даць яму кавалачак памяці ў стэку. Зараз, я павінен параіцца з зыходны код зноў. Якія лакальныя зменныя для галоўнага? Мабыць нічога, так што частка не эфектыўна пустым ці нават не як вялікі як я намаляваў яго. Але ў F, у мяне ёсць лакальная зменная, які называецца х. Так што я збіраюся ісці наперад і даць F ўчастак памяці, назваўшы яго х. А цяпер Malloc у 10 разоў 4, Так Malloc 40, дзе гэтая памяць прыходзяць? Мы не намалявала як гэта раней. Але давайце выкажам здагадку, што гэта эфектыўна Зыходзячы з тут, так што адзін, два, тры, чатыры, пяць. І цяпер мне трэба 40 з іх. Так што я проста зраблю кропка, кропка, кропка прапанаваць што ёсць яшчэ больш памяці вярталіся з кучы. Цяпер тое, што адрас? Давайце абярэм наш адвольны рашэнні як заўсёды - Ox123, хоць гэта, верагодна, быць нешта зусім іншае. Гэта адрас першага байта памяці, што я прашу для Malloc. Карацей кажучы, як толькі выконваецца радок 20, што літаральна захоўваць ўнутры х тут? Ox123. Ox123. І Быка нецікава. Гэта проста азначае, вось шаснаццатковы лік. Але тое, што ключавым з'яўляецца тое, што я магазін ў X, якая з'яўляецца лакальнай зменнай. Але яго тып дадзеных, зноў жа, гэта адрас унутр. Ну, я збіраюся захоўваць Ox123. Але зноў жа, калі гэта занадта залішне складаным, калі я пералічваю таму, мы можам абстрагавацца ад гэтай даволі разумна і проста казаць, што х паказальнік на гэты кавалак памяці. ОК. Цяпер пытанне пад рукой з'яўляецца наступнае - радок 21, аказваецца, глючыць. Чаму? Прабачце? Ён не мае - сказаць, што яшчэ раз. Ну, гэта не вызваляе. Дык вось, але другі. Так што ёсць яшчэ адзін, але спецыяльна у радку 21. Менавіта так. Гэтая простая радок кода проста перапаўненне буфера, перапаўненне буфера. Буфер проста азначае кавалак памяці. Але гэта частка памяці мае памер 10, 10 цэлыя лікі, што азначае, калі мы Індэкс ў яе з дапамогай сінтаксічнага цукру абазначэння масіва, плошча дужкі, вы маеце доступ да х кранштэйны 0 х кранштэйны 1 х, Кранштэйн кропка, кропка, кропка. х кранштэйны 9 з'яўляецца самым вялікім. Таму, калі я х кранштэйны 10, дзе Я на самой справе адбываецца ў памяці? Ну, калі ў мяне ёсць 10 Int - давайце на самай справе, усіх прыцягну з іх тут. Такім чынам, гэта быў першы пяць. Вось на цэлых пяць. Так х кранштэйны 0 тут. х кранштэйны 1 тут. х кранштэйны 9 тут. х кранштэйны 10 тут, што азначае, я кажу, у радку 21, кампутар паставіць дзе колькасць? Лік 0, дзе? Ну, гэта 0, так. Але толькі тым, што яго 0 гэта свайго роду супадзенне. Гэта можа быць колькасць 50, для ўсіх мы клапоцімся. Але мы спрабуем пакласці яго на х кранштэйны 10, які дзе гэта Пытальнік малюецца, якая гэта не вельмі добрая рэч. Гэтая праграма цалкам можа аварыі ў выніку. Цяпер, давайце ісці наперад і паглядзець, калі гэта , Сапраўды, тое, што адбываецца. Зрабіць памяці, так як файл называецца memory.c. Давайце пойдзем далей і запусціць памяці праграм. Так што нам пашанцавала, на самай справе, здаецца. Нам пашанцавала. Але давайце паглядзім, калі цяпер запусціць Valgrind. На першы погляд, мая праграма можа , Здаецца, зусім правільна. Але дазвольце мне працаваць з Valgrind - Праверка герметычнасці роўнае поўнай памяці. І цяпер, калі я запускаю гэта - цікава. Няправільны напісаць памерам 4 на радку 21 memory.c. Радку 21 memory.c гэта які? О, цікава. Але пачакайце. Памер 4, што ў тым, што на ўвазе? Я толькі зрабіў адну пісаць, але гэта памерам 4. Чаму 4? Гэта таму, што гэта Інтэлект, які , Зноў жа, чатыры байта. Так Valgrind знайшлі памылку, што я, зірнуўшы на мой код, гэтага не зрабілі. А можа быць, ваш TF можа ці не. Што Valgrind Але напэўна выявілі, што Мы зрабілі памылку там, нават хоць нам пашанцавала, і кампутар вырашыў, так, я не збіраюся да краху толькі таму, што вы закранулі адзін байт, адзін Варта INT ў памяці, які ня на самой справе ўласныя. Ну, што яшчэ тут глючыць. Адрас - гэта вар'ят шукае адрас у шаснаццатковым. Гэта проста азначае, дзесьці ў кучы нулявых байтаў пасля таго, як блок памерам 40 вылучаецца. Дазвольце мне паменшыць маштаб тут і паглядзець, калі гэта крыху больш карыснай. Цікава. 40 байт, безумоўна, страціў да страты Запіс 1 з 1. Зноў жа, больш словаў, чым можа апынуцца вельмі дарэчы. Але на аснове выдзеленай лініі дзе я павінен, верагодна, засяродзіць сваю увагі іншую памылку? Падобна на радку 20 memory.c. Так што, калі мы вернемся да лініі 20, гэта той, які Вы вызначылі раней. І гэта не абавязкова калясцы. Але мы гэтага адмяніў сваё эфектаў. Так як я магу выправіць па меншай меры, адна з тых памылак? Што я мог зрабіць пасля радка 21? Я мог бы зрабіць бясплатна х, так каб аддаць гэтай памяці. І як я магу выправіць гэтую памылку? Я павінен вызначана Не далей, чым 0. Такім чынам, дазвольце мне паспрабаваць зноў запусціць гэты. На жаль, вызначана Не далей, чым 9. Зрабіць памяці. Дазвольце мне паўторна Valgrind у вялікім акне. А цяпер паглядзіце. Ніцу. Усе блокі кучы былі вызваленыя. Уцечкі не магчымыя. А уверсе тут, няма ніякай згадкі больш несапраўдных правоў. Проста каб атрымаць прагны, і давай убачыць, калі яшчэ адна дэманстрацыя не так, як задумвалася - Я павязу хвіліну таму. І тое, што гэта, мабыць, 0 залішне зман. Давайце проста зробім 50, некалькі адвольны нумар, марку памяці кропка слэш памяці - яшчэ пашанцуе. Нічога не развальваецца. Выкажам здагадку, што я проста раблю нешта сапраўды па-дурному, і я раблю 100. Дазвольце мне перарабіць памяці, кропка слэш памяці - зноў пашанцавала. Як наконт за 1000? за цэлыя, груба кажучы, дзе я павінен быць? Зрабіць памяці - чорт пабяры. [Смяецца] ОК. Давайце не важдацца больш. Паўтарыць памяці. Там мы ідзем. Добра. Так што вы, мабыць, індэкс 100000 цэлыя за межы, дзе вы павінны былі ў памяці, дрэнныя рэчы здараюцца. Так што гэта, відавочна, не жорсткія, хуткія правілы. Я быў збольшага метадам спроб і памылак, каб туды патрапіць. Але гэта таму, што, карацей кажучы, памяць кампутара таксама будзе падзелены ў гэтыя рэчы называюцца сегментамі. А часам, кампутар на самай справе даў вам крыху больш памяці чым вы просіце. Але для эфектыўнасці, гэта проста лягчэй атрымаць больш памяці, але толькі сказаць вам, што вы атрымліваеце яго частка. І калі вам пашанцуе часам, Такім чынам, вы можаце мець магчымасць дакрануцца да памяці, якія не належаць вам. У вас няма ніякай гарантыі, што, якое значэнне вы паклалі будзе застацца там, таму што кампутар па-ранейшаму думае, што гэта не ваша, але гэта не абавязкова будзе хіт іншы сегмент памяці ў Кампутар і выклікаюць памылку, як гэта тут. Добра. Любыя пытанні, то на памяць? Добра. Давайце паглядзім тут, то, па крайняй тое, што мы прымалі за прадастаўлены на працягу досыць доўгага часу, што У гэтым файле cs50.h. Так што гэта файл. Такія толькі цэлая куча каментарыяў наверсе. І вы, напэўна, глядзелі на гэта, калі Вы памацаў на самым прыладзе. Але аказваецца, што ўвесь час, калі мы прывыклі выкарыстоўваць радок як сінонімаў, з дапамогай якіх мы абвясцілі , Што было сінонімам з гэтым Ключавое слова, аб'ява тыпу, для вызначэння тыпу. І мы па сутнасці, кажа, рабіць нацягнуць сінонім сімвал зоркі. Гэта сродак, з дапамогай якога стэка створаны гэтыя навучальныя колы вядомыя як радка. Цяпер вось толькі прататып для GetChar. Мы, магчыма, бачыў яго раней, але гэта сапраўды тое, што ён робіць. GetChar не бярэ ніякіх аргументаў, вяртае знак. GetDouble не бярэ ніякіх аргументаў, вяртае двайны. GetFloat прымае ніякіх аргументаў, вяртаецца якая плавае кропкай, і гэтак далей. GetInt знаходзіцца тут. getlonglong знаходзіцца тут. І GetString знаходзіцца тут. І гэта ўсё. Гэта фіялетавая лінія іншая препроцессора Дырэктыва з-за хэштэг ў пачатку яго. Добра. Так што цяпер адпусьці мяне ў cs50.c. І мы не будзем казаць занадта шмат часу на гэта. Але, каб даць вам убачыць тое, што ўжо на ўсё гэта час, адпусціць мяне ў - давайце зробім GetChar. Так GetChar ў асноўным каментары. Але гэта выглядае наступным чынам. Так што гэта фактычная функцыя GetChar, што мы былі прымаем як належнае існуе. І хоць мы не выкарыстоўвалі гэтую , Што часта, калі наогул калі-небудзь, гэта па меншай меры адносна простым. Так што варта браць Збеглы погляд на тут. Так GetChar мае бясконцы цыкл, Такім чынам, відавочна наўмысна. Затым ён выклікае - і гэта выгляд добрае паўторнае выкарыстанне кода мы самі напісалі. Ён заклікае GetString. Таму што тое, што робіць гэта значыць атрымаць сімвал? Ну, вы маглі б таксама паспрабаваць атрымаць Уся лінія тэксту ад карыстальніка і то проста паглядзіце на адну з гэтых знакаў. У лініі 60, вось трохі Трохі санітарнай праверкі. Калі GetString вярнуўся нулявым, давайце не будзем працягваць. Што-то пайшло не так. Зараз гэта некалькі раздражняе, але У звычайных знакаў C. Макс, верагодна, ўяўляе тое, што проста грунтуючыся на яго імя? Гэта пастаянная. Гэта як лікавае значэнне найбуйнейшы знак можна ўявіць з адзін ўкус, які, верагодна, колькасць 255, які з'яўляецца самым вялікім нумарам ўяўляюць восем біт, пачынаючы з нуля. Так што я выкарыстаць гэта, у гэтай функцыі, калі напісання гэтага кода, толькі таму, што Калі што-то пойдзе не так, але ў GetChar яго мэта ў жыцці, каб вярнуцца сімвал, неабходна нейкім чынам быць у стане каб сігналізаваць карыстачу, што што-то пайшло не так. Мы не можам вярнуць значэнне NULL. Атрымліваецца, што з'яўляецца нулявым паказальнікам. І зноў жа, мае GetChar вярнуць знак. Такім чынам, Канвенцыя, калі што-то пойдзе няправільна, гэта вы, праграміст, або ў гэтым выпадку, мне з бібліятэкай, у мяне было проста вырашыць адвольна, калі нешта пойдзе не так, я збіраюся вяртае лік 255, якая сапраўды азначае, што мы не можам, карыстальнік можа не ўводзіце знак, прадстаўлены лік 255, таму што ў нас было выкрасці ў якасці так званага дазорную значэнне прадстаўляць праблему. Зараз жа высвятляецца, што характар ​​255 гэта не тое, то можна будзе ўвесці клавіятуры, так што гэта не вялікая праблема. Карыстальнік не заўважае, што Я скраў гэты персанаж. Але калі вы калі-небудзь бачылі ў чалавеку старонак Кампутарная сістэма спасылкай на некаторыя загалоўнымі літарамі сталым, як гэта кажа, што, у выпадку памылкі гэтая пастаянная моц вяртаюцца, вось і ўсё зрабіў некаторыя чалавечыя гадоў таму быў адвольна вырашыў вярнуць гэтую асаблівую каштоўнасць і называюць гэта пастаяннай ў выпадку нешта пойдзе не так. Зараз адбываецца чараўніцтва тут. Па-першае, я абвяшчаю ў лініі 67 два знака, C1 і C2. І тады ў лініі 68, там на самай справе радок кода, якая з'яўляецца нагадваюць аб наш сябар Е, улічваючы, што гэта сапраўды ёсць адсоткаў Cs ў двукоссі. Але звярніце ўвагу, што тут адбываецца. Sscanf азначае радок сканавання - азначае сканавання адфарматаваных Радок, ERGO Sscanf. Што гэта значыць? Гэта азначае, што вы перадаеце Sscanf радок. І ўсё, што лінія Карыстальнік ўводзіць цалі Пераходзіце на Sscanf радок фармату, як гэта кажа, што SCANF якія Вы спадзяецеся, што ўводзіў карыстальнік цалі Затым прайсці ў адрасы двух участкаў памяці, у дадзеным выпадку таму што ў мяне ёсць два запаўняльнікаў. Так што я збіраюся даць яму адрас С1 і С2-адрас. І нагадаць, што вы даяце функцыі адрас якой-небудзь зменнай, што наступствы? Што гэта можа зрабіць функцыю ў выніку перадачы яе адрас зменная, у супрацьлегласць сама пераменная? Гэта можа змяніць яго, праўда? Калі ў вас хто-то карту да фізічнага адрас, яны могуць пайсці туды і зрабіць што яны хочуць па гэтым адрасе. Тая ж самая ідэя тут. Калі перайсці да Sscanf, адрас двух ўчасткі памяці, нават гэтыя малюсенькія мала участкаў памяці, C1 і C2, але У ёй мы паказваем адрас з іх, Sscanf можаце яго змяніць. Так што мэта Sscanf ў жыцці, калі мы чытаем Чалавек старонцы, чытаць тое, што карыстач уводзіць, надзея на карыстальніка, які мае набраў у характары і, магчыма, іншы персанаж, і любы карыстальнік набралі, першы знак ідзе Тут, другі сімвал ідзе тут. Цяпер, як і ў бок, гэта, і вы б Толькі ведаю, што гэта з дакументацыі, той факт, што я стаўлю прабел існуе проста азначае, што я не хвалюе, калі карыстач націскае клавішу прабелу некалькі разоў, перш чым ён або яна прымае характару, я збіраюся ігнараваць любы прабел. Так што, я ведаю, ад дакументацыі. Той факт, што ёсць другая C% за імі ідуць белыя прасторы на самай справе наўмысным. Я хачу быць у стане выявіць, калі карыстальнік аблажаўся або ня супрацоўнічаў. Так што я спадзяюся, што карыстальнік толькі набраны у адзін знак, таму я спадзяюся, Sscanf, што толькі збіраецца вярнуцца значэнне 1, таму што, зноў жа, калі я чытаю Дакументацыя, Мэта Sscanf ў жыцця для вяртання да ліку зменных, якія былі запоўненыя з карыстацкага ўводу. Я прайшоў з двума зменнымі адрасы, C1 і C2. Я спадзяюся, аднак, што толькі адзін з іх забіваюць, таму што калі Sscanf вяртае 2, што меркавана маецца на ўвазе лагічна? Каб карыстальнік не проста даць мне адзін персанаж, як я сказаў яму ці ёй. Яны набралі на не менш двух знакаў. Так што, калі я замест гэтага не было другога % З, я проста быў адзін, які адкрыта была б больш інтуітыўным падыход, я думаю, што першы погляд, Вы не збіраецеся быць у стане выявіць Калі карыстальнік быў даючы вам больш выдаткаў, чым вы на самой справе хацелі. Так што гэта няяўным выглядзе праверкі памылак. Але звярніце ўвагу, што я раблю тут. Як толькі я ўпэўнены, што карыстальнік даў мне адзін характар, я вызваліць лінію, робячы супрацьлегласць GetString, які ў сваю чаргу выкарыстоўвае Malloc, а затым я вярнуся C1, сімвал, які я спадзяваўся, карыстальніка і патрабуецца толькі пры ўмове. Так хутка ўбачыў толькі, але Па пытаннях GetChar? Мы вернемся да некаторых з іншых. Ну, дазвольце мне ісці наперад і рабіць гэта - Выкажам здагадку зараз, проста каб матываваць нашых абмеркавання ў тыдзень плюс час, гэта знаходзіцца файл structs.h. І зноў жа, гэта толькі густ пра што-то, што ляжыць наперадзе. Але звярніце ўвагу, што шмат з гэтага каментароў. Такім чынам, дазвольце мне вылучыць толькі цікавая частка на дадзены момант. ЬурейеЕ - ёсць тое, што ж ключавое слова зноў. ЬурейеЕ мы выкарыстоўваем, каб абвясціць радок як адмысловы тып дадзеных. Вы можаце выкарыстоўваць ЬурейеЕ на стварэнне прынцыпова новай тыпы дадзеных, не існуе, калі C быў прыдуманы. Напрыклад, унутр пастаўляецца з С. сімвалаў пастаўляецца з двайны C. пастаўляецца з С. Але няма ніякага паняцця студэнта. І ўсё ж было б вельмі карысна, каб быць ў стане напісаць праграму, якая захоўвае ў зменнай, нумар пасведчання асобы студэнта, іх назвы, і іх дамы. Іншымі словамі, тры часткі дадзеных, як і цэлалікавых радок і іншы радкі. З ЬурейеЕ, што даволі магутным Пра гэта і ключавое слова для sturct Структура, праграмісту ў 2013 годзе, сапраўды можа вызначыць свае ўласныя тыпы дадзеных, якія не існавалі ўжо гадоў таму, але якія адказваюць вашым мэтам. І вось, у радках з 13 па 19, Мы аб'явы новага тыпу дадзеных, як Інтэлект, але назваўшы яго студэнтам. А ўнутры гэтай зменнай будзе Тры рэчы - Інтэлект, радок, і радкі. Такім чынам, вы можаце думаць аб тым, што сапраўды тут адбылося, нават калі гэта Трохі спрашчэнне на сённяшні дзень, студэнт збіраецца істотна каб выглядаць наступным чынам. Яго будзе кавалак памяці з ID, імя поле, а дома вобласці. І мы зможам выкарыстоўваць гэтыя кавалкі памяць і доступ да іх наступным чынам. Калі я іду ў struct0.c, вось адносна доўга, але пасля малюнкам, кода, які выкарыстоўвае гэты новы трук. Такім чынам, спачатку, дазвольце мне звярнуць вашу ўвагу да цікавай часткі наверсе. Sharp вызначае студэнты 3, аб'яўляе канстанта, званая студэнтаў і правапераемнікаў яно адвольна нумар 3, усяго так у мяне ёсць тры студэнты, якія выкарыстоўваюць гэтая праграма на дадзены момант. А вось галоўную. І звярніце ўвагу, як я заяўляю Масіў студэнтаў? Ну, я проста выкарыстоўваць той жа сінтаксіс. Слова студэнт, відавочна, новае. Але студэнт, клас, студэнты кранштэйна. Таму, на жаль ёсць шмат паўторнага выкарыстання тэрмінаў тут. Гэта проста нумар. Так што гэта ўсё роўна што сказаць тры. Клас менавіта тое, што я хачу выклікаць зменнай. Я магу называць яго студэнтаў. Але клас, гэта не клас у аб'ектна-арыентаваны выгляд Java шляху. Гэта проста клас студэнтаў. І тып дадзеных кожнага элемента у гэтым масіве з'яўляецца студэнтам. Так што гэта крыху па-іншаму і кажучы нешта ад як гэта, гэта проста - Я кажу, дайце мне тры студэнты і называюць гэты масіў класа. Добра. Цяпер вось чатыры завесы. Гэты хлопец знаёмы - ітэрацыя ад нуля на тэрмін да трох. А вось і новая частка сінтаксісу. Праграма збіраецца падказваюць мне, чалавека, даць яму студэнта ID, які з'яўляецца унутр. А вось сінтаксіс, з якімі вы можаце захоўваць нешта ў поле ідэнтыфікатара ў Размяшчэнне кранштэйна класа I. Такім гэты сінтаксіс не новая. Гэта проста азначае, дайце мне восьмы Студэнт у класе. Але гэты сімвал з'яўляецца новым. Да гэтага часу мы ніколі не можа выкарыстоўвацца кропка, па меншай меры ў такі код. Гэта азначае пайсці ў структуру вядомага як студэнт і пакласці што-то там. Аналагічным чынам, у наступным радку, 31, перайдзіце наперад і пакласці ўсё, што карыстач набірае для аднаго імя можна тут і што яны робяць для дома, тое ж самае, ісці наперад і пакласці яго ў. дома. Так, што гэта праграма у канчатковым выніку рабіць? Вы можаце ўбачыць трохі Цізер. Дазвольце мне ісці наперад і робяць структур 0 кропка слэш структуры 0, ID студэнта 1, Дэвід сказаў Мазер, студэнцкі білет 2. Rob Kirkland, студэнцкі білет 3. Ларэн Leverit - і адзіная рэч, гэтая праграма зрабіла, які знаходзіцца ўсяго ў зусім адвольнай, з'яўляецца Я хацеў зрабіць што-то з гэтымі дадзенымі, Цяпер, калі я вучыў нас, як выкарыстоўваць структуры, гэта я толькі што гэтая дадатковая пятля тут. Я ітэрацыі па масіве студэнтаў. Я выкарыстаў нашы, магчыма, ужо знаёмыя адзін, параўнанне радкоў, каб stircomp праверка восьмым доме студэнта роўным Mather? І калі гэта так, проста надрукаваць што-небудзь адвольна падабаецца, так, гэта так. Але зноў жа, каб проста даць мне магчымасць ў выкарыстанні і паўторнага выкарыстання і паўторна выкарыстоўваць гэтую новую кропкавую натацыю. Дык хто клапоціцца, ці не так? Прыдумляючы студэнтам праграмы некалькі адвольна, але аказваецца, што мы можам зрабіць карысныя рэчы з гэта, напрыклад, наступным чынам. Гэта значна больш складаная структура у С. ёсць дзесятак ці больш палёў, некалькі загадкава назвалі. Але калі вы калі-небудзь чулі пра графіцы фармат называецца растравай, BMP, ён Атрымліваецца, што растравы фармат файла ў значнай ступені падобна, што гэта. Гэта дурная смайлік. Гэта маленькае малюнак, якое я павялічана на даволі вялікі, так што я мог бачыць кожны асобных кропак ці пікселяў. Цяпер, аказваецца, мы можам прадставіць чорная кропка, скажам, з нумарам 0. І белая кропка з нумарам 1. Такім чынам, іншымі словамі, калі вы хочаце прыцягнуць Смайлік і захаваць гэты вобраз у кампутар, дастаткова для захоўвання нулёў і тыя, якія выглядаюць, як гэта, дзе, зноў жа, з іх белыя і нулёў чорныя. І разам, калі вы павінны эфектыўна апранецеся з адзінак і нулёў, у вас ёсць сетку пікселяў, і калі вы ляжалі іх, у вас ёсць міла маленькі смайлік. Зараз, растравы фармат файла, BMP, з'яўляецца эфектыўна, што пад капотам, але з вялікай колькасцю пікселяў сот, што вы можа на самай справе ўяўляюць кветак. Але калі ў вас ёсць больш складаныя фарматы файлаў, як BMP і JPEG і GIF з якімі вы можаце быць знаёмыя, тыя файлаў на дысках звычайна не толькі ёсць нулёў і адзінак для кропак, але яны маюць некаторыя метададзеныя, а таксама - мета у тым сэнсе, што на самой справе не дадзеных, але гэта карысна мець. Такім чынам, гэтыя палі тут маецца на ўвазе, і Мы ўбачым гэта больш падрабязна ў P-набор 5, што да нулёў і адзінак, што ўяўляюць кропак ў малюнку, ёсць куча метададзеныя, як Памер малюнка і шырыня малюнка. І заўважце, я выскубанне ад некаторых адвольных рэчаў тут - шырыні і вышыні. Падліку бітрэйтаў і некаторыя іншыя рэчы. Такім чынам, ёсць некаторыя метададзеныя ў файл. Але, разумеючы, як змяшчае файлы у гэтым выпадку, вы можаце фактычна затым маніпуляваць выявамі, аднаўлення малюнка з дыска, змяняць памер малюнкаў. Але вы можаце не абавязкова актывізацыі іх дзейнасці. Я меў патрэбу ў фатаграфіі. Так я вярнуўся да RJ тут, які вы бачылі на экране некаторы час таму. І калі я адкрываю Keynote тут, гэта Што адбудзецца, калі вы паспрабуеце для павелічэння і павышэння RJ. Ён не становіцца лепш на самай справе. Цяпер Keynote гэта свайго роду размыванне яго трохі, проста каб затушаваць Тое, што RJ не атрымлівае асабліва ўзрастае, калі вы павялічыць цалі І калі рабіць гэта такім чынам, см. квадратаў? Так, можна вызначана бачыць квадратаў на праектары. Гэта тое, што вы атрымліваеце, калі вы зможаце палепшыць. Але ў нашым разуменні таго, як RJ або Смайлік рэалізуецца дазволіць нам на самай справе пісаць код, які кіруе гэтыя рэчы. І я думаў, што скончыцца на гэтай ноце, з 55 секунд, што гэта павышэнне, Смею, гавораць хутчэй ўводзіць у зман. [Прайграванне відэа] -Ён хлусіць. Пра тое, што, я не ведаю. -Так што ж мы ведаем? -Гэта ў 09:15 Ray Сантойя было ў банкамаце. -Такім чынам, пытанне, што ён рабіў года ў 9:16? -Здымкі дзевяць міліметраў на нешта. Можа быць, ён убачыў снайпера. -Ці працаваў з ім. -Пачакай. Зварот на адзін. -Што ты бачыш? -Прынясі яго твар, поўны экран. -Яго акуляры. -Там у адлюстраванні. -Гэта каманда Neuvitas бейсбол. Гэта іх лагатып. -І ён кажа таму, хто гэта насіць гэтую куртку. [КАНЕЦ ВИДЕОВОСПРОИЗВЕДЕНИЕ] Дэвід Дж. малая: гэта быць праблематыка 5. Мы будзем бачыць вас на наступным тыдні. MALE SPEAKER: На наступным CS50. [Цвыркуны Шчабятанне] [Музыка Прайграванне]