[Nagpe-play ng musika] David J. MALAN: Lahat ng mga karapatang ito ay CS50 at ito ang simula ng limang linggo. Kaya ngayon, sa ilalim ng iyong cushions upuan, hindi ka makakahanap ng kahit ano. Ngunit sa itaas, dapat mong mahanap ang mga ito, isang maliit na token ng aming pagpapahalaga para sa lahat ng mga gawa na inilagay mo sa Laro ng labinlimang. Tanggalin lang ang maliit na bilog sa ibaba upang simulan ang pag-play para sa natitira sa klase. Kaya isipin ang na, o alam na problema nakatakda apat, na kung saan nagpunta out na ito katapusan ng linggo, nagsasangkot ng pagsulat ng isa pang laro. Ngunit oras na ito ito ay nagsasangkot gamit ang isang aktwal na graphical user interface, hindi isang tekstuwal interface tulad ng Game ng labinlimang noon. At ang laro ay namamalagi na nangunguna sa iyo, kung hindi mo pa nakikita ito sa tabi, Mukhang ng kaunti ng isang bagay na katulad nito. Pupunta ako upang pumunta sa aking terminal window dito sa GDB. At ako pagpunta sa sige at patakbuhin ang staff solusyon, na maaari mong ma-access ang pagkatapos tumatakbo update 50 gaya ng dati. Ngunit ako pagpunta sa ilagay ito papunta sa isang maliit na lihim na mode, medyo Easter itlog, tinatawag nang gayon Diyos mode, sa pamamagitan ng paglalagay ng Diyos sa argv1. At mayroon akong upang sundin ang aking sariling mga direksyon, tumatakbo ito sa aking sarili problema itakda direktoryo. Kaya ngayon mo makita ang isang kumpletong bersyon ng laro ng Breakout. Sa katunayan, ito ay walang-kamay mode. Kaya ito ay talagang - wowed bagaman maaari kang maging - medyo hindi mahalaga upang ipatupad ang Diyos mode sa Breakout, hindi tulad ng Game ng labinlimang, kung saan ang ilan sa iyo ay maaaring tackled para sa mga Hacker edisyon. Sa Breakout ito suffices sa Diyos mode na lang gawin kung ano ang, intuitively may paddle? Lang gawin itong katumbas ng anumang mga pahalang na posisyon ay sa mga bola. At kaya hangga't mo gawin ito sa lockstep may mga bola gumagalaw ito laro kalooban hindi kailanman, kailanman, kailanman mapalampas ang bola at makikita mo manalo sa bawat oras. Ngunit sa Hacker edisyon na ito linggo mayroong higit pa sa Diyos mode. Mayroong isang bilang ng iba pang mga tampok. Kabilang sa mga ito, Laser. Kaya na kung ikaw talaga makakuha ng walang tiyaga mo maaaring magsimula pagbaril down ang bricks at ilang iba. At para sa mga ng sa iyo na nais i- i-calibrate standard kumpara sa Hacker edition, ang maaari kong makita na ito linggo Hacker edisyon sadyang ay isang kaunti pa maaaring gawin, sabihin nating, kaysa sa Diyos mode ay may Game ng labinlimang. Kaya kung naghahanap ka para sa isang kahabaan at naghahanap ka ng ilang karagdagang masaya mga tampok gawin dive sa kung ng interes. Ngayon higit sa kapaki-pakinabang na paraan, hayaan mo akong ituro out isang bagay pati na rin. GDB, na ang ilan sa iyo ay hindi maaaring magkaroon pa hinawakan personal, na kung saan ay pinong. Ngunit ngayon ay talagang ng panahon upang masanay upang ito at kumportable ang tool na ito dahil ito ay gumawa ng iyong buhay lubhang mas madaling, tunay. Bawat ni Rob lecture sa GDB isang pares ng linggo na ang nakaraan, isipin ang GDB na ay isang debugger. Ito ay isang tool na hinahayaan kang patakbuhin ang iyong mga programa ngunit patakbuhin ito sa pamamagitan ng hakbang na hakbang, linya sa pamamagitan ng linya, sa gayon maaari mong sundutin sa paligid, nang sa gayon ay makita mo ang mga bagay na nangyayari, kaya na maaari mong i-print out mga halaga ng variable. Sa maikli, ito ay nagbibigay sa iyo kaya magkano ang higit pa lakas kaysa printDef ginagawa nito. Ngayon tinatanggap na, ang interface ay medyo arcane. Itim at puti tekstuwal interface para sa pinaka-bahagi. Ang utos ay medyo matigas matandaan sa unang. Ngunit kahit na maaaring tumagal ng sa iyo kalahati isang oras, isang oras, ang ilalagay na agad investment ng oras sa ito, nagtitiwala sa akin. Tiyak sa pamamagitan ng pagtatapos ng semestre ay i-save ito mo ang isang order ng magnitude na mas oras kaysa sa na. Kaya maaga sa linggo dive in At sa mga tuntunin ng Breakout, alam mo na Maaari gawin ito kaya hangga't mayroon kang ang pamamahagi ng code o ang iyong sariling code sa pag-unlad sa iyong Pst4 direktoryo. Malaman na maaari mong patakbuhin ang gdb. / Breakout. Ito ay pagpunta sa buksan up isang window na tulad nito. Hayaan akong bigyan ang aking sarili higit pa ng isang terminal na window. At pagkatapos ay kung ano ang pupuntahan ko sige at gawin, ito ay hindi lamang patakbuhin ito. Pupunta ako sa unang set ng pahinga point pagkuhang muli, na nagbibigay-daan sa iyo upang i-pause pagsasagawa sa isang partikular na lugar. Lamang upang panatilihing simple ang mga bagay ako pupunta upang masira sa linya ng isa sa pamamagitan lamang ng pag-type ang bilang isa. Hayaan akong aktwal na muling buksan ang window na ito dahil nakakakuha ito ng isang maliit na maliit doon. Kaya ano ngayon pupuntahan ko na gawin dito ay kung ko bang buksan up ang aking mga terminal na window. Halika sa, doon kami pumunta. Kaya ngayon kung pumunta ako pabalik sa dropbox, Pst4 at magpatakbo ng gdb. / breakout magpasok, mapansin Pupunta ako sa masira ang isa upang i-set ng pahinga punto sa linya ng isa. At ngayon pupuntahan ko pumunta Magpatuloy at uri tumakbo. At kapag gagawin ko, mapapansin wala Mukhang mangyari. Walang mga pop up. Walang graphical user interface pa. Ngunit iyon dahil naiintindihan ako Literal na sa linya ng isa sa aking mga programa. At mapapansin na mabilis Naipasa ko na, partikular na ngayon sa 62, dahil ang lahat ang mga bagay na sa tuktok ng file na ito ay mga bagay tulad ng mga komento at mga constants at hindi kawili-wili para sa mga bagay-bagay ngayon. Kaya ngayon ako sa loob ng main, parang, sa linya 62. At ito ay lamang ang pamamahagi code, isipin ang. Kung ko bang buksan ito up sa pamamagitan ng pagpunta, katulad, sa aking direktoryo ng drop box sa Pst4, sa breakout.c. At kung ako mag-scroll pababa at pababa at pababa, at ipaalam sa akin sige at i-on ang aking mga numero ng linya. Ano ang makikita ko makita, kung ako mag-scroll pababa upang line 62, ay eksaktong linya na namin nai-pause sa. Kaya linya na ito dito, 62, ay kung saan kami ay tungkol sa upang maging. Kaya ngayon sa GDB, kung pumunta ako nang maaga at i-type ngayon susunod, ilagay ito sa pupuntahan isakatuparan na linya. At voila, mayroon kaming ang tinatawag nang gayon g window. Kung pamilyar sa kung ano ang isang GWindow ay, huwag mag-alala. Ang spec ay kitang ipakilala sa ito, bilang din ang isang bilang ng mga video na walkthrough naka-embed sa spec. Ngunit ngayon sabihin gawin ang isang kaunti pa kagiliw-giliw. Hayaan akong ilipat ang window na ito sa paglipas ng sa gilid ng kaunti bit. Hayaan akong gumawa ng window ng kaunti kaya mas malaki ang maaari kong makita ang higit pa. At ngayon hayaan mo akong sige at ang susunod na gagawin muli. At doon ang aking mga brick. Kung ako type susunod muli ngayon ko makita ang bola. At kung ako type susunod muli ngayon ko makita ang sagwan. At sa kabutihang-palad gedit na ito ay hindi talaga cooperating sa pamamagitan ng pagpapakita sa akin ang lahat ng bagay na gusto ko. Ngunit ngayon kung gagawin ko susunod muli, susunod muli, ako lamang deklarasyon ng ilang mga variable. At maaari kong i-print ang anumang isa ng mga guys out. I-print bricks, prints buhay. At ngayon kung patuloy kong gawin susunod, mapapansin na ang kukunin ko na maging sa loob ng loop na. Ngunit ang code ay pagpunta sa execute nang eksakto tulad ng inaasahan ko. Kaya kapag ako pindutin ito function, Maghintay para sa Click, ito ay pagpunta sa gawin ito literal na. Kaya ako tila nawala kontrol sa ibabaw ng programa. GDB ay hindi pagbibigay sa akin ng isa pang prompt. Ngunit huwag mag-alala. Pumunta sa aking mga laro, i-click sa isang lugar. At voila, ngayon ito naaayos sa line 86. Kaya muli, ito ay napakahalaga, sa huli, para sa pagde-debug ng mga problema. Dahil maaari mong literal magbasa-basa ang iyong code, naka-print na mga bagay out at magkano, magkano, higit pa. Ngunit para sa ngayon, ang mga tool sa nag-iisa dapat kumuha ka ng medyo malayo. Kaya kami, siyempre, ng pagtingin Graphics sa ngayon, ang lahat ng isang biglaang. At ngayon ating mundo ay nakakakuha ng kaunti mas kawili-wiling. At alam mo, marahil, mula sa ilan sa mga mga video online na mayroon kaming mga shorts na matagal mo nang panoorin bilang bahagi ng mga hanay ng problema. At ito ay nai-kinuhanan, kusa, laban sa isang puting backdrop. At ang ilan sa mga ito ay ang pagtuturo Fellows pagguhit ng ilang mga teksto sa screen na naka-overlay sa gilid ng mga ito. Ngunit siyempre, hindi ito ang lahat na kawili-wili sa tunay na mundo. Ito ay lamang ng isang silid para sa panayam na may malaki puting screen at isang backdrop. At ang aming kahanga-hangang produksyon koponan ng pag-uuri Ginagawa ng lahat ng bagay hitsura magandang pagkatapos ng katotohanan sa pamamagitan ng pag-crop out overlaying o anumang bagay ginagawa namin o hindi nais. Ngayon lamang upang mag-udyok sa linggong ito at talaga, kung saan maaari kang pumunta, sa huli, may computer science. Hindi lamang ang problema pagkatapos ng apat na set. Ngunit pagkatapos ng isa pang kurso o sa isang buong kurikulum ito ay kahanga-hangang kung ano ang maaari mong gawin mga araw na ito sa mga tuntunin ng graphics sa partikular na. Ang ilan sa iyo ay maaaring may nakita ito dumadaloy sa buong online. Ngunit naisip ko na gusto kong ipakita sa iyo, para sa lamang ng isang ilang minuto, isang sulyap sa kung ano ang computer na teknolohiya at kung ano CGI, graphics computer ay maaaring gawin ang mga araw na ito may isang pamilyar na kanta at marahil pelikula. [Music - Lana Del Ray, "Young at maganda] Tagapagsalita 1: Ito ay lamang ng isang maliit na bit kahanga-hangang, marahil, lamang kung paano nasa lahat ng dako - [Palakpakan] Tagapagsalita 1: ko lang ang nai-download na ito. Ngunit ito ay talagang kahanga-hangang, sa palagay ko, lamang paano nasa lahat ng dako at software code at mga tool tulad ng ito ay talagang. Kaya na ng panlasa ng mga direksyon kung saan maaari kang pumunta. Oh, wala nang Appliance ngayon. Well, na talagang timing trahedya na naibigay ang punto ko lang sinubukang gawin. Ang lahat ng mga karapatan, kaya sabihin ilunsad Fusion muli. Ipaalala sa akin mamaya. Ang lahat ng mga karapatan, at dapat kang nakakuha ng isang mag-email bilang isang bukod kung ginawa mo makakuha ng isang mapansin tulad na. Ang lahat ng mga karapatan, kaya isipin ang na noong nakaraang linggo nagsimula kaming upang mag-alis ng balat pabalik na ito mamaya na kilala bilang string. string naalala isang uri ng data na ipinahayag sa CS50 library. At ito ay bahagi ng mga gulong ng pagsasanay na ngayon ay nagsisimula sa tumagal-off. Ito ay isang kapaki-pakinabang konsepto maaga. Ngunit ngayon ito ay pagpunta upang makakuha ng higit kawili-wili at higit na malakas sa talaga makita na sa ilalim ng hood, isang string lamang ang kung ano ang, ay sinabi namin? Oo, sa gayon ito ay isang tinatawag na pansamantalang trabaho *. At ang doon * Nagpapahiwatig na mayroong ang ilang mga uri ng address kasangkot. At kaya kapag sinabi mong pansamantalang trabaho * ka lang bang sabihin isang variable na uri ng data ay isang pointer ngayon. Ang katotohanan na may mga star doon lamang ay nangangahulugan na ikaw ay isang deklarasyon tinatawag nang gayon pointer. At pointer na ay pagpunta sa mukha mag-imbak ng address ng, ng Siyempre, isang pansamantalang trabaho. Ngayon kung bakit ito ay magkaroon ng kahulugan? Well, kung ano ay isang string sa ilalim ng hood? Well, para sa ilang mga oras na aming sinasabi na isang string sa ilalim ng hood ay lamang h-e-l--l o, halimbawa. Ngunit kami uusapang tungkol sa ito bilang Pansamantala, mahalagang, isang array. At isang array gusto pagkatapos tumingin ng kaunti higit na tulad nito, na may bawat isa sa mga pagkuha up ng isang kagat. At pagkatapos namin sinabi na mayroong isang bagay na espesyal na bumalik dito, ang backslash 0, o null Terminator. Kaya lahat ng mga oras na ito, ito dito ay naging isang string. Ngunit talagang, isang string ay talaga ng isang address. At address, tulad ng ipapakita namin makita, ay madalas may prefix na 0x sa pamamagitan ng convention. Ano ang ibig 0x magpakilala? May nakakaalam ba? Kaya ito ay nangangahulugan lamang hexadecimal. Kaya maaari mong isipin ang, talaga, mula sa PST 1, naniniwala ako, isa sa mga mainit-init-up mga tanong na aktwal na tinanong tungkol sa hexadecimal notation sa karagdagan sa binary at decimal. At ang pag-uudyok dito ay na may hexadecimal mayroon kang 16 digit sa iyong pagtatapon. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, sinundan sa pamamagitan ng a, b, c, d, e, f. At kung ikaw bilangin ang lahat ng mga up, kumuha ka ng isang kabuuan ng 16. Kaya ito ay sa kabilang banda na may decimal, kung saan mayroon kaming 10 digit, sa pamamagitan ng 0 siyam. Ito ay sa kaibahan sa binary kung saan namin lamang magkaroon ng 0 at 1. Ngunit sa pagtatapos ng araw na maaari mo lamang Kinakatawan ng parehong numero, ngunit medyo naiiba. At hexadecimal ay karaniwan dahil bilang ito lumiliko out - at kami na makita ito mamaya sa kurso - kahit na kapag makuha namin sa web programming sa konteksto ng HTML kulay at mga code, hexadecimal ay magaling. Dahil sa ang bawat digit, lumiliko out, Kinakatawan ng apat na piraso perpektong. Kaya ito lang ang uri ng mga linya up mabuti dahil kakailanganin namin ay makakita. Kaya maaaring ito ay Ox123 o isang bagay tulad na, denoting address 123 sa isang lugar sa loob ng aking computer memory. Ngunit siyempre, ang ilang mga problema pumailanglang dahil sa napapailalim na ito pagpapatupad. At isipin ang ko na kinuha ng isang ulos sa pagpapatupad ng isang function na ganito - ihambing gitling 0 tuldok c nakaraang linggo, na kahit na ito ay tumingin tulad ng ito ay kanan, ito lamang ay hindi ihambing dalawang string ng tama. Ko na itinapon ang layo ng main, at ko na itinapon ang layo ng mga komento lamang mag-focus sa sa ang code na ng interes dito. At ito ay nasa pula dahil ito ay maraming surot. Para sa kung ano ang dahilan? Well, sa tuktok doon kapag ako ay ipinahayag isang string, kung ano ang talagang pagpunta sa sa ilalim ng hood? Well, hayaan mo akong pumunta sa ibabaw ng mga screen dito at gumuhit na. Kaya ko ipinahayag, muli, string s GetString. Kaya pupuntahan ko sige at ngayon gumuhit para sa mga ito kung ano ang talagang ay. Ito ay pagpunta sa maging isang parisukat na dito. At ako pagpunta sa i-claim na iyon ang 32 bits. Hindi bababa sa ito ay karaniwang ay, hindi bababa sa CS50 appliance ng maraming mga computer. Pupunta ako sa call ito s. Ngunit ngayon na maalala muli namin tinatawag GetString. Kaya GetString babalik, siyempre, isang string. Kung ang mga uri ng user sa h-e-l--l o ipasok string ang halo ay makakakuha ng ibinalik. At string na, bilang lang namin sinabi, nagtatapos up sa isang lugar sa memorya ng iyong computer sa backslash 0 sa dulo. Kukunin ko gumuhit ito tulad ng array - o magkadikit bloke ng mga character - na ito ay tunay. At ngayon, kung ano ang GetString talagang bumabalik? Ano ay GetString na bumabalik lahat ng oras na ito? Well, sinasabi namin, sa linggo bago, ito ay nagbabalik ng isang string. Ngunit mas technically, kung ano ang ibig GetString balik sa malas? Madla: ang isang address. Tagapagsalita 1: ang isang address. Partikular ito ay magbabalik ng mga address ng ang pinakaunang kagat, kahit anong ito ay. Katatapos ko lamang panatilihin ang paggamit ng isa, dalawa, tatlo dahil ito ay maginhawa. Ito ay nagbabalik ng address ng unang na character sa string. At sinabi namin noong nakaraang linggo na iyon ay sapat. Dahil maaari lagi naming malaman kung saan sa dulo ng string sa pamamagitan lamang ng iterating sa paglipas ng ito, siguro, may para sa loop o isang habang loop o isang bagay tulad ng na, lamang naghahanap para sa "backslash 0", ang mga espesyal na character na nagbabantay. At pagkatapos ay alam namin na ang mga string Nagkataong ng haba - sa kasong ito - limang. Kaya technically kung ano ang ibig GetString ito ay nagbabalik Ox123 sa kasong ito. At technically kung ano ang mangyayari pagkatapos ay mag-imbak na kami, sa loob ng s, Ox123. Sa pagtatapos ng araw, kahit na ito ay bagong konsepto, payo, ang mga ito ay lamang ang mga variable. Ngunit mangyari sila upang mag-imbak na mga piraso sama-sama kumakatawan sa isang address. Kaya technically lahat sila ay nakakakuha naka-imbak sa s ay Ox123. Ngunit kami bilang mga kawani na tao - kabilang ngayon pasulong - ang talagang hindi pagpunta sa pinapahalagahan, karaniwan, kung ano ang aktwal na address ay ng ilang tipak ng memory. Ito ay lamang sa mababang antas ng detalye sa maging intellectually kawili-wili. Kaya ako ng pagpunta sa i-undo ito. At sa halip, mas mataas na antas, sabihin lamang na kapag pinag-uusapan natin ang tungkol sa mga payo Pupuntahan ko lang makahatak ng mga madaling magamit na mga arrow na nagbibigay ng parehong ideya at abstracts ang layo particular ng kung ano ang aktwal na napapailalim na address ay. Ngayon kung pumunta kami pabalik sa code, kung ano Nangyari ito noong nakaraang linggo kung kami ay may string t ay katumbas ng GetString? Well, kung ako muli, uri sa halo oras na ito ako pagpunta upang makakuha ng isa pang tipak ng memory. h-e-l--l o backslash 0. Ngunit dahil ako tinatawag GetString sa pangalawang pagkakataon - at alam ko ito mula sa pagtingin sa mga source code para sa GetString - kahit na bagaman ito ay hindi sinasadya kumusta na noon ay nai-type sa dalawang beses, GetString ay hindi pagpunta sa subukan upang i-optimize at maging matalino. Lamang Ito ay pagpunta upang makakuha ng isa pang tipak ng memorya mula sa mga computer, na kung saan ay pagpunta sa maging sa isa pang address. Sabihin mang lang nating 456. At pagkatapos ay kung ano ito ay pagpunta sa bumalik? Ito ay pagpunta sa bumalik 456 at mag-imbak ito sa t. Kaya kung ano ang talagang pagpunta sa, sa kaliwang bahagi ay mayroon akong isa pang tipak ng memorya, 32 bits ay karaniwang. At doon ay pagpunta sa pumunta Ox456. Ngunit muli, hindi ako interesado sa mga partikular na mga numero na ngayon. Lamang ako ng pagpunta sa abstractly gumuhit ito bilang isang arrow. Kaya ito ay ngayon ng isang bagong paliwanag. Ngunit ito ay ang parehong eksaktong ideya na na nangyayari ang lahat ng oras na ito. At kaya ang dahilan pagkatapos, na ito muna bersyon ng Ihambing noon ay maraming surot noong nakaraang linggo ang dahilan kung bakit? Kapag ginawa mo kung s ay katumbas ng katumbas t kung ano ang ikaw ay tunay na sa ilalim ng hood ng paghahambing? Naghahambing ka ng mga address. At lamang intuitively, malinaw, Ox123 Hindi pupunta sa pantay na Ox456. Yaong mga numero, mga bits lamang ang naiiba. At kaya tuloy-tuloy, noong nakaraang linggo ito sinabi type ka iba't ibang mga bagay, kahit na ang mga salita ay eksaktong kopya ng parehong. Kaya naming ayusin ito. Sa mga tuntunin lego, na noon ay kung ano ang fix? Madla: Gumamit ng isang function. Tagapagsalita 1: Gumamit ng isang function. O kaya, ang mga bituin ay siguradong kasangkot, ngunit gamitin ang isang function upang gawin kung ano? Madla: Upang ihambing ang mga string. Tagapagsalita 1: Upang ihambing ang mga string. Kaya ang pangunahing problema dito ay na lang ako ay isinasaalang-alang ang kalidad ng mga string na tinukoy sa pamamagitan ng paghahambing ng kanilang mga address. At malinaw naman na ito lamang ay pipi ngayon sabay-sabay maunawaan mo kung ano ang nangyayari sa sa ilalim ng hood. Upang tunay na ihambing ang mga string upang makita kung ang mga ito ay pantay-pantay sa mga paraan na ang isang tao Gusto isaalang-alang ang dalawang mga string na maging kapantay kailangan namin upang ihambing ang mga ito ng character para sa karakter para sa character. Ngayon maaari ba akong magkaroon ng tapos ito napaka tediously. Ngunit pabihasa, kami ay gamit ang isang para sa loop. At lamang ihambing ang mga bracket i laban t i bracket. s bracket i plus 1 laban t bracket i plus 1, at iba pa, sa loob ang ilang mga uri ng loop. At kung makita ko ang anumang dalawang character na mag-iba, o kung Napag-alaman kong ooh, s ay mas maikli sa t o mas mahaba kaysa sa t Maaari ko bang sabihin agad na hindi totoo, ang mga ito ay hindi ang pareho. Ngunit kung makakuha ako sa pamamagitan ng s at t at sabihin parehong, parehong, parehong, parehong, parehong, dulo ng parehong mga string, ang maaari kong sabihin totoo, ang mga ito ay pantay. Well, thankfully, taon na ang nakakaraan ng isang tao Nagsulat na code para sa atin. At sila ay tinatawag na ito StrComp para sa string ihambing. At kahit na ito ay isang maliit na counter madaling maunawaan, StrComp nagbabalik 0 kung ang mga dalawang string, s at t ay pareho. Ngunit ito ay nagbabalik negatibong halaga kung s dapat dumating bago t ayon sa alpabeto o positibong halaga kung paano ito dapat na dumating pagkatapos t ayon sa alpabeto. Kaya kung sakaling nais upang ayusin ang isang bagay, ito lumiliko out na StrComp ay kapaki-pakinabang. Dahil ito ay hindi lamang sabihin oo o hindi, katumbas o hindi. Ito ay nagbibigay sa iyo ng isang pakiramdam ng pag-order i isang diksyunaryo baka. Kaya StrComp, mga kuwit t ay katumbas ng ay katumbas ng 0 ay nangangahulugan na ang string ay talagang pantay. Dahil kung sinuman ang nagsulat function na ito taon na ang nakaraan siguro ay gumamit ng isang para sa loop o isang habang loop o isang bagay tulad na na isama sa paglipas ng ang mga character na muli at muli at muli. Ngunit problema dalawang lumitaw dito. Ito ay copy0.c. At ang dalawa ay pula dahil ito ay flawed. At kung ano ang ginagawa namin dito? Well, una kong tinatawag GetString. At ako na naka-imbak ang return halaga sa s. Kaya na medyo magkano ang parehong bilang ito tuktok na bahagi ng larawan. Ngunit kung ano ang nauuna matapos na? Well, ipaalam sa akin sige at mapupuksa ng isang buong grupo ng mga ito. Susubukan naming rewind sa oras na kung saan namin lamang may s, na ngayon ay pare-pareho sa line up ng isa doon. I-check. Kung s ay katumbas ay katumbas ng 0. Ngayon, isang mabilis na tandaan gilid, kapag baka GetString bumalik 0? Walang sapat na memory. I-right? Ito ay bihira na ito ay pagpunta sa mangyari, tiyak sa isang computer na Nakakuha ng daan-daang megs o kahit na gig ng RAM. Ngunit ito ay maaaring, sa teorya, bumalik 0, lalo na kung ang gumagamit ay hindi makikipagtulungan. May mga paraan upang magpanggap tulad ng hindi mo pa inputted anumang bagay at bilis ng kamay GetString sa pagbabalik 0 epektibo. Kaya ito ang nangyayari upang tingnan ang mga iyon. Dahil kung anuman sa iyo Sinimulan na upang makakuha ng, na, segmentation faults - na kung saan ay marahil naging isang pinagmulan ng ilang mga pagkabigo - iyon ay halos palaging ang resulta ng memory-kaugnay na error. Kahit paano mo messed up na may pagsasaalang-alang sa isang pointer, kahit na hindi mo mapagtanto nagkaroon ng pointer. Kaya maaari mo pa sapilitan segmentation faults na mas maaga sa linggo ng isa gamit isang bagay tulad ng isang para sa loop o isang habang loop at isang array sa pamamagitan ng pagpunta masyadong malayo lagpas sa mga hangganan ng ilang array na ipinahayag sa iyo, sa dalawang linggo sa partikular na. Maaaring nagawa mo na ito kahit na sa problema itakda ang apat na may Breakout. Kahit na ikaw ay malamang na hindi na nakikita anumang mga bituin sa code para sa pamamahagi Breakout, ito lumiliko out na ang mga GRect at GOval at iba pang mga bagay, iyon ay aktwal na payo sa ilalim ng hood. Ngunit Stanford, tulad ng sa amin, uri ng Itinatago na detalye ng hindi bababa sa para sa mga aklatan layunin, tulad ng ginagawa namin para sa string at pansamantalang trabaho *. Ngunit GRect at GOval at lahat ng mga bagay ka guys ay o ay gumagamit ng linggo ito ay sa huli memory address. Ikaw lamang ay hindi alam ito. Kaya ito ay hindi nakakagulat pagkatapos, marahil, na maaari mong paglalakbay sa paglipas ng ilang mga segmentation faults. Ngunit kung ano ang kawili-wiling dito ngayon, kung pagkatapos naming suriin para sa 0 ang ginagawa namin string t nakakakuha s. Well, hayaan mo akong idedeklara t. Pupunta ako sa gumuhit ito bilang isang parisukat, 32 bits, tumawag ito t. At pagkatapos ay ako pagpunta sa gawin ay nakakakuha s. Well, ano ang na ibig sabihin nito? Well, ito ay isang maliit na mahirap na isipin tungkol sa ang larawan ito matalino. Ngunit sabihin isipin ang tungkol kung ano ang nasa loob ng x? Ano ang Literal na ito sa loob ng variable? Ang halaga Ox123. Kaya kapag sinabi ko string t nakakakuha s, na lamang Literal na nangangahulugan na gawin ang mga numero ng sa s, na kung saan ay Ox123 at ilagay ito Ox123. O pictorially, kung ako uri ng abstract ang layo mula sa na detalye nito ay ang epekto ng literal paggawa ito pati na rin. Kaya ngayon, sa tingin bumalik sa nakaraang linggo kapag kami nagpatuloy sa kapitalistang T. ako ginawang T bracket 0. Well, T bracket 0, kahit na ito ay isang pointer, maaari mong ituring ito bilang bagaman ito ay isang array, na may isang parisukat bracket pagtatanda. Kaya kung saan ay T bracket 0? Well, ito ay ang h. At kaya kapag ginagamit namin na linya ng code, dalawang itaas, na kung saan ay nasa c na type.h header ng file, na kung saan ito ay ipinahayag. Kang naka-capitalize na ito H. Ngunit ng Siyempre, iyon ang eksaktong parehong h na sa loob ng s, kaya na magsalita. At kaya ngayon binago mo na o Isulat sa malaking titik ang parehong orihinal at ang tinatawag nang gayon kopya. Dahil hindi ka gumawa ng isang kopya sa paraan na ang isang tao ay gusto mo itong maging. Kaya kung ano ay ang pag-aayos dito, sa copy1.c noong nakaraang linggo? Pag-andar, sa gayon maaari naming talaga kopyahin ang string. At sa panimula, ano ang kailangan namin upang gawin upang kopyahin ang string? Well, sa ganitong berde bersyon dito ako pagpunta sa gawin ito nang walang kinikilingan mababang antas. May mga aktwal na mga function sila ay maaaring makatulong sa ito. Ngunit ang pinaka-basic ng isa, at ang pinaka- pamilyar ang isa, hindi bababa sa, ay malapit nang maging pamilyar sa amin, ay ang mga sumusunod - kaya isa sa unang linya ng code sa berde ngayon. Ko lang rewrote s bilang pansamantalang trabaho *. Walang functional pagkakaiba doon. Katatapos ko lamang threw ang layo ng CS50 library at Ako pagtawag ito kung ano ito ay, isang pansamantalang trabaho *. Ngayon tuldok, tuldok, tuldok, dahil mayroong ang ilang mga error checking na hindi kagiliw-giliw na makipag-usap tungkol sa muli. Kaya ngayon t ay ipinahayag. Ito masyadong ay isang pansamantalang trabaho *. Kaya ako iginuhit ng kaunti sa parisukat ang screen tulad ng dati. Ngunit sa kanang bahagi, malloc, sinabi namin ay magtalaga ng memory. Kaya maglaan ng ilang tipak ng memory. At kung gaano karaming bytes ginagawa namin talaga nais upang maglaan, ay mukhang ito? Well, ang string haba ng s. Kaya kung kumusta na pagpunta sa maging lima. Susubukan naming sabihin h-e-l--l o. Kaya limang bytes. Ngunit pagkatapos plus 1, bakit 1? Ang mga character na 0. Kung hindi kami iwanan kuwarto para sa tao namin maaaring aksidenteng lumikha ng isang sitwasyon kung saan ang string ay h-e-l--l o. At pagkatapos ay ang susunod na panahon GetString ay tinatawag na ako at i-type sa, halimbawa, David, D-a-v-i-d, ang computer ay pagpunta mag-isip na ang mga ay ang tunay h-e-l-l-o-d-a-v-i-d dahil mayroong hindi masira sa pagitan ng mga salitang iyon. Kaya kailangan namin na bakasyon. Kaya hindi namin nais limang. Gusto naming anim bytes. At bytes sinasabi ko. Ngunit ito ay talagang oras laki ng pansamantalang trabaho. Technically pansamantalang trabaho ay halos palaging isang solong byte. Ngunit lamang upang gumawa ng aming mga code portable, kaya na magsalita, upang ito ay gumagana sa iba't ibang mga computer kahit na maaari nilang maging medyo iba sa ilalim ng hood, pupuntahan ko generically sabihin laki ng pansamantalang trabaho nang sa gayon ay ang aking code palaging gumagana. At hindi ko na kailangang mag-recompile ito lamang dahil ko i-upgrade ang aking computer o gamitin ilang iba't ibang mga platform. Kaya Mayroon akong 6 beses ang laki ng isang pansamantalang trabaho, na ang mangyayari sa maging 1. Kaya na paraan malloc ng dati bigyan mo ako ng anim na bytes. Ano ang tunay na ginagawa? Well, ipaalam sa akin pagulungin pabalik sa panahon dito upang kung saan tayo sa kuwento. Kaya kung pumunta ako pabalik dito, ko na ipinahayag isang pansamantalang trabaho * tinatawag t. Ngayon ko na tinatawag na malloc para sa anim bytes. At ngayon pupuntahan ko upang gumuhit ng mga anim na bytes tulad ng array mas maaga. Ngunit ko talagang hindi alam kung ano ang sa loob ng array. Kung maglaan ka ng memory ito lumiliko out na Hindi mo maaaring pagkatiwalaan na mayroong ilang mga Kilala halaga doon. Maaaring ito ay ginamit sa pamamagitan ng isang bagay tao, sa ilang ibang mga pag-andar, ang ilang mga iba pang linya ng code na sinulat mo. Kaya makikita namin sa pangkalahatan ay tawagan ang mga basura mga halaga at makahatak ng mga ito, marahil, bilang tanong mark, lamang na nagpapahiwatig na namin hindi alam kung ano ang talagang doon. At na hindi sang-ayon kaya hangga't namin ay matalino sapat na upang patungan ang mga mga halaga ng basura na may mga numero o char na pinapahalagahan namin ang tungkol sa. Kaya sa kasong ito kung ano ako pagpunta sa gawin? Well, ang aking mga linya ng code susunod, mayroon akong apat. int makakuha i 0, n nakakakuha ng string haba ng s. Kaya isang pamilyar para sa loop. Ako ay mas mababa sa o katumbas ng n, na karaniwang ay sa itaas. Ngunit oras na ito ito ay sinadya. Ako + +, at pagkatapos ko lang gawin t bracket ay nakakakuha i s. Dahil ang aking mga larawan ay mukhang ganito sa sandaling ito, na naka-imbak sa t ay ang address ng random na tipak ng memory kung saan ang mga halaga ay hindi kilala. Ngunit sa sandaling gawin ko t bracket 0 na naglalagay sa akin dito. At kung ano ay nagtatapos up nagsisimula iginuhit doon? Tapusin namin ang hanggang paglalagay h. Dahil iyon ang kung ano ang sa mga bracket 0. At pagkatapos ay ang parehong bagay para sa e, at l, at l, at o. n, bakit ako pumunta up sa pamamagitan ng isang patas sa n? Dahil sa 0 karakter. Kaya lamang maging malinaw, pagkatapos, kung ako talaga burahin ang anumang mga basura mga halaga ay at pagkatapos ay talagang gumuhit sa kung ano ang inaasahan ko, ito ang mga bracket 1, 2, 3, 4, plus na trailing bagong character. At kaya ngayon kung namin ipinagpatuloy nakalipas na ang tuldok, tuldok, tuldok na ito sa tamang bersyon at capitalized t bracket 0 gagawin ko, ng Siyempre, i-capitalize lang ito tao dito, na conceptually, sa huli ay ang layunin. Kaya na ang lahat ng pointer ay. At na ginagamit mo ang mga ito para sa linggo ngayon sa konteksto ng mga string. Ngunit sa ilalim ng hood ang mga ito ay medyo mas kumplikado. Pero kung sa tingin mo tungkol sa mga ito sa ito may mga larawan form na ipanukala ko na ang mga ito ay Marahil hindi lahat ng nakakatakot na habang ang mga ito baka unang tila sa unang tingin, lalo na may tulad na bagong syntax. Ang anumang mga katanungan sa payo, string, o char? Oo? Madla: Maaari kang bumalik sa [hindi marinig]? Tagapagsalita 1: Oo naman. Madla: Kaya kung paano dumating sa iyong napaka-huling linya, hindi mo kailangang magkaroon ng isang linya * t at isang * s sa linya? Huwag kang magkaroon ang reference sa - Tagapagsalita 1: Ah, isang talagang mahusay na tanong. Bakit hindi Mayroon akong * t at isang * s? Dahil sa madaling sabi, noong nakaraang linggo, tulad ng sa aming swap function, ko sabihin na kapag mayroon kang pointer ang mga paraan kung saan pumunta ka doon bilang namin ginawa pisikal na sa entablado, ay talagang gamitin ang star operator. Ito ay lumiliko out na ito square-bracket pagtatanda ay kung ano ang makikita namin tumawag sintaktik asukal, na kung saan ay lamang ng isang sexy paraan ng sinasabi ito ng shorthand notation para sa eksakto kung ano ang naglalarawan. Ngunit ito ay isang maliit na mas madaling maunawaan. At sa panganib ng paggawa ng ito ay tila higit pa kumplikado kaysa ito ay kailangang maging, kung ano talaga ang nangyayari dito ay ang mga sumusunod - Kung sinasabi ko * t nangangahulugan na pumunta sa address ang naka-imbak sa t. Kaya literal, kung t ay pag-iimbak ang address ng na h sa una, * t paraan pumunta dito. Ngayon, ano ang nilalaman ng t bracket 0 ibig sabihin nito? Parehong eksaktong bagay. Ito ay lamang ng kaunti pa sa gumagamit magiliw na magsulat. Ngunit hindi ko pa tapos. Hindi lang ko masabi * t ay nakakakuha * s. Dahil kung ano ang Gusto ko ginagawa pagkatapos? Gusto ko ma-putting h, h, h, h, h sa buong ang buong bagay. I-right? Dahil * t ay pumunta sa address sa t. Ngunit kami ay sa loob ng isang loop. At ano ang halaga ako incrementing, siyempre, sa bawat pag-ulit? i. Subalit mayroong isang pagkakataon dito, tama? Kahit na ito nararamdaman tulad ng nakakakuha ito ng ang kaunti pa sopistikadong kaysa sa square bracket-pagtatanda kami na ginagamit para sa ilang oras - hayaan mo akong i-undo ang aking h pagbabago doon - kahit na ito ay ngayon sa pagkuha ng kaunti may interes, ang pangunahing ideya, kung * t Nangangahulugan dito at * t lamang ang pumunta sa address sa t. Ngunit ano ay ang address sa t? Ang bilang panatilihin namin ang paggamit? Tulad Ox456, sabihin na magdala pabalik para lamang sa ang kapakanan ng talakayan. Well, kung gusto ko upang makakuha ng sa e in t string, ko lang nais upang pumunta sa, talaga, 456. O sa halip, 457. Ko lang ang kailangan upang magdagdag ng isa. Ngunit maaari kong gawin na, tama? Dahil t, kahit na panatilihing ako drawing ito ngayon bilang isang arrow, ito lamang ay isang numero, Ox456. At kung ako magdagdag ng isa sa na, o higit pang mga Sa pangkalahatan, kung ako idaragdag ko sa na maaari kong talagang makakuha ng eksakto kung saan gusto ko. Kaya kung ko talagang gawin ito - at ito ay kung ano ang tinatawag na ngayong pointer aritmetika - Maaari ko bang tanggalin ang linyang ito. Alin ang, lantaran, tingin ko mas malinaw at ang kaunti pa user friendly na basahin. Ngunit ito ay hindi gaanong tama. Ang linya ng code ngayon ay gumagamit ng pointer aritmetika. Ito ay nagsasabi pumunta sa pagsunod address - ano ang simula ng t ay, na ay t plus i, na una ay 0, na kung saan ay mahusay. Dahil ito ay nangangahulugan na ang simula ng t plus 1, 2 plus, plus 3, at iba pa. At sa parehong pakikitungo na may s. Kaya sintaktik asukal para sa ito. Ngunit pag-unawa kung ano talaga ang nangyayari sa sa ilalim ng hood, Gusto ko magtaltalan, ay talagang kapaki-pakinabang sa loob at ng sarili nito. Dahil ang ibig sabihin nito ngayon ay may hindi marami pang iba magic ng pagpunta sa sa ilalim ng hood. May ay hindi pagpunta sa maging marami pa mga layer na maaari naming i-back alisan ng balat para sa iyo. Ito ay c. At ito ay mga programa. Talagang mahusay na tanong. Ang lahat ng mga karapatan, sa gayon ito ay na maraming surot programa ako ay nagre-refer sa mas maaga. makipagpalitan ay flawed. Kung ang tila upang gumana. Pagkuhang muli na lang bang may gatas at ang orange juice - na kung saan ako nagsimula inom demonstration ngayon. Kaya lang bilang may orange juice at gatas ang, namin ginawa na kailangang gumamit ng isang pansamantalang variable, tmp, upang i-hold ang isang Pansamantalang sa gayon ay maaari naming pagkatapos ay baguhin ang mga halaga at pagkatapos ay i-update b. Ngunit ang function na ito, sinabi namin, o ito programa kung saan ang function na ito ay nakasulat ay mali at flawed, bakit? Oo? Madla: [hindi marinig]. Tagapagsalita 1: Mismong, kapag tumawag ka makipagpalitan - o mas pangkalahatan, kapag nag- tumawag pinaka-anumang function na - kung ang argumento sa function na iyon ay noong unang panahon, kaya na magsalita, ints at char at Doubles at sa kamay, mga bagay na walang bituin, ikaw ay pagpasa sa isang kopya ng ang argumento. Kaya kung x ay 1 at y ay 2, ang isang ay pagpunta upang maging 1 at b ay magiging 2. Subalit sila ay pagpunta sa maging iba chunks ng bits, iba't ibang mga chunks ng memory na nangyari mang-iimbak magkamukha halaga. Kaya code na ito ay sobrang perpekto sa pagpapalit ng isang at b. Ito ay walang magandang sa pagpapalit - Halimbawa sa huling linggo - x at y. Dahil muli, ang mga ito ay nasa maling saklaw. Ngayon, kung paano namin ay pumunta tungkol sa pag-aayos na ito? Kinailangan naming gawin ang mga function na tumingin ng kaunti hindi maganda. Ngunit muli, isaalang-alang kung ano ang ito ay nangangahulugan lamang. At talagang, sabihin sa akin, para hindi pabago-bago, baguhin ang isang bagay kaya kapareho ano pa lang namin ginawa. Tulad ng nabanggit ko noong nakaraang linggo, hindi mahalaga kung saan ito mapupunta. Sa katunayan, karaniwan nais mong ilagay ang bituin sa tabi ng pangalan ng variable. Ngunit sa tingin ko magiging isang maliit na mas madali upang isaalang-alang ang * sa tabi ng uri ng data bilang ibig sabihin ito ay isang pointer sa isang int sa kasong ito. Kaya kung ano ako ng paggawa dito? Ako sinasabi huwag magbigay sa akin ng isang int sinundan ng isa pang int, pagtawag sa kanila ng isang at b. Bigyan mo ako ng address ng isang int. Bigyan mo ako ng address ng isa pang int. Tawagan ang mga address ng isang at b. At pagkatapos ay ang paggamit ng * notation pababa sa ibaba, pumunta sa bawat isa sa mga address na iyon bilang kinakailangan upang makakuha ng alinman sa o itakda ang halaga nito. Subalit mayroong isang exception dito. Bakit hindi ako magkaroon ng isang * sa tabi ng tmp? Bakit hindi ako gawin ito, halimbawa? Ito nararamdaman tulad ng dapat kong pumunta lamang lahat out at maitama ang buong bagay. Oo? Madla: [hindi marinig]. Tagapagsalita 1: Hindi ko pa ipinahayag tmp bilang isang string. Kaya ito ay ipinapahayag, sa kasong ito, tmp isang upang maging ang address ng isang int. Ngunit iyon ay hindi pa kung ano ang gusto ko, para sa isang pares ng mga dahilan. Madla: Hindi mo nais na i-swap ang mga ito. Tagapagsalita 1: Mismong, hindi ko nais upang magpalitan anumang bagay na may tmp. tmp lamang ang linggo-isa bagay-bagay. Ang lahat ng mga gusto ko ay isang variable mag-imbak ng ilang mga numero. Hindi ko kahit na nagmamalasakit tungkol sa mga address sa panahon na ito. Ko lang kailangan 32 bits o kaya i-store sa isang int. At gusto ko ang ilalagay sa mga 32 bit ano ay wala sa, kaya na magsalita, ngunit kung ano ang nasa isang, lamang na maging mas tumpak. Dahil kung ang isang ay isang address, * ay nangangahulugang isang pumunta doon at makuha ang halaga 1. Halimbawa, sa halimbawa huling linggo o sa b ni kaso, makakuha ng halaga ng 2. Kaya kung ano talaga ang nangyari? Hayaan akong gumuhit ng larawan dito na kalooban mang-ulol lamang apart bahagi ng araw na ito. Ngunit ito ay patuloy na lumitaw para sa lubos ng ilang oras. Ito, inaangkin ko, ay kung ano ang iyong computer memory Mukhang kapag nagpatakbo ka ng programa, ang anumang programa. Kapag nagpatakbo ka ng isang programa sa pinakatuktok ng RAM ng iyong computer - kaya isipin ito parihaba, tunay, bilang iyong computer RAM o memorya, ang lahat ng 101 bilyong bytes ng ito, ang lahat ng dalawang bilyong bytes, ang lahat ng dalawang gigabytes ng ito, anuman ang dami mayroon kang ay, sabihin iguhit ito bilang isang parihaba. At inaangkin ko na kapag nagpatakbo ka ng isang programa tulad ng Microsoft Word o Chrome o anumang bagay tulad na, ang mga bits na O Microsoft na ang Google ay nagsulat - sa kaso ng mga programa - ang malo-load sa memory ng iyong computer kung saan maaari nilang ipatupad ang higit pa mabilis at fed papunta sa CPU, na ay ang talino ng mga computer. At sa TAM sila ay naka-imbak sa pinakadulo tuktok ng iyong programa, kaya na magsalita. Sa ibang salita, kung ito ay isang tipak ng memorya, kapag nag-double-click sa Microsoft Word, ang mga bits ay off ang hard drive. Sila ay makapag-load sa RAM. At kami tulak up ang mga ito sa pinakatuktok ito ng parihaba conceptually. Well, ang natitirang bahagi ng iyong memorya ay na ginagamit para sa iba't ibang mga bagay. Sa pinakatuktok makita mo initialize data at uninitialize data. Ito ay gawin, para sa pinaka-bahagi, na may constants o pangkalahatang variable na may halaga. Ngunit higit pa sa mga ibang oras. Pagkatapos mayroon kang ang kimpal, na kami ay bumalik sa. Ngunit sa ilalim ay ang bahagi na lalo na dyermeyn sa ngayon. Ito ay ang tinatawag na stack. Kaya tulad lamang ng sa karamihan ng anumang D hall dito sa campus, mayroon kang mga trays na isalansan lamang sa ibabaw ng bawat isa sa kung saan maaari kang maglagay ng pagkain at watnat. Ang stack sa isang sistema ng computer na ay halos katulad na. Maliban kung saan ang tray, pati na ginagamit namin sa sa dining hall, siyempre, ay sinadya upang dalhin ang mga bagay trays o ang mga frame - dahil kakailanganin naming tawagan ang mga ito - sa isang computer memorya ay ginagamit upang i-hold variable at halaga. Kaya kung ano ang talagang napupunta sa sa ilalim ng hood? Well, hayaan mo akong i-flip sa ibabaw sa screen dito. At sabihin tumuon lamang sa ibabang bahagi para sa isang sandali. Kung ito ang ibabang bahagi ng aking computer memory ito lumiliko out kapag ako tawagan ang function pangunahing - na mangyayari, lantaran, Awtomatikong para sa akin - Nakakuha ako ng tipak ng memory sa ibaba ng aking RAM kaya na magsalita. At ito ay kung saan ang pangunahing lokal na mga variable pumunta. Ito ay kung saan argc at argv siguro pumunta, at anumang mga variable na ako Ipinahahayag sa loob ng main. Sila ay nagtatapos up sa ilalim ng RAM ng aking computer. Ngayon ipagpalagay na pangunahing mga tawag sa isang function tulad makipagpalitan ng, tulad ng ito ginawa noong nakaraang linggo? Well, aming lubos na maglagay ng bagong tray, isang bagong frame, sa aking mga tipak ng memory. At ako pagpunta sa ilarawan ito bilang kasali sa function na makipagpalitan. Ngayon kung ano ang nasa loob ng makipagpalitan? Well, batay sa programa noong nakaraang linggo at ang isa pa lang namin nakita ang isang sipi mula sa, sa loob ng frame makipagpalitan ng, o sa makipagpalitan ng tray, kung ano ang mga variable? Well, isang at b. Dahil doon ay nito lokal na mga argumento, plus isang third, tmp. Kaya talaga, kaya kong iguhit ito ang kaunti pa nang malinis. Hayaan akong sige at i-undo ang mga label. At ipaalam sa akin i-claim na alam mo kung ano? isang ay marahil pagpunta sa magtapos up dito. B ay pagpunta upang tapusin up dito. At tmp ay pagpunta upang tapusin up dito. Ngayon, na pagkakasunud-sunod ng kapangyarihan maging isang maliit na naiiba. Ngunit conceptually ito ay ang ideya. At lamang kapag pinagsama-sama, ito ay kung ano ang Makikita kami tatawag sa frame makipagpalitan ng, o dining hall-tray. At sa parehong pakikitungo sa main. Ngunit hindi ko ay redraw na. Ngunit iyon kung saan argc at argv at anumang ng kanyang mga lokal na variable tulad ng x at y maaaring pati na rin. Kaya ngayon isaalang-alang kung ano talaga ang nangyayari kapag tumawag ka makipagpalitan. Kapag tumawag ka makipagpalitan, e-execute code tulad ng ito, ikaw ay pagpasa sa, sa maraming surot bersyon, at isang b bilang ng mga kopya ng x at y. Kaya kung ngayon ko gumuhit ito sa screen - Nakakuha upang makakuha ng mas mahusay na sa ito - kaya ang kuwento ko ay nagsasabi sa aking sarili ay ito sa maraming surot bersyon, kapag kami tumawag magpalit ng pagpasa sa isang literal at b bilang integer, kung ano talaga ang nangyayari? Well, kung ano talaga ang nangyayari ay na ito. Hayaan akong sige at i-undo lamang upang i-clear ng ilang espasyo dito. Kaya ito ay ang memorya ng aking computer. Kaya kung mayroon akong, halimbawa - talagang sabihin gawin ito sa ganitong paraan - kung i-claim ko na ito ay x, pag-iimbak ang halaga 1 tulad ng nakaraang linggo. At ito ay y, pag-iimbak ang halaga 2 tulad lamang ng nakaraang linggo. At ito ay pangunahing, kapag tumawag ako makipagpalitan ng, sa gayong paraan pagbibigay sa sarili ko ng access sa at b at tmp, pupuntahan ko i-claim na ito ay isang at ito ay 1. Ito ay b. Ito ay 2. Ito ay tinatawag na tmp. At sa una, ito ay may ilang mga halaga ng basura hanggang ko talaga mag-imbak sa isang ito, na kung saan ay 1. Pagkatapos ko sige at baguhin isang upang maging kung ano? B. halaga. At kaya ngayon mayroon akong dalawang dito. At pagkatapos ay sinabi namin ay nakakakuha b tmp. Muli, tulad ng isang katinuan check, ang mga third linya ng code dito ay simpleng na ito isa, b nakakakuha tmp. At bilang wakas gayon, ano ang gagawin ko? Ako sige at baguhin b upang maging anumang ang halaga ng tmp ay, na kung saan ay 1. Hindi ko pindutin ang tmp muli. Ngunit ngayon, ang problema ay sa lalong madaling makipagpalitan ng babalik, dahil hindi ito handing i-back ang ilang mga halaga, may return walang tahasang pahayag sa loob nito. Ano ang tunay na nangyayari? Well, mahalagang lahat ng mga ito memory - OK, tila pambura ang may gusto lamang ng isang daliri sa isang pagkakataon - lamang mawala. Ngayon sa katotohanan hindi ito pagpunta kahit saan. Ngunit maaari mong isipin na ito ngayon bilang tanong marks. Dahil hindi na ito talaga sa paggamit. At wala ay tapos na may mga halagang iyon. Kaya sa kaso ng mga berdeng bersyon ng ang code na ito, kung ano ang sa halip ay ini- pumasa sa makipagpalitan? Kaya addresses. Kaya ang address ng x at ang address ng y. Kaya kung muli naming sabihin sa kuwentong ito ng isang huling panahon, at ko talagang gumuhit makipagpalitan muli, ngunit may mga payo, ito sa pagiging isang, ito pagiging b, at ang pagiging tmp, kung ano ang aktwal na naka-imbak sa isang ito sa berdeng bersyon ng aking code kung saan makakakuha ako ng pagpasa sa mga address? Ito ay pagpunta sa maging isang pointer sa x. Kaya maaari kong iguhit ang isang arrow. Ngunit gamitin natin ang parehong arbitrary Halimbawa tulad ng dati. Sabihin natin na ito ay isang bagay tulad ng Ox123. At ito ay magiging Ox127 dahil ito ay apat na bytes ang layo dahil ito ay isang int, kaya Ox127. At muli, ako pagkuha ng ilang mga kalayaan kasama ang mga numero. Ang mga ito ay mas maliit kaysa sa gagawin nila talaga at maging sa ibang order. Ngunit na kung paano ang larawan ngayon ay naiiba. Ngunit kapag ginagamit ko ito berde code at ko int tmp makakuha ng isang *. * Isang paraan upang gawin ang mga sumusunod, magsasagawa ng tugunan na nasa isang at pumunta sa ito, na kung saan ay 1. At ang ginagawa ko pagkatapos ay ilagay sa tmp. Samantala, sa susunod na linya ng code dito, isang * b nakakakuha, ano ang na ibig sabihin nito? Well, isang *, kaya pumunta dito ay nakakakuha * b, na nangangahulugan na pumunta doon. At na nangangahulugan na ilagay ang halaga sa mga doon. Sa wakas, sa huling linya ng code sinabi lang * b nakakakuha tmp. Kaya sabi ni b pumunta doon at patungan ng tmp kung saan, sa kasong ito, ay pagpunta maging, muli, 1. At ito ang dahilan kung bakit ang berde na bersyon ng ang aming code ay gumagana, samantalang ang pula na bersyon ay hindi kailanman ginawa. Ito lahat lamang kahulihan babagsak sa kung paano ang memorya ay pinamamahalaan at kung saan ito talaga nailagay sa iyong computer RAM. At sa ngayon, iyon ang isa sa mga bagay na stack na ang ay ginagamit para sa. Mga Tanong sa layout? Sa payo? O kaya sa makipagpalitan? Ang lahat ng mga karapatan, kaya malloc, isipin ang, ginawang isang bagay na katulad nito. Ito ay isang napaka-simpleng halimbawa. At ito ay ang isa na Binky ipinakilala sa amin sa, kahit na medyo mabilis, sa pagtatapos ng klase. Dammit, doon kami pumunta muli. Kaya isipin ang na ito ay ang halimbawa na Binky ipinakilala sa amin, kahit na medyo mabilis sa pagtatapos ng klase. At dito ginamit namin malloc talaga para sa ikalawang pagkakataon. Dahil sa unang pagkakataon na ginamit namin ito sa lumikha ng sapat na RAM, maglaan ng sapat na RAM mag-imbak ng isang string. Oras na ito Binky iningatan itong simple. Kaya mag-imbak lamang isang int, tila. At iyon ang lahat-lahat fine. Ito ay isang maliit na kakaiba, lantaran, upang gamitin ang malloc upang magtalaga ng isang int. Ngunit ang punto ng ni Pedro noon ay claymation talaga lang sabihin ang kuwento ng kung ano ang nangyayari o hindi mangyayari kapag abusuhin mo memory. Kaya sa kasong ito, ang program na ito ginawa ang ilang mga bagay. Sa unang kaso dito, ito declares pointer isang tinatawag na x sa isang int. Ito pagkatapos declares isang pointer tinatawag y sa isang int. Ito pagkatapos ay iniimbak sa x, ano? May ibang ngayon. Ano ay makakakuha ng naka-imbak sa x ayon sa ang ikatlong linya ng programang ito? Madla: [hindi marinig]. Tagapagsalita 1: Well, hindi masyadong bytes, bawat sasabihin. Maging mas tumpak na ngayon. Ano ay makakakuha ng naka-imbak sa x? Ang isang address, sa tingin ko Narinig ko ito. Kaya kung ano ang malloc bumalik? malloc behaviorally allocates isang tipak ng memory. Ngunit paano ito magbibigay sa iyo ng access sa mga ito? Ito ay nagbabalik ano? Ang address ng unang byte sa mga tipak ng memory. Ngayon, ito ay napaka-simple. Ito ay isa lamang byte, na nangangahulugan na ang tugunan kami pagbalik ay ang address ng buong bagay. Kaya naka-imbak sa x pagkatapos, ay ang address ng na tipak ng memory. Samantala, kung ano ang susunod na mangyayari? Kaya talaga, sabihin sige at gumuhit ito out real mabilis. Kaya kung pumunta kami sa ibabaw ng mga screen dito at maglaro namin ito out int * x at int * y ay pagpunta sa gawin kung ano ang para sa akin? Inaangkin ko na lang ito ng pagpunta sa gawin isang bagay na tulad nito at tumawag ito x, at ito at tawagan ito y. Samantala, ang ikatlong linya ng code ay pagpunta sa maglaan ang laki ng isang int, na kung saan ang mangyayari sa maging - paumanhin kung ako sinabi isa bago ako nilalayong isa int - apat na bytes sa isang tipikal na computer. Hindi bababa sa CS50 appliance. Kaya ito ay pagpunta sa maglaan ito, na nakakaalam? Sa isang lugar out dito. At ito ay naka-imbak sa ilang mga address kapong baka, na nakakaalam? Ngunit ano ang nangyayari upang ibinalik ang address na iyon. Ngunit kailangan naming gumuhit ito pictorially bilang lamang ang isang arrow na tulad ng. Ngayon sa susunod na linya * x ay nakakakuha ng 42. Ano ang ibig * x ibig sabihin sa mga tuntunin ng karaniwang tao? Pumunta lamang doon. Pumunta sa address na iyon. O sa ibang salita, sundin ang arrow at ilagay 42 doon. Ngunit pagkatapos ng isang bagay masamang nangyari sa Binky, tama? Isipin ang linya na limang dito, * y ay makakakuha ng 13, sa katunayan isang sawi numero, ano ginawa para sa amin? Well, * y nangangahulugan pumunta doon. Well, ito ay hindi pa naibigay isang halaga pa, tama? Code ay hindi alam ang pagiging y nasimulan sa anumang bagay. Kami ay ina-x nasimulan sa isang address. Ngunit y ay ipinahayag up tuktok. Ngunit pagkatapos ng isang tuldok-kuwit, walang halaga ay talagang ilagay sa loob nito. Kaya ito ay patas na tumawag ito isang basura halaga. Sino ang nakakaalam kung ano ang doon? Ito ay ang mga labi ng mga bit na ginamit sa pamamagitan ng ilang mga nakaraang mga linya ng code sa ang aking programa. Kaya kung sasabihin kong pumunta doon, ito ay tulad ng, Wala akong palagay kung saan ang arrow na ito pagpunta sa mga end up. At na kapag ikaw ay karaniwang makakuha ng segmentation fault. Kung hindi mo sinasadyang dereference, kaya upang magsalita, o pumunta sa isang address na hindi talagang isang lehitimong address, masamang bagay na mangyayari. At iyon mismo kung ano ang nangyari mag-isip Binky. Kaya isipin ang na ang mga kuwento na Nick noon ay na nagsasabi sa dito ay ang parehong ideya ng kung anong Ko ang iginuhit na may mga ilusyon ng tisa sa board doon. X at y ay ipinahayag. Pagkatapos ay inilalaan namin ang laki ng isang int at naka-imbak ito sa x. Pagkatapos ay sa susunod na linya ginawa namin * x. Ito ang magic wand ni Pedro ng dereferencing. Iyon ilagay 42 sa memory may tulis out sa pamamagitan ng x. Ngunit ito ay kung saan bagay nagpunta horribly mali. I-right? Sinubukan naming i-dereference y. Ngunit y ay may ilang hindi tunay na halaga, tama? Na arrow sa ibabang kaliwang sulok, ay hindi tunay na tumuturo sa kahit ano. Ito ay uri ng kung ano ang ginagawa ko ginawa dito sa board. Kaya hindi magandang bagay na mangyayari, segmentation kasalanan, o Binky kasalanan, sa kasong ito. Ngunit kung kami pagkatapos ayusin na sa paggawa x nakakakuha y kung paano ipinapakita ng kuwento pagbabago? Well, kung gagawin ko x nakakakuha y, na epektibo ang parehong bilang sinasabi kahit ano ito ay, kapong baka-isang bagay ay magiging ang parehong dito, Kapong baka-isang bagay. O pictorially namin gumuhit ng isang arrow. Kaya dito sa board na may Binky, sa mga susunod na linya ng code, * y nangangahulugan pumunta doon. Saan ang doon? Ito ay nangangahulugan na sa paglipas dito. At kapag nag-update namin na maging 13 ito lamang ay nagsasangkot ng pagpunta at Sumusulat 13 dito ngayon. Kaya marahil hindi ganap tuwiran sa unang tingin. Pero sa paglalagom at upang gamitin ang parehong magulong pag-uusap na Binky na ginagamit dito, kaya ang unang dalawang maglaan ng payo, x at y, ngunit hindi ang pointees. At pointees ay hindi isang sa pangkalahatan ay ginamit na term. Ngunit pointer ay talagang. Ngunit ito ay kung ano ang itinuturo sa sa Binky ng mga katawagan. Ang susunod na linya, siyempre, allocates isang int pointee. Kaya isang tipak ng memory - bilang ako iginuhit sa ibabaw ang kanang bahagi doon - at itakda ang x katumbas upang tumuro sa ito. Ito dereferences x-imbak 42 sa ang memory na ito ay nagtuturo sa. At pagkatapos na ito, siyempre, ay isang masamang bagay. Dahil ang y ay hindi pagturo sa kahit ano pa. Ito Inaayos ito. Kaya ito ay pa rin maraming surot programa. Dahil lamang kami ng pamumulaklak sa pamamagitan ng code sa linya sa pamamagitan ng linya at sinasabi, oh well, ipaalam ito lumagpak doon. Iyon ay isang masamang bagay. Logro ay ang programa ay lamang ng pagpunta sa i-abort nang sama-sama sa na linya. Ngunit kung ikaw ay alisin ang mga nag-crash Linya at palitan ito ng huling dalawang mga linya doon magtalaga ka - gamit ang pointer pagtatalaga - y upang tumuro sa x bilang t point. At pagkatapos mo dereference y sa isang napaka-ligtas na paraan. Kaya kung saan ito ay mag-iwan sa amin? Well, lumiliko out na sa ilalim ng hood sa CS50 library, mga payo ginamit sa buong lugar. At kami ay talagang simulan upang alisan ng balat pabalik na layer bago ang haba. Ngunit ito ay nagiging masyado, isang expression na ang ilan sa ikaw ay maaaring maging pamilyar sa, lalo na sa mga mas kumportable, ay ang tunay na ng isang napaka-tanyag website, o stack overflow, mga araw na ito. Ngunit ito ay talagang napaka teknikal na kahulugan. Kami ngayon malaman kung ano ang isang stack ay. Ito ay tulad ng isang stack ng mga trays sa loob ng isang dining hall. O kaya sa loob ng iyong computer memorya nito ang mga frame na ginagamit sa pamamagitan ng pag-andar. Well, ito lumiliko out na dahil sa na napaka-simpleng pagpapatupad ng mga memorya at ang mga frame sa tinaguriang isalansan, maaari mong aktwal na kontrolin ng isang computer system medyo madali. Maaari mong sumibak sa isang sistema kung tao hindi katulad sa amin na nakasulat sa aming code partikular na mahusay. Kung ang mga tao tulad ng sa amin gamitin chunks ng memorya o paggamit array - kahit na mas karaniwang - pero minsan kalimutan na suriin ang mga hangganan ng aming mga array bilang maaari mong Mayroon iyong sarili kung minsan, at iterated paraan masyadong malayo nakaraan sa dulo ng array. Sa pinakamahusay na kaso, ang iyong mga programa baka lang pag-crash ng. Segmentation fault, uri ng nakakahiya. Hindi mahusay, ngunit ito ay hindi kinakailangan isang hugely masamang bagay. Ngunit kung ang iyong programa ay talagang sa real mga gumagamit ng 'computer, kung ito ay tumatakbo sa isang website na aktwal na random na mga tao sa internet ay pagpindot, pagpapaalam mga tao magbuod masamang bagay sa iyong code ay sa pangkalahatan ay hindi isang magandang bagay dahil nangangahulugan ito ng pagkakataon upang gumawa ng kontrol ng mga computer. At ito ay pagpunta sa hitsura isang maliit na misteriyoso. Ngunit naisip ko na gusto kong matakot sa iyo ng ang huling halimbawa dito. Narito ang isang halimbawa ng code. At mayroong isang magandang Wikipedia artikulo na nagtuturo sa pamamagitan ng ito nang mas detalyado. Mayroon akong main sa pagtawag sa ibaba foo, pagpasa sa argv ng 1. At ito lamang sa gayon maaari mong tumakbo ang program at makapasa isang arbitrary na input. At pagkatapos foo ay ipinahayag up tuktok tanggapin bilang isang string, o higit pang mga tumpak, isang pansamantalang trabaho *. Ito pagkatapos declares isang array ng char. Tumawag ito ng isang buffer, mas pangkalahatang paraan, ng laki 12. Kaya 12 na karakter ay maaaring magkasya sa loob ng array na tinatawag c. At pagkatapos ay ginagamit nito ang bagong pag-andar, na kung saan ay bagong ngunit hindi mahirap Nauunawaan, memory kopya. Ito kinokopya ang memorya mula sa bar, na noon ay ang variable n nakaraan, anuman ang gumagamit na nai-type sa argv 1 sa c. Gaano karaming bytes? Ang string ng haba ng bar. Kaya sa ibang salita, kung ang user ang mga uri sa h-e-l--l o magpasok, ang haba ng string ng halo ay limang. Kaya limang ng mga bytes ay pagpunta upang makakuha ng kinopya sa array na tinatawag c, na ang laki ng 12. Ngunit ano ang user ang mga uri sa isang mas matagal salita na 13 character o 14 character o 100 mga character o higit pa? Saan nakatago ang mga ito ng pagpunta sa pumunta? Well, na frame, na tray sa dining hall-stack, sila ay pagpunta sa pumunta doon. At lamang ito ng pagpunta sa simulan patungan iba pang mga bagay-bagay na na- sa na stack, umaapaw stack ang, kaya na magsalita. Kaya pictorially, isipin ito sa ganitong paraan. Ito ay lamang ng isang makulay na bersyon ng ang larawan na aming pagguhit. Sa ibaba, sabihin nating, ang pangunahing. At sa itaas, kung ano ang iyong nakikita ngayon ay ang frame, kulay naka-code na ngayon, para sa isang function na tinatawag foo. Ngunit kung ano ang kawili-wiling tungkol dito foo ay na dito ay frame nito. Kaya ito ay iguguhit tulad ko ginawa ngunit sa mapusyaw na asul. At ngayon ito ay kung saan c bracket 0 napupunta. At ito ay kung saan c bracket 11 ay pagpunta upang tapusin up. Sa ibang salita, ito ang mangyayari sa ay kinakatawan bilang isang parisukat. Ngunit kung ikaw lamang panatilihin plopping bytes pababa - o char - ito ay naka pagpunta sa magtapos hanggang sa lokasyon 0 ang lahat ng mga paraan up sa 11 dahil na-index 0. Ngunit kung saan ay ang ika-13 na character pagpunta sa mga end up? Nasaan ang ika-14? Nasaan ang 50 na character pagpunta sa mga end up? Ito ay pagpunta upang panatilihin ang pagpunta pababa. Dahil kahit na namin ang iginuhit larawan na may mga stack lumalaking up, ang address, ito lumiliko out, pumunta mula sa maliit na mga address, maliit payo, sa malaking address. Kaya ito lamang mapigil ang pagpunta up at up. Kaya kung ang user ang mga uri sa kumusta, mabuti iyan. Walang mga bug, walang problema, safe lahat. Ngunit kung ang user ang mga uri sa kung ano ang aming bibigyan tumawag adversarial code, kinakatawan generically bilang, pag-atake, pag-atake, pag-atake, pag-atake, kung ano ang maaaring mangyari? Well, kung ang lahat ng pag-input na mga gumagamit nai-type sa ay hindi lamang ang ilang mga magiliw o nakakasakit na string ng mga character. Ito ay tunay na isang pagkakasunod-sunod ng mga character na kung pinagsama-sama mo ito, ito ay aktwal na code. Siguro ito code na tinatanggal ang lahat ng mga mga file sa iyong hard drive o nagpapadala ng spam o isang bagay tulad na. Pansinin na kung ano ang key dito ay na kung ang masamang tao Nakakuha masuwerteng sapat na upang patungan ang pulang tipak ng memory - na hindi ko gumuhit sa aking larawan ngunit ito Wikipedia larawan dito ay may - nito tinatawag na return address. Kapag ang pagkain ay babalik, kapag makipagpalitan ng pagbalik, paano ang computer na malaman upang pumunta mula sa up dito upang pababa dito? O kaya sa tech segment up sa itaas, kung paano ay alam ito upang pumunta mula sa makipagpalitan ng code - ang 0 at 1 ni na sumulat ng mga makipagpalitan - pabalik sa main? Mayroong isang tinatawag na return address naka-imbak sa na parehong frame stack, sa ang parehong tray cafeteria. Kaya kung ang masamang tao ay matalino sapat upang ilagay atake ng code, code atake, pag-atake code, at makakuha ng masuwerteng sapat - madalas sa pamamagitan ng pagsubok at mga error - upang patungan na red return address, may address at notice pinakatuktok. Pansinin 0835C080. Ito ay nakasulat paurong up para sa tuktok dahilan namin marahil bisitahin muli. Ito ang numerong iyon. Kaya kung ang masamang tao ay nakakakuha ng sapat na masuwerteng o ang smart sapat na upang patungan ang pula alisan ng memory sa address ng code na siya ay may sa paanuman injected papunta sa iyong computer, hulaan kung saan ang code ay pagpunta sa ibabalik sa sa lalong madaling foo ay tapos na e-execute? Ang code masamang tao ni. Kaya ang code na atake, AAA, muli, kapangyarihan magpadala ng spam, maaaring tanggalin ang lahat ng mga file sa iyong hard drive. Ngunit iyon ay kung ano ang tunay na isang stack overflow ay, o isang paglampas sa buffer, o isang Buffer overflow atake. At ito ay hindi mapaniniwalaan o kapani-paniwala, hindi kapani-paniwalang mga karaniwang sa araw na ito na may mga programa na nakasulat sa C, C + +, at kahit na ang ilang mga iba pang mga wika. Sa nakakatakot na tala, bibigyan namin ng magtapos sa isang biro. [Tawa] Tingnan mo sa Miyerkules. Sa susunod na CS50 - Kaya ako lahat out sa lamp disk ngayon pero maghintay, taba-free gatas, kalahati ng telepono aklat, ang orange juice na ako drank ngayon. USB cable, isang wrench. [Nagpe-play ng musika]