[Musika nagpe-play] David J. MALAN: Lahat ng karapatan. Ito ay CS50. At ito ang simula ng linggo 5. At bilang maaari mong napansin, ang ilan sa mga materyal na ay hindi nakakakuha ng kaunti pa complex, ang maliit na mas siksik. 

At ito ay napakadali, lalo na kung ka pa sa ugali para sa ilang oras, na sinusubukan mong i-scribble down na pinaka kahit ano ang ginagawa namin, kami ay nagsasabi sa klase. Ngunit Napagtanto, iyon ay hindi marahil ang perpektong pedagogical diskarte sa pag-aaral ng ganitong uri ng materyal, at materyal sa mas pangkalahatang paraan. At kaya kami ay nalulugod sa ipahayag sariling Gheng na CS50 ni Gong nagsimula ay upang maghanda isang canonical na hanay ng mga tala para sa mga kurso, ang pag-asa ng na iyon, isa, ang mga magsilbi hindi lamang bilang isang sanggunian at mapagkukunan para sa pagsusuri ng materyal at pagpunta pabalik sa pamamagitan ng materyal na maaaring mayroon escaped mo sa unang pagkakataon sa paligid, ngunit rin upang ang iyong ulo ay maaaring maging mas hanggang sa pababa, kapag ito ay oras upang panayam, nang sa gayon ay maaari kang tumuon higit pa thoughtfully, bilang sumasalungat sa higit pang scribbly. 

Sa sinabi na iyon, kung anong makikita mo sa ang website ay tulad ng mga dokumento bilang na ito. At paunawa, sa kaliwang tuktok, mayroong hindi lamang ng isang talaan ng nilalaman, kundi pati na rin ng panahon mga code na Agad tumalon sa iyo sa naaangkop na bahagi sa video online. At kung ano Chang dito ay tapos na ay, mahalagang, dokumentado kung ano ang nangyari sa partikular na lecture. At marami sa mga aralin ay nasa online na ngayon sa URL na ito. At patuloy kaming mag-post ang natitira ng mga sa pagtatapos ng linggong ito, kaya huwag samantalahin na mapagkukunan. 

Kaya nang walang karagdagang ado, Nagsimula kami sa Peel pabalik ang layer na naging string para sa ilang oras. At kung ano ang sinabi namin ang isang string talaga ay noong nakaraang linggo? Kaya char star. At char bituin, na rin, kung ano ang ay na talagang sabihin? Well, ang lahat ng mga oras na ito, kung hindi namin Na-pagtawag ng isang function, tulad ng getString, at pag-iimbak ang tinatawag na return halaga ng getString sa isang variable-- ang tawag dito uri ng mga string-- namin ang nagsusulat ang linya ng code up doon sa itaas. At ito ay lamang kapag nakita ko ang aking sulat-kamay Pinalaking dito gawin Napag-alaman kong paano lamang atrocious ito ay. 

Gayunpaman, Ipagpalagay na ipaalam, sa kanang gilid ay, nonetheless, ng makatwirang paglalarawan ng kung ano ang nangyayari ang lahat ng ito oras na may getString. getString, siyempre, ay nakakakuha ng isang string. Ngunit ano ang na talagang ibig sabihin? Ang ibig sabihin nito ito ay makakakuha ng isang chunk ng memorya mula sa operating system sa pamamagitan ng pagtawag ng isang function, na tinatawag malloc. Ngunit higit pa sa na sa ibang pagkakataon. At pagkatapos nito populates na chunk ng memorya na may mga titik na ang gumagamit ay may nai-type sa, sinusundan ng, siyempre, isang null character, o backslash zero sa dulo napaka. 

Samantala, sa kaliwang gilid ng kuwentong ito, ang lahat ng mga oras na ito, na namin ang nai-pagdeklara ng variable, tulad ng s. At variable na iyon ay kung ano ngayon Magsisimula ang pagtawag sa isang pointer. Ito ay hindi isang kahon sa loob ng na ilalagay namin ang string, Daven, per se, ngunit sa halip naming ilagay sa na parisukat box sa kaliwa kung ano ang eksaktong? Oo? 

Madla: Ang address ng kung saan ito matatagpuan sa memorya. 

David J. MALAN: Eksaktong. Ang address ng kung saan Daven Matatagpuan sa memorya. At hindi kung saan matatagpuan ang lahat ng Daven, per se, ngunit partikular na mga address ng kung ano? Oo? 

Madla: Una character. 

David J. MALAN: Ang unang character sa Daven, na kung saan, sa kasong ito, Ipinanukala ako ay nagkataon at unrealistically 1, Ox1, na nangangahulugan lamang ng hexadecimal bilang ng mga 1. Ngunit marahil ito ang nangyayari upang maging isang mas mas malaking numero na maaari naming gumuhit may 0x bilang isang prefix, na kumakatawan sa isang hexadecimal character. At dahil hindi namin kailangan mong malaman kung saan ang natitirang bahagi ng ang mga character ng Daven ay, dahil sa kung ano simpleng disenyo desisyon na ginawa maraming taon na ang nakakaraan? Oo? 

Madla: Backslash 0. David J. MALAN: Oo, eksakto. Ang backslash 0 nagbibigay-daan sa iyo, albeit sa linear oras, sa traverse ang string, maglakad mula kaliwa hanggang kanang, may para sa loop, o isang habang loop, o isang bagay tulad ng iyon, at tinutukoy, oh, dito ay ang katapusan ng partikular na string. Kaya lang sa mga address na ito sa simula ng isang string, maaari naming ma-access ang kabuuan ng ito, dahil ang lahat habang ito, isang string Na naging isang char star. 

Kaya ito ay tiyak na masarap na ipagpatuloy ang paggamit ang CS50 library at ito abstraction, kaya upang makipag-usap, ngunit na aming mag-uumpisang makakita nang eksakto kung ano ang nangyayari sa ilalim na ito buong oras. Kaya maaari mong isipin ang halimbawang ito, Masyadong, mula sa huling beses, ihambing 0, na hindi aktwal na ihambing. Ngunit sinimulan namin upang malutas ito. 

Ngunit marahil bilang isang refresher, Maaaring ko na kawili-wili sa isang tao sa isang pink elephant ngayon, Nakagawa rin sa pamamagitan ng Chang? Paano tungkol sa iyo sa harap? [INAUDIBLE]. Halika sa up. 

At sa habang panahon, bilang dumating ka up, sabihin isaalang-alang para sa isang sandali lamang kung ano ang ang code na ito ay aktwal na paggawa. Ang pagdeklara ito ng dalawang variable up tuktok, s at t, at pagtawag getString. Ito ay hindi isang napaka-program ang user-friendly, dahil hindi nito sasabihin sa iyo kung ano ang gagawin. Ngunit sabihin ipinapalagay lang kami ay nagbibigay-diin sa juicy bahagi. At pagkatapos ay ginagawa namin, kung katumbas s ay katumbas t, dapat itong sabihin printf, iyong nai-type ang parehong bagay. Hello. Ano ang inyong pangalan? 

JANELLE: Janelle. David J. MALAN: Janelle, mabait sa matugunan mo. Kaya ang iyong mga hamon sa kamay para sa elephant ay ang unang gumuhit sa amin ng isang larawan ng kung ano ang na kinakatawan sa mga unang dalawang linya. Kaya s at t ay maaaring maging kinakatawan kung paano sa screen? At maaari kang gumuhit lamang ito sa ang iyong daliri sa malaking screen. 

Kaya mayroong dalawang halves sa sa bawat gilid ng equation na iyon. Kaya walang s sa kaliwa, at pagkatapos getString sa kanan. At pagkatapos ay mayroong hindi sa kaliwa, at pagkatapos ay getString sa kanan. Kaya kung paano na maaari naming simulan pagguhit ng isang larawan na Kinakatawan ng kung ano ang nangyayari sa dito sa memory, nais mong sabihin? At hayaan mo akong ipaalam sa iyo ipaliwanag ano ang ginagawa mo habang nagpapatuloy ka. 

JANELLE: OK. Well, una, ito ay nagtatanong sa iyo upang makuha ang input ng string. At ito ay store-- oh, paumanhin. David J. MALAN: OK. Mahusay. At ito ay tinatawag na kung ano? Oh, ang OK. Panatilihin ang pagpunta. Hindi ko sinasadyang gambalain. JANELLE: Paumanhin. Kaya gagawin ito ng pag-input ito sa ang address of-- hindi sigurado. Hindi matandaan ko nang eksakto ang numero, ngunit naniniwala ko ito ay nagsisimula sa 0. 

David J. MALAN: Iyon ang lahat ng karapatan, dahil ginawa ko ang mga numero up, kaya walang tamang sagot. 

JANELLE: Simula sa 0 arc. 

David J. MALAN: OK, kaya elemento 0. Oo naman. 

JANELLE: At pagkatapos ay kung noon ay tulad ng isang dalawang-letter-- lamang 

David J. MALAN: OK, pabalik sa iyo. 

JANELLE: Kaya elemento 0, at pagkatapos elemento 1 o 2 elemento. David J. MALAN: At kung aling mga piraso ng ang larawan ay mo ang pagguhit ngayon? Ang tawag sa getString? O ang pagpapahayag ng s? 

JANELLE: Ang pagpapahayag ng s, Naniniwala akong. Oh, ang getString, dahil gagawin ito ay inputted sa bawat [? area. ?] 

