[Mūzikas atskaņošanai] DAVID J. Malan: Nu labi. Tas ir CS50. Un tas ir sākums nedēļas 5. Un kā jums var būt ievērojuši, daži no materiāla kļūst nedaudz vairāk sarežģīts, maz blīvāks. Un tas ir ļoti viegli, jo īpaši, ja jūs esat bijis ieradums kādu laiku, , ir mēģināt ķeburs leju visvairāk kaut ko mēs darām, mēs esam sakot klasē. Bet saprast, ka nav iespējams ideāls pedagoģiskā pieeja mācīšanās šāda veida materiālu, un materiāli kopumā. Un tāpēc mēs esam priecīgi paziņot, ka CS50 pašu Gheng Gong ir sākusi sagatavot kanonisko kopums piezīmes kursam, cerība kas ir tā, ka viens, šie kalpo ne tikai kā atsauce un resurss pārskatīšanai materiālu un dodas atpakaļ caur materiāla, kas varētu būt izbēguši jums pirmo reizi apkārt, bet arī tāpēc, ka jūsu galvas var būt vairāk uz augšu nekā uz leju, kad to runa ir laiks, lekciju, lai jūs varētu iesaistīties vairāk domīgi, jo pretstatā vairāk scribbly. Ar to teica, tas, ko jūs atradīsiet par mājas lapa ir šādi dokumenti, jo tas. Un paziņojums, kreisajā augšējā stūrī, tur ir ne tikai satura, bet arī laika kodi uzreiz lēkt jums uz attiecīgo daļu šajā video tiešsaistē. Un ko Chang šeit ir paveicis ir, būtībā, dokumentēts kas notika šajā īpaši lekcija. Un daudzi no lekcijām ir jau ir tiešsaistē tagad ar šo URL. Un mēs turpināsim to post atlikušo no tām, kuras nedēļas beigām, tāpēc izmantot šo resursu. Tātad bez papildu ADO, mēs sākām lobīties atpakaļ slānis, kas ir bijis string kādu laiku. Un ko mēs sakām virkni patiesībā ir pagājušajā nedēļā? Tik char zvaigzne. Un char zvaigzne, labi, kādi bija, ka īsti nozīmē? Nu, visu šo laiku, ja mēs esam aicinājuši funkciju, piemēram getString un uzglabāšanai tā sauktās atgriešanās vērtība getString in variable-- tā sauc s tips string-- mēs esam rakstiski līnija koda tur augstāk. Un tas ir tikai tad, kad es redzu manu rokraksts šeit palielināts es varu saprast, cik šausmīgi tas ir. Taču pieņemsim, ka, uz labajā pusē ir, tomēr saprātīgs attēlojums, kas ir nu jau tas viss laiku ar getString. getString, protams, saņem virkni. Bet ko tas īsti nozīmē? Tas nozīmē, ka tā izpaužas rieciens atmiņas no operētājsistēmas zvanot funkciju, ko sauc malloc. Bet vairāk par to vēlāk. Un tad tas aizpilda ka rieciens atmiņas ar burtiem lietotājam ir ierakstījāt, kam seko, protams, null raksturs, vai slīpsvītru nulle pašās beigās. Tikmēr kreisajā pusē šajā stāstā, visu šo laiku, mēs esam deklarējot mainīgo, piemēram, s. Un, ka mainīgais ir tas, ko tagad sāks aicinot rādītāju. Tas nav kastē iekšā kas mēs uzdodam virkni, Daven, per se, bet mēs ieliekam šajā laukumā kaste pa kreisi, ko tieši? Yeah? AUDITORIJA: of adrese kur tas atrodas atmiņā. DAVID J. Malan: Tieši tā. , Kur Daven adrese atrodas atmiņā. Un nav, ja visi Daven atrodas, per se, bet īpaši adresi par ko? Yeah? AUDITORIJA: First raksturs. DAVID J. Malan: pirmā zīme in Daven, kura, šajā gadījumā, Man ieteica bija patvaļīgi un nereāli 1, OX1, kas tikai nozīmē, heksadecimālais skaits 1. Bet tas ir iespējams, gatavojas būt daudz lielāks skaits ka mēs varētu izdarīt ar 0x kā prefiksu, pārstāv heksadecimālo raksturs. Un tāpēc, ka mums nav nepieciešams zināt, kur pārējie rakstzīmes Daven ir, jo to, ko vienkāršs dizains lēmums, kas tika pieņemts pirms daudziem gadiem? Yeah? AUDITORIJA: reversā slīpsvītra 0. DAVID J. Malan: Jā, tieši tā. Slīpsvītru 0 ļauj jums, lai gan lineārā laika, lai šķērsotu virkni, gājienā no kreisās uz labo, ar par cilpu, vai uz brīdi cilpa, vai kaut kas tamlīdzīgs ka, un noteikt, oh, šeit gals ir šajā konkrētajā virkni. Tātad tikai adresi, sākums virknes, mēs varam piekļūt veselumu tas, ka visu šo laiku, string tikko ir char zvaigzne. Tātad, tas ir, protams, naudas sods, lai turpinātu izmantot CS50 bibliotēku, un tas abstrakcija, tā teikt, bet mēs sāk redzēt, tieši kas ir bijis notiek zem visu šo laiku. Lai jūs varētu atgādināt šo piemēru, Arī no pēdējo reizi salīdzināt 0, , kas nav reāli salīdzināt. Bet mēs sākām, lai atrisinātu šo. Bet kā varbūt atsvaidzināšanas, Es varētu interesēt kādu rozā ziloni šodien arī veic Chang? Kā par jums priekšā? [Nedzirdama]. Nāciet uz augšu. Un tajā pašā laikā, kā jūs nākt klajā, pieņemsim izskatīt tikai brīdi, ko šis kods faktiski dara. Tas ir deklarēt divus mainīgos augšu top, s un t, un aicinot getString. Tas nav ļoti draudzīga programma jo tas nav pateikt, ko darīt. Bet pieņemsim tikai pieņemt, mēs esam koncentrējoties uz sulīgs puses. Un tad mēs, ja s vienāds vienāds t, tai vajadzētu teikt printf, jūs ierakstījāt to pašu. Sveiki. Kāds ir tavs vārds? Janelle: Janelle. DAVID J. Malan: Janelle, nice to meet you. Tātad jūsu uzdevums pie roku šai zilonis ir vispirms izdarīt mums priekšstatu par to, kas ir attēlot tiem pirmie divi līnijas. Tik s un t varētu būt pārstāvētas, kā uz ekrāna? Un jūs varat vienkārši izdarīt to ar pirkstu uz šo lielo ekrānu. Tātad tur ir divas puses, lai katra puse no šī vienādojuma. Tātad tur ir s pa kreisi, un tad getString labajā pusē. Un tad tur ir t pa kreisi, un tad getString labajā pusē. Tātad, kā mēs varbūt sākt zīmēšanas attēlu, kas atspoguļo to, kas notiek šeit atmiņā, jūs teiktu? Un ļaujiet man jums paskaidrot ko jūs darāt, kā jums iet. Janelle: OK. Nu, pirmkārt, tas būtu jautā Jums iegūt ieejas virkni. Un tas store-- oh, sorry. DAVID J. Malan: OK. Labs. Un to sauc par ko? Ak, OK. Uzglabāt iet. Es negribēju pārtraukt. Janelle: Sorry. Tātad, tas būtu ieguldījums to adrese of-- nav pārliecināts. Es nevaru precīzi atcerēties numuru, bet es uzskatu, ka tas bija, sākot ar 0. DAVID J. Malan: Tas viss ir labi, tāpēc, ka es skaitu uz augšu, tāpēc nav pareizā atbilde. Janelle: Sākot ar 0 loka. DAVID J. Malan: Labi, tā elements 0. Pārliecināts. Janelle: Un tad, ja ir piemēram, tikai divu letter-- DAVID J. Malan: Labi, atpakaļ uz jums. Janelle: Tātad elements 0, un tad elements 1 vai elements 2. DAVID J. Malan: Un kas gabals attēlu jūs zīmēšanas tieši tagad? Aicinājums getString? Vai deklarācija s? Janelle: deklarācija no s, es uzskatu. Ak, getString, jo tas būtu ievadīšana katrā [? zona. ?] DAVID J. Malan: Labi. Tieši tā. Pat ja tas reāli atgriež masīvs, atgādināt, kad mēs saņemam atpakaļ virkni, mēs varam indekss vērā, ka virknē, izmantojot 01 un 2. Tehniski, tie, iespējams, ir pārstāv atsevišķu adresēm, bet tas ir jauki. Tātad pieņemsim, ja es varu tikai ātri nosūtīt kur mēs left off pēdējā laikā, tad, ja viena no stīgas bija g b e, slīpsvītru 0, tādējādi pārstāvot gabe s ievadi, kā varētu mēs pārstāvam s tagad? Ja tas ir atmiņu, kas ir atdota ar getString? Janelle: Vai tas būtu pārstāv loka? DAVID J. Malan: Ar loka? Nu, nē. Pieņemsim tikai teikt, gleznieciski, ļaujiet man tikai iet uz priekšu un ierosina, ka, ja tas ir s, tas ir atgriešanās vērtība getString. Un jums izdarīt to kā 0, 1, 2, kas ir pilnīgi pamatota, jo mēs var indekss vērā virkni, kā tādu. Bet tikai, lai tie atbilstu pēdējo reizi, ļaujiet man iet uz priekšu un patvaļīgi ierosinās šo ir adrese 1, tas ir adrese 2, tas ir adrese, 3, un tā tālāk. Un tā, tikai, lai būtu super skaidrs, kas notiek iet s, kā rezultātā, kas pirmajā rindā kodu, jūs teiktu? Janelle: Adrese 1? DAVID J. Malan: Tieši tā. Tā adrese 0x1. Un tikmēr, ļaujiet man iet uz priekšu un dublēt daudz no tā, ko jūs esat darījuši un pievienot savu t šeit. Ja es būtu rakstīt Gabe atkal, otrreiz kad tiek piedāvāts ar getString, kur, protams, ir Gabe gatavojas doties? Nu, presumably-- Janelle: Tāpat kā šeit? DAVID J. Malan: Jā. Janelle: Vai tas ir arī tajās pašās? DAVID J. Malan: Ļaujiet man ieteikt, jā, tieši tā, tāpēc šo papildu kastēs. Bet kas ir galvenais šobrīd ir tas, ka, pat lai gan es esmu sastādīts šos diezgan tuvu together-- 0x1, šis ir 0x2-- realitātē, tagad tas varētu būt adresi 0x10, Piemēram, un 0x11 un 0x12, un tā tālāk. Un tā, ja tas ir gadījumā, kas notiek, lai galu galā šeit t? Janelle: 0x10? DAVID J. Malan: Tieši tā. Tātad 0x10. Un tāpēc tagad, pēdējais jautājums. Jūs, neapšaubāmi, bija jāstrādā vissmagāk par ziloni līdz šim. Līdz šim, ja es uzvilkt kodu atkal, kad es daru, atbilst trīs, ja s vienāds vienāds t, ko es esmu patiešām salīdzinātu, ka mēs esam izdarīt šeit? Janelle: Abi adreses? DAVID J. Malan: Tieši tā. Tāpēc es saku, ir s vienāds vienāds ar t? Citiem vārdiem, ir 1 vienāda vienāds ar 10? Un, protams, Acīmredzama atbilde tagad ir, nav. Un tāpēc šī programma ir galu galā gatavojas drukāt, ko Jūs teiktu? Janelle: Vai tas būtu, jūs ierakstījāt to pašu? DAVID J. Malan: Tātad, ja s ir 1, un t ir 10? Janelle: Tu drukāti dažādas lietas. DAVID J. Malan: Tieši tā. Jūs ierakstījāt dažādas lietas. Viss labi. Tātad kārta aplausi, ja mēs varētu, šeit. [Aplausi] Tas bija sāpīgi. Es zinu. Labi darīts. Tātad tagad pieņemsim redzēt, ja mēs nevaram ķircināt izņemot kāda fix bija. Un, protams, kad mēs fiksēts this-- ko es ņemšu tagad pārstāvu green-- mēs darījām pāris uzlabojumiem šeit. Pirmkārt, tāpat kā vesels saprāts pārbaudiet, es esmu pirmā pārbaude ja s vienāds spēku un t vienāds null. Un tikai, lai būtu skaidrs, kad varētu s vai t ir spēkā koda līdzīgs šim? Kad varētu s vai t būt nulle. Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. Ja virkne, ka lietotājs drukāti ir pārāk garš lai ietilptu atmiņā, vai kādu dīvaini stūra gadījums, piemēram, ka, getString, kā mēs redzēsim, burtiski šodien, tā dokumentāciju, saka tā atgriezīsies null kā īpašu sargs vērtība, vai vienkārši veida īpašs simbols tas nozīmē, ka kaut kas nogāja greizi. Tāpēc mēs vēlamies, lai pārbaudītu ka, jo izrādās ka null ir ļoti bīstams vērtību. Bieži vien, ja jūs mēģināt kaut ko darīt ar null iesaistot function-- iet to kā ievade, lai instance-- šo funkciju varētu ļoti būs crash, un ar to, ņemtu nosaka jūsu visu programmu. Tātad šis trešais rindā tagad ir tikai vesels saprāts pārbaudiet, kļūdu pārbaudi, ja Jums gribas. Tas ir labs ieradums tagad mums nokļūt jebkurā laikā mēs mēģināt izmantot vērtību, kas , varētu, iespējams, būt nulle. Tagad, ceturtajā rindā šeit "Ja strcmp (s, t)," labi, to, kas ir, ka atsaucoties uz? Nu, mums teica, ka tas bija ļoti kodolīgi nosaukts funkcija stīgu salīdzinājumu. Un tās mērķis dzīvē ir, lai salīdzinātu tā pirmais arguments pret to, otrkārt, bet ne uz to adreses, kā mēs to darījām netīšām brīdis Pirms ar sarkanu kodu, bet drīzāk, lai salīdzinātu šos divus virknes cilvēcīgi intuitīvi veids, salīdzinot to, pret to, pret to, pret to, un tad apstāšanos, ja un kad vai abiem maniem pirkstiem hits slīpsvītru 0. Tātad pirms kāds gadus īsteno strcmp īstenot mums funkcionalitāte ka mēs cerējām mēs būtu gotten , tikai salīdzinot divus vienkāršus vērtības. Tagad godīgi sakot, es glabāt zīmējumu visas šīs dažādās skaitļiem. Bet realitāte ir tāda, es esmu bijis padarot tās veido visu laiku. Un tāpēc ļaujiet man tikai iet uz priekšu un ķeburs šos out lai punktu, ka beigās dienu un virzās uz priekšu, mēs īsti gatavojas rūp kādi adreses lietas ir patiesībā atmiņā. Tāpēc es neesmu gatavojas izdarīt šos veidu skaita tik daudz vairs, Es esmu tikai abstrakta šo prom mazliet vairāk draudzīgs tikai ar bultiņām. Citiem vārdiem, ja S ir rādītājs, labi, pieņemsim tikai izdarīt to, burtiski, kā rādītājs, bulta no pati uz kaut ko citu, un nav jāuztraucas pārāk daudz vairāk par minutia no šīm adresēm kas, atkal, es veido vienalga. Bet mēs redzēsim šīs adreses, Dažreiz, kad debugging kodu. Tagad tikmēr, šī programma šeit labojumi, protams, ka problēma salīdzinot šie divi stīgas. Bet mēs uzbrauca citu problēmu. Tas bija no kopijas programmēt pēdējo reizi, kuru, es centos kapitalizēt tikai pirmais simbols virknē. Bet to, kas bija simptoms mēs redzējām pēdējo reizi lietotājs ierakstījāt vērtību, piemēram, Gabe ar mazajiem, lai s, tad mēs piešķirts s uz t, kā trešajā rindā tur, un tad es mēģināju kapitalizēt t kronšteinu 0? , Kas bija efekts mainot t kronšteinu 0 šeit? AUDITORIJA: Tā ir mainījusi s. DAVID J. Malan: Jā, Es izmainīju s, kā arī. Tāpēc, ka to, kas īsti notiek? Nu, ļaujiet man redzēt, ja es varētu tīrīt up šo attēlu, šādi. Ja s ir, atkal, vārds g, a, b, e, slīpsvītra, 0 un S mēs turpināsim zīmējumu kā kastē šeit, bet ne vairāk adreses. Pieņemsim apstāties padarot lietas uz augšu. Pieņemsim tikai uzzīmēt vienkāršot pasauli. Kad es apliecinu, t ar stīgu t, kas rada šo rieciens atmiņas. Square notiek, ir 32 biti vairumā datoriem. Patiesībā, ja jūs esat kādreiz dzirdējuši par dators ar 32 bitu arhitektūru, tiešām fancy-runā, ka tikai nozīmē, ka tā izmanto 32-bitu adreses. Un kā tehnisku malā, ja jūs esat kādreiz domājuši kāpēc vecākiem datoriem, ja jūs faktiski mēģināja zupa tos ar daudz RAM, varēja tikai maksimālais četru gigabaitu RAM, labi, ka ir, jo, burtiski, savu veco datoru varētu tikai skaitās kā augsta kā 4 miljards, 4 miljardi baiti, jo tas bija, izmantojot 32-bit numuri adresēm. Bet jebkurā gadījumā, jo tas Piemēram, stāsts ir daudz vienkāršāk. t ir tikai vēl viens rādītājs, vai tiešām char zvaigzne, aka stīgu. Un kā es gribu, lai atjauninātu šo attēlu tagad ar šo otro rindiņu kodu, pēc dot, dot, dot? Kad man stīgu t vienāds s semikolu, kā tas aina mainās? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Jā. Tieši tā. Es tikko likts bultu no t kaste uz to pašu adresi, pats pirmais burts deva. Vai tehniski, ja tas puisis vēl bija 0x1, tas ir tā, it kā man bija 0x1 šeit un 0x1 šeit. Bet atkal, kas rūpējas par adresēm? Tas ir tikai ideja, ka tagad svarīgi. Tātad, tas ir tas, kas notiek šeit. Tātad, protams, ja tu dari t kronšteinu 0, kas ir masīvs apzīmējums, no course-- un godīgi sakot, tas izskatās kā tur ir masīvs nekā šeit, bet tagad tur ir tas dīvaini lieta. Zināt, ka programmēšanas valodu, C, piedāvā šo funkciju, , saskaņā ar kuru, pat tad, ja t ir rādītāju, vai i ir rādītājs, Jūs joprojām varat izmantot, ka pazīstami, ērts kvadrātiekava notācija doties uz pirmo elementu, vai otrais elements, vai kāds no elementiem ka šis rādītājs ir vērsta līdz, jo, iespējams, to ir, kā šajā gadījumā, norādot kādā masīvs. Tātad, kā mēs varam noteikt šo? Atklāti sakot, tas ir, ja tas got nedaudz milzīgs pie pirmā acu uzmetiena. Bet šeit ir jauna un uzlabota versija. Tātad, pirmkārt, es saņemu atbrīvoties no CS50 bibliotēkas, tikai, lai atklātu, ka viņam ir patiešām char zvaigzne, tikai sinonīms. Un t ir arī char zvaigzne. Bet to, kas notiek uz labajā pusē no minētās līnijas kur t ir piešķirta vērtība? Kas ir malloc? Kas tas ir strlen? Kas ir sizeof (char)? Kāpēc heck dara līnija izskatās tik sarežģīti? Ko tas dara augstā līmenī? Kas tas uzglabāt t? Yeah? AUDITORIJA: Tas ir piešķirot zināma atmiņas vietas. Tas ir, lai uzglabātu, es domāju, burti [nedzirdama]. DAVID J. Malan: Perfect. Perfekta. Tas piešķirot noteiktu daudzums atmiņas telpa uzglabāt, iespējams, nākotnes vēstules. Un jo īpaši, malloc Tāpēc atgriežas ko? AUDITORIJA: Atgriežoties uz [nedzirdama]? DAVID J. Malan: Tieši tā. Atgriežoties adresi šīs atmiņas, kas ir iedomātā veids, kā pateikt, atgriež adresi Pirmais baits šīs atmiņas. Pienākums ir man atcerēties cik daudz atmiņas man tiešām piešķirti vai lūdza malloc par. Tagad, cik daudz tas ir? Nu, kaut arī tur ir daudz iekavās šeit malloc aizņem tikai vienu argumentu. Un es esmu norādot strlen no s, lai dotu man tik daudz baiti, kā tur ir s, bet pievienot vienu. Kāpēc? Yeah? AUDITORIJA: slīpsvītru 0. DAVID J. Malan: Tieši tā. Mēs esam ieguvuši, lai darīt nedaudz mājturība. Tāpēc, ka tur ir slīpsvītru 0, mēs labāk atcerēties. Pretējā gadījumā mēs ejam izveidot virkni, kas nav, ka īpaša terminators. Tikmēr, tikai, lai būtu super anālais, man ir sizeof (char), tikai gadījumā, ja kāds iet MY kods nav uz CS50 ierīces, bet varbūt atšķirīgs dators kopā kur simboli ir viens baits, pēc vienošanās, bet divi baiti, vai kaut kas lielāks nekā. Tas ir vienkārši, lai būtu super, super izvairās kļūdas. Kaut gan, patiesībā, tas ir visbiežāk būs 1. Tagad, tikmēr, man iet uz priekšu un kopēt string, t kronšteins i vienāds t bracket s. Un es piekāpjas pagājušajā nedēļā avota kodu, lai redzētu, kas notiek. Bet galvenais takeaway, un Iemesls Man kodu tagad zaļā krāsā, ir tāpēc, ka ļoti pēdējā rindā, t kronšteins 0 vienāds toupper, ir sekas gūstot kas string? T, un / vai i? Ka pēdējā rindā kodu. Tikai t, jo tas, kas ir notika šoreiz, ja es mazliet atsaukt šo pēdējo soli, to, kas ir noticis, ir, kad es aicinu malloc, Man būtībā saņemt rieciens atmiņas kas ir tāda paša izmēra kā oriģinālam, jo tas ir aritmētiskā es to darīju. Es esmu uzglabāt t adresi Minētā rieciens atmiņas. Pat ja tas izskatās jauki un skaista, jauka un tukšs, realitāte ir tur, ko mēs ņemšu saglabāt zvanot, atkritumu vērtības šeit. Ka rieciens atmiņas varētu ļoti arī ir tikusi izmantota iepriekš, dažas sekundes, pirms dažām minūtēm. Tātad pilnīgi varētu būt skaitļi vai burti tur, tikai nejauši. Bet viņi nav derīgs, kamēr es pats aizpildīt šo rieciens atmiņas ar faktiskajām rakstzīmēm, kā es darīt, ka cilpa tur. Labi? Tāpēc tagad, kulminācija šie trīs piemēri , kas bija šķietami sadalīti pēdējo reizi, šis Swap Piemēram, šī funkcija strādāja nozīmē ka samainās a un b. Bet tas nestrādāja kādā citā ziņā? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. Ja es būtu, lai izsauktu šo funkciju no another-- piemēram, no funkciju, piemēram, galvenais, kur Man ir mainīgs, x un y, kā I darīja pagājušajā nedēļā, tas pats kods, un es pass x un y līdz Swap, un tad zvana Swap-- tas, protams, ir pareizais variants ir tas, ko mēs esam par to, lai see-- tas nestrādāja. Tātad, kas ir noteikt? Nu, tāpēc, tikai, lai būtu skaidrs, ļaujiet man iet uz priekšu and-- dod man vienu otru šeit, un redzēt ja es varu parādīt jums pēdējais, kas Būs in-- pieņemsim redzēt, ja es varētu atrast tas ir reāls fast-- OK, [nedzirdama]. Labi, tur tas ir. Tātad ignorēt komandas es esmu tikai rakstīt. Es gribu, lai ielādētu pie pēdējā minūte piemērs no pēdējo reizi, kas tagad sauc nē Swap. Līdz ar to nav Swap ir vieta, kur mēs left off pēdējo reizi, saskaņā ar kuru, es inicializēts x ir 1 un Y ir 2. Tad es aicinu Swap, kas iet 1 un 2. Un tad šī funkcija strādāja kādā ziņā, bet tas nebija pastāvīga Ietekme uz x un y. Tātad jautājums pie rokas ir, kā tagad mēs faktiski noteikt šo problēmu? Kāds ir risinājums, pie rokas? Nu, kas swap.c, kas ir jauns šodien pamanīt pāris atšķirības. X un Y ir vienādi. Bet kas ir skaidri atšķirīgs par līnijas 25? Kas jauns tur, ja jūs atceraties kas tas izskatījās kā otrs atpakaļ? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Jā. Tātad ampersands ir jauns gabals no sintakse ne tikai šajā programmā, bet arī vispārīgāk CS50. Līdz šim, es nedomāju, ka mēs esam redzējuši nevienu piemēru vai tiešām runāja par viņiem jebkurā detaļa, izņemot, varbūt, preemptively iedaļā, Ampersand kā šis. Nu, izrādās Ampersand ir viens pēdējo gabalu jaunā sintakse mēs ejam mācīties. Viss, tas nozīmē, adrese kādu mainīgā. Pēc kāda adrese nav x dzīvot? Bet ko adrese tas y dzīvot? Jo, ja pamatproblēma pirms tika, ka x un y tika nodots kā kopijas, ko mēs patiešām vēlamies darīt ir nodrošināt Swap ar kā dārgumu karte, kas noved pie ja x un y faktiski ir RAM, tā ka Swap var sekot šo karti un doties, kur vien x vai y iezīmē vietas un mainīt faktiskās vērtības 1 un 2 tur. Tātad Swap jāmaina nedaudz too. Un pēc pirmā acu uzmetiena, tas var likties mazliet līdzīgs char zvaigzni. Un tas patiešām ir. Tāpēc ir pointers uz kāda veida datu pamatojoties uz šo iezīmētā daļu? Tātad, tas ir int. Tātad vairs int, tas ir adrese int. Un tāpat, b tagad gatavojas būt adresi int. Tātad, kad es tagad aicinu Swap no Main, Es neesmu gatavojas sniegt Swap 1 un 2. Es esmu gatavojas sniegt to kā Ox-kaut un Vērsis-kaut ko, divas adreses, kas novedīs Swap to faktiskajiem vietās mana datora atmiņā. Tāpēc tagad, mans paliekot īstenošana jāmaina a tad. Kas, protams, savādāka Šajās trīs rindiņas kodu? Tur šie nopelt zvaigznes visas pār vietu, labi? Tātad, kas notiek šeit? Yeah? AUDITORIJA: Tas ir acīmredzami [nedzirdama]. DAVID J. Malan: Tieši tā. Tātad šajā context--, un tas nebija labākais dizains lēmums, protams, gadus atpakaļ. Šajā kontekstā, kur Jums vienkārši ir zvaigzne, un jums nav datu tipu, piemēram, int, uzreiz pa kreisi, vietā jums ir vienādības zīmi, skaidri, šajā kontekstā, kad jūs sakāt zvaigzne, tas nozīmē, ka iet uz adresi, kas ir kas. Sekojiet dārgumu karti, lai runāt. Un tikmēr, atbilst 37, tas nozīmē to pašu. Iet uz adresi a, un īstenot to, ko tur? Kāds ir vietu, kas b precizēts. Citiem vārdiem sakot, dodieties uz b. Saņemt šo vērtību. Iet uz un, katru vienāds parakstīt, uzdevums operators, nodot šo vērtību tur. Tāpat int temp ir tikai int. Nekas jāmaina par temp. Tas ir tikai rezerves stikls no Annenberg kādu pienu vai apelsīnu sulu. Bet man jāsaka, dodieties uz b. Iet uz šo galamērķi un ielieciet vērtību temp tur. Tātad, kas notiek pēc tam? Kad es tiešām aicinu Swap šo laiku, ja šis pirmais paplāte šeit pārstāv Main, šis otrais tray pārstāv Swap, kad Es iet Ampersand x un aizvieto & zīmes y no Main līdz Swap, tikai, lai būtu skaidrs, Kas tas ir kaudze rāmis saņemšana? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. X adrese un adrese y. Un jūs varat iedomāties šos piemēram, pasta adresēm. 33 Oxford Street un 35 Oxford Street, un jūs vēlaties pārvietot divas ēkas , kas ir šajās vietās. Tas ir sava veida smieklīgi idejas, bet tas ir viss, ko mēs saprotam ar adresi. Kur pasaulē var jums atrast šos divus ints? Kur pasaulē jūs varat atrast šīs divas ēkas? Tātad, ja beidzot, pēc visu šo laiku I iedziļināties šodienas pirmkodu un apkopot Swap un palaist ./swap, visbeidzot, lai Pirmo reizi mēs patiešām redzam, ka manas vērtības ir patiešām veiksmīgi aizstāja. Un tagad, mēs varam pat ņemt piezīmi šajā, teiksim, gdb. Tāpēc ļaujiet man iet uz pašu failu. Ļaujiet man iet uz priekšu un palaist gdb no ./swap. Un tagad, Swap, es iešu priekšu un noteikt lūzuma punktu in Main. Un tagad es iešu priekšu un palaist programmu. Un tagad mēs redzam savu kodu apstājās pie šīs līnijas. Ja es iet uz priekšu un izdrukāt x, ko man vajadzētu redzēt šeit? Tas ir jautājums. Saku vēlreiz? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tātad izlases numuri, varbūt. Varbūt man paveicās, un tas ir jauki un vienkārši, piemēram, 0. Bet varbūt tas ir daži izlases numurs. Šajā gadījumā, es saņēmu laimīgs. Tā vienkārši notiek, ir 0. Bet tas tiešām ir laime, tāpēc, ka, līdz es ierakstiet nākamo un pēc tam izdrukāt x ir, ka rindā kodu, līnija 19, tika izpildīts. Tajā pašā laikā, ja es tipa blakus atkal, un Tagad izdrukāt y, es esmu gatavojas, lai redzētu 2. Tagad, ja es tipa blakus, tas būs get nedaudz mulsinoši, jo tagad, printf gatavojas parādīties ekrāns, kā tas notika. x ir 1. Darīsim to vēlreiz. Un tagad, lūk, kur lietas iegūt interesantu. Pirms es aicinu Swap vai pat soli tajā, pieņemsim nedaudz palūrēt. x ir, atkal, 1. Y ir, protams, ātri vesels saprāts pārbaudiet, 2, tāpēc nav grūti tur. Bet kāda ir Ampersand x? Atbilde, tas ir sava veida bailīgs meklējat. Bet int zvaigzne iekavās ir tikai GDP veids, kā sakot, šī ir adrese. Tas nav int, tas ir rādītājs, lai int, vai citādi pazīstams kā adresi. Kas tas ir traks lieta? Mēs nekad neesmu redzējis kaut ko gluži tāpat, ka pirms. Tātad šī ir adrese mans dators ir atmiņa, kur x notiek dzīvot. Tas ir Ox-kaut kas. Un tas ir, atklāti sakot, kāpēc Esmu sācis zīmēšanas bultas, nevis par skaitļiem, jo, kas tiešām rūpējas ka jūsu int ir īpaši adresi, kas ir tik liels. Bet bffff0c4, tie visi Patiešām heksadecimālcipariem, , kas ir no 0 līdz f. Tāpēc mēs nebrauksim kavēties pārāk sen par to, kas šīs lietas ir. Bet, ja es izdrukāt y, Protams, es redzu 2. Bet Ampersand y, es redzu šo adresi. Un paziņojums, par ziņkārīgs, cik tālu ir x un y? Jūs varat ignorēt lielāko daļu adresi. Četras baiti. Un tas ir saskaņā ar mūsu agrāk, apgalvo, ka, cik liela ir int? Četras baiti. Tā izskatās viss ir odere augšu labi, kā jūs varētu cerēt, atmiņā. Tāpēc tagad, pieņemsim tikai ātri uz priekšu līdz beigām šo stāstu. Iesim uz priekšu un ierakstiet soli, nodoties Swap funkciju. Tagad paziņojums, ja es tipa, tas ir identiska adresei x. Ja es tipa b, tas ir identisks uz adresi y. Tātad, ko man vajadzētu redzēt, ja es teikt, dodieties uz adresi a? Tātad izdrukāt zvaigzne. Tātad zvaigzne nozīmē iet tur, šajā kontekstā. Ampersand nozīmē, kāda ir adrese. Tātad zvaigzne līdzekļus 1. Un drukas zvaigzne b dod man 2. Un ļaujiet man pieņemt, uz šo brīdi, ka vismaz kods, kas ieņēmumus izpildīt tagad var būt pamatots ar šādā veidā. Bet mēs pārskatīt šo ideju pirms ilgi. Tātad šī versija Swap tagad ir pareizs un ļauj mums apmainīt šo konkrēto datu tipu. Tātad, kādi jautājumi, tad uz Swap? Par zvaigzne? Par adreses? Un jūs redzēsiet, ar problēma noteikti 4, veida, bet problēma noteikti 5, noteikti, kā šie lietas ir noderīgi un iegūt daudz vairāk apmierināti ar tiem, kā rezultātā. Kaut ko vispār? Viss labi. Tātad malloc ir, atkal, šī funkcija ka tikai piešķir atmiņas, atmiņas sadali. Un kāpēc tas ir noderīgi? Nu, visu šo laiku, jūs esat bijis, izmantojot malloc. Ja jūs uzskatāt, tagad, kā getString darbi, iespējams, tas ir lūdzis kādam rieciens atmiņa, jebkurā laikā lietotājs veidiem string in, jo mēs, protams, nezināja, kā CS50 darbiniekiem, cik liels šīs virknes, kas cilvēkus gatavojas rakstīt varētu būt. Tātad pieņemsim, pirmo reizi, sāciet mizu atpakaļ cik tad CS50 bibliotēka darbi, veidā pāris piemēri kas novedīs mūs tur. Tātad, ja es atvērt gedit un atvērt scanf 0, Mēs ejam, lai redzētu šādu kodu. Scanf 0, kas pieejams tīmekļa vietnē šodien, ir samērā dažas rindiņas kodu šeit, 14 līdz 20. Un redzēsim, ko tas dara. Tā paziņo par int, ko sauc par x. Tā saka kaut ko līdzīgu, numuru lūdzu. Un tagad tā saka, scanf% i, un x. Tātad tur ir ķekars jaunu stuff tur. Bet scanf, jūs varat veida domāt no kā pretstatu printf. printf, protams, izdrukas uz ekrāna. scanf veida skenē no lietotāja tastatūra kaut ko viņš vai viņa ir drukāti. % I ir tāpat kā printf. Tas nozīmē, sagaida lietotājs rakstīt int. Un tagad, kāpēc jūs domājat, ka es varētu iet scanf & X? Ja dzīves jēgu no scanf ir, lai saņemtu kaut ko no lietotāja, , kas ir nozīme iet to, un x, tagad? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. Kāds man, cilvēkam, tipa, mans ievadi tiks saglabāts šajā vietā. Tas nav pietiekami, atgādināt, lai tikai caurlaide x, jo mēs esam redzējuši jau, jebkurā laikā jums iet tikai jēlu mainīgo, tāpat kā int, uz kādu citu funkciju, Protams, tas var mainīt, ka mainīgs, bet ne pastāvīgi. Tā nevar ietekmēt Main. To var mainīt tikai savu lokālo kopiju. Bet, ja tā vietā, jums nav iedodiet man faktisko int, bet tu man norādījumus ka int, es tagad, būdams scanf, protams, es varētu sekot, ka risinātu un nodot vairākus tur tāpēc jums ir piekļuve to, kā labi. Tātad, kad es palaist šo programmu, redzēsim. Padarīt scanf 0 dot slīpsvītra, scanf 0. Un, ja es tagad ierakstiet numuru piemēram, 50, paldies par 50. Ja es tagad ierakstiet numuru, piemēram, negatīvs 1, par negatīvo 1. Es tagad ierakstiet skaitli, piemēram, 1.5, hm. Kāpēc mana programma ignorēt mani? Nu, tāpēc, ka vienkārši, es teicu tas sagaidīt tikai int. Viss labi. Tāpēc, ka ir viena versija par to. Paņemsim lietas uz augšu robs un ierosina, ka tas nav labi. Un šeit slēpjas ļoti vienkāršu piemēru par to, kā mēs varam sākt rakstīšanas kodu , ka citi cilvēki var izmantot vai kompromitēt darot sliktas lietas. Tātad 16 līnija, tik līdzīgas garā pirms, bet es neesmu atzīts par int šoreiz. Es esmu deklarējot it char zvaigzne, aka virkni. Bet ko tas īsti nozīmē? Tātad, ja man nav norādiet address-- un Es esmu aicinot to patvaļīgi, buferis, bet es varētu saukt to s, būt simple-- un tad es to izdarītu, paskaidrojiet man, ja jūs varētu, balstoties uz iepriekšējā loģika, kas ir scanf dara 18 līniju, ja pass% s un buferi, kas ir adrese? Kas ir scanf, ja jūs pieteikties Precīzs pati loģika kā versiju 0, mēģināšu darīt šeit, ja lietotājs kaut kas? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. Scanf, ko loģika agrāk, gatavojas veikt virkni ka cilvēka drukāti in-- tas tagad virkne, tas nav numuru, iespējams, ja viņš vai viņa cooperates-- un tas notiek, lai mēģinātu likt ka string atmiņā brīdī jebkurā adresē buferis precizēts. Un tas ir lieliski, jo buferis patiešām ir domāts, lai būtu adresi. Bet es varu pieprasīt šī programma ir buggy ļoti nopietns veids, jo kāda vērtība ir buferis pēc noklusējuma? Ko es esmu inicializēts vērā? Kāda rieciens atmiņas? Man nav, vai ne? Tātad, pat ja es esmu piešķirti char zvaigzne, kas ir vairs sauc s, tā vietā sauc, buffer-- tāpēc pieņemsim vērst mainīgā vārds tagad, kā buffer-- ja man nav sauc getString vai malloc šeit , kas faktiski nozīmē, ka buferis ir tikai daži atkritumu vērtība. Tagad, ko tas nozīmē? Tas nozīmē, ka es esmu teicis scanf sagaidīt virkni no lietotāja. Un jūs zināt, ko? Neatkarīgi no šī lieta ir vērsta kuri paredzēti, un es izdarīt jautājuma zīmi, bet patiesībā, tas būs kaut kas līdzīgs OX1, 2, 3, vai ne? Tas ir daži viltus vērtību, kas tikko notiek, ir tur, no pirms tam. Tātad citiem vārdiem sakot, tas ir it kā buferis ir tikai norādot uz kaut ko atmiņā. Man nav ne jausmas, kāda. Tātad, ja es tipa Gabe tagad, tas būs mēģināt likt g-a-b-e / 0 tur. Bet kas zina, kas tas ir? Un agrāk, jebkura reize, kad mēs esam mēģinājuši pieskarties atmiņu, kas nepieder mums, kas ir noticis? Vai gandrīz katru reizi. Segmentāciju vaina, vai ne? Šī bulta, man nav ne jausmas, kur tas ir norādot. tas ir tikai daži izlases vērtība. Un, protams, ja jūs interpretēt izlases vērtība adresi, jūs gatavojas doties uz daži izlases galamērķis. Tātad Gabe varētu patiešām crash mana programma šajā gadījumā šeit. Tātad, ko mēs varam darīt, ir gandrīz tikpat slikti? Uzskata, ka tas trešais un final piemērs scanf. Šī versija ir labāk kādā nozīmē? Ja Jums ir apmierināti ar iepriekšējā problēma, tas ir labāk. Kāpēc? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Labi. Tātad šis gadījums 16 līnijas ir labāks, ar to saprotot ka mēs esam skaidri piešķirot daļu atmiņas. Mēs nelietojat malloc, mēs esam izmantojot nedēļa 2 pieeja vienkārši deklarēt masīvu. Un mēs esam teicu, ka virkne ir tikai masīvs rakstzīmes, tāpēc tas ir pilnīgi likumīga. Bet tas, protams, kā Jūs ņemiet vērā, fiksētu lielumu, 16. Tātad šī programma ir pilnīgi droši, ja es tipa vienā rakstzīmju virknes, divi raksturs stīgas, 15 rakstzīmju virknes. Bet, tiklīdz es sāku rakstīt 16, 17, 18, 1000 rakstzīmju virknes, ja ir tā, ka virkne gatavojas galu galā? Tas notiek, lai galu galā daļēji šeit. Bet tad, kas zina, kāds cits ir ārpus robežām Šī konkrētā masīva? Tas ir tā, it kā es esmu deklarēta 16 kastes šeit. Tātad, nevis izņemt visus 16, mēs ņemšu tikai izlikties, ka es esmu sastādīts 16. Bet, ja es tad mēģiniet lasīt virkni tas ir daudz ilgāk, piemēram, 50 rakstzīmes, Es esmu gatavojas sākt liekot a, b, c, d, x, y, z. Un tas ir iespējams, daži citi atmiņas segmentu ka, atkal, var izraisīt mana programma crash, tāpēc, ka es esmu ne lūdza kaut kas vairāk nekā tikai 16 baitu. Tātad, kurš rūpējas? Nu, šeit ir CS50 bibliotēka. Un lielākā daļa no tā ir tikai tāpat norādījumiem augšu augšas. CS50 bibliotēka, visu šo laiku, ir bijusi šī līnija 52 rindā. Mēs esam redzējuši typedef, vai Jūs redzēsiet typedef in PSET 4, kas tikai rada sinonīms kuru char zvaigzne var būt vairāk vienkārši sauc par virkni. Tātad, tas ir viens no daži mācību riteņi mēs esam izmantojuši slepeni zem motora pārsega. Tikmēr, šeit ir funkcija, getchar. Tagad acīmredzot, nav organismam to. Un patiesībā, ja es glabāt ritināšanu, man nav reāli redzat realizācijas no šīm funkcijām. Kā veselība pārbaudītu, kāpēc tā? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Jā. Tātad šis ir header fails. Un header faili satur prototipus, kā arī dažas citas lietas, šķiet, piemēram typedefs. Bet CS50.c, kurā mēs esam nekad dota jums tieši, bet ir bijis CS50 ierīces visu šoreiz, dziļi iekšā no tās mapes, ievērosiet, ka tur ir viss ķekars funkcijas šeit. Faktiski, pieņemsim ritiniet uz leju. Pieņemsim ignorēt lielākā daļa no tiem, kas tagad. Bet, ritiniet uz leju līdz getInt un redzēt, kā getInt darbojas. Tātad, šeit ir getInt. Un, ja jūs kādreiz tiešām rūpējas, kā nokļūt int darbi, šeit ir tā dokumentāciju. Un starp lietām tā saka, ir tā stāsta jums kāda vērtību diapazons tā var atgriezties. Tas ir īpaši negatīva 2 miljardus pozitīvu 2 miljardiem, sniegt vai pieņemt. Un izrādās, tas viss laiks, lai gan mēs esam nekad bija jums pārbaudīt to, ja kaut kas noiet greizi, izrādās, ka visi šoreiz, getInt ir ir atkal īpaša nemainīgs, nav Null, bet int_max, kas ir Tikai programmētāja konvencija. Tas nozīmē, šeit ir īpaša vērtība. Pārliecinieties, lai pārbaudītu šo, vienkārši gadījumā, ja kaut kas noiet greizi. Bet mēs nekad bothered ar to līdz šim, jo atkal, tas ir domāts, lai vienkāršotu. Bet kā tas getInt iegūt īstenoti? Nu, viens, tas aizņem nekādus argumentus. Mēs zinām, ka. Tā atgriež int. Mēs zinām, ka. Tātad, kā tas darbojas zem pārsega? Tātad tur ir acīmredzot bezgalīgs cilpa, vismaz izskatu vienu. Ievērojiet, ka mēs esam izmantojot getString. Tāpēc, ka ir interesanti. getInt prasa mūsu pašu funkciju, getString. Un tagad, kāpēc tas varētu būt gadījums? Kāpēc man ir piesardzīga šeit līnijas 165? Kas varētu notikt saskaņā 164, tikai, lai būtu skaidrs? Tā ir pati atbilde kā pirms tam. Var tikai no atmiņas. Kaut kas noiet greizi ar getString, mēs esam ieguvuši, lai varētu rīkoties, ka. Un iemesls, kāpēc es nedomāju atgriezties null ir ka, tehniski, null ir rādītājs. getInt ir atgriezties int. Tāpēc es esmu patvaļīgi nolēma, būtībā, ka 2 miljardiem, sniegt vai pieņemt, gatavojas būt īpaša vērtība, ka es nekad nevar faktiski nokļūt no lietotāja. Tā ir tikai viena vērtība es eju tērēt pārstāvēt kļūdas kodu. Tāpēc tagad, lietas iegūt nedaudz iedomātā. Un tas nav gluži tas pats funkcija kā iepriekš, bet tas ir ļoti līdzīgs. Tātad paziņojums, es apliecinu šeit, saskaņā 172, gan int n un char c. Un tad es izmantot šo bailīgs līniju, sscanf, kas izrādās neskenē virkni no klaviatūras. Tā stāv esošo virkni, kas lietotājs jau drukāti. Tāpēc es jau sauc getString, kas nozīmē, ka man ir virkne atmiņā. sscanf ir tas, ko jūs vēlaties izsaukt parsēšana funkciju. Tas izskatās pēc virknes es esmu ierakstījāt, burtu pa burtam, un dara kaut ko noderīgu. Ka virkne tiek glabāta līniju. Un es zinu, ka tikai, dodoties dublēt šeit un saka, oh, OK, I sauc par to nav s šoreiz, bet līnijas. Un tagad tas ir nedaudz atšķirīgs. Bet tas faktiski nozīmē, dēļ mēs nedaudz vilnis mūsu rokās ir šodien, ka mēs esam pārbaudi, lai redzēt, ja lietotājs drukāti un int un varbūt vēl raksturs. Ja lietotājs ierakstījāt int, tas ir būs jāuzglabā n, jo es esmu iet šo pēc adreses, Jaunais triks mēs esam redzējuši jau šodien. Ja lietotājs arī drukāti līdzīgā 123x, ka x gatavojas galu galā vēstule rakstzīmju c. Tagad izrādās, ka sscanf man pateikt, inteliģenti, cik mainīgie tika sscanf veiksmīgi spēj aizpildīt. Tātad, šīs loģikas, ja funkcija Es esmu īstenošanas ir getInt, bet es esmu pārbaudot, iespējams, lietotājam , ir drukāti int seko kaut ko citu, Ko es gribu sscanf s atgriešanās vērtība patiešām būtu? Ja mērķis ir iegūt tikai int no lietotāja? Tātad, ja sscanf atdevi 2, ko tas nozīmē? Lietotājs drukāti kaut kas līdzīgs, burtiski, 123x, kas ir vienkārši absurds. Tas ir kļūdas stāvoklis, un Es gribu, lai pārbaudītu to. Tātad, ja lietotājs veidiem tas, ko šī loģika, ko dara sscanf atgriezties, jūs teiktu? Tātad, tas ir gatavojas atgriezties 2, jo 123 gatavojas iet šeit un x gatavojas galu galā šeit. Bet es nevēlos x saņemt piepildīta. Es gribu, lai sscanf tikai panākumus iepildīšanas pirmais tās mainīgo. Un tā tas ir iemesls, kāpēc es vēlas sscanf atgriezties 1. Un, ja tas ir mazliet virs galvas uz brīdi, ka ir pilnīgi naudas sodu. Saprast, lai gan, ka viens no vērtības getInt un getString ir tas, ka mēs darām heck kļūdu daudz pārbaudes, piemēram, tas, lai , ka līdz šim, jūs varat diezgan daudz kaut ko tipa tastatūras, un mēs nozvejas to. Un mēs, protams, darbinieki, būs noteikti nav būt avots bug jūsu programma, jo mēs esam aizsardzībai pārbaudes visiem stulba lietas, ko lietotājs var darīt, piemēram, ierakstot virkni, kad jūs patiešām vēlējās int. Tātad now-- mēs nāksim atpakaļ uz šo pirms long-- bet visu šo laiku, getString un getInt ir bijis zem pārsega, izmantojot šo Pamatideja adreses atmiņas. Tāpēc tagad, pieņemsim darīt lietas nedaudz vairāk lietotājam draudzīgu. Kā jūs varbūt atceraties, no Binky pēdējās LAIKU_ ja mana pele būs cooperate-- tik mums bija šo kodu, kas godīgi sakot, ir diezgan muļķīgi. Šis kods sasniedz neko noderīga, bet tas bija piemērs ka profesors Parlante izmanto, lai pārstāvēt kas notiek ar programma, kurā atmiņu. Tātad pieņemsim atstāstīt šī Stāsts super īsi. Šīs pirmās divas rindas, jo Angļu, vai ko, jūs teiktu? Tikai samērā cilvēku, bet nedaudz tehniskie termini, pieņemt stab. AUDITORIJA: [nedzirdama]. DAVID J. Malan: Labi, jūs izveidi adreses jūsu x un y mainīgajiem. Ne visai, ka x un y ir ne mainīgie tradicionālajā izpratnē. x un y ir adreses vai arī uzglabāt adresi. Tāpēc pamēģināsim to vēl vienu reizi. Nav slikts sākums, though. Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Labi. Es domāju, ka nedaudz tīrāku. Deklarēt divus norādes, divi veseli skaitļi. Un mēs aicinām viņus x un y. Vai, ja mēs būtu izdarīt to kā attēlu, atkal, atgādināt, gluži vienkārši, ka visi mēs darām ar šo pirmajā rindā ir zīmēšanas kaste, piemēram, tas, ar kādu atkritumu vērtību tajā, un aicinot to x, un pēc tam vēl kaste, piemēram, tas, ar kādu atkritumu vērtību tajā, aicinot to y. Mēs esam deklarētas divas norādes, ka galu galā saglabās adresi int. Tāpēc, ka viss tur. Tātad, ja Binky izdarīja, māla tāpat izskatījās. Un Nick tikko veida apkopoja bultas, it kā viņi nav norādot nekur it īpaši tāpēc, ka viņi vienkārši atkritumu vērtības. Viņi nav skaidri inicializēts jebkur īpaši. Tagad nākamais līnija kods, atgādināt, bija šī. Tātad samērā draudzīga, bet nedaudz tehniskās angļu, kāda ir šī līnija kods dara? Yeah? AUDITORIJA: [nedzirdama]. DAVID J. Malan: Perfect. Tas piešķirot rieciens atmiņu, kas ir lielums int. Un tas ir puse atbilde. Jūs atbildēja tiesības puse no izteiksmes. Kas notiek kreisā pusē vienādības zīmi? Yeah? AUDITORIJA: Un pēcteči to mainīgo x? DAVID J. Malan: Un pēcteči to mainīgo x. Tātad, lai Atgādinājums, labajā pusē piešķir pietiekami daudz atmiņas, lai saglabātu int. Bet malloc īpaši atgriež adresi Minētā rieciens atmiņas, kas jūs esat tikko ierosināja izpaužas uzglabā x. Tātad, ko Niks darīja pēdējo reizi ar Binky ir viņš vilka šo rādītāju, kas, māls, norādīt tagad baltu rieciens atmiņas , kas ir vienāds ar izmēru int. Un, protams, ka ir domāts pārstāvēt četri baiti. Tagad, nākamais rindā kodu to izdarīja, zvaigzne x izpaužas 42. Tātad 42 ir vienkārša uz labajā pusē, dzīves jēga. Kreisajā pusē, zvaigzne x nozīmē ko? Ka pārāk varētu būt gone-- tas ir OK. OK. AUDITORIJA: Būtībā, dodieties uz [nedzirdama] DAVID J. Malan: Labi. AUDITORIJA: [nedzirdama]. DAVID J. Malan: Tieši tā. Kreisā puse nozīmē iet ar x. x ir adrese. Tas ir tāpat kā 33 Oxford Street, vai OX1. Un zvaigzne x nozīmē doties, ka risināt un īstenot to, ko tur? 42. Tik tiešām, tas ir tieši tas, ko Niks darīja. Viņš sāka ar BY, būtībā, garīgi norādot pirkstu pie x, pēc bultiņas uz balto lodziņā labajā pusē, un liekot numuru 42 tur. Bet tad lietas got mazliet bīstami, vai ne? Binky ir apmēram, lai zaudēt galvu. Star y vienāds 13, nelaime, nozīmē ko? Tātad zvaigžņu y līdzekļi doties uz adresi y. Bet kāda ir adrese y? Nu labi, tas ir atkritumu vērtību, vai ne? Es vērsa to kā jautājuma zīmi. Niks izvilka to kā sarullēta augšu bultiņu. Un, tiklīdz jūs mēģināt do zvaigzne y, sakot iet uz turieni, bet nav likumīgs adrese, tas ir daži viltus atrašanās vietu, programma gatavojas crash. Un Binky galva dodas aizlidot šeit, kā tas notika. Tātad galu galā, šajā programmā bija tikai dzīvoklis, plaisāt. Tas bija buggy programmu. Un tas nepieciešams, lai tiktu fiksēts. Un vienīgais veids, patiešām, to salabot varētu būt, piemēram, šī līnija, kas mums nav pat nokļūt, jo programma avarēja pārāk ātri. Bet, ja mēs būtu noteikt to, kādi efekts nav darot y vienāds x ir? Nu, tā būtībā norāda y at kāda vērtība x ir vērsta uz. Tātad Nika stāsts, vai Binky stāsts, gan x un y ir pavērsts balta rieciens atmiņas, tā, ka, beidzot, ja jums Vai zvaigzne y vienāds 13 atkal, jūs galu galā liekot 13 in piemērotu vietu. Tātad visas šīs līnijas ir perfekti pamatotas, izņemot šo vienu, kad tas notika pirms jums faktiski piešķirts y dažas vērtības. Tagad par laimi, jums nav ir spriest cauri visiem no šiem jautājumiem veida uz savu. Ļaujiet man iet uz priekšu un atvērt up termināla logā šeit un atvērt, tikai brīdi, super īsa programma, kas arī ir sava veida bezjēdzīgi. Tas ir neglīts. Tas nav sasniegt kaut ko noderīgu. Bet tas jāpierāda jautājumus atmiņas, tāpēc pieņemsim to apskatīt. Galvenais, super vienkārši. Tā acīmredzot aicina funkciju, f, un pēc tam atgriež 0. Tas ir sava veida grūti sajaukt šo augšu. Tātad galvenais ir diezgan labs, līdz šim. Tātad f ir problemātiska. Un vienkārši nelika daudz pūles uz nosaucot to šeit, lai saglabātu koncentrēties uz kodu. f ir divas līnijas. Un pieņemsim redzēt, kas tagad notiek. Tātad, no vienas puses here-- un ļaujiet man tas saskaņā ar iepriekšējo example--, no vienas puses, kreisā puse ir dara to, ko angļu valodā? Tā is-- AUDITORIJA: Radīt rādītāju. DAVID J. Malan: Radīt rādītāju int un aicinot to x. Tātad, tas ir radīt vienu no šiem kastes Es turpinu zīmēšanas skārienekrānā. Un tagad, uz labās rokas pusē, malloc, protams, novirza rieciens atmiņas. Un tikai, lai būtu skaidrs, cik daudz atmiņas ir tas acīmredzot piešķirot, ja jūs vienkārši veida do math šeit? Tātad, tas ir 40 baiti. Un es zinu, ka tikai tāpēc, ka es zinu int, uz CS50 ierīces, vismaz ir četri baiti. SO 10 reizes 4 ir 40. Tātad šis ir uzglabāt par x, adrese no pirmā no 40 ints, ka ir piešķirti telpu atpakaļ, atpakaļ, atpakaļ, uz muguras. Un tas, kas ir galvenais par malloc. Tas neņem maz atmiņas šeit, mazliet šeit, mazliet šeit. Tas dod jums vienu rieciens atmiņas, contiguously, no pamatdarbības sistēmu. Tagad to, ko par šo, x kronšteins 10 ir vienāds ar 0? Patvaļīga līnija kodu. Tas nav sasniegt kaut ko noderīgu. Bet tas ir interesanti, jo x kronšteinu 10--? Yeah? Mērķauditorija: [dzirdams]? DAVID J. Malan: x kronšteins 10 nav jābūt null. Null detaļa tikai nāk spēlēt ar stīgām, beigās virknes. Bet laba doma. Cik liels tas ir masīvs, pat lai gan es esmu piešķirti 40 baiti? Tas ir 0 līdz deviņi, vai ne? Tas ir 10 ints, kopā. 40 baiti, bet 10 ints, indeksētas 0 caur 0. Tātad, kas ir tas, ka x stiprinājums 10? Tas ir tiešām daži nezināms atkritumu vērtība. Tas ir atmiņu, kas nepieder man. Es nebūtu aizkustinošs, ka baitu skaitu 41, 42, 43, 44. Es esmu mazliet pārāk tālu. Un tiešām, ja es palaistu šo programmas, tas varētu ļoti labi crash. Bet dažreiz, mēs saņemsiet laimīgs. Un tā tikai, lai pierādītu this-- un atklāti, Jūs nekad zināt, pirms jums do it-- pieņemsim palaist šo. Tas faktiski nav crash. Bet, ja es to mainītu, lai Piemēram, lai būtu tāpat kā 1000, lai tas tiešām apzināta, redzēsim ja mēs varam iegūt to crash šoreiz. Labi, tas nav crash. Kā par 100,000? Pieņemsim pārtaisīt to, un tagad atkārto to. OK. Phew. Viss labi. Tātad acīmredzot, atkal, tie segmenti atmiņas, tā teikt, ir pietiekami liels, lai mēs varam saņemt laimīgs atkal un atkal. Bet galu galā, kad jūs saņemsiet smieklīgi un tiešām iet tālu uz ekrāna, jūs pieskarties atmiņu, ka tiešām, tiešām nav pieder jums. Bet atklāti sakot, šie veidu bugs gatavojas būt grūtāk un grūtāk , lai noskaidrotu par savu. Bet, par laimi, jo programmētāji, mums ir rīki, kas ļauj mums to darīt mums. Tātad šis ir, iespējams, viens no ugliest programmu, pat neglītāks nekā GDB izlaidi. Bet tas vienmēr ir līnija vai divi, kas ir super noderīga. Valgrind ir programma, kas palīdz Jums nav atkļūdot programmu, per se, bet atrast atmiņas saistīto problēmas, jo īpaši. Tas automātiski palaist savu kodu Jūs un meklēt vismaz divām lietām. Viens, jūs kaut ko darīt nejauša patīk touch atmiņu kas nepiederēja pie jums? Tas palīdzēs jums atrast šos gadījumus. Un divas, tas palīdzēs jūs atradīsiet kaut ko sauc par atmiņas noplūdes, kas mums ir pilnīgi ignorēts, naivi, kādu laiku un svētlaimīgi. Bet izrādās, viss šoreiz, kad esat sauc getString in tik daudzi no mūsu programmas, tu jautā darboties sistēmas atmiņā, bet jums ir jauna savākt no kādreiz piešķirot tai atpakaļ, darot NEPIEŠĶ, vai bez maksas, kā to sauc. Nē, jo mēs esam nekad lūdza jums to darīt. Bet visu šo laiku, programmas jūs esat rakstiski C Ir noplūde atmiņu, lūdzot darboties sistēma vairāk un vairāk atmiņa stīgām un plauktiņš, bet nekad nododot to atpakaļ. Un tagad tas ir nedaudz par realitātei, bet, ja jūs esat kādreiz palaist jūsu Mac vai datora uz ilgu laiku, atvēršanu daudz programmu, varbūt slēdzot programmas, un pat ja jūsu dators nav crashed, tas kļūst tik daudz lēnāk, it kā tas ir patiešām izmantojot daudz atmiņas vai resursi, lai gan, Ja jūs neesat pat pieskaras tastatūra, kas varētu be-- bet always-- varētu būt, ka programmas jūs strādājat ir paši atmiņas noplūde. Un viņi pastāvīgi lūdzot OS vairāk un vairāk atmiņas, bet aizmirstot par to, faktiski nelietojat, bet Tāpēc, ņemot atmiņu prom no citām programmām, kas varētu to vēlas. Tā ka ir kopīga izskaidrojums. Tagad šeit ir, ja Valgrind s produkcija ir pilnīgi zvērīgās tiem mazāk un ērtāku līdzīgi. Bet interesanti sīkumi ir labi šeit. Tā stāsta man nederīgu rakstīt par lielums četras notiek šajā programmā, it īpaši, ir no memory.c 21 līnijas. Ja es eju uz 21 līnija, hm, tur patiešām ir nederīgs rakstīt izmēru četri. Kāpēc lielums četras? Nu, tas number-- un tas varētu būt anything-- ir int. Tātad, tas ir četri baiti. Tāpēc es esmu liekot četri baiti ja tie nepieder. Tas ir kāda Valgrind faktiski stāsta man. Turklāt, tas būs arī man pateikt, kā mēs redzēsim, kā jūs darbināt šo nākotnes PSET, ja un kad esat noplūda atmiņu, kas patiešām Man ir, jo es esmu sauc malloc, bet man nav reāli sauc, šajā gadījumā, brīva ko mēs galu galā redzēt ir pretējs malloc. Tāpēc tagad, es domāju, galīgo piemēru. Tāpēc šī ir nedaudz vairāk mistisks, bet tas ir iespējams Lielākais iemesls jābūt uzmanīgiem ar atmiņu, un iemesls tam, ka daudzas programmas un / vai web serveri, pat līdz šai dienai, pārņem sliktajiem puišiem kaut kur internetā, kas ir kaut kādā veidā nosūtot viltus paketes uz jūsu serveri mēģinot apdraudēt savus kontus, vai veikt savus datus, vai vienkārši parasti pārņemt mašīnu. Bufera pārpildes, jo nosaukums liecina, līdzekļus pārpildīta nevis int, bet buferi. Un buferis ir tikai iedomātā veids no sakot, ka tas ir ķekars atmiņas. Un tiešām, es sauc string Pirms buferi, nevis s. Jo, ja tas ir buferis, tāpat kā YouTube nozīmē, vai jebkurā laikā, skatoties video, Jums varētu būt redzējis vārdu buferizācijas, dot, dot, dot. Tas ir neticami kaitinošas. Un tas tikai nozīmē, ka jūsu video atskaņotājs mēģina lejupielādēt daudz baitu, daudz baitu no video no interneta. Bet tas ir lēns, tāpēc tas mēģina lai lejupielādētu ķekars no tiem aizpildīt buferi, konteinera tā, ka Jums ir pietiekami daudz baiti, ka tas ir iespējams, tad parādīs video, bez pauzes pastāvīgi. Bet izrādās, jūs varat ir buferis, lai šī lielā. Bet mēģināt likt šo daudz datus tā, un ļoti sliktas lietas var notikt. Tātad, piemēram, aplūkosim šo galīgo teaser par piemēru. Šī ir vēl viena programma ka, pēc pirmā acu uzmetiena, nedara neko super noderīgu. Tas ir ieguvuši galveno funkciju , kas aicina šo funkciju, f. Un, ka funkcija, f, šeit, ir char masīvs, sauc c, no to lieluma 12. Un tad tas ir, izmantojot šo jauna funkcija sauc strncpy. Izrādās, ka ar šo vienkāršo, vienkāršu līniju kodu, tikai divas līnijas, mēs esam veikuši visu savu programmu, un tāpēc visa mana datora, un mans lietotāja konts, un mans cietais vadīt potenciāli neaizsargāti ikvienam kas zina, un ir pietiekami labs, lai palaistu šī programma ar noteiktu komandrindu arguments. Citiem vārdiem sakot, ja tas slikts puisis liek iekšā argvargv [1], ierakstot pie klaviatūras ļoti speciāli izstrādāts string, nevis abc, 123, bet būtībā, binārās simboli izpildāmā kods, programma, kas viņš vai viņa rakstīja, ar šo vienkāršo programmu, kas pārstāvis tūkstošiem programmu kas ir līdzīgi neaizsargāti, daresay, viņš vai viņa galu galā var izdzēst visu failus uz manu cieto disku, iegūt mirgo ātri, lai viņš vai viņa var tipa komandas par to pašu, rakstiet visus failus pie sevis. Jebkas, ko es varu darīt, viņš vai viņa var darīt ar šo kodu. Mēs ne gluži atrisināt šo ziņu. Un patiesībā, tas būs iesaistīt mazliet attēlu kā šis, ko mēs drīz nāks saprast visu labāk. Bet šodien, pieņemsim beidzas to, kas ir, cerams, nedaudz vairāk saprotams xkcd joks, kamēr mēs atsākt nākamreiz. Viss labi. Tiekamies trešdien. [Mūzikas atskaņošanai] SPEAKER: Un tagad, dziļi domas, ko Daven Farnham. Atmiņa ir kā lekt kaudzē zelta atstāj uz svētdienas pēcpusdienā. Vējš pūš, tossing savu hair-- ak, es garām dienas when-- [Smiekli]