[MUSIC KUCHEZA] DAVID J. Malan: All wa kulia. Hii ni CS50. Na hii ni mwanzo wa wiki 5. Na kama unaweza kuwa niliona, baadhi ya vifaa ni kupata kidogo zaidi tata, denser kidogo. Na ni rahisi sana, hasa kama tumekuwa katika tabia kwa muda fulani, kuwa anajaribu mpapuro chini zaidi chochote cha kufanya, sisi ni kusema katika darasa. Lakini kutambua, kwamba ni si labda mbinu bora za ufundishaji kujifunza aina hii ya vifaa, na vifaa zaidi kwa ujumla. Na hivyo sisi ni radhi kwa kutangaza kwamba CS50 ya mwenyewe Gheng Gong imeanza kuandaa kisheria seti ya maelezo kwa ajili ya kozi, tumaini la ambayo ni kwamba, mmoja, haya si tu kutumika kama kumbukumbu na rasilimali kwa kupitia upya nyenzo na kwenda nyuma kwa njia ya vifaa kwamba wanaweza kuwa na alitoroka mara ya kwanza kote, lakini pia hivyo vichwa yako inaweza kuwa zaidi up kuliko chini, wakati inakuja wakati kwa hotuba, hivyo kwamba unaweza kushiriki zaidi kwa kufikiri, kama kinyume na zaidi scribbly. Kwa kuwa alisema, ni nini utapata juu ya tovuti ni hati kama huu. Na taarifa, juu kushoto, kuna si tu meza ya yaliyomo, lakini pia codes huo mara moja kuruka wewe kwa sehemu sahihi katika video online. Na nini Chang hapa amefanya ni, kimsingi, kumbukumbu kile kilichotokea katika hii hasa hotuba. Na wengi wa mihadhara ni tayari online sasa na URL hii. Na tutaweza kuendelea baada ya salio ya wale mwishoni mwa wiki hii, hivyo kuchukua faida ya rasilimali hiyo. Hivyo bila wasiwasi zaidi, sisi kuanza peel nyuma safu ambayo imekuwa kamba kwa muda fulani. Na nini sisi kusema kamba kweli ni wiki iliyopita? Hivyo char nyota. Na char nyota, vizuri, nini gani kwamba kweli maana? Naam, muda wote huu, kama tumekuwa wamekuwa wakitoa wito kazi, kama GetString, na hifadhi kinachojulikana kurudi thamani ya GetString katika variable-- ni kuitwa s aina string-- sisi tumekuwa kuandika mstari wa kanuni up huko juu. Na ni tu wakati mimi kuona yangu handwriting kujitukuza hapa kufanya mimi kutambua jinsi mauaji hii ni. Hata hivyo, hebu kudhani kwamba, juu ya upande wa kulia ni, hata hivyo, busara picha ya nini kinachoendelea haya yote muda na GetString. GetString, bila shaka, anapata kamba. Lakini ni nini kwamba kweli maana yake nini? Ina maana anapata chunk ya kumbukumbu kutoka mfumo wa uendeshaji na wito kazi, iitwayo malloc. Lakini zaidi juu ya kwamba baadaye. Na kisha populates kwamba chunk ya kumbukumbu pamoja na barua user ina typed katika, ikifuatiwa na, bila shaka, null tabia, au backslash zero mwishoni sana. Wakati huo huo, upande wa mkono wa kushoto ya hadithi hii, muda wote huu, tumekuwa kutangaza variable, kama s. Na kwamba variable ni nini sasa kuanza wito pointer. Siyo sanduku ndani ya ambayo sisi kuweka kamba, Daven, per se, lakini badala ya sisi kuweka katika kwamba mraba sanduku upande wa kushoto nini hasa? Yeah? Watazamaji: pepe ya ambapo ni iko katika kumbukumbu. DAVID J. Malan: Hasa. pepe ya ambapo Daven iko katika kumbukumbu. Na si ambapo wote wa Daven iko, per se, lakini hasa anwani ya nini? Yeah? Watazamaji: tabia ya kwanza. DAVID J. Malan: tabia ya kwanza katika Daven, ambayo, katika kesi hii, Mimi mapendekezo mara kiholela na kubadili pesa 1, OX1, ambayo ina maana ya hexadecimal ya simu ya 1. Lakini pengine ni kwenda kuwa idadi kubwa sana ili tupate kuteka kwa 0x kama kiambishi awali, anayewakilisha tabia ya hexadecimal. Na kwa sababu hatuna haja ya kujua wapi mapumziko ya wahusika wa Daven ni kwa sababu ya yale kubuni rahisi uamuzi huo ulifanywa miaka mingi iliyopita? Yeah? Watazamaji: Backslash 0. DAVID J. Malan: Yeah, kwa uhakika. backslash 0 utapata, angalau katika wakati linear, traverse kamba, kutembea kutoka kushoto kwenda kulia, na kwa kitanzi, au wakati wa kitanzi, au kitu kama kwamba, na kuamua, oh, hapa ni mwisho wa kamba fulani. Hivyo, pamoja na tu anwani katika mwanzo wa kamba, tuweze kupata ukamilifu wa yake, kwa sababu wakati wote huu, kamba imekuwa tu nyota Char. Hivyo ni hakika faini kuendelea kutumia Maktaba CS50 na kufikirika hii, hivyo kusema, lakini tutaweza kuanza kuona hasa nini imekuwa kinachoendelea chini ya wakati huu kwa ujumla. Hivyo unaweza kukumbuka mfano huu, pia, kutoka wakati wa mwisho, kulinganisha 0, ambao hawakuwa kweli kulinganisha. Lakini sisi alianza kutatua hili. Lakini kama labda rejea, natakiwa maslahi mtu katika pink tembo leo, pia yaliyotolewa na Chang? Vipi kuhusu wewe mbele? [Inaudible]. Kuja juu juu. Na wakati huo huo, kama wewe kuja, hebu kufikiria kwa muda tu kile kanuni hii kwa kweli alikuwa akifanya. Ni kutangaza vigezo mbili hadi juu, s na t, na wito GetString. Hii si sana user-kirafiki mpango, kwa sababu haina kukuambia nini cha kufanya. Lakini hebu kudhani tu tuko kulenga sehemu Juicy. Na kisha sisi kufanya, kama s ni sawa na sawa na t, ni lazima kusema printf, typed kitu kimoja. Hello. Nini jina lako? Janelle: Janelle. DAVID J. Malan: Janelle, vyema kukutana na wewe. Hivyo changamoto yako katika mkono kwa ajili ya tembo hii ni kuteka us kwanza picha ya nini kuwakilishwa katika wale wawili wa kwanza mistari. Hivyo s na t inaweza kuwa kuwakilishwa jinsi ya screen? Na unaweza tu kuteka ni pamoja na kidole yako juu ya screen hii kubwa. Hivyo kuna nusu mbili kwa kila upande wa kwamba equation. Hivyo kuna s upande wa kushoto, na kisha GetString juu ya haki. Na kisha kuna t upande wa kushoto, na kisha GetString juu ya haki. Hivyo jinsi gani tunaanza kuchora picha kwamba inawakilisha nini kinaendelea hapa katika kumbukumbu, unaweza kusema? Na napenda basi wewe kueleza nini unafanya kama wewe kwenda. Janelle: OK. Naam, kwanza, itakuwa kuuliza kupata string pembejeo. Na itakuwa store-- oh, sorry. DAVID J. Malan: OK. Good. Na hii inaitwa nini? Oh, OK. Kuendelea. Sikuwa na maana kwa kupinga. Janelle: Sorry. Hivyo ingekuwa pembejeo katika anwani of-- si uhakika. Siwezi hasa kumbuka ya simu, lakini naamini ilikuwa ni kwa kuanzia na 0. DAVID J. Malan: Hiyo ni haki ya wote, kwa sababu mimi alifanya namba up, hivyo hakuna jibu sahihi. Janelle: Kuanzia na 0 arc. DAVID J. Malan: Sawa, hivyo kipengele 0. Uhakika. Janelle: Na kisha kama alikuwa kama wawili tu-letter-- DAVID J. Malan: Sawa, nyuma yenu. Janelle: Hivyo kipengele 0, na basi kipengele 1 au kipengele 2. DAVID J. Malan: Na ambayo kipande cha picha ni wewe kuchora sasa hivi? wito kwa GetString? Au tamko la s? Janelle: tamko ya s, naamini. Oh, GetString, kwa sababu ingekuwa kuwa inputted katika kila [? eneo hilo. ?] DAVID J. Malan: Good. Hasa. Hata ingawa hii kwa ufanisi anarudi safu, kukumbuka, wakati sisi kupata nyuma kamba, tunaweza index ndani ya kwamba string kutumia 01 na 2. Kitaalam, hizi ni pengine kuwakilishwa na anwani ya mtu binafsi, lakini hiyo ni faini. Hivyo tuseme, kama naweza tu kufunga mbele kwa ambapo sisi kushoto mbali mara ya mwisho, kama moja ya masharti mara g b e, backslash 0, na hivyo anayewakilisha Gabe ya pembejeo, jinsi gani sisi kuwakilisha s sasa? Kama hii ni kumbukumbu hiyo ni wamekuwa akarudi na GetString? Janelle: Je, ni kuwa kuwakilishwa na arc? DAVID J. Malan: Kwa arc? Naam, hakuna. Hebu tu kusema, pictorially, basi mimi tu kwenda mbele na kupendekeza kwamba, kama hii ni s, hii ni thamani ya kurudi kwa GetString. Na ve inayotolewa hii kama 0, 1, 2, ambayo ni kikamilifu busara, kwa sababu sisi unaweza index ndani ya kamba, kama vile. Lakini tu kuwa thabiti na mara ya mwisho, basi mimi kwenda mbele na kiholela kupendekeza kwamba hii ni mahali 1, hii ni mahali 2, hii ni anwani 3, na kadhalika. Na hivyo, tu kuwa super wazi, nini kinaendelea kwenda katika s kama matokeo ya mstari wa kwanza wa code, ungeweza kusema? Janelle: 1 mitaani? DAVID J. Malan: Hasa. Hivyo kushughulikia 0x1. Na wakati huo huo, napenda kwenda mbele na duplicate mengi ya nini umefanya kosa na kuongeza t yangu mwenyewe hapa. Kama ningekuwa na aina katika Gabe tena mara ya pili, wakati wakiongozwa na GetString, ambapo, bila shaka, ni Gabe kwenda? Naam, presumably-- Janelle: Kama ilivyokuwa katika hapa? DAVID J. Malan: Yeah. Janelle: Au ni pia katika masanduku sawa? DAVID J. Malan: Hebu kupendekeza, yeah, hasa, hivyo katika masanduku haya ya ziada. Lakini nini muhimu sasa ni kwamba, hata ingawa nimekuwa inayotolewa haya pretty karibu together-- 0x1, hii ni 0x2-- katika hali halisi, hii sasa inaweza kuwa anwani 0x10, kwa mfano, na 0x11, na 0x12, na kadhalika. Na hivyo, kama hiyo kesi, nini kinaendelea na kuishia hapa katika t? Janelle: 0x10? DAVID J. Malan: Hasa. Hivyo 0x10. Na hivyo sasa, swali la mwisho. Una, kwa mbali, alikuwa na kazi gumu kwa tembo hivi sasa. Kwa sasa, kama mimi kuvuta up code tena, wakati mimi kufanya, katika line tatu, kama s ni sawa na ni sawa na t, nini ni mimi kwa kweli kulinganisha kwamba tumekuwa inayotolewa hapa? Janelle: anwani mbili? DAVID J. Malan: Hasa. Hivyo mimi nina kusema ni s sawa sawa na t? Kwa maneno mengine, ni sawa sawa na 1 10? Na bila shaka, Jibu la wazi sasa ni, hakuna. Na hivyo mpango huu ni hatimaye kwenda magazeti nini, unaweza kusema? Janelle: Je, ni kuwa, typed kitu kimoja? DAVID J. Malan: Hivyo kama s ni 1 na t ni 10? Janelle: You typed mambo mbalimbali. DAVID J. Malan: Hasa. Typed mambo mbalimbali. Wote haki. Hivyo duru ya applause, kama tunaweza, hapa. [Makofi] Hiyo ilikuwa chungu. Mimi najua. Nicely kufanyika. Hivyo sasa hebu angalia kama hatuwezi tease mbali nini fix mara. Na bila shaka, wakati sisi fasta Haya ambayo mimi itabidi sasa ya kuwakilisha katika green-- sisi alifanya michache ya nyongeza hapa. Kwanza, tu kama sanity kuangalia, mimi nina kuangalia kwanza kama s ni sawa na batili na t sawa na null. Na tu kuwa wazi, wakati anaweza s au t kuwa null katika code kama hii? Wakati wanaweza s au t kuwa null. Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Hasa. Kama string kwamba mtumiaji typed katika ni njia ya muda mrefu pia walionao katika kumbukumbu, au baadhi weird kona kesi kama hiyo, GetString, kama tutaweza kuona, literally leo, katika nyaraka zake, anasema atarudi null kama thamani maalum sentinel, au tu aina ya ishara maalum hiyo ina maana kitu potoka. Hivyo tunataka kuangalia kwa kwamba, kwa sababu ni zamu nje kwamba null ni thamani ya hatari sana. Mara nyingi, kama wewe jaribu kufanya kitu kwa null kuwashirikisha function-- kupita kama pembejeo, kwa instance-- kazi ambayo wanaweza sana itakuwa ajali na, pamoja na hayo, kuchukua chini ya mpango yako yote. Hivyo line hii ya tatu sasa ni tu sanity kuangalia, kuangalia makosa, kama wewe. Hiyo ni tabia nzuri sasa kwa sisi kupata katika wakati wowote sisi kujaribu kutumia thamani kwamba inaweza, uwezekano, kuwa null. Sasa, katika mstari wa nne hapa, "Kama strcmp (s, t)," vizuri, nini kuwa akimaanisha? Naam, sisi alisema hii ilikuwa kwa ufupi sana aitwaye kazi kwa kamba kulinganisha. Na madhumuni yake katika maisha ni kulinganisha hoja yake ya kwanza dhidi yake ya pili, lakini si katika suala la anwani zao, kama tulivyofanya bila kukusudia wakati iliyopita na kanuni nyekundu, lakini badala ya kulinganisha hizo mbili masharti katika humanly Intuitive njia kwa kulinganisha hili, juu ya hii, dhidi ya hili, juu ya hili, na kisha kuacha ikiwa na wakati moja au wote wawili wa vidole yangu hits backslash 0. Hivyo mtu miaka iliyopita kutekelezwa strcmp kutekeleza kwa us utendaji kwamba sisi matumaini sisi ingekuwa Gotten na tu kulinganisha maadili mbili rahisi. Sasa kusema ukweli, mimi kuweka kuchora yote ya namba hizi mbalimbali. Lakini ukweli ni, nimekuwa kufanya haya juu wakati wote. Na hivyo basi mimi tu kwenda mbele na mpapuro hizi nje kufanya hatua hiyo, mwishoni mwa wa siku na kusonga mbele, sisi siyo kweli kwenda huduma ya juu nini anwani mambo ni kweli katika kumbukumbu. Hivyo mimi nina si kwenda kuteka haya aina ya namba sana tena, Mimi tu abstract hii mbali kidogo zaidi ya kirafiki na mishale tu. Kwa maneno mengine, kama s ni pointer, vizuri, hebu tu kuteka ni, literally, kama pointer, arrow akizungumzia kutoka yenyewe kwa kitu kingine, na si wasiwasi sana zaidi kuhusu minutia ya anwani hizi ambayo, tena, mimi alifanya juu anyway. Lakini tutaweza kuona wale anwani, wakati mwingine, wakati debugging code. Sasa wakati huo huo, mpango huu up hapa fixes, bila shaka, kwamba tatizo kwa kulinganisha wale masharti mawili. Lakini sisi mbio katika tatizo jingine. Hii ilikuwa na nakala mpango mara ya mwisho, ambapo, mimi alikuwa anajaribu capitalize tu tabia ya kwanza katika kamba. Lakini ilikuwa ni nini dalili tuliona mara ya mwisho wakati user typed katika thamani, kama Gabe katika lowercase, kwa s, kisha sisi kwa ajili s katika t, kama katika mstari wa tatu huko, na kisha mimi alijaribu capitalize t bracket 0? Mara ya athari za nini kubadilisha t bracket 0 hapa? Watazamaji: Ni iliyopita s. DAVID J. Malan: Yeah, Mimi iliyopita s, kama vile. Kwa sababu kile kweli kinachoendelea? Naam, napenda kuona kama naweza safi up picha hii, kama ifuatavyo. Kama s ni, tena, neno g, a, b, e, backslash, 0, na s tutaweza kuendelea kuchora kama sanduku hapa, lakini hakuna zaidi ya anwani. Hebu kuacha kufanya mambo up. Hebu tu kuteka picha kurahisisha dunia. Wakati mimi kutangaza t kwa kamba t, ambayo inajenga kwamba chunk ya kumbukumbu. Square hutokea kwa kuwa 32 bits katika kompyuta nyingi. Kwa kweli, kama wameweza milele habari za kompyuta kuwa na 32-bit usanifu, kweli dhana-kusema, kwamba tu ina maana inatumia anwani 32-bit. Na kama kiufundi kando, kama wameweza umewahi kujiuliza kwa nini kompyuta wakubwa, kama kweli alijaribu supu yao juu na kura ya RAM, inaweza tu kuwa na upeo ya gigabytes nne ya RAM, vizuri kwamba ni kwa sababu, literally, kompyuta yako ya zamani inaweza tu kuhesabu kama juu kama 4 bilioni, bilioni 4 ka, kwa sababu ilikuwa kutumia 32-bit namba kwa anwani. Lakini katika hali yoyote, katika hii mfano, hadithi ya rahisi sana. t ni mwingine tu pointer, au kweli nyota char, kamba aka. Na jinsi gani mimi wanataka update picha hii sasa na kwamba mstari wa pili wa kanuni, baada ya dot, dot, dot? Wakati mimi kufanya string t sawa na s semicolon, jinsi gani picha hii kubadilika? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Yeah. Hasa. Mimi tu ya kuweka mshale kutoka t sanduku kwa anwani huo, ile ile ya kwanza ya mbili katika alitoa. Au kitaalam, kama hii guy bado walikuwa katika 0x1, ni kama nilikuwa ingawa 0x1 hapa na 0x1 hapa. Lakini tena, anayejali kuhusu anwani? Ni wazo tu kwamba sasa mambo. Hivyo hii ni nini kinatokea hapa. Hivyo bila shaka, kama wewe kufanya t bracket 0, ambayo ni safu nukuu, ya course-- na kusema ukweli, inaonekana kama kuna safu zaidi ya hapa, lakini sasa kuna jambo hili weird. Kujua kwamba lugha ya programu, C, inatoa kipengele hiki, ambapo, hata kama t ni pointer, au s ni pointer, bado unaweza kutumia utambuzi, starehe za mraba bracket nukuu kwenda kipengele kwanza, au kipengele pili, au yoyote ya kipengele kwamba pointer ni akizungumzia kwa sababu, labda, ni ni, kama katika kesi hii, akionyesha baadhi safu. Hivyo ni jinsi gani sisi kurekebisha hili? Kwa kweli, hii ni mahali ambapo got kidogo mno katika mtazamo wa kwanza. Lakini hapa ni toleo mpya na kuboreshwa. Hivyo kwanza, mimi nina kupata kuondoa maktaba CS50, tu kuwaonyesha kwamba s ni kweli nyota Char, tu kisawe. Na t ni pia nyota Char. Lakini ni nini kinaendelea juu ya mkono wa kulia upande wa kwamba line ambapo t ni kwa ajili thamani? Malloc ni nini? Nini ni strlen? Sizeof (Char) ni nini? Kwa nini heck gani hii line kuangalia hivyo tata? Nini ni kufanya katika ngazi ya juu? Nini ni kuhifadhi katika t? Yeah? Watazamaji: Ni kugawa kiasi fulani cha kumbukumbu nafasi. Ni kuhifadhi, mimi nadhani, barua [inaudible]. DAVID J. Malan: Perfect. Perfect. Ni kugawa baadhi ya kiasi cha kumbukumbu nafasi kuhifadhi, labda, barua siku zijazo. Na hasa, malloc hiyo ni kurudi nini? Watazamaji: Kurudi [inaudible]? DAVID J. Malan: Hasa. Kurudi pepe ya kwamba kumbukumbu, ambayo ni njia dhana ya kusema, anarudi pepe ya Byte kwanza ya kwamba kumbukumbu. Wajibu ni juu yangu kukumbuka kiasi gani kumbukumbu mimi kwa kweli zilizotengwa au aliuliza malloc kwa. Sasa ni kiasi gani ni kwamba? Vizuri, hata kama kuna mengi ya mabano hapa, malloc inachukua tu hoja moja. Na mimi nina kubainisha strlen ya s, hivyo kutoa me ka kama wengi kama kuna katika s, lakini kuongeza moja. Kwa nini? Yeah? Watazamaji: backslash 0. DAVID J. Malan: Hasa. Sisi nimepata kufanya housekeeping kidogo. Hivyo kwa sababu kuna backslash 0, tunatarajia bora kukumbuka kwamba. Vinginevyo, tunakwenda kujenga string kwamba hana kwamba Terminator maalum. Wakati huo huo, tu kuwa super anal, nina sizeof (Char), tu katika kesi ya mtu anaendesha yangu code si juu ya CS50 appliance, lakini labda kompyuta tofauti kabisa ambapo chars ni byte moja, kwa mkataba huo, lakini mbili ka, au jambo kubwa kuliko hiyo. Ni tu kuwa super, super mnaichukia makosa. Hata ingawa, katika hali halisi, ni zaidi uwezekano wa kwenda kuwa 1. Sasa, wakati huo huo, mimi kwenda mbele na nakala kamba, t bracket i sawa na t bracket s. Nami kuahirisha kwa wiki iliyopita chanzo code kuona nini kinaendelea. Lakini takeaway muhimu, na sababu mimi kuweka code sasa katika kijani, ni kwa sababu kwamba mstari wa mwisho sana, t bracket 0 sawa na toupper, ina athari ya kuyafanyia ambayo kamba? t na / au s? Hiyo mstari wa mwisho wa kanuni. Tu t, kwa sababu nini kilichotokea wakati huu, kama mimi kidogo kutengua hatua hiyo ya mwisho, nini kilichotokea, ambapo mimi wito malloc, Mimi kimsingi kupata chunk ya kumbukumbu kwamba ni kawaida sawa kama awali, kwa sababu hiyo ni hesabu mimi alivyofanya. Mimi nina kuhifadhi katika t anwani ya kwamba chunk ya kumbukumbu. Hata ingawa hii inaonekana nzuri na pretty, nzuri na tupu, ukweli ni kuna, nini tutaweza kuweka wito, maadili takataka katika hapa. Hiyo chunk ya kumbukumbu nguvu sana vizuri na zimetumika kabla, sekunde chache, dakika chache zilizopita. Hivyo kuna inaweza kabisa kuwa namba au barua huko, tu kwa ajali. Lakini wao ni si halali, hata mimi mwenyewe na idadi ya chunk hii ya kumbukumbu na chars halisi, kama mimi kufanya katika kwamba kwa kitanzi huko. Wote haki? Hivyo sasa, kilele cha mifano hizi tatu kwamba walikuwa inaonekana kuvunjwa mara ya mwisho, hii Swap mfano, kazi hii kazi katika akili kuwa ni swapped a na b. Lakini haikuwa kazi kwa namna gani nyingine? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Hasa. Kama ningekuwa kuwaita kazi hii kutoka another-- kwa mfano, kutokana na kazi kama kuu, ambapo Nina variable, x na y, kama mimi alifanya wiki iliyopita, kanuni na huo, na mimi kupita katika x na y kwa Byta, na kisha kuwaita Swap-- hii, bila shaka, ni toleo sahihi ni nini sisi ni juu ya see-- haikuwa kazi. Kwa hiyo kile ni fix? Naam, hivyo tu kuwa wazi, basi mimi kwenda mbele and-- nipe moja ya pili hapa, na kuona kama naweza kuonyesha moja ya mwisho, ambayo itakuwa in-- hebu angalia kama naweza kupata hii fast-- OK halisi, [inaudible]. OK, huko ni. Hivyo kupuuza amri mimi nina tu kuandika. Mimi nataka retrieve katika dakika ya mwisho mfano kutoka wakati wa mwisho, ambayo sasa inaitwa hakuna Swap. Hivyo hakuna Swap ni ambapo sisi kushoto mbali wakati wa mwisho, ambapo, mimi initialized x kwa 1 na y kwa 2. Mimi kisha kuwaita Swap, kupita katika 1 na 2. Na kisha kazi hii kazi katika baadhi ya hisia, lakini hakuwa na kudumu athari juu ya x na y. Hivyo swali katika mkono ni jinsi sasa je, sisi kweli kurekebisha tatizo hili? Ni ufumbuzi katika mkono ni nini? Naam, katika swap.c, ambayo ni mpya leo, taarifa wanandoa wa tofauti. x na y ni sawa. Lakini nini ni wazi tofauti juu ya line 25? Nini mpya huko, kama unakumbuka nini inaonekana kama pili iliyopita? Watazamaji: [inaudible]. DAVID J. Malan: Yeah. Hivyo ampersands ni kipande mpya ya syntax si tu katika mpango huu, lakini pia kwa ujumla zaidi katika CS50. Hadi sasa, sidhani tumeona mifano yoyote au kweli aliyesema kuhusu wao katika yoyote undani, zaidi ya, labda, preemptively katika sehemu, Ampersand kama hii. Naam, ni zamu nje Ampersand ni moja ya vipande ya mwisho ya syntax mpya tunakwenda kujifunza. All maana ni pepe ya baadhi kutofautiana. Kwa nini anwani haina x kuishi? Lakini nini anwani haina y kuishi? Kwa sababu kama tatizo la msingi kabla ya ilikuwa kwamba x na y walikuwa kuwa kupita kama nakala, nini sisi kweli wanataka kufanya ni kutoa Swap na kama ilivyo kwa hazina ramani ambayo inaongoza kwa ambapo x na y kweli ni katika RAM, ili Swap unaweza kufuata ramani kwamba na kwenda popote x au y alama doa na mabadiliko ya maadili halisi ya 1 na 2 huko. Hivyo Swap inahitaji mabadiliko kidogo sana. Na katika mtazamo wa kwanza, hii nguvu kuonekana kidogo sawa na char nyota. Na hakika ni. Hivyo ni pointer kwa nini aina ya data, misingi ya sehemu hii yalionyesha? Hivyo ni int. Hivyo ni tena int, ni pepe ya int. Na vile vile, b sasa ni kwenda kuwa pepe ya int. Hivyo wakati mimi sasa wito Swap kutoka Kuu, Mimi si kwenda kutoa Swap 1 na 2. Mimi nina kwenda kuwapa kama Ng'ombe-kitu na ng'ombe-kitu, anwani mbili ambayo itasababisha Swap na maeneo yao halisi katika kumbukumbu ya kompyuta yangu. Hivyo sasa, utekelezaji yangu iliyobaki inahitaji mabadiliko tad. Nini ni wazi tofauti na sasa katika mistari haya matatu ya kanuni? Kuna nyota hizi damn wote juu ya mahali pa, wote haki? Hivyo nini kinaendelea hapa? Yeah? Watazamaji: Ni wazi [inaudible]. DAVID J. Malan: Hasa. Hivyo katika context-- hii na hii ilikuwa si bora uamuzi wa kubuni, admittedly, miaka iliyopita. Katika hali hii, ambapo wewe tu na nyota, na huna kuwa na aina data, kama int, mara moja kwa upande wa kushoto, badala una ishara sawa, kwa uwazi, kwa mantiki hii, wakati wewe kusema nyota, hiyo ina maana kwenda anwani hiyo ni katika. Kufuata ramani hazina, hivyo kusema. Na wakati huo huo, katika line 37, ina maana kitu kimoja. Kwenda mahali a, na kuweka kile huko? Chochote ni saa eneo hilo b bayana. Kwa maneno mengine, kwenda b. Kupata thamani hiyo. Kwenda na, kwa sawa saini, zoezi operator, kuweka thamani kwamba kuna. Vile vile, int temp ni tu int. Hakuna inahitaji mabadiliko kuhusu temp. Ni tu kioo vipuri kutoka Annenberg kwa baadhi ya maziwa au juisi ya machungwa. Lakini mimi haja ya kusema, kwenda b. Kwenda kwamba marudio na kuweka thamani katika temp huko. Hivyo nini kinatokea, basi? Wakati mimi kwa kweli kuwaita Byta wakati huu, kama tray hii ya kwanza hapa inawakilisha Kuu, tray hii ya pili inawakilisha Swap, wakati Mimi kupita Ampersand x na y Ampersand kutoka Kuu kwa Byta, tu kuwa wazi, ni kitu gani stack frame kupokea? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Hasa. pepe ya x na anwani ya y. Na unaweza kufikiria haya kama anwani ya posta. 33 Oxford Street na 35 Oxford Street, na wewe wanataka kuhamia majengo mawili kwamba ni katika maeneo hayo. Ni aina ya wazo ujinga, lakini hiyo yote maana sisi na mahali. Ambapo katika dunia unaweza wewe kupata wale ints mbili? Ambapo katika dunia unaweza kupata majengo hayo mawili? Hivyo kama hatimaye, baada ya hayo mimi wakati kwenda katika chanzo code ya leo na kukusanya Swap na kukimbia ./swap, hatimaye, kwa mara ya kwanza sisi kweli kuona kwamba maadili yangu na kwa kweli wamekuwa swapped kwa mafanikio. Na sasa, tunaweza hata kuchukua kumbuka ya hii katika, kusema, GDB. Hivyo basi mimi kwenda katika faili moja. Hebu kwenda mbele na kukimbia GDB ya ./swap. Na sasa, katika Swap, mimi nina kwenda mbele na kuweka hatua ya mapumziko katika Kuu. Na sasa mimi nina kwenda mbele na kuendesha programu. Na sasa tunaona code yangu paused katika mstari huo. Kama mimi kwenda mbele na magazeti x, nini anatakiwa kuona hapa? Ni swali. Sema tena? Watazamaji: [inaudible]. DAVID J. Malan: Hivyo namba random, labda. Labda mimi kupata bahati, na ni nzuri na rahisi, kama 0. Lakini labda ni baadhi ya idadi random. Katika kesi hiyo, mimi got bahati. Ni hutokea tu kuwa 0. Lakini ni kweli bahati, kwa sababu si mpaka mimi aina ya pili na kisha magazeti x ina kuwa mstari wa kanuni, line 19, ameuawa. Wakati huo huo, kama mimi aina ya pili yake, na sasa magazeti nje y, mimi nina kwenda kuona 2. Sasa, kama mimi aina ya pili, ni kwenda kwa kupata utata kidogo, kwa sababu sasa, printf ni kwenda kuonekana kwenye screen, kama ilivyokuwa. x ni 1. Hebu kufanya hii tena. Na sasa, hapa ambapo mambo kupata kuvutia. Kabla ya mimi wito Swap au hata hatua ndani yake, hebu kuchukua peek kidogo. x ni, tena, 1. Y ni, bila shaka, haraka sanity kuangalia, 2, hivyo si ngumu huko. Lakini Ampersand x ni nini? Jibu, ni aina ya funky kuangalia. Lakini nyota int katika mabano ni tu njia Pato la Taifa ya kusema hii ni mahali. Ni si int, ni pointer kwa int, au vinginevyo inajulikana kama mahali. Jambo hili mambo ni nini? Sisi sijawahi kuona kitu kabisa kama kwamba kabla. Hivyo hii ni mahali katika kompyuta yangu ya kumbukumbu ya ambapo x hutokea kuishi. Ni Ox-kitu. Na hii ni, kusema ukweli, kwa nini Nimekuwa kuanza kuchora mishale, badala ya namba, kwa sababu ambao kwa kweli wasiwasi kwamba int yako ni saa fulani anwani hiyo ni kwamba kubwa. Lakini bffff0c4, haya yote ni kweli hexadecimal tarakimu, ambayo ni 0 kupitia f. Hivyo sisi ni si kwenda kukaa pia muda mrefu juu ya nini mambo hayo ni. Lakini kama mimi magazeti nje y, bila shaka, naona 2. Lakini Ampersand y, naona anwani hii. Na taarifa, kwa curious, jinsi mbali mbali ni x na y? Unaweza kupuuza zaidi ya mahali. Tarakimu ka. Na kwamba ni sambamba na yetu mapema kudai kwamba jinsi kubwa ni int? Tarakimu ka. Hivyo inaonekana kama kila kitu ni bitana up nicely, kama unaweza matumaini, katika kumbukumbu. Hivyo sasa, hebu haraka tu mbele hadi mwisho wa hadithi hii. Hebu kwenda mbele na aina hatua, kupiga mbizi katika Swap kazi. Sasa angalia, kama mimi aina, ni kufanana na anwani ya x. Kama mimi aina b, ni kufanana kwa anwani ya y. Hivyo kile lazima mimi kuona kama mimi kusema, kwenda mahali? Hivyo magazeti nyota. Hivyo nyota ina maana kwenda huko, katika muktadha huu. Ampersand ina maana nini pepe ya. Hivyo nyota njia 1. Na magazeti nyota b inatoa me 2. Na napenda kudhani, kwa wakati huu, kwamba angalau kificho kwamba kuendelea kutekeleza sasa unaweza kuwa kujadiliana kupitia katika njia hiyo. Lakini tutaweza kupitia upya wazo hili kabla ya muda mrefu. Hivyo toleo hili la Swap ni sasa sahihi na inaruhusu sisi wabadilishane data ya aina fulani. Kwa hiyo, maswali yoyote basi juu ya Swap? On nyota? On pepe ya? Na utaona, na tatizo kuweka 4, aina ya, lakini tatizo kuweka 5, dhahiri, ni jinsi gani hizi mambo ni muhimu na kupata mengi zaidi vizuri pamoja nao, kama matokeo. Chochote wakati wote? Wote haki. Hivyo malloc ni, tena, kazi hii kwamba tu kutenga kumbukumbu, kumbukumbu mgao. Na kwa nini hii ni muhimu? Naam, muda wote huu, tumekuwa kutumia malloc. Kama wewe kufikiria sasa jinsi GetString kazi, labda, ni wamekuwa kuuliza mtu kwa chunk ya kumbukumbu, wakati wowote aina ya mtumiaji kamba katika, kwa sababu sisi hakika hakujua, kama CS50 wafanyakazi, jinsi kubwa masharti wale ambao binadamu ni kwenda aina inaweza kuwa. Basi hebu, kwa mara ya kwanza, kuanza kwa peel nyuma jinsi matendo CS50 maktaba, kwa njia ya mifano michache ambayo itasababisha yetu huko. Hivyo kama mimi kufungua gedit na kufungua scanf 0, tunakwenda kuona kanuni zifuatazo. Scanf 0, inapatikana kwenye tovuti kwa ajili ya leo, ina mistari wachache wa kanuni hapa, 14 mpaka 20. Na hebu angalia nini ni kufanya. Ni anatangaza int, iitwayo x. Ni anasema kitu kama, idadi tafadhali. Na sasa inasema, scanf% i, & x. Hivyo kuna rundo la mambo mpya huko. Lakini scanf, unaweza aina ya kufikiri ya kama kinyume cha printf. printf, bila shaka, prints kwa screen. scanf aina ya scans kutoka mtumiaji keyboard kitu yeye au yeye ana typed. % I ni tu kama printf. Hii ina maana kutarajia user aina int. Na sasa, kwa nini unafikiri mimi inaweza kuwa kupita scanf & x? Kama kusudi katika maisha ya scanf ni kupata kitu kutoka kwa mtumiaji, nini maana ya kupita, & x, sasa? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Hasa. Chochote mimi, binadamu, aina katika, pembejeo yangu ni kwenda kuokolewa katika eneo hilo. Ni si ya kutosha, kukumbuka, tu kupita katika x, kwa sababu tumeona tayari, wakati wowote, unaweza kupita tu variable mbichi, kama int, kwa baadhi ya kazi nyingine, uhakika, inaweza kubadilika kwamba variable, lakini si moja kwa moja. Ni hawezi kuwa na athari juu ya Kuu. Ni inaweza tu mabadiliko nakala yake mwenyewe ndani. Lakini kama, badala yake, huna nipe int halisi, lakini nipe maelekezo kwa kwamba int, mimi sasa, kuwa scanf, Hakika, siwezi kufuata kwamba kushughulikia na kuweka idadi huko hivyo kuwa na huduma hiyo kama vizuri. Hivyo wakati mimi kukimbia mpango huu, hebu angalia. Kufanya scanf 0 dot slash, scanf 0. Na kama mimi sasa aina ya simu kama 50, shukrani kwa ajili ya 50. Kama mimi sasa aina ya simu kama hasi 1, kwa hasi 1. Mimi sasa aina ya simu kama 1.5, hm. Kwa nini mpango wangu kupuuza mimi? Naam, kwa sababu tu, mimi aliiambia ni kwa kutarajia int tu. Wote haki. Hivyo hiyo ni toleo moja ya hili. Hebu kuchukua mambo up notch na kupendekeza kwamba hii si nzuri. Na humu uongo mfano rahisi sana jinsi gani tunaweza kuanza kuandika code kwamba watu wengine wanaweza kutumia au maelewano kwa kufanya mambo mabaya. Hivyo mstari 16, hivyo sawa katika roho kwa mbele, lakini mimi si kutangaza ni int wakati huu. Mimi nina kutangaza ni char nyota, aka kamba. Lakini ni nini kwamba kweli maana yake nini? Hivyo kama mimi si bayana address-- na Mimi nina wito ni kiholela, buffer, lakini mimi naweza kuiita s, kuwa simple-- na kisha mimi kufanya hivyo, kueleza kwangu, kama unaweza, kwa kuzingatia uliopita mantiki, ni nini scanf kufanya katika line 18, kama kupita% s na buffer, ambayo ni anwani? Scanf ni kitu gani, kama wewe kuomba halisi mantiki hiyo kama toleo 0, kwenda kujaribu kufanya hapa, wakati aina ya mtumiaji kitu katika? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Hasa. Scanf, kwa mantiki ya awali, ni kwenda kuchukua kamba kwamba typed binadamu in-- ni sasa kamba, si ya simu, labda, kama yeye au yeye cooperates-- na ni kwenda kujaribu kuweka kwamba kamba katika kumbukumbu katika chochote anwani buffer bayana. Na hii ni kubwa, kwa sababu buffer ni kweli maana ya kuwa ya mahali. Lakini mimi kudai mpango huu ni Buggy katika njia kubwa sana, kwa sababu kile thamani ya kitu buffer na default? Nini mimi initialized katika? Nini chunk ya kumbukumbu? Mimi sina, haki? Hivyo ingawa nimekuwa zilizotengwa nyota Char hiyo tena kuitwa s, ni badala kuitwa, buffer-- hivyo hebu kuteka jina variable ya sasa kama buffer-- kama nina si kuitwa GetString au malloc hapa, kwamba ufanisi ina maana kwamba buffer ni baadhi tu ya thamani ya takataka. Sasa nini maana gani? Ina maana kwamba mimi aliiambia scanf kutarajia kamba kutoka kwa mtumiaji. Na unajua nini? Kitu chochote hii ni akizungumzia to-- na mimi kuteka alama swali, lakini katika hali halisi, ni kwenda kuwa kitu kama OX1, 2, 3, haki? Ni baadhi ya thamani bogus kwamba tu hutokea kwa kuwa kuna kutoka kabla. Hivyo kuweka njia nyingine, ni kana kwamba buffer ni tu akizungumzia kitu katika kumbukumbu. Mimi sijui nini. Hivyo kama mimi aina katika Gabe sasa, ni kwenda kujaribu kuweka g-b-e / 0 huko. Lakini ambaye anajua nini kwamba ni? Na katika siku za nyuma, yoyote wakati tumekuwa alijaribu kugusa kumbukumbu kwamba hana mali kwetu, nini kilichotokea? Au karibu kila wakati. Mkato wa soko kosa, haki? Arrow hii, mimi hawana wazo ambapo ni akizungumzia. ni baadhi tu thamani random. Na bila shaka, kama wewe kutafsiri thamani random kama ya mitaani, wewe ni kwenda kwa baadhi random marudio. Hivyo Gabe nguvu kweli ajali mpango wangu katika kesi hii hapa. Hivyo tunaweza kufanya nini hiyo ni karibu kama mbaya? Fikiria hili tatu na Mfano wa mwisho scanf. Toleo hili ni bora katika maana gani? Kama wewe ni starehe na tatizo uliopita, hii ni bora. Kwa nini? Watazamaji: [inaudible]. DAVID J. Malan: Good. Hivyo kesi hii ya mstari 16 ni bora zaidi, kwa maana ya kwamba sisi ni wazi kugawa baadhi ya kumbukumbu. Sisi siyo kutumia malloc, sisi ni kutumia wiki 2 mfumo wa tu kutangaza safu. Na tumekuwa alisema kuwa kabla ya kamba ni tu safu ya wahusika, hivyo hii ni kinyume kabisa halali. Lakini ni, bila shaka, kama wewe kumbuka, fasta ukubwa, 16. Hivyo mpango huu ni salama kabisa, kama mimi aina katika masharti tabia ya moja, mbili tabia ya masharti, 15 masharti tabia. Lakini kwa haraka kama mimi kuanza kuandika 16, 17, 18, 1000 tabia ya masharti, ambapo ni string kwamba kwenda kuishia? Ni kwenda kuishia sehemu hapa. Lakini basi ambaye anajua kile kingine ni nje ya mipaka ya safu hii hasa? Ni kana kwamba nimekuwa alitangaza 16 masanduku hapa. Hivyo badala ya kuteka zote 16, tutaweza tu kujifanya kuwa nimekuwa inayotolewa 16. Lakini kama mimi kisha kujaribu kusoma kamba hiyo ni kwa muda mrefu, kama wahusika 50, Mimi nina kwenda kuanza kuweka a, b, c, d, x, y, z. Na hii ni labda baadhi ya wengine kumbukumbu sehemu tena kuwa, inaweza kusababisha mpango wangu kwa ajali, kwa sababu nimekuwa si aliuliza kwa chochote zaidi ya ka 16 tu. Hivyo ni nani anayejali? Naam, hapa maktaba CS50. Na zaidi ya hii ni tu kama maelekezo juu juu. Maktaba CS50, muda wote huu, imekuwa na mstari huu katika line 52. Tumeona typedef, au utaona typedef katika pset 4, ambayo inajenga tu kisawe ambapo char nyota inaweza kuwa zaidi tu inajulikana kama kamba. Hivyo hii ni moja ya magurudumu mafunzo chache tumekuwa kutumika kwa siri chini ya kofia. Wakati huo huo, hapa ni kazi, getchar. Sasa inaonekana, hakuna mwili yake. Na kwa kweli, kama mimi kuweka scrolling, mimi si kweli kuona utekelezaji yoyote ya kazi hizi. Kama sanity hundi, kwa nini ni kwamba? Watazamaji: [inaudible]. DAVID J. Malan: Yeah. Hivyo hii ni header file. Na header files vyenye prototypes, pamoja na baadhi ya mambo mengine, inaonekana, kama typedefs. Lakini katika CS50.c, ambayo tumekuwa kamwe kupewa wewe moja kwa moja, lakini imekuwa katika CS50 appliance wote wakati huu, ndani ya folders yake, taarifa kwamba kuna zima rundo la kazi katika hapa. Kwa kweli, hebu kitabu chini. Hebu kupuuza wengi wao, kwa sasa. Lakini kitabu chini ya GetInt na kuona jinsi GetInt kazi. Hivyo hapa ni GetInt. Na kama wewe milele kweli kumjali jinsi kupata int kazi, hapa ni kuweka kumbukumbu yake. Na miongoni mwa mambo anasema ni anakwambia nini ni kati ya maadili inaweza kurudi. Ni kimsingi hasi bilioni 2 chanya bilioni 2, kutoa au kuchukua. Na zinageuka, yote hii wakati, ingawa tumekuwa kamwe alikuwa na wewe kuangalia kwa ajili yake, kama kitu fulani kitaenda vibaya, zinageuka kuwa wote wakati huu, GetInt ina anarudi maalum mara kwa mara, si null, lakini badala int_max, ambayo ni tu programu ya mkataba. Ina maana hapa ni thamani maalum. Kuhakikisha na kuangalia kwa hii, tu katika kesi kitu kitaenda vibaya. Lakini tumekuwa kamwe bothered na kwamba hadi sasa, kwa sababu tena, hii ni maana ya kurahisisha. Lakini jinsi gani GetInt kupata kutekelezwa? Naam, moja, inachukua hakuna hoja. Tunajua kwamba. Ni anarudi int. Tunajua kwamba. Hivyo ni jinsi gani kazi chini ya Hood? Hivyo kuna inaonekana usio kitanzi, angalau muonekano wa moja. Taarifa kwamba sisi ni kutumia GetString. Hivyo kwamba ni ya kuvutia. GetInt wito kazi yetu wenyewe, GetString. Na sasa kwa nini huenda hii kuwa kesi? Kwa nini mimi kuwa kujihami hapa katika line 165? Nini inaweza kutokea katika line 164, tu kuwa wazi? Ni jibu sawa mbele. Ili tu kuwa nje ya kumbukumbu. Kitu fulani kitaenda vibaya na GetString, sisi nimepata kuwa na uwezo wa kushughulikia hiyo. Na sababu mimi si kurudi null ni kwamba, kitaalam, null ni pointer. GetInt ina kurudi int. Hivyo nimekuwa kiholela aliamua, kimsingi, kwamba bilioni 2, kutoa au kuchukua, ni kwenda kuwa thamani maalum kwamba naweza kamwe kweli kupata kutoka kwa mtumiaji. Ni tu thamani moja mimi nina kwenda kupoteza kuwakilisha kosa code. Hivyo sasa, mambo kupata dhana kidogo. Na si kabisa kazi moja kama kabla, lakini ni sawa sana. Hivyo taarifa, mimi kutangaza hapa, katika line 172, wote int n na char c. Na kisha mimi kutumia mstari huu funky, sscanf, ambayo ni zamu nje haina Scan kamba kutoka keyboard. Ni anasimama kamba zilizopo ambazo user tayari typed katika. Kwa hiyo mimi tayari kuitwa GetString, ambayo ina maana nina kamba katika kumbukumbu. sscanf ni nini wewe d wito parsing kazi. Inaonekana katika kamba nimekuwa typed katika, tabia ya na tabia, na anafanya kitu muhimu. Kamba kwamba ni kuhifadhiwa katika mstari. Nami najua kuwa tu kwa kwenda nyuma hadi hapa na kusema, oh, OK, Mimi kuitwa ni si s wakati huu, lakini line. Na sasa hii ni tofauti kidogo. Lakini hii ina maana ufanisi, kwa sababu tutaweza kiasi fulani wimbi mikono yetu katika leo, kwamba sisi ni kuangalia kwa kuona kama user typed katika na int na labda tabia nyingine. Kama mtumiaji typed katika int, ni kwenda kuhifadhiwa katika n, kwa sababu mimi nina kupita hili kwa mitaani, hila mpya tumeona leo. Kama mtumiaji typed pia katika kama 123x, kwamba x ni kwenda kuishia barua katika tabia ya c. Sasa ni zamu nje kwamba sscanf wataniambia, akili, jinsi vigezo vingi mara sscanf mafanikio na uwezo wa kujaza. Hivyo kwa mantiki hii, kama kazi Mimi nina kutekeleza ni GetInt, lakini mimi nina kuangalia, uwezekano, kwa mtumiaji kwa kuwa typed katika int ikifuatiwa na kitu kingine, nini nataka sscanf ya thamani ya kurudi kweli kuwa? Kama lengo ni kupata tu int kutoka kwa mtumiaji? Hivyo kama anarudi sscanf 2, hiyo ina maana gani? user typed katika kitu kama, literally, 123x, ambayo ni nonsense tu. Ni hali makosa, na Nataka kuangalia kwa ajili hiyo. Hivyo kama aina ya mtumiaji hii katika, na mantiki hii, nini sscanf kurudi, unaweza kusema? Hivyo ni kwenda na kurudi 2, kwa sababu 123 ni kwenda katika hapa, na x ni kwenda kuishia katika hapa. Lakini sitaki x kupata kujazwa. Nataka sscanf kwa tu kufanikiwa katika kujaza kwanza ya vigezo wake. Na hivyo ndiyo sababu mimi wanataka sscanf kurudi 1. Na kama hii ni kidogo juu ya kichwa kwa wakati huu, hiyo ni kabisa faini. Kutambua kuwa, moja ya maadili ya GetInt na GetString ni kwamba sisi ni kufanya heck ya mengi ya makosa ya kuangalia kama hii ili kwamba, hadi sasa, unaweza pretty much aina kitu chochote katika keyboard yako, na sisi kukamata yake. Na sisi hakika, wafanyakazi, utakuwa dhahiri si kuwa chanzo cha mdudu katika yako mpango, kwa sababu sisi ni kujitetea kuangalia kwa wote wa kijinga mambo ambayo mtumiaji anaweza kufanya, kama kuandika kamba, wakati kweli alitaka int. Hivyo kwa now-- tutaweza kuja nyuma ya hii kabla ya long-- lakini muda wote huu, GetString na GetInt na imekuwa chini ya Hood kutumia hii wazo msingi ya anwani ya kumbukumbu. Hivyo sasa, hebu kufanya mambo a user-kirafiki kidogo zaidi. Kama unaweza kukumbuka, kutoka Binky mwisho time-- kama panya yangu cooperate-- hivyo tulikuwa na kanuni hii, ambayo kusema ukweli, ni haki nonsensical. Kanuni hii kinafikia chochote muhimu, lakini ilikuwa ni mfano kwamba profesa Parlante kutumika ili kuwakilisha nini kinachoendelea katika mpango kuwashirikisha kumbukumbu. Basi hebu retell hii hadithi super kwa ufupi. Hizi kwanza mistari miwili, katika Kiingereza, kufanya nini, unaweza kusema? Tu katika sababu za binadamu, lakini kidogo suala kiufundi, kuchukua kumchoma. Watazamaji: [inaudible]. DAVID J. Malan: Sawa, wewe ni kuanzisha anwani kwa x yako na y vigezo. Si kabisa, kwa sababu x na y ni si vigezo katika maana ya asili. x na y ni anwani au kuhifadhi mahali. Basi hebu jaribu hii mara moja zaidi. Si mwanzo mbaya, ingawa. Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Good. Nadhani hiyo ni safi kidogo. Kutangaza kuyatumia mbili, integers mbili. Na sisi ni kuwaita x na y. Au kama tulikuwa na kuteka hii kama picha, tena, kukumbuka kwa urahisi kabisa kwamba wote sisi ni kufanya na kwamba mstari wa kwanza ni kuchora sanduku kama hii, pamoja na baadhi ya thamani ya takataka ndani yake, na kuiita X, na kisha sanduku mwingine kama huu, pamoja na baadhi ya thamani ya takataka ndani yake, na kuiita y. Tumekuwa alitangaza mbili kuyatumia kwamba hatimaye mapenzi kuhifadhi pepe ya int. Hivyo kwamba ni yote kuna. Hivyo wakati Binky alifanya hivyo, udongo tu inaonekana kama hii. Na Nick aina tu ya ilimalizika mishale, kana kwamba wao siyo akizungumzia popote hasa, kwa sababu wao ni tu takataka maadili. Wao ni si wazi initialized mahali popote hasa. Sasa line ya pili ya code, kukumbuka, ilikuwa hii. Hivyo katika sababu user-kirafiki, lakini kwa kiasi fulani ya kiufundi Kiingereza, ni mstari wa code kufanya nini? Yeah? Watazamaji: [inaudible]. DAVID J. Malan: Perfect. Ni kugawa chunk ya kumbukumbu hiyo ni ya ukubwa wa int. Na kwamba ni jibu nusu. You akajibu haki nusu wa kujieleza. Nini kinatokea kwenye mkono wa kushoto upande wa ishara sawa? Yeah? Watazamaji: Na chukueni ni kwa x variable? DAVID J. Malan: Na chukueni ni kwa x kutofautiana. Hivyo kwa kurejea, mkono wa kulia upande kutenga kumbukumbu ya kutosha kuhifadhi int. Lakini malloc hasa anarudi anwani ya kwamba chunk ya kumbukumbu, ambayo wewe wameweza tu mapendekezo anapata kuhifadhiwa katika x. Basi nini Nick alifanya mara ya mwisho kwa Binky ni yeye dragged kwamba pointer nje, udongo, kwa uhakika sasa katika chunk ya kumbukumbu nyeupe ambayo ni sawa na ukubwa wa int. Na hakika, hiyo ni maana kuwakilisha ka nne. Sasa, line ya pili ya code alifanya hivyo, nyota x anapata 42. Hivyo 42 ni moja kwa moja juu ya mkono wa kulia upande, maana ya maisha. Upande mkono wa kushoto, nyota x nini maana ya? Hiyo pia wanaweza kuwa na gone-- kwamba ni sawa. OK. Watazamaji: Kimsingi, kwenda [inaudible] DAVID J. Malan: Good. Watazamaji: [inaudible]. DAVID J. Malan: Hasa. Upande wa mkono wa kushoto ina maana kwenda x. x ni mahali. Ni kama 33 Oxford Street, au OX1. Na nyota x maana kwenda kuwa kushughulikia na kuweka kile huko? 42. Hivyo kweli, kwamba ni nini hasa Nick alivyofanya. Alianza na na, kimsingi, kiakili kunyooshea kidole x, kufuatia arrow kwa sanduku nyeupe juu ya mkono wa kulia upande, na kuweka namba 42 hapo. Lakini basi mambo got kidogo hatari, sawa? Binky ya juu ya kupoteza kichwa chake. Star y sawa na 13, bahati mbaya, maana yake nini? Hivyo nyota y njia kwenda mahali katika y. Lakini ni mahali katika y nini? Zote haki, ni thamani ya takataka, haki? Mimi akauchomoa kama alama ya swali. Nick akauchomoa kama curled up mshale. Na kama hivi karibuni kama wewe kujaribu kufanya nyota y, akisema kwenda huko, lakini kuna si halali anwani, ni baadhi anuani ya bogus, mpango kinaendelea kwa ajali. Na kichwa Binky ni kwenda kuruka mbali hapa, kama ilivyokuwa. Hivyo katika mwisho, mpango huu mara tu gorofa ya nje flaw. Ilikuwa ni mpango buggy. Na zinahitajika kuwa fasta. Na njia pekee, kwa kweli, kurekebisha itakuwa, kwa mfano, mstari huu, ambayo sisi hawakuwa hata kupata, kwa sababu mpango wa kugonga mapema mno. Lakini kama sisi walikuwa na kurekebisha hili, nini athari gani kufanya y x sawa na? Naam, ni kimsingi anasema y katika chochote thamani x ni akizungumzia katika. Hivyo katika hadithi Nick ya, au hadithi Binky ya, wote x na y walikuwa akionyesha chunk nyeupe ya kumbukumbu, hivyo kwamba, hatimaye, wakati wewe je nyota y sawa na 13 tena, wewe kuishia kuweka 13 katika eneo sahihi. Basi wote wa mistari haya ni kikamilifu halali, ila kwa ajili ya hii moja, wakati kilichotokea kabla ya kweli kwa ajili y baadhi ya thamani. Sasa nashiriki, huna lazima nizungumze kwa njia zote wa aina hii ya masuala juu yako mwenyewe. Hebu kwenda mbele na kufungua up window terminal hapa na kufungua, kwa muda tu, mpango super short kwamba pia ni aina ya pointless. Ni mbaya. Ni haina kufikia kitu chochote muhimu. Lakini haina kuonyesha masuala ya kumbukumbu, hivyo hebu kuchukua kuangalia. Kuu, super rahisi. Ni inaonekana wito kazi, f, na kisha anarudi 0. Ni aina ya ngumu kwa fujo hii up. Hivyo Kuu ni nzuri, hivyo mbali. Hivyo f ni tatizo. Na tu hakuwa na kuweka kiasi juhudi katika kumtaja ni hapa, kuweka umakini juu ya kanuni. f ina mistari miwili. Na hebu angalia nini sasa kinachoendelea. Hivyo kwa upande mmoja here-- na napenda kufanya hii inaendana na uliopita example-- kwa upande mmoja, upande wa mkono wa kushoto ni kufanya nini, kwa Kiingereza? Ni is-- Watazamaji: Kujenga pointer. DAVID J. Malan: Kujenga pointer kwa int na kuiita x. Hivyo ni kujenga moja ya masanduku wale Mimi kuendelea kuchora juu ya screen ya kugusa. Na sasa, juu ya mkono wa kulia upande, malloc, bila shaka, ni kugawa chunk ya kumbukumbu. Na tu kuwa wazi, jinsi kumbukumbu kiasi gani ni inaonekana kugawa, kama wewe tu aina ya kufanya hesabu hapa? Hivyo ni 40 ka. Nami najua kuwa tu kwa sababu mimi najua int, juu ya CS50 appliance, angalau, ni ka nne. Hivyo mara 10 4 ni 40. Hivyo hii ni hifadhi ya x, anwani ya nje ya kwanza ya 40 ints kwamba zimetengwa nafasi nyuma, kwa nyuma, kwa nyuma, kwa nyuma. Na kwamba ni nini muhimu kuhusu malloc. Haina kuchukua kumbukumbu kidogo hapa, kidogo hapa, kidogo hapa. Ni anakupa chunk moja ya kumbukumbu, contiguously, kutoka uendeshaji mfumo. Sasa nini kuhusu hili, x bracket 10 sawa na 0? Holela mstari wa kanuni. Ni haina kufikia kitu chochote muhimu. Lakini ni ya kuvutia, kwa sababu x bracket 10--? Yeah? Watazamaji: [inaudible]? DAVID J. Malan: x bracket 10 haina kuwa null. null undani tu anakuja katika kucheza na masharti, mwishoni mwa kamba. Lakini wazo nzuri. Jinsi kubwa ni safu hii, hata ingawa nimekuwa zilizotengwa 40 ka? Ni kwa njia ya tisa 0, haki? Ni 10 ints, jumla. 40 ka, lakini 10 ints, indexed 0 kupitia 0. Hivyo ni kwamba x bracket 10 nini? Ni kweli baadhi jamii haijulikani thamani ya takataka. Ni kumbukumbu hiyo haina mali yangu. Mimi haipaswi kugusa kwamba Byte idadi 41, 42, 43, 44. Mimi nina kwenda kidogo mbali sana. Na hakika, kama mimi kukimbia hii mpango, ili vizuri sana ajali. Lakini wakati mwingine, tutaweza kupata bahati. Na hivyo tu kuonyesha Haya na kusema ukweli, huwezi kujua kabla ya je it-- hebu kukimbia hii. Haikuwa kweli ajali. Lakini kama mimi kubadili hali hii, kwa mfano, kuwa kama 1,000, kufanya kweli hii makusudi, hebu angalia kama tunaweza kupata ajali wakati huu. OK, haikuwa ajali. Vipi kuhusu 100,000? Hebu remake yake, na sasa rerun yake. OK. Phew. Wote haki. Hivyo inaonekana, tena, hizi makundi ya kumbukumbu, hivyo kusema, ni sababu kubwa, hivyo tunaweza kupata bahati tena na tena. Lakini hatimaye, mara moja kupata ridiculous na kwa kweli kwenda mbali nje ya screen, wewe kugusa kumbukumbu kwamba kwa kweli, kweli haina ni yako. Lakini kusema ukweli, hizi aina ya mende ni kwenda kuwa vigumu na vigumu kufikiri juu yako mwenyewe. Lakini nashiriki, kama programmers, tuna zana kwamba kuruhusu sisi kufanya hili kwa ajili yetu. Hivyo hii ni, pengine, moja wa mipango ya ugliest, hata uglier ya pato GDB ya. Lakini daima ina line au mbili ambazo ni super muhimu. Valgrind ni programu ambayo husaidia wewe si Debug mpango, per se, lakini kupata kumbukumbu-kuhusiana matatizo, hasa. Itakuwa moja kwa moja kukimbia code yako kwa wewe na kuangalia kwa mambo mawili. Moja, je, kufanya kitu ajali kama kugusa kumbukumbu kwamba hakuwa na mali yenu? Ni itakusaidia kupata kesi hizo. Na mbili, itasaidia kupata kitu kinachoitwa uvujaji kumbukumbu, ambayo tuna kupuuzwa kabisa, naively, kwa baadhi ya wakati na blissfully. Lakini zinageuka, kila wakati huu, wakati wowote umetumia GetString katika hivyo, wengi wa mipango yetu, wewe ni kuuliza uendeshaji mfumo kwa kumbukumbu, lakini una kumbukumbu yoyote ya milele kutoa ni nyuma, kufanya unalloc, au bure, kama ni kuitwa. Hapana, kwa sababu tumekuwa kamwe aliuliza wewe kufanya hivyo. Lakini muda wote huu, mipango tumekuwa kuandika katika C wamekuwa kinachovuja kumbukumbu, kuuliza uendeshaji mfumo kwa zaidi na zaidi kumbukumbu kwa masharti na whatnot, lakini kamwe kuikabidhi nyuma. Na sasa hii ni kidogo ya kurahisisha, lakini kama wameweza milele kukimbia Mac yako au PC yako kwa muda kabisa, ufunguzi kura ya mipango, labda kufunga programu, na hata kama wako kompyuta hana kugonga, ni kupata hivyo polepole sana, kana kwamba ni kweli kutumia mengi ya kumbukumbu au rasilimali, ingawa, kama wewe si hata kugusa keyboard, ambayo inaweza be-- lakini si always-- inaweza kuwa mipango wewe ni mbio kuwa wao wenyewe na uvujaji kumbukumbu. Na wao kuendelea kuuliza OS kwa zaidi na zaidi ya kumbukumbu, lakini kusahau kuhusu hilo, si kweli kutumia, lakini kwa hiyo kuchukua kumbukumbu mbali na programu nyingine ambao wanaweza kutaka yake. Hivyo hiyo ni maelezo ya kawaida. Sasa hapa ni ambapo Valgrind ya pato ni kabisa mauaji kwa wale chini na vizuri zaidi sawa. Lakini ya kuvutia mambo ni haki hapa. Ni ananiambia kuandika batili ya ukubwa nne kinachotokea katika mpango huu, hasa, katika mstari wa 21 ya memory.c. Kama mimi kwenda kwa mstari 21, hm, kuna kweli ni kuandika batili ya ukubwa nne. Kwa nini ukubwa nne? Naam, hii number-- na inaweza kuwa anything-- ni int. Hivyo ni ka nne. Hivyo mimi nina kuweka ka nne ambapo wao si. Hiyo ni nini Valgrind ni kweli kuniambia. Aidha, itakuwa pia kuniambia, kama tutaweza kuona, kama wewe kukimbia hii katika pset siku zijazo, kama na wakati ve kuvuja kumbukumbu, ambayo kwa hakika Mimi, kwa sababu nimekuwa inayoitwa malloc, lakini nina si kweli kuitwa, katika kesi hii, huru, ambayo tutaweza hatimaye kuona ni kinyume cha malloc. Hivyo sasa, nadhani, Mfano wa mwisho. Hivyo hii moja kidogo zaidi arcane, lakini ni labda sababu kubwa kwa kuwa makini na kumbukumbu, na mipango ya sababu kwamba wengi na / au servrar mtandao, hata siku hii ya leo, ni yamechukuliwa na wabaya mahali fulani kwenye mtandao ambao ni kwa namna fulani kutuma packets bogus kwa server yako kujaribu maelewano akaunti yako, au kuchukua data yako, au tu kwa ujumla kuchukua juu ya mashine. Buffer kufurika, kama jina la kupendekeza, njia wingi si int, lakini buffer. Na buffer ni njia tu dhana ya kusema ni rundo la kumbukumbu. Na hakika, mimi kuitwa kamba kabla ya buffer, badala ya s. Kwa sababu kama ni buffer, kama katika akili YouTube, au wakati wowote wewe ni kuangalia video, unaweza kuwa na kuonekana neno buffering, dot, dot, dot. Ni incredibly annoying. Na kwamba tu ina maana kuwa mchezaji video yako ni kujaribu kushusha kura ya ka, kura ya ka kutoka video kutoka katika mtandao. Lakini ni polepole, hivyo ni kujaribu download rundo la yao kujaza buffer, chombo, ili una ka kutosha kwamba unaweza kisha kuonyesha video, bila pausing mara kwa mara. Lakini zinageuka, unaweza na buffer kwa hii kubwa. Lakini kujaribu kuweka hii data sana katika yake, na sana mambo mabaya yanaweza kutokea. Hivyo kwa mfano, hebu tuangalie teaser hii ya mwisho ya mfano. Hii ni mpango mwingine kwamba, katika mtazamo wa kwanza, haina kufanya kitu chochote super muhimu. Ni got Kuu ya kazi kwamba wito kazi hiyo, f. Na kazi hiyo, f, hapa juu, ina char safu, iitwayo c, ukubwa 12. Na kisha ni kwa kutumia hii kazi mpya iitwayo strncpy. Ni zinageuka kuwa, pamoja na hii rahisi, rahisi mstari wa kanuni, mistari miwili tu, tumefanya mpango wangu nzima, na kwa hiyo, kompyuta yangu yote, na user akaunti yangu, na ngumu wangu gari uwezekano wa mazingira magumu kwa mtu yeyote ambaye anajua na ni nzuri ya kutosha ya kuendesha mpango huu na baadhi ya mstari amri hoja. Kwa maneno mengine, kama hii guy mbaya unaweka ndani ya argvargv [1] na kuandika katika keyboard hasa crafted sana kamba, si abc, 123, lakini kimsingi, alama binary kwamba kuwakilisha executable code, mpango kwamba yeye au yeye aliandika, na mpango huu rahisi, ambayo ni mwakilishi wa maelfu ya programu kwamba ni vile vile katika mazingira magumu, daresay, yeye au yeye inaweza hatimaye kufuta yote files kwenye gari yangu ngumu, kupata blinking haraka hivyo kwamba yeye au yeye anaweza aina amri juu yao wenyewe, email files kila mmoja kwangu. Kitu chochote ambacho siwezi kufanya, yeye au anaweza kufanya na kanuni hii. Sisi si kabisa kutatua hii bado. Na kwa kweli, ni kwenda kwa kuhusisha picha kidogo kama hii, ambayo tutaweza karibuni kuja kuelewa wote bora. Lakini kwa leo, hebu mwisho juu ya nini, hopefully, kidogo zaidi kueleweka XKCD utani, mpaka sisi kuendelea mara ya pili. Wote haki. Angalia wewe juu ya Jumatano. [MUSIC KUCHEZA] SPIKA: Na sasa, kina mawazo, na Daven Farnham. Kumbukumbu ni kama kuruka ndani ya rundo la majani ya dhahabu juu ya Jumapili alasiri. Upepo unavuma, tossing yako hair-- oh, I miss siku when-- [Kicheko]