David J. MALAN: Mahusay. Mismong. Kahit na ito nang epektibo ay nagbabalik ng isang array, pagpapabalik, kapag kami makababalik isang string, na aming makakaya index sa string na gamit 01 at 2. Technically, ang mga ito ay marahil kinakatawan ng indibidwal na mga address, ngunit iyon ang multa. 

Kaya ipagpalagay, kung maaari ko lamang mabilis ipasa sa kung saan iniwan namin off huling panahon, kung ang isa sa ang mga string ay g isang b e, backslash 0, at sa gayon ay kumakatawan sa Gabe ni input, kung paano maaari naming kumatawan s ngayon? Kung ito ang memorya na Na-ibinalik ng getString? 

JANELLE: Gusto itong maging kinakatawan ng isang arc? 

David J. MALAN: Sa pamamagitan ng isang arc? Well, hindi. Sabihin nating lamang, pictorially, ipaalam sa akin pumunta lamang maaga at magmungkahi na, kung ito ay s, ito ay ang return halaga ng getString. At mo iguguhit na ito bilang 0, 1, 2, na ay perpektong makatwirang, dahil kami maaari index sa string, bilang tulad. Ngunit upang maging pare-pareho lang huling oras, hayaan mo akong sige at nagkataon ipanukala na ito ay address 1, ito ay address 2, ito ay address 3, at iba pa. At kaya, upang maging sobrang lamang malinaw, kung ano ang nangyayari upang pumunta sa mga bilang resulta ng na unang linya ng code, na gusto mong sabihin? 

JANELLE: Address 1? 

David J. MALAN: Eksaktong. Kaya tugunan ang 0x1. At samantala, hayaan mo akong sige at doblehin karami ng kung ano ang nagawa mo na at magdagdag ng aking sariling t dito. Kung ako ay mag-type ng Gabe muli, sa pangalawang pagkakataon, kapag na-prompt sa getString, kung saan, siyempre, ay pagpunta sa pumunta Gabe? Well, presumably-- 

JANELLE: Tulad ng sa dito? David J. MALAN: Oo. JANELLE: O ito ay din sa parehong mga kahon? David J. MALAN: Hayaan akong ipanukala, Oo, eksakto, kaya sa mga karagdagang mga kahon. Ngunit kung ano ang key na ngayon ay na, kahit bagaman iginuhit ko ang mga malapit sa katangian together-- 0x1, ito ay 0x2-- sa katotohanan, ito ngayon ay maaaring maging address 0x10, halimbawa, at 0x11, at 0x12, at iba pa. At kaya, kung iyon ang kaso, kung ano ang nangyayari sa mga end up dito sa t? 

JANELLE: 0x10? David J. MALAN: Eksaktong. Kaya 0x10. At kaya ngayon, huling tanong. Na sa iyo, sa pamamagitan ng malayo, ay nagkaroon upang gumana ang hardest para sa isang elephant kaya sa ngayon. Sa pamamagitan ng ngayon, kung hilahin ko up ang code muli, kapag gagawin ko, sa tatlong linya, kung katumbas s ay katumbas t, ano Ako talaga Ang paghahambing ng na-iguguhit namin dito? 

JANELLE: Ang dalawang mga address? David J. MALAN: Eksaktong. Kaya ako sinasabi ko ay katumbas ng y katumbas ng pang? Sa ibang salita, ay katumbas ng 1 katumbas ng 10? At syempre, ang halata sagot ay ngayon, hindi. At kaya programang ito ay sa huli pagpunta sa i-print ang ano, gusto mong sabihin? 

JANELLE: Gusto itong maging, iyong nai-type ang parehong bagay? 

David J. MALAN: Kaya kung s ay 1 at t 10? 

JANELLE: nai-type mo ang iba't ibang mga bagay. 

David J. MALAN: Eksaktong. Nai-type mo ang iba't ibang mga bagay. Lahat ng karapatan. Kaya isang round ng applause, kung magagawa namin, dito. [APPLAUSE] Iyon ay masakit. Alam ko. Maayos na Natapos. Kaya ngayon sabihin makita kung hindi namin maaari tease bukod sa kung ano ang fix yan. At syempre, kapag naayos na namin this-- kung saan kukunin ko na ngayon ay kumakatawan sa green-- May ginawang kami ng ilang mga pagpapahusay dito. Una, tulad ng isang katinuan suriin, unang Lalabas na ako kung s ay katumbas ng walang bisa at hindi katumbas null. At upang maging malinaw lamang, kapag maaari s o t null sa code na tulad nito? Kapag maaaring s o t null. Oo? 

Madla: [INAUDIBLE]. 

David J. MALAN: Eksaktong. Kung ang string na ang gumagamit nai-type sa ay masyadong mahaba upang magkasya sa memorya, o ilang kakaiba sulok kaso na tulad nang, getString, dahil kakailanganin namin makita, nang literal ngayon, sa dokumentasyon nito, sabi ni ito ay bumalik null bilang isang espesyal na halaga Sentinel, o lamang uri ng isang espesyal na simbolo Ibig sabihin nito na may nangyaring mali. Kaya gusto naming suriin para sa na, dahil ito ay lumiliko out na null ay isang napaka-mapanganib na halaga. 

Madalas, kung sinubukan mong gawin ang isang bagay na may null na kinasasangkutan ng isang function-- pagpasa ito bilang input, para sa instance-- na function na maaaring napaka ay nagka-crash at, na may mga ito, tumagal down na ang iyong buong programa. Kaya pangatlong linya na ito ngayon ay isang katinuan lamang suriin, error checking, kung gagawin mo. Iyon ay isang mahusay na ugali na ngayon para sa amin upang makakuha ng mga ito sa anumang oras namin subukan na gumamit ng isang halaga na maaari, potensyal, maging null. 

Ngayon, sa ika-apat na linya dito, "Kung strcmp (s, t)," na rin, kung ano ang na nagre-refer sa? Well, sinabi namin na ito ay isang napaka succinctly pinangalanang pag-andar para sa string paghahambing. At nito layunin sa buhay ay upang ihambing ang unang argumento laban dito segundo, ngunit hindi sa mga tuntunin ng kanilang mga address, tulad ng ginawa namin sinasadyang isang sandali nakaraan gamit ang pulang code, ngunit sa halip na ihambing ang dalawang string sa humanly madaling maunawaan paraan sa pamamagitan ng paghahambing na ito, laban ito, laban na ito, laban na ito, at pagkatapos ay humihinto kung at kapag isa o pareho sa aking mga daliri hit ang isang backslash 0. Kaya ang isang tao taon na ang nakakaraan ipinatupad strcmp upang ipatupad para sa amin ang pag-andar na namin umaasa gusto namin na makakakuha ito sa pamamagitan ng paghahambing lamang ang dalawang simpleng mga halaga. 

Ngayon tapat, panatilihing ako drawing lahat ng mga iba't-ibang numero. Ngunit ang katotohanang ay, naging ako pagsasagawa ng mga ganitong up ang buong oras. At kaya ipaalam sa akin pumunta lamang maaga at scribble mga out upang gumawa ng puntong iyon, sa pagtatapos ng araw at sumusulong, Hindi kami talaga ng pagpunta sa nagmamalasakit sa kung ano ang humaharap sa mga bagay ay aktwal na sa memory. Kaya hindi ako pagpunta sa gumuhit ng mga mga uri ng mga numero kaya magkano ngayon, Ako lamang ng isang abstract ito ang layo ng isang kaunti pa friendly na sa pamamagitan lamang ng mga arrow. 

Sa ibang salita, kung s ay isang pointer, mahusay, gumuhit ng lang ito, literal ipaalam, bilang isang pointer, ang isang arrow na nakaturo mula mismo sa ibang bagay, at hindi mag-alala masyadong maraming higit pa tungkol sa ang minutia ng mga address na ito na kung saan, muli, na binubuo ko pa rin. Ngunit kami ay makita ang mga address na iyon, minsan, kapag ang pag-debug code. 

Ngayon samantala, ang program na ito dito ang mga pag-aayos, siyempre, na problema sa pamamagitan ng paghahambing dalawang mga string ng mga. Ngunit namin ang bumangga sa isa pang problema. Ito ay mula sa mga kopya programa huling oras, kung saan, ako ay sinusubukan upang mapakinabangan lang ang unang character sa isang string. Ngunit ano ang palatandaan Nakita namin huling beses kapag ang isang gumagamit na nai-type sa isang halaga, tulad ng Gabe sa maliliit na titik, para s, pagkatapos ay nagtalaga kami ng mga papunta t, tulad ng sa pangatlong linya doon, at pagkatapos ay sinubukan kong ika-capitalize t bracket 0? Ano ang epekto ng pagbabago t bracket 0 dito? 

Madla: Binago ito s. 

David J. MALAN: Oo, Binago ko s, pati na rin. Dahil kung ano ang talagang nangyari? Well, hayaan mo akong makita kung ang maaari kong linisin up ang larawang ito, gaya ng mga sumusunod. 

Kung s ay, muli, ang salitang g, a, b, e, backslash, 0, at mga patuloy kaming guhit bilang isang kahon dito, ngunit hindi hihigit address. Ni itigil ang paggawa ng mga bagay-bagay Hayaang. Gumuhit ng lang ng isang larawan Hayaan upang gawing simple ang mundo. 

Kapag Ipinahahayag ko t may string t, na lumilikha na chunk ng memorya. Square ang mangyayari sa maging 32 mga bit sa karamihan ng mga computer. Sa katunayan, kung nag-kailanman narinig ng isang computer na pagkakaroon ng 32-bit na arkitektura, talaga magarbong-makipag-usap, na lamang ang ibig sabihin nito ay gumagamit ng 32-bit na mga address. At bilang isang teknikal na bukod, kung sakaling mo na ang nagtaka bakit mas lumang mga computer, kung ikaw talaga Sinubukan ni na sopas up ang mga ito na may maraming ng RAM, maaari lamang magkaroon ng isang maximum na ng apat na gigabytes ng RAM, mahusay na ay dahil, literal, ang iyong lumang computer na maaari lamang mabibilang bilang mataas na bilang 4 bilyon, 4000000000 bytes, dahil ito ay gumagamit ng 32-bit mga numero para sa mga address. 

Ngunit sa anumang kaso, sa ganitong Halimbawa, kuwento ng magkano ang mas simple. t ay isa lamang pointer, o talaga ng char bituin, aka string. At kung paano ang gusto kong i-update ang larawang ito na ngayon ay mayroon na pangalawang linya ng code, pagkatapos ng tuldok, tuldok, tuldok? Kapag ginawa ko string t ay katumbas ng semicolon s, kung paano baguhin ang litratong ito? Oo? 

Madla: [INAUDIBLE]. 

David J. MALAN: Oo. Mismong. Ilagay ko lang ang isang arrow mula sa t kahon sa parehong address, Ibinigay ang parehong unang titik sa. O kaya technically, kung ito tao ay sa 0x1 pa rin, ito ay waring ako nagkaroon 0x1 dito at 0x1 dito. Ngunit muli, na pinahahalagahan ng tungkol sa mga address? Ito ay lamang sa ideya na ngayon ang mahalaga. Kaya ito ay kung ano ang nangyayari dito. Kaya siyempre, kung gagawin mo t bracket 0, na kung saan ay pagtatanda array, ng course-- at tapat, tinitingnan nito tulad ng mayroong isang array sa paglipas dito, ngunit ngayon ay may ito kakaiba bagay. Malaman na ang programming language, C, nag-aalok sa iyo ang tampok na ito, kung saan, kahit na t ay isang pointer, o s ay isang pointer, Maaari mo pa ring gamitin ang pamilyar na, kumportableng square bracket pagtatanda upang pumunta sa unang elemento, o ang pangalawang elemento, o anumang elemento ng na na pointer ay tumuturo upang dahil, baka, ito ay, tulad ng sa kasong ito, pagturo sa ilang mga array. 

Kaya paano ko namin ito aayusin? Tapat, ito ay kung saan ito nakakuha ng maliit na napakalaki sa unang tingin. Ngunit dito ay isang bago at pinahusay na bersyon. 

Kaya una, nakakakuha ako ng mga mapupuksa ng CS50 library, upang ilantad lamang na s ay sa katunayan isang char bituin, isang kasingkahulugan lamang. At t ding char star. Ngunit ano ang nangyayari sa sa ng kanang bahagi ng na linya kung saan t ay bibigyan ng isang halaga? 

Ano ang malloc? Ano ito ay strlen? Ano ang sizeof (char)? Bakit ito ang heck linya hitsura kaya mahirap unawain? Ano ang ginagawa nito sa isang mataas na antas? Ano ang pag-iimbak nito sa t? Oo? Madla: Ito ay naglalaan ng isang tiyak na halaga ng puwang ng memory. Ito ay upang mag-imbak, hulaan ko, mga titik [INAUDIBLE]. 

David J. MALAN: Perpekto. Perpekto. Ang paglalaan ng mga ito sa isang tiyak na dami ng puwang ng memory upang mag-imbak, baka, hinaharap titik. At sa partikular, malloc samakatuwid ay bumabalik kung ano? 

Madla: Bumabalik ang [INAUDIBLE]? David J. MALAN: Eksaktong. Bumabalik ang address ng na memorya, kung saan ay isang magarbong paraan ng sinasabi, Ibinabalik ang address ng unang byte ng memorya na. Onus Ang ay sa akin na tandaan kung gaano karaming memory ko talaga inilaan o tinanong malloc para sa. 

Ngayon kung magkano ay na? Well, kahit na mayroong ng maraming mga panaklong dito, malloc tumatagal lamang ng isang solong argumento. At ako ng pagtukoy ng strlen s, kaya bigyan sa akin ng maraming byte bilang mayroong sa s, ngunit magdagdag ng isa. Bakit? Oo? 

Madla: Ang backslash 0. David J. MALAN: Eksaktong. Mayroon kaming na gawin ang isang maliit na gawaing-bahay. Kaya dahil mayroong isang backslash 0, nais naming mas mahusay na tandaan na. Kung hindi man, kami ay pagpunta upang lumikha ng isang string na Walang espesyal na Terminator. 

Samantala, upang maging sobrang lamang anal, mayroon akong sizeof (char), kung sakali isang tao na tumatakbo ang aking code wala sa CS50 appliance, ngunit siguro ng ibang computer nang sama-sama kung saan char ay isa byte, sa pamamagitan ng convention, ngunit dalawang bytes, o isang bagay na mas malaki kaysa iyon. Ito ay upang maging napaka-lamang, sobrang averse sa mga error. Kahit na, sa katotohanan, ito'y pinaka-malamang na magiging isang 1. 

Ngayon, samantala, pumunta ako magpatuloy at kopyahin ang mga string, t bracket ay katumbas ng i t bracket s. At ako ay defer sa huling linggo ng source code upang makita kung ano ang nangyayari sa. Ngunit ang key takeaway, at ang dahilan ko bang ilagay ang code na ngayon sa berde, ay dahil na ang pinaka huling linya, t bracket 0 ay katumbas ng toupper, May mga epekto ng Pag-capitalize na string? t at / o s? Iyon huling linya ng code. 

Hindi na lang, dahil kung ano ang Nangyari oras na ito, kung bahagyang ko i-undo na huling hakbang, kung ano ang nangyari ay, kapag Tinatawag kong malloc, Tunay ba akong makakuha ng chunk ng memorya na ay ang kapareho ng sukat tulad ng orihinal, dahil iyon ang aritmetika ginawa ko. Ako sa pag-iimbak sa t address ng na chunk ng memorya. Kahit na ito ay mukhang maganda at kaakit-akit, maganda at blangko, ang katotohanan ay mayroong, kung ano na aming panatilihin ang pagtawag, mga halaga ng basura in dito. Na chunk ng memory maaari napaka mahusay mayroon pa nagamit dati, ng ilang segundo, ng ilang minuto ang nakalipas. Kaya doon ay maaaring talagang maging numero o titik doon, sa pamamagitan lamang ng aksidente. Ngunit ang mga ito ay hindi wasto, hanggang sa ako aking sarili populate ito chunk ng memorya may aktwal na karakter, bilang ako gawin sa na para sa loop doon. Ang lahat ng mga karapatan? 

Kaya ngayon, ang rurok ng ang tatlong mga halimbawa na tila pinaghiwa huling oras, Pagpalitin ang mga ito halimbawa, ang pagpapaganang ito nagtrabaho sa kamalayan na ito swapped isang at b. Ngunit hindi ito gumana sa kung ano ang iba pang kahulugan? Oo? 

Madla: [INAUDIBLE]. 

David J. MALAN: Eksaktong. Kung ako ay upang tawagan ang pagpapaganang ito mula another-- halimbawa, mula sa isang pag-andar tulad ng pangunahing, kung saan Mayroon akong isang variable, x at y, bilang ako ginawa noong nakaraang linggo, parehong code, at pumasa ako sa x at y upang magpalit, at pagkatapos ay tumawag Swap-- ito, siyempre, ay ang tamang bersyon ay kung ano kami ay tungkol sa see-- hindi ito gumana. Kaya kung ano ay ang pag-ayos? 

Well, kaya lang na maging malinaw, hayaan mo akong sige and-- ninyo ako ng isang pangalawang dito, at tingnan kung maaari kong ipakita sa iyo ang huling isa, na Magiging in-- sabihin makita kung ang maaari kong makahanap ng ito real fast-- OK, [INAUDIBLE]. OK, mayroong ito ay. Kaya huwag pansinin ang mga utos tingin lang ako sa pag-type. Gusto ko ito upang mabawi sa sa huling minuto ng isang halimbawa mula sa huling beses, na ay tinatawag na ngayong walang Swap. 

Kaya walang Pagpalitin ay kung saan iniwanan namin off ang huling panahon, kung saan, nasimulan ko x sa 1 at y sa 2. Pagkatapos ay tumawag ako Pagpalitin, pagpasa sa 1 at 2. At pagkatapos ay ang pagpapaganang ito nagtrabaho sa ilang mga kahulugan, ngunit ito ay walang permanenteng Epekto sa x at y. Kaya ang tanong sa kamay ay, kung gaano ngayon huwag talaga naming ayusin ang problemang ito? Ano ang solusyon sa kamay? 

Well, sa swap.c, na bagong ngayon, mapansin ng ilang mga pagkakaiba. x at y ay pareho. Ngunit ano ay malinaw na iba't ibang tungkol sa 25 linya? Anong bago doon, kung iyong naaalala kung ano ito ay tumingin tulad ng isang segundo na nakalipas? 

Madla: [INAUDIBLE]. 

David J. MALAN: Oo. Kaya ang mga ampersand ay isang bagong piraso ng syntax hindi lamang sa programang ito, ngunit din sa mas pangkalahatang sa CS50. Upang petsa, Hindi sa tingin ko nakakita kami ng anumang mga halimbawa o talagang usapan tungkol sa mga ito sa anumang detalyado, bukod sa, siguro, preemptively sa seksyon, isang ampersand tulad nito. Well, ito ay lumiliko out ampersand ay isa ng huling piraso ng bagong syntax kami ay pagpunta upang matuto. Ang lahat ng mga ibig sabihin nito ay ang address ng ilang mga variable. Sa anong address ay x nakatira? Ngunit kung ano ang address na iyon ay y nakatira? Dahil kung ang pangunahing problema bago ay na x at y ay ini-pumasang bilang ng mga kopya, kung ano ang gusto talaga naming gawin ay nagbibigay Pagpalitin may tulad ng isang kayamanan mapa na humahantong sa kung saan x at y talaga ay nasa RAM, upang Maaaring sumunod ang Pagpalitin na mapa at pumunta sa kung saan man x o y ay minamarkahan ang lugar at baguhin ang mga aktwal na halaga ng 1 at 2 doon. 

Kaya't kailangang baguhin nang bahagya masyadong Swap. At sa unang tingin, ito ay maaaring tila isang maliit na katulad ng char star. At sa katunayan ito ay. Kaya isang ay isang pointer sa kung anong uri ng data, batay sa naka-highlight na bahagi? Kaya ito ay isang int. 

Kaya isang hindi na isang int, ito ay ang address ng isang int. At katulad, b ay pagpunta ngayon maging ang address ng isang int. Kaya kapag ako ay tumawag ngayon Pagpalitin mula sa Main, Hindi ako pupunta upang bigyan Swap 1 at 2. Pupunta ako sa bigyan ito tulad ng Baka-bagay at baka-isang bagay, dalawang address na humantong Pagpalitin sa kanilang tunay na lokasyon sa memorya ng aking computer. 

Kaya ngayon, aking natitirang pagpapatupad Kailangang palitan ang isang tad. Ano ang iba't ibang mga malinaw naman ngayon sa mga tatlong linya ng code? Mayroong mga damn bituin lahat sa ibabaw ng lugar, lahat ng karapatan? Kaya kung ano ang nangyayari sa dito? Oo? 

Madla: Ito ay malinaw naman [INAUDIBLE]. 

David J. MALAN: Eksaktong. Kaya sa context-- ito at hindi ito ay ang pinakamahusay na desisyon disenyo, admittedly, taon na ang nakakaraan. Sa kontekstong ito, kung saan ikaw ay may star, at wala kang isang uri ng data, tulad ng int, kaagad sa kaliwa, sa halip mayroon kang isang pantay na lagdaan, malinaw, sa kontekstong ito, kapag sinabi mong lagyan ng star ang isang, ay nangangahulugan na ang pumunta sa address na nasa isang. Sundin ang mga kayamanan mapa, kaya na magsalita. 

At samantala, sa 37 na linya, ito ay nangangahulugan na ang parehong bagay. Pumunta sa address ng, at ilagay kung ano ang doon? Anuman ay sa lokasyon na tumutukoy b. Sa ibang salita, pumunta sa b. Kumuha ng halagang iyon. Pumunta sa isang at, ayon sa mga kapantay mag-sign, ang pagtatalaga operator, maglagay ng halagang iyon doon. 

Katulad nito, int Temp lamang sa isang int. Wala kailangang baguhin ang tungkol sa Temp. Ito ay lamang ng isang ekstrang salamin mula sa Annenberg para sa ilang mga gatas o orange juice. Ngunit ko na kailangan ko upang sabihin, pumunta sa b. Pumunta sa na patutunguhan at ilagay ang halaga sa Temp doon. Kaya kung ano ang nangyayari pagkatapos? Kailan ko talagang tumawag Pagpalitin ang oras na ito, kung ito unang tray dito ay kumakatawan sa Main, ang pangalawang tray ay kumakatawan Swap, kapag Pumasa ko ampersand x at y ampersand mula sa Main upang magpalit, upang maging malinaw lamang, kung ano ito stack frame na tatanggap? Oo? 

Madla: [INAUDIBLE]. David J. MALAN: Eksaktong. Ang address ng x at ang address ng y. At maaari mong isipin na ang mga tulad ng postal address. 33 Oxford Street at 35 Oxford Street, at ikaw Gusto upang ilipat ang dalawang mga gusali na nasa mga lokasyong iyon. 

Ito ay uri ng isang katawa-tawa ideya, ngunit iyon ang lahat ibig sabihin namin sa pamamagitan ng address. Saan sa mundo maaari kang makahanap ng mga dalawang ints? Saan sa mundo maaari kang makahanap ng dalawang mga gusali mga? Kaya kung sa wakas, pagkatapos ang lahat ng ito oras ako pumunta sa source code ngayong araw at pagsama-samahin Pagpalitin at run ./swap, sa wakas, para sa unang pagkakataon namin ang aktwal na makita na ang aking mga halaga mayroon ngang Matagumpay na nai-swapped. At ngayon, maaari naming kahit na magsagawa ng tala ng ito sa, sabihin nating, gdb. 

Kaya hayaan mo akong pumunta sa parehong file. Hayaan akong sige at patakbuhin ang gdb ng ./swap. At ngayon, sa Swap, pupuntahan ko pumunta Magpatuloy at magtakda ng pahinga point sa Main. At ngayon pupuntahan ko pumunta magpatuloy at patakbuhin ang program. At ngayon nakita namin ang aking code naka-pause na sa linya. 

Kung pumunta ako magpatuloy at pag-print x, ano ang dapat kong makita dito? Ito ay isang tanong. Sabihing muli? 

Madla: [INAUDIBLE]. 

David J. MALAN: Kaya random na numero, siguro. Siguro nakukuha ko masuwerteng, at ito ay maganda at simpleng, tulad ng 0. Pero siguro ito ang ilang mga random na numero. Sa kasong ito, suwerteng Nakatanggap ako. Mangyayari lamang ito sa 0. Ngunit ito ay katunayan swerte, dahil hindi ko hanggang i-type susunod at pagkatapos ay i-print ang x ay may na linya ng code, 19 linya, na pinaandar. 

Samantala, kung nagta-type ako sa tabi muli, at ngayong mag-print out y, pupuntahan ko makita 2. Ngayon, kung nagta-type ako susunod na, ito ay pagpunta sa makakuha ng isang maliit na nakalilito, dahil ngayon, ang printf ay pagpunta sa lumitaw sa screen, tulad ng ginawa ito. x ay 1. 

Ni gawin muli ito Hayaan. At ngayon, narito ang kung saan bagay makakuha ng kawili-wiling. Bago ko tawagan Swap o kahit na hakbang sa ito, sabihin tumagal ng isang maliit na silip. x ay, muli, 1. Y, siyempre, mabilis katinuan suriin, 2, kaya hindi mahirap doon. Ngunit ano ang ampersand x? Sagot, uri ng funky ito ay naghahanap. Subalit ang int bituin na naka-panaklong lamang paraan ng pagsabi na ito GDP ay isang address. Ito ay hindi isang int, ito ay isang pointer sa isang int, o kung hindi man ay kilala bilang isang address. 

Ano ito na nakatutuwang bagay? Hindi kailanman nasaksihan namin ang isang bagay medyo na tulad nang dati. Kaya ito ay ang address sa computer ang aking memorya ng kung saan ang mangyayari x upang mabuhay. Ito ay baka-isang bagay. At ito ay, tapat, bakit Sinimulan ko ang pagguhit ng mga arrow, sa halip ng mga numero, dahil sino ba talagang pinahahalagahan na ang iyong int ay nasa isang partikular na address na iyan malaki. Ngunit bffff0c4, ang mga ito ay lahat sa katunayan hexadecimal digit, na kung saan ay sa pamamagitan ng 0 f. 

Kaya kami ay hindi pagpunta sa dwell masyadong matagal sa kung ano ang mga bagay ang. Ngunit kung i-print out ako y, siyempre, nakikita ko 2. Ngunit ampersand y, nakikita ko ang address na ito. At paunawa, para sa mga malaman, paano malayo ay x at y? Maaari mong huwag pansinin ang karamihan sa mga address. Apat na bytes. At iyon ang pare-pareho sa aming mga mas maaga-claim na kung gaano kalaki ang isang int? Apat na bytes. Kaya mukhang lining up ang lahat ng bagay ay ng mabuti, dahil maaari mong umaasa, sa memorya. 

Kaya ngayon, sabihin lamang mabilis pasulong sa dulo ng kuwentong ito. Sabihin sige at i-type hakbang, upang sumisid sa Swap function. Ngayon mapansin, kung nagta-type ako ng, ito ay nahahawig sa address ng x. Kung nagta-type ako b, ito ay magkapareho sa address ng y. Kaya ano ang dapat kong makita kung ako Sabihing, pumunta sa isang address? Kaya mag-print ng star ang isang. Kaya bituin ay nangangahulugan pumunta doon, sa ganitong konteksto. Ampersand ay nangangahulugang kung ano ang address ng. Kaya lagyan ng star ang isang paraan 1. At nagbibigay-print star b akin 2. 

At ipaalam sa akin ipinapalagay, para sa mga sandali, na na hindi bababa sa ang code naaayos upang maisagawa ngayon ay maaaring maging reasoned sa pamamagitan ng sa na paraan. Ngunit kami ay muling bisitahin ang sa ideya na ito bago ang haba. Kaya ang bersyon na ito ng Pagpalitin ay tama ngayon at pinapayagan amin upang magpalit sa partikular na uri ng data. 

Kaya anumang mga katanungan pagkatapos ay sa Swap? Sa star? Sa address? At makikita mo, na may itakda ang problema 4, uri ng, ngunit nakatakda 5, talagang, kung paano ang mga problema mga bagay na kapaki-pakinabang at makakuha ng higit pang kumportable sa kanila, bilang isang resulta. Anumang bagay sa lahat? Lahat ng karapatan. Kaya malloc ay, muli, ang function na na lamang ang naglalaan ng memorya, memory paglalaan. At kung bakit kapaki-pakinabang na ito ay? Well, ang lahat ng mga oras na ito, na ginagamit mo malloc. Kung isinasaalang-alang mo na ngayon kung paano gawa getString, baka, ito ay Na-pagtatanong sa isang tao para sa isang chunk ng memorya, anumang oras uri ng user isang string in, dahil kami ay tiyak na Hindi alam, bilang mga tauhan CS50, kung paano malaki ang mga string na tao ay pumunta i-type ay maaaring maging. 

Kaya sabihin, sa unang pagkakataon, magsimula sa pabalik sa kung paano gumagana Peel ang CS50 library, sa pamamagitan ng paraan ng isang pares ng mga halimbawa na humantong sa amin doon. Kaya kung buksan ko up gedit at magbukas ng mga scanf 0, kami ay pagpunta upang makita ang sumusunod na code. Scanf 0, magagamit sa website para sa ngayon, ay may kaugnay sa ilang mga linya ng code dito, 14 sa pamamagitan ng 20. At makita ng kung ano ang ginagawa itong ipaalam. Ito declares isang int, na tinatawag na x. Sinasabi nito na ang isang bagay tulad, numero ng pakiusap. At ngayon sinasabi nito, scanf% i, at x. Kaya mayroong isang bungkos ng mga bagong bagay-bagay doon. 

Ngunit scanf, maaari mong uri ng tingin ng bilang ng kabaligtaran ng printf. printf, siyempre, mga print sa screen. scanf uri ng mga pag-scan mula sa user na ito keyboard isang bagay na siya ay na-type. 

% I ay tulad ng printf. Ang ibig sabihin nito inaasahan ang gumagamit na mag-type sa isang int. At ngayon, bakit sa tingin mo ako Maaaring pagpasa scanf & x? Kung ang layunin sa buhay ng scanf ay upang makakuha ng isang bagay mula sa user, ano ang kahulugan ng pagpasa ito, at x, ngayon? Oo? 

Madla: [INAUDIBLE]. David J. MALAN: Eksaktong. Anuman ko, ang tao, i-type sa, ang aking input Mawawala na mai-save sa lokasyong iyon. Ito ay hindi sapat, isipin, sa makatarungan pumasa sa x, dahil nasaksihan namin nagagawa, anumang oras pumasa ka lamang ng isang raw na variable, tulad ng isang int, sa ilang iba pang mga pag-andar, sigurado, maaari itong baguhin sa na variable, ngunit hindi permanente. Hindi ito maaaring magkaroon ng epekto sa Main. Maaari lamang itong baguhin sa sarili nitong lokal na kopya. Ngunit kung, sa halip, hindi mo gusto bigyan mo ako ng aktwal na int, ngunit ba ninyo akong bigyan ng mga direksyon sa na int, ako ngayon, pagiging scanf, tiyak, maaari sundin ko na tugunan at maglagay ng numero doon kaya mayroon kang pati na rin ng access dito. 

Kaya kapag nagpatakbo ako ng programang ito, sabihin makita. Gumawa ng scanf 0 tuldok slash, scanf 0. At kung ngayon nagta-type ako ng isang numero tulad ng 50, salamat para sa 50. Kung ngayon nagta-type ako ng isang numero tulad ng negatibong 1, para sa mga negatibong 1. Ngayon nagta-type ako ng isang numero tulad ng 1.5, Hm. Bakit ang aking programa huwag pansinin sa akin? Well, dahil lamang, sinabi ko ito ang aasahan sa isang int lamang. Lahat ng karapatan. Kaya na ng isang bersyon ng ito. Tingnan natin ang isang bingaw mga bagay-bagay at ipanukala na ito ay hindi mabuti. At dito ay namamalagi isang napaka-simpleng halimbawa ng kung paano namin maaaring magsimula pagsulat code na ang ibang mga tao ay maaaring samantalahin o ikompromiso pamamagitan ng paggawa ng masamang bagay. Kaya 16 linya, kaya katulad sa espiritu sa dati, ngunit hindi ako pagdeklara ito int oras na ito. Ako pagdeklara ito char bituin, aka string. 

Ngunit ano ang na talagang ibig sabihin? Kaya kung hindi ko tukuyin ang isang address-- at Ako pagtawag ito nagkataon, buffer, ngunit maaari kong tumawag ito s, upang maging simple-- at pagkatapos kong gawin ito, ipaliwanag sa akin, kung magagawa mo, batay sa mga nakaraang logic, kung ano ang ginagawa scanf sa 18 linya, kung pass% s at buffer, kung saan ay isang address? Ano ang scanf, kung inilapat mo ang eksaktong parehong logic bilang bersyon 0, pagpunta sa subukan na gawin dito, kapag ang isang bagay na uri ng gumagamit in? Oo? 

Madla: [INAUDIBLE]. 

David J. MALAN: Eksaktong. Scanf, sa pamamagitan ng logic mas maaga, ay pagpunta sa gawin ang mga string na ang nai-type ng tao in-- ito ay ngayon isang string, ito ay hindi isang numero, baka, kung siya cooperates-- at ito ay pagpunta sa subukan upang ilagay na string sa memory sa kahit anong address Tinutukoy buffer. At ito ay mahusay na, dahil buffer ay sa katunayan nilalayong maging isang address. 

Ngunit inaangkin ko ang program na ito ay mayroong bug sa isang napaka-seryoso paraan, dahil kung ano ang halaga ay buffer sa pamamagitan ng default? Ano pa nasimulan ko sa? Ano chunk ng memory? Mayroon akong hindi, i-right? 

Kaya kahit na inilaan ko ang isang char star na hindi na tinatawag na s, sa halip ang tawag dito, kaya buffer-- gumuhit ng pangalan ng variable ay hayaan ngayon bilang buffer-- kung mayroon akong hindi na tinatawag na getString o malloc dito, na mabisang ay nangangahulugan na buffer ay lamang ng ilang mga halaga ng basura. 

Ngayon kung ano ang ibig sabihin na? Ito ay nangangahulugan na ang sinabi ko scanf aasahan isang string mula sa user. At alam mo kung ano? Anuman ang bagay na ito ay tumuturo to-- at gumuhit ako tandang pananong, ngunit sa katotohanan, ay ito pagpunta sa maging isang bagay tulad ng Ox1, 2, 3, i-right? Ito ay ilang mga bogus halaga na lamang ang mangyayari sa maging doon mula sa bago. Kaya maglagay ng isa pang paraan, ito ay na waring buffer lamang na tumuturo sa isang bagay sa memorya. Wala akong mga ideya kung ano. 

Kaya kung nagta-type ako sa Gabe ngayon, ito ay pagpunta subukan upang ilagay ang g-a-b-e / 0 doon. Ngunit sino ang nakakaalam kung ano na? At sa nakaraan, anumang oras na sinubukan namin sa pagpindot memorya na ay hindi nabibilang sa amin, kung ano ang nangyari? O halos sa tuwing. Segmentation fault, tama? 

Arrow na ito, wala akong mga ideya kung saan ito ay pagturo. ito lamang ang ilang mga random na halaga. At siyempre, kung bigyang-kahulugan sa iyo isang random na halaga bilang isang address, ka ng pagpunta sa pumunta sa ang ilang mga random na patutunguhan. Kaya maaari Gabe ng pag-crash sa katunayan ang aking mga programa sa kasong ito dito. 

Kaya kung ano ang magagawa natin na halos bilang masama? Isaalang-alang ang mga third at panghuling halimbawa ng scanf. Ang bersyon na ito ay mas mahusay sa kung ano ang kahulugan? Kung ikaw ay komportable na sa nakaraang problema, ito ay mas mahusay. Bakit? 

Madla: [INAUDIBLE]. David J. MALAN: Mahusay. Kaya ito kaso ng 16 na linya ay mas mahusay, sa kamalayan na kami ay tahasan paglaan ng ilang mga memorya. Hindi namin ginagamit malloc, ginagamit namin ang 2 linggo diskarte ng pagdeklara lamang ng isang array. At ang sinabi namin bago na isang string lamang ang isang array ng mga character, kaya ito ay lubos na lehitimo. Pero, siyempre, bilang Tandaan mo, fixed laki, 16. 

Kaya programang ito ay ganap na ligtas, kung nagta-type ako sa mga string ng isang character, dalawang character mga string, 15 mga string ng character. Ngunit sa lalong madaling ako magsisimulang mag-type 16, 17, 18, 1,000 mga string ng character, kung saan na string ng pagpunta ay upang tapusin up? Ito ay pagpunta sa mga end up bahagyang dito. Ngunit pagkatapos na nakakaalam kung ano pa ay lagpas sa mga hangganan ng partikular na array? 

Ito ay waring na hindi ko na ipinahayag 16 mga kahon dito. Kaya sa halip na gumuhit out ang lahat ng 16, ipapakita namin magpanggap lamang na iginuhit ko ang 16. Ngunit kung pagkatapos ay subukan ko upang basahin ang isang string na mas matagal, tulad ng 50 na character, Pupunta ako upang simulan ang paglagay a, b, c, d, x, y, z. At ito ay baka sa ilang ibang mga segment ng memory na iyon, muli, ay maaaring magsanhi ang aking mga programa ng pag-crash, dahil hindi ko na tinanong para sa kahit ano higit sa 16 bytes lamang. 

Kaya sino pinahahalagahan ng? Well, narito ang CS50 library. At karamihan sa mga ito ay isa lamang tulad ng mga tagubilin up tuktok. Ang CS50 library, lahat ng oras na ito, ipinagkaroon ang linyang ito sa 52 linya. Nasaksihan namin typedef, o makikita mo ang typedef sa pset 4, na lamang lumilikha ng isang kasingkahulugan kung saan char bituin ay maaaring maging mas lamang tinutukoy bilang string. Kaya ito ay isa sa mga ilang mga gulong pagsasanay na ginamit namin lihim sa ilalim ng hood. 

Samantala, narito ang pag-andar, getchar. Ngayon tila, walang katawan dito. At sa katunayan, kung panatilihing ako scroll, gagawin ko hindi talaga nakakakita ng anumang mga pagpapatupad ng mga pag-andar. Bilang isang katinuan check, kung bakit ay na? 

Madla: [INAUDIBLE]. David J. MALAN: Oo. Kaya ito ay ang header ng file. At header file maglaman ng mga modelo, plus ilang iba pang mga bagay-bagay, ito ay tila, tulad ng typedefs. Ngunit sa CS50.c, na hindi namin hindi kailanman nagbigay sa iyo ng tahasan, ngunit naging sa CS50 appliance lahat oras na ito, malalim sa loob ng mga folder nito, mapansin na mayroong isang buo bungkos ng mga function in dito. 

Sa katunayan, ay mag-scroll pababa ipaalam. Sabihin huwag pansinin karamihan sa mga ito, sa ngayon. Ngunit mag-scroll pababa upang getInt at makita kung paano gumagana ang getInt. Kaya dito ay getInt. At kung ikaw man talaga cared kung paano makakuha ng int gumagana, narito ang dokumentasyon nito. At bukod sa mga bagay na sinasabi nito ay nagsasabi sa iyo ito kung ano ang maaari itong ibalik ang mga hanay ng mga halaga. Ito ay mahalagang mga negatibong 2000000000 sa positibong 2 bilyong, bigyan o tumagal. 

At ito ay lumiliko out, lahat ng ito oras, kahit na hindi namin kailanman ay tingnan mo ito, kung ang isang bagay napupunta mali, ito ay lumiliko out na ang lahat oras na ito, getInt ay Na-bumabalik isang espesyal na pare-pareho, hindi null, ngunit sa halip int_max, na convention ng programmer ni lamang. Ito ay nangangahulugang dito ay isang espesyal na halaga. Tiyaking upang tingnan ang mga ito, tulad lamang kung sakaling isang bagay napupunta mali. Ngunit hindi kailanman namin ang bothered may na sa petsa, dahil muli, ito Nakalaan lamang ito upang gawing simple. 

Ngunit paano ito getInt makakuha ng ipinatupad? Well, isa, ito ay tumatagal ng walang mga argumento. Alam namin na iyon. Ibinabalik nito ang isang int. Alam namin na iyon. Kaya paano ito gumagana sa ilalim ng hood? 

Kaya mayroong tila isang walang-katapusang loop, hindi bababa sa ang hitsura ng isa. Pansinin na ginagamit namin getString. Kaya na ay nakawiwili. getInt tawag ating sariling function, getString. At ngayon bakit maaaring ito ang kaso? Bakit ako pagiging nagtatanggol dito sa 165 linya? Ano ang maaaring mangyari sa linya 164, upang maging malinaw lang? Ito ay ang parehong sagot tulad ng dati. Maaari lamang maging out sa memorya. Isang bagay na napupunta mali sa getString, na kailangan namin upang magawang upang mahawakan ang mga iyon. At ang dahilan kung hindi ako bumalik null ay iyon, technically, null ay isang pointer. getInt ay may upang bumalik sa isang int. Kaya na hindi ko na nagkataon Nagpasya, mahalagang, na 2000000000, bigyan o tumagal, ay pagpunta upang maging isang espesyal na halaga na maaari kong hindi kailanman talagang makakuha mula sa user. Ito ay lamang ng isang halaga pupuntahan ko upang mag-aaksaya ng kinakatawan ang isang error code. 

Kaya ngayon, mga bagay makakuha ng isang maliit magarbong. At ito ay hindi masyadong ang parehong pag-andar tulad ng dati, ngunit ito ay halos katulad na. Kaya mapansin, Dinedeklara ko dito, sa linya 172, parehong isang int n at isang char c. At pagkatapos kong gamitin ito funky linya, sscanf, kung saan ito ay lumiliko out ay hindi i-scan ang isang string mula sa keyboard. Ito ay nakatayo sa isang umiiral na string ang user ay nag-type sa. Kaya na tinatawag ko getString, na Nangangahulugan ba akong magkaroon ng isang string sa memory. sscanf ay kung ano ang gusto mo tumawag sa isang pag-parse ng function. Tinitingnan nito ang string na hindi ko na nai-type sa, ng character sa pamamagitan ng character, at ang isang bagay na kapaki-pakinabang. String na naka-imbak sa linya. At alam ko na lamang sa pamamagitan ng pagpunta i-back up dito at sinasabi, oh, OK, Tumawag ako ito hindi s oras na ito, ngunit linya. 

At ngayon ito ay isang maliit na naiiba. Ngunit ito ay nangangahulugan na epektibo, para sa mga kadahilanang kami ay medyo iwagayway ang aming mga kamay sa ngayon, na namin ang pagsuri sa makita kung ang gumagamit ay nai-type sa at int at siguro ay isa pang character. Kung ang gumagamit na nai-type sa isang int, ito ay pagpunta sa ay naka-imbak sa n, dahil ako pagpasa ito sa pamamagitan ng address, ang bagong nanlilinlang nakakita kami ngayon. Kung ang gumagamit na nai-type rin tulad ng sa 123x, na x Mawawala na upang tapusin up ng isang sulat sa karakter c. 

Ngayon ito ay lumiliko out na sscanf ay magsasabi sa akin, intelligently, kung gaano karaming mga variable ay sscanf Matagumpay na magagawang upang punan. Kaya sa pamamagitan ng logic na ito, kung ang function Ako pagpapatupad ay getInt, ngunit Lalabas na ako, potensyal na, para sa user sa na-type sa isang int sinundan ng ibang bagay, kung ano ang nais kong sscanf ni return halaga tunay na maging? Kung ang layunin ay upang makakuha ng lamang sa isang int mula sa user? 

Kaya kung sscanf babalik 2, ano ang ibig sabihin na? Ang gumagamit na nai-type sa isang bagay tulad ng, literal, 123x, na lamang ang walang katuturang. Ito ay isang kondisyon na error, at Gusto kong mag-check para sa mga iyon. 

Kaya kung ang mga uri ng gumagamit na ito sa, sa pamamagitan ng logic na ito, kung ano ang ginagawa sscanf bumalik, Gusto mo sabihin? Kaya ito ang nangyayari upang bumalik 2, dahil ang 123 ay pagpunta sa pumunta sa dito, at ang x ay pagpunta sa mga end up in dito. Ngunit hindi ko nais ang x upang makakuha ng mga puno. Gusto kong sscanf upang magtagumpay lamang sa pagpuno ang una sa mga variable nito. At sa gayon ay ang dahilan kung bakit ako nais sscanf upang bumalik 1. 

At kung ito ay isang bit sa ibabaw ng ulo para sa sandaling ito, na ganap fine. Napagtanto bagaman, na isa sa mga mga halaga ng getInt at getString ay na aming ginagawa isang heck ng isang maraming error pagsuri ganito kaya na, sa petsa, maaari mong halos i-type ang anumang bagay sa iyong keyboard, at kami ay mahuli ito. At kami ay tiyak na, ang kawani, talagang ay hindi maging ang pinagmulan ng isang bug sa iyong programa, dahil kami defensively pagsusuri para sa lahat ng mga hangal bagay na maaaring gawin ng isang user, tulad ng pag-type ng isang string, kapag mo ba talagang gusto int. Kaya para now-- namin dumating bumalik sa mga ito bago long-- ngunit sa lahat ng oras na ito, getString at getInt mayroon naging sa ilalim ng hood ng paggamit na ito pangunahing ideya ng mga address ng memorya. 

Kaya ngayon, gumawa ng mga bagay na ipaalam sa isang maliit na mas user-friendly. Bilang maaari mong isipin, mula sa huling Binky time-- kung ang aking mouse ay cooperate-- kaya nagkaroon kami ang code na ito, na tapat, ay medyo walang saysay. Ang code na ito ay walang Nakakamit kapaki-pakinabang, ngunit ito ay ang halimbawa na propesor Parlante ginamit upang kumatawan kung ano ang nagaganap sa isang programa na kinasasangkutan ng memorya. 

Kaya sabihin retell ito kuwento super panandalian. Ang mga unang dalawang linya, sa Ingles, huwag kung ano, gusto mong sabihin? In lamang makatuwirang tao, ngunit bahagyang teknikal na termino, maglaan ng ulos. Madla: [INAUDIBLE]. 

David J. MALAN: OK, na iyong pagtatag address para sa iyong x at y variable. Hindi masyadong, dahil ang x at y ay hindi variable sa tradisyonal na kahulugan. x at y ay address o mag-iimbak ang address. Kaya sabihin subukan ito nang isa pang beses. Hindi isang masamang simula, bagaman. Oo? 

Madla: [INAUDIBLE]. David J. MALAN: Mahusay. Sa tingin ko na ang isang ilan mas malinis. Ang pagdeklara ng dalawang mga payo, dalawang integer. At kami ay pagtawag sa kanila x at y. O kung kami ay upang gumuhit ito bilang isang larawan, muli, isipin nang bahagyang lamang na ang lahat kami ay ginagawa sa na unang linya ay ang pagguhit ng isang kahon na tulad nito, na may ilang mga halaga ng basura sa loob nito, at pagtawag ito X, at pagkatapos ay isa pang kahon na tulad nito, na may ilang mga halaga ng basura nasa loob nito, pagtawag ito y. Ipinahayag kami ng dalawang mga payo na ganap mag-iimbak ang address ng isang int. Kaya na ang lahat doon. 

Kaya kapag ginawa ito Binky, ang clay lamang mukhang ito. At Nick lang ang uri ng balot up ang mga arrow, na waring hindi sila na tumuturo sa kahit saan sa partikular, dahil sila lamang mga halaga ng basura. Hindi sila naka tahasang nasimulan kahit saan sa partikular na. 

Ngayon ang susunod na linya ng code, pagpapabalik, ay ito. Kaya sa makatwirang user-friendly, pero medyo teknikal na Ingles, kung ano ito linya ng paggawa code? Oo? 

Madla: [INAUDIBLE]. 

David J. MALAN: Perpekto. Ito ay naglalaan ng chunk ng memorya na ang laki ng isang int. At iyon ang kalahati ng mga sagot. Sinagot kang karapatan kalahati ng expression. Ano ang nangyayari sa kaliwang bahagi ng katumbas sign? Oo? Madla: At pinaglaanan ito sa variable x? 

David J. MALAN: At pinaglaanan ito sa variable na x. Kaya sa pagbabalik-tanaw, kanang bahagi naglalaan sapat na memorya upang mag-imbak sa isang int. Ngunit malloc partikular Ibinabalik ang address ng na chunk ng memorya, na hindi mo lamang ipinanukalang ay makakakuha ng naka-imbak sa x. 

Kaya kung ano ang ginawa ni Pedro huling beses na may Binky ay nag-drag siya na pointer out, ang luad, upang ituro na ngayon sa isang puting chunk ng memorya na katumbas ng laki ng isang int. At sa katunayan, na nilalayong upang kumatawan sa apat na bytes. 

Ngayon, ang susunod na linya ng code ginawa ito, bituin x nakakakuha ng 42. Kaya 42 ay prangka sa ng kanang bahagi, kahulugan ng buhay. Kaliwa-bahagi, bituin x nangangahulugan kung ano? Masyadong na maaaring mayroon gone-- na OK lang. OK. 

Madla: isa lamang, pumunta sa [INAUDIBLE] David J. MALAN: Mahusay. Madla: [INAUDIBLE]. David J. MALAN: Eksaktong. Nangangahulugan pumunta sa x kaliwang bahagi. x ay address. Ito ay tulad ng 33 Oxford Street, o Ox1. At star x nangangahulugan pumunta sa na tugunan at ilagay kung ano ang doon? 42. 

Kaya sa katunayan, iyon mismo kung ano ang ginawa ni Pedro. Sinimulan niya sa pamamagitan ng, mahalagang, itak pagturo ng isang daliri sa x, ng pagsunod sa mga arrow upang ang puting kahon sa kanang-kamay gilid, at paglalagay ng numero ng 42 doon. Ngunit pagkatapos ng mga bagay Nakakuha ng maliit na mapanganib, i-right? Binky tungkol sa mawala ang kanyang ulo. 

Star y ay katumbas ng 13, masamang kapalaran, ang ibig sabihin kung ano? Kaya star y paraan pumunta sa address sa y. Ngunit ano ay ang address sa y? Ang lahat ng mga karapatan, ito ay ang halaga ng basura, tama? Iginuhit ko ito bilang isang tandang pananong. Nick iginuhit mo ito bilang isang kulutin up arrow. At sa lalong madaling mo subukang mag- gawin bituin y, na sinasabi pumunta doon, ngunit mayroong hindi isang lehitimong address, ito ang ilang bogus lokasyon, ang programa pupuntahan crash. At tumuloy Binky ay pagpunta upang lumipad off dito, tulad ng ginawa ito. 

Kaya sa katapusan, ang program na ito ay isa lamang flat out flaw. Ito ay isang program na mayroong bug. At kinakailangan na ito ay naayos na. At ang tanging paraan, talaga ito, ayusin ito ay magiging, halimbawa, ang linyang ito, na kung saan hindi namin kahit na ang nakuha sa, dahil Nag-crash ang programa masyadong sa lalong madaling panahon. Ngunit kung kami ay upang ayusin ito, kung ano ang ang epekto ng paggawa y katumbas x magkaroon? Well, mahalagang ito tumuturo sa y kahit anong halaga x nakaturo sa. 

Kaya sa kuwento ni Pedro, o kuwento ni Binky, parehong x at y ay tumuturo sa ang puting chunk ng memorya, nang sa gayon, sa wakas, kapag nag- huwag lagyan ng star ang y ay katumbas muli 13, magtapos ka ng hanggang 13 paglalagay sa ang naaangkop na lokasyon. Kaya lahat ng mga linyang ito ay perpektong lehitimo, maliban para sa isa, kapag ito ay nangyari bago mo aktwal na itinalaga y ilang mga halaga. 

Ngayon thankfully, hindi mo gusto kailangang dahilan sa lahat ng mga ganitong uri ng mga isyu sa iyong sarili. Hayaan akong sige at buksan up ng isang terminal na window dito at buksan up, para sa isang sandali lamang, super maikling programa na rin ay isang uri ng pointless. Ito ay pangit. Hindi nito makamit ang anumang bagay na kapaki-pakinabang. Ngunit ito ay nagpapakita ng mga isyu ng memorya, kaya tumagal ng isang hitsura ipaalam. 

Main, sobrang simple. Ito tila tawag ng isang function, f, at pagkatapos ay bumalik 0. Ito ay uri ng mahirap na gulo na ito up. Kaya Main ay medyo mabuti, sa ngayon. 

Kaya f ay may problemang. At lamang ay hindi ilagay magkano pagsisikap sa pagbibigay ng pangalan nito dito, upang panatilihin ang focus sa code. f ay may dalawang linya. At sa kung ano ang ngayon ng pagpunta sa ipaalam. Kaya sa isang banda here-- at ipaalam sa akin gumawa ito pare-pareho sa nakaraang example-- sa isang banda, kaliwang panig ay ginagawa kung ano ang, sa Ingles? Is-- ito Madla: Paglikha ng isang pointer. David J. MALAN: Paglikha ng isang pointer papunta sa isang int at pagtawag ito x. Kaya ito ay ang paglikha ng isa sa mga kahon Ako panatilihing pagguhit ang touch screen. At ngayon, sa kanang-kamay gilid, malloc, siyempre, ay naglalaan ng isang chunk ng memorya. At upang maging malinaw lamang, kung paano maraming memorya ay tila ito paglalaan, kung ikaw lamang uri ng gawin ang matematika dito? 

Kaya 40 bytes. At alam ko na dahil lamang Alam ko ang isang int, sa CS50 appliance, hindi bababa sa, ay apat na bytes. Kaya 10 beses 4 ay 40. Kaya ito ay ang pag-iimbak ng isang x, ang address ng unang out ng 40 ints na Nai-inilaan na puwang likod, upang i-back, i-back, sa likod. 

At iyon ang kung ano ang key tungkol sa malloc. Hindi nito tumagal ng kaunti memory dito, may kaunting panahon dito, ng kaunti dito. Nagbibigay ito sa iyo ng isang chunk ng memorya, contiguously, mula sa operating system. 

Kung ano ang tungkol sa ngayon, x 10 bracket ay katumbas ng 0? Di-makatwirang linya ng code. Hindi nito makamit ang anumang bagay na kapaki-pakinabang. Ngunit ito ay kawili-wili, dahil x bracket 10--? Oo? 

Madla: [INAUDIBLE]? 

David J. MALAN: x bracket 10 ay hindi kailangang maging null. Nanggagaling lamang ang detalye null sa pag-play sa mga string, sa dulo ng isang string. Ngunit isang mahusay na pag-iisip. 

Gaano kalaki ito ay array, kahit na bagaman ilalaan ko ang 40 bytes? Ito'y 0 sa pamamagitan ng siyam, tama? Ito ay 10 ints, kabuuang. 40 bytes, ngunit 10 ints, 0-index sa pamamagitan ng 0. 

Kaya kung ano ay ang x 10 bracket? Ito ay talagang ilang hindi alam na halaga ng basura. Ito ay memorya na ay hindi nabibilang sa akin. Hindi ko dapat na nakadikit na byte numero 41, 42, 43, 44. Pupunta ako bahagyang Masyadong malayo. 

At sa katunayan, kung nagpatakbo ako ng ito programa, maaari itong napakahusay crash. Ngunit minsan, magpapadala kami makakuha ng masuwerteng. At kaya lamang upang ipakita this-- at tapat, hindi mo na malaman bago ka ni patakbuhin ang ko it-- ipaalam. Hindi ito aktwal na pag-crash. 

Ngunit kung binago ko ito, para Halimbawa, upang maging katulad ng 1,000, upang gawin ito talaga sinadya, sabihin makita kung maaari naming makakuha ng mga ito sa pag-crash ng oras na ito. OK, hindi ito nagka-crash. Paano tungkol sa 100,000? Remake ni ito Hayaan, at ngayon muling patakbuhin ito. OK. Phew. Lahat ng karapatan. Kaya tila, muli, ang mga segment ng memory, kaya upang makipag-usap, ay makatwirang malaki, kaya magagawa namin makakuha ng masuwerteng muli at muli. Ngunit kalaunan, sa sandaling makakuha ka ng katawa-tawa at talagang pumunta malayo out sa screen, hinawakan mo memory na talaga ito, talaga ay hindi nabibilang sa iyo. 

Ngunit tapat, ang mga mga uri ng mga bug ay pagpunta upang maging mas mahirap at mas mahirap upang malaman sa inyong sarili. Ngunit thankfully, bilang programmer, mayroon kaming mga tool na nagbibigay-daan sa amin upang gawin ito para sa amin. Kaya ito ay, marahil, isa ng ugliest mga programa, kahit hindi maganda kaysa sa output ng gdb. Ngunit ito palaging ay may linya o dalawang na ito ay sukdulang kapaki-pakinabang. 

Valgrind ay isang programa na tumutulong sa hindi mo i-debug ng isang program, bawat se, ngunit mahanap memory-kaugnay na mga problema, partikular. Ito ay awtomatikong tumakbo ang iyong code para sa mo at hanapin para sa hindi bababa sa dalawang bagay. Ang isa, ginawa ka ng isang bagay ang hindi sinasadyang tulad ugnay memory na hindi nabibilang sa iyo? Ito ay makakatulong sa iyo na makahanap ng mga kasong iyon. 

At dalawang, makakatulong ito sa nakahanap ka ng bagay na tinatawag na memory paglabas, na kung saan mayroon kaming ganap na hindi pinansin, naively, para sa ilang mga oras at blissfully. Ngunit ito ay lumiliko out, lahat oras na ito, sa tuwing mo na tinatawag na getString sa kaya marami sa aming mga programa, ka na humihiling sa operating system para sa memorya, ngunit mayroon kang anumang mga recollection ng kailanman pagbibigay ito pabalik, ang paggawa unalloc, o libre, bilang ang tawag dito. Hindi, dahil hindi namin kailanman tinanong mo na gawin ito. 

Ngunit ang lahat ng oras na ito, ang mga programa nagsusulat ka sa C Nai-leaking memorya, pagtatanong sa operating system para sa higit pa at higit pa memory para sa string at whatnot, ngunit hindi handing ito pabalik. At ngayon ito ay isang bit ng isang oversimplification, ngunit kung hindi mo kailanman tumakbo ang iyong Mac o iyong PC para sa masyadong ilang panahon, pambungad na ng maraming mga programa, siguro pagsasara ng programa, at kahit na ang iyong computer na ay hindi nag-crash, nakakakuha ito ng kaya magkano ang mas mabagal, na waring talaga paggamit ng maraming memorya o mga mapagkukunan, kahit na, kung hindi ka pa kahit na pagpindot sa keyboard, na maaaring be-- ngunit hindi always-- ng dati maging ang mga programa na iyong pinapatakbo Mayroon kanilang sarili memorya paglabas. At panatilihin ang mga ito na humihiling sa mga OS para sa higit pa at higit pang memory, ngunit forgetting tungkol dito, hindi tunay na paggamit, subalit samakatuwid pagkuha ng memory layo mula sa iba pang mga programa na maaaring gusto. Kaya na ang isang karaniwang paliwanag. Ngayon narito ang kung saan Valgrind ni output ay lubos na atrocious sa mga hindi gaanong at higit pa kumportableng magkamukha. Ngunit ang mga kagiliw-giliw bagay-bagay ay tama up dito. Ito ay nagsasabi sa akin ng isang di-wastong write ng laki ng apat na mangyayari sa programang ito, sa partikular, sa 21 na linya ng memory.c. 

Kung pumunta ako sa line 21, Hm, sa katunayan doon ay isang di-wastong write ng laki apat. Bakit ang laki ng apat? Well, ito number-- at ito ay maaaring anything-- ay isang int. Kaya apat na bytes. Kaya ako ng paglalagay ng apat na bytes kung saan hindi nila pag-aari. Iyon ang dahilan kung ano Valgrind ay aktwal na nagsasabi sa akin. Bukod dito, ito ay din sabihin sa akin, dahil kakailanganin namin nakikita, bilang patakbuhin mo ito sa isang susunod na pset, kung at kapag iyong na-leaked memory, na sa katunayan Mayroon akong, dahil na-Tumawag ako malloc, ngunit mayroon akong hindi tunay na tinatawag na, sa kasong ito, libre, kung saan ipapakita namin ay makakita ay ang kabaligtaran ng malloc. 

Kaya ngayon, sa palagay ko, isang huling halimbawa. Kaya ang isang ito ay isang kaunti pa arcane, ngunit ito ay marahil ang pinakamalaking dahilan upang maging maingat kayo sa memorya, at ang dahilan na maraming mga programa at / o mga web server, kahit na sa araw na ito, ay kinuha sa paglipas ng sa pamamagitan ng masamang guys sa isang lugar sa internet na kahit papaano pagpapadala ng bogus packet sa server mo sinusubukan mong ikompromiso ang iyong mga account, o kumuha ng iyong data, o lamang Sa pangkalahatan ay tumagal ng higit sa isang machine. Buffer overflow, pati na ang pangalan nagmumungkahi, paraan overflowing hindi isang int, ngunit isang buffer. At isang buffer lamang magarbong paraan ng sinasabi ito ay isang bungkos ng memorya. 

At sa katunayan, tinatawag na ako ng string bago buffer, sa halip na ni. Dahil kung ito ay isang buffer, tulad ng sa kamalayan ng YouTube, o anumang oras mo ang panonood ka ng video, maaaring nakakita ka ng salitang buffering, tuldok, tuldok, tuldok. Ito ay hindi kapani-paniwalang nakakainis. At na lamang ay nangangahulugang na ang iyong video player ay sumusubok na i-download ng maraming ng mga byte, maraming ng mga byte mula sa isang video mula sa internet. Ngunit ito ay mabagal, kaya sinusubukan mag-download ng isang bungkos ng mga ito upang punan ang isang buffer, isang lalagyan, upang mayroon kang sapat na mga byte na ito pagkatapos ay maaari ipakita sa iyo ang video, nang walang pag-pause Patuloy. Ngunit ito ay lumiliko out, maaari mong magkaroon ng isang buffer upang ito malaki. Ngunit subukan upang ilagay ito magkano ang data sa ito, at napaka-masamang bagay na maaaring mangyari. Kaya halimbawa, tingnan natin hayaan ito panghuling teaser ng isang halimbawa. Ito ay isa pang programa na iyon, sa unang tingin, ay hindi gumawa ng anumang bagay sobrang kapaki-pakinabang. Ito ay nakuha ng isang Main function na na mga tawag na function, f. At na function, f, hanggang dito, may isang char array, na tinatawag c, ng laki 12. At pagkatapos ay gumagamit ito ito bagong function na tinatawag na strncpy. 

Ito ay lumiliko out na, na may ito simple, simpleng linya ng code, tulad lamang ng dalawang mga linya, nakagawa kami buong aking programa, at samakatuwid, ang aking buong computer, at ang aking user account, at ang aking matapang humimok ng potensyal na mahina laban sa sinuman na may alam at ay sapat na mahusay na tumakbo ito programa na may isang tiyak na command line argumento. Sa ibang salita, kung ito masamang tao Inilalagay sa loob ng argvargv [1] sa pamamagitan ng pag-type sa keyboard isang napaka-espesyal na ginawa string, hindi abc, 123, ngunit mahalagang, binary simbolo na kumakatawan sa mga maipapatupad na code, isang programa na siya ay nagsulat, na may ganitong simpleng programa, na kung saan ay kinatawan ng libu-libong mga programang na katulad ng kahinaan, daresay, siya o maaari sa huli niyang tanggalin ang lahat ang mga file sa aking hard drive, kumuha ng isang kumikislap prompt sa gayon na siya ay maaari i-type ang mga utos sa kanilang sariling, mag-email sa lahat ng mga file sa aking sarili. Anumang bagay na maaari kong gawin, siya o maaari niyang gawin sa ang code na ito. 

Susubukan naming hindi masyadong pa malutas ito. At sa katunayan, ay ito ng pagpunta sa may sangkot isang maliit na larawan tulad nito, na magpapadala kami sa lalong madaling panahon dumating upang maunawaan ang lahat ng mas mahusay. Ngunit para sa araw, na nagtatapos sa ipaalam kung ano ang, sana, ang isang bahagyang higit pa nauunawaan ang XKCD Joke, hanggang sa ipagpatuloy namin sa susunod na pagkakataon. Lahat ng karapatan. Tingnan mo sa Miyerkules. 

[Musika nagpe-play] 

Tagapagsalita: At ngayon, malalim mga pananaw, sa pamamagitan ng Daven Farnham. Memory ay tulad ng tumatalon papunta sa isang tumpok ng ginintuang dahon sa isang afternoon Linggo. Hangin na Pagbugso, tossing iyong hair-- oh, Hinahanap-hanap ko ang mga araw when-- 

[Tawa]