[Mūzikas atskaņošanas] DAVID J. Malan: Nu labi, tas ir CS50 un tas ir sākums piecu nedēļu. Tātad šodien, zem jūsu sēdekļu spilveni, Jūs neatradīsiet neko. Bet iepriekš, jums vajadzētu atrast šos, maz simbolisku mūsu atzinību par visu darbu, ka jūs varat ievietot spēlei piecpadsmit. Vienkārši izņemiet maz aplis apakšas, lai sāktu spēlēt Atlikušo klasē. Tā atgādina, ka, vai zināt, ka noteikto problēmu četri, kas izgāja šīs nedēļas nogalē, ietver rakstot citu spēli. Bet šoreiz tas nozīmē, izmantojot Faktiskais grafisko lietotāja interfeisu, kas nav tekstuālā interfeiss, piemēram, Spēle piecpadsmit bija. Un spēle, kas ir priekšā no jums, ja jūs esat vēl nav redzējis šo nākamo, izskatās mazliet kaut kas līdzīgs šim. Es iešu uz manu terminālā logs šeit gdb. Un es iešu uz priekšu un palaist personāla risinājumu, kas var piekļūt pēc darbības atjauninājumu 50, kā parasti. Bet es esmu gatavojas nodot to nedaudz noslēpums režīmā, nedaudz Lieldienu olu, tā sauktās Dieva režīms, ko liekot Dievu argv1. Un man ir sekot mana virzienos, darbojas to mana problēma, kas direktorijā. Tātad tagad jūs redzat pilnu versiju par spēli Breakout. Faktiski, tas ir no-rokas režīmā. Tātad, tas ir tiešām - wowed gan jūs varētu būt - diezgan niecīgs, lai īstenotu Dievs režīmā Breakout, atšķirībā no spēles Piecpadsmit ko daži no jums, iespējams, ir jārisina par hakeru valodā. Jo Breakout pietiek Dievam režīmā, lai vienkārši darīt to, kas, intuitīvi ar bradāt? Tikai padara to vienāda neatkarīgi horizontālā stāvoklī ir bumbu. Un tik ilgi, kamēr jūs darīt to lockstep ar bumbu pārvietojas šo spēli būs nekad, nekad, nekad garām bumbu un jūs uzvarēt katru reizi. Bet šīs nedēļas hakeru izdevuma tur ir vairāk nekā tikai Dievs režīmā. Tur ir citas funkcijas skaits. Starp tiem, lāzeri. Tā ka, ja jūs patiešām iegūt nepacietīgs jums var sākt notriekšanu ķieģeļu un daži citi. Un tiem no jums, kuri vēlētos kalibrēt standarts pret hakeru izdevums, es redzu, ka šonedēļ ir hakeris izdevums apzināti ir nedaudz vairāk veicams, teiksim, par Dievu režīms bija ar spēli piecpadsmit. Tātad, ja jūs meklējat, lai stiept un jūs meklējat dažas papildu fun iezīmes darīt, nirt, ja interesē. Tagad vairāk praktiski, ļaujiet man norādīt no vienas puses, kā arī. GDB, ko daži no jums var nebūt vēl nav aizskāra personīgi, kas ir labi. Bet tagad ir patiešām pienācis laiks, lai pierastu šo un apmierināti ar šo rīku jo tas padarīs jūsu dzīvi daudz vieglāk, patiesi. Per Rob lekciju par gdb pāris nedēļas atpakaļ, atgādināt ka GDB ir atkļūdotājs. Tas ir instruments, kas ļauj jums vadīt savu programma, bet palaist to soli pa solim, līnija pa līniju, lai jūs varētu pabāzt apkārt, tā, ka jūs redzat lietas notiek, tāpēc ka jūs varat izdrukāt mainīgo lielumu vērtības. Īsāk sakot, tas dod jums tik daudz enerģijas nekā printDef dara. Tagad, protams, interfeiss ir diezgan mistisks. Melnā un baltā tekstuālo saskarni par lielāko daļu. Šīs komandas ir diezgan grūts atcerēties sākumā. Bet pat ja tas varētu tevi pusi stunda, stunda, nodot, ka sākumā ieguldījums laika uz to, ticiet man. Protams līdz semestra beigām, tas ļaus ietaupīt Jūs kārtu vairāk laiks nekā, ka. Tik agri Nedēļas nirt iekšā Un attiecībā uz Breakout, zinu, ka tu var darīt tik ilgi, kamēr jums ir sadales kodu vai savu kodu Notiek jūsu Pst4 direktorijā. Ziniet, ka jūs varat palaist gdb. / Starplaikos. Tas notiek, lai atvērtu logs kā šis. Ļaujiet man sniegt sevi vairāk no termināļa logā. Un tad ko es esmu gatavojas iet uz priekšu un darīt, tas nav tikai palaist to. Es esmu gatavojas vispirms noteikt lūzuma punkts atgādināt, kas ļauj jums, lai apturētu izpilde konkrētā vietā. Tikai, lai saglabātu lietas vienkārši es esmu gatavojas lauzt vienā rindā tikai, ierakstot numur viens. Ļaujiet man faktiski no jauna atvērt šo logu jo tas kļūst nedaudz mazu tur. Tātad, ko es esmu tagad gatavojas darīt, šeit ir ja es atvērt manu termināla logu. Come on, tur mēs ejam. Tāpēc tagad, ja es dodos atpakaļ uz Dropbox, Pst4 un palaist gdb. / breakout ieiet, paziņojums Es esmu gatavojas lauzt vienu, kas lūzuma punkts vienā rindā. Un tagad es iešu priekšu un tips darboties. Un, kad es darīt, pamanīt neko šķiet, notiek. Nav pop up. Nav grafiskā lietotāja interfeiss vēl. Bet tas ir saprotams, jo es esmu burtiski manā programmā vienā rindā. Un ievēroju, ka es esmu ātri pārsūtīt, īpaši tagad līdz 62, jo visi augšpusē šo failu sīkumi lietas, piemēram, komentāri un konstantes un neinteresanti stuff tagad. Tāpēc tagad es esmu iekšā main, šķiet, ir 62 līnijas. Un tas ir tikai sadales kods, atgādināt. Ja es atvērt šo augšu, dodoties, līdzīgi, manā piliens kastē direktorijā stāšanās Pst4, uz breakout.c. Un, ja es ritiniet uz leju un uz leju un uz leju, un ļaujiet man iet uz priekšu un ieslēgt mans līniju numuri. Ko es redzēsit, ja es ritiniet uz leju, lai līnija 62, ir tieši līnija, kas mēs esam apturēta tālāk. Tātad, šī līnija šeit, 62, ir kur mēs esam par to, lai būtu. Tāpēc tagad gdb, ja man iet uz priekšu un tips Tagad nākamais, ievadiet tas notiek izpildīt šo līniju. Un voila, mums ir tā saukto g logu. Ja svešs ar to, GWindow ir, nav jāuztraucas. Spec būs jūs iepazīstināt ar to, kā arī vairāki walkthrough video iestrādāta spec. Bet tagad pieņemsim šo nedaudz vairāk interesants. Ļaujiet man pāriet šo logu pa uz sāniem mazliet. Ļaujiet man loga nedaudz lielāks, tāpēc es redzu vairāk. Un tagad ļaujiet man iet uz priekšu un darīt tālāk atkal. Un tur ir manas ķieģeļi. Ja es rakstīt nākamo atkal Tagad es redzu bumbu. Un, ja es rakstīt nākamo atkal Tagad es redzu bradāt. Un par laimi tas gedit nav patiešām sadarbojās, parādot mani viss, ko es gribu. Bet tagad, ja man darīt tālāk atkal, nākamais atkal, es esmu tikai atzīstot dažus mainīgos. Un es varu izdrukāt kādu no šiem guys out. Drukāt ķieģeļi, izdrukas dzīvi. Un tagad, ja es turpinu to darīt Nākamais, ievēroju, ka es būšu iekšā šī cilpa. Bet kods ir gatavojas izpildīt tieši tā, kā es gaidīt. Tātad, kad es hit šo funkciju, Wait par klikšķi, tas būs jādara tas burtiski, ka. Tāpēc man šķiet, ir zaudējuši kontroli pār programmas. GDB nedod man citu ātri. Bet ne jāuztraucas. Iet uz manu spēli, noklikšķiniet kaut kur. Un voila, tagad tas ieņēmumus 86 līniju. Tātad vēlreiz, tas ir nenovērtējams, galu galā, debugging problēmas. Tāpēc, ka jūs varat burtiski soli pa savu kodu, drukāt lietas, un daudz, daudz, vairāk. Bet tagad, tie instrumenti vien vajadzētu saņemt jūs diezgan tālu. Tāpēc mēs esam, protams, ņemot apskatīt pie Grafikas tagad, visi pēkšņi. Un tagad mūsu pasaule kļūst nedaudz vairāk interesants. Un jūs zināt, iespējams, no dažām video tiešsaistē, kas mums ir šie šorti, ka jūs esat bijis skatīties kā daļa no problēmu kopas. Un viņi ir nošauts, apzināti, uz balta fona. Un daži no tiem ir mācību Stipendiātiem zīmēšanas kādu tekstu uz ekrāns, kas ir pārklāts par pusi no tiem. Bet, protams, tas nav viss, kas interesanti reālajā pasaulē. Tas ir tikai lekciju zāle liels balts ekrāns un fons. Un mūsu pārsteidzošs ražošanas komanda kārtošanas gada padara viss izskatās skaisti pēc tam, kad to, pēc ražas out vai pārklāj neko mēs darām vai negribam. Tagad tikai, lai motivētu šonedēļ, un tiešām, kur jūs varat iet, galu galā, ar datorzinātnēs. Ne tikai pēc tam, kad problēma noteikti četri. Bet pēc cita kursa vai visa mācību tas ir pārsteidzošs, ko jūs varat darīt šajās dienās ziņā grafikas, jo īpaši. Daži no jums varētu būt redzējuši šo plūst apkārt tiešsaistē. Bet es domāju, ka man parādīs, lai tikai pāris minūtes, ieskatu par to, ko datoru tehnoloģijas un kāda CGI, datorgrafika var darīt šajās dienās ar pazīstamo dziesmu un varbūt filmu. [MUSIC - LANA DEL RAY, "Jauna un skaista] SPEAKER 1: Tas ir tikai nedaudz pārsteidzošs, varbūt, cik visuresošs - [Aplausi] SPEAKER 1: Es tikai lejupielādēt to. Bet tas ir patiešām pārsteidzošs, es domāju, ka, tikko kā visuresošs programmatūras un kodu un instrumentus, piemēram, tas tiešām ir. Tātad, kas ir no virziena garša kurā jūs varat iet. Ak, ne vairāk Appliance šodien. Nu, tas ir tiešām traģisks laiks ņemot vērā punktu es tikai centos darīt. Labi, tāpēc pieņemsim sākt Fusion vēlreiz. Atgādināt vēlāk. Visas tiesības, un jums ir ieguvuši e-pastu, kā malā, ja jūs saņemsiet pamanīt, piemēram, ka. Visas tiesības, lai atgādināt, ka pagājušajā nedēļā mēs sākām mizu atpakaļ šajā vēlāk pazīstams kā virkni. string atgādina datu tipu, kas ir deklarēto CS50 bibliotēkā. Un tā ir daļa no mācību riteņi kas tagad sāk pacelties. Tas bija lietderīgs jēdziens sākumā. Bet tagad tas notiek, lai iegūtu vairāk interesantu un jaudīgākas patiešām redzēt, ka zem motora pārsega, virkne ir tieši tas, ko, tomēr mēs teicām? Jā, tāpēc tas ir tā sauktais char *. Un * tur norāda, ka tur ir dažas adreses veida iesaistīti. Un tā, kad jūs sakāt char * tu tikai nozīmē mainīgais, kura datu tips ir rādītājs tagad. Tas, ka tur ir zvaigzne tur tikai nozīmē, ka jūs deklarējat tā saukto rādītājs. Un tas rādītājs gatavojas acīmredzot uzglabāt adresi, no protams, char. Tagad, kāpēc tas ir jēga? Nu, kas ir virkne zem pārsega? Nu, kādu laiku mēs esam bijuši pasakot ka zem motora pārsega virkne ir tikko h-e-l-l-o, piemēram. Bet mēs esam runājuši par to, kā ir, būtībā, masīvs. Un masīvs tad izskatās mazliet vairāk kā tas, ar katru no šiem sākšanu uzkost. Un tad mēs jau teicām, ka tur ir kaut kas īpašs atpakaļ šeit, slīpsvītru 0 vai null terminators. Tātad, visu šo laiku, tas šeit ir bijusi virkne. Bet tiešām, virkne ir patiesībā adresi. Un adreses, kā mēs redzēsim, bieži prefiksu ar 0x pēc vienošanās. Kāda 0x apzīmē? Vai kāds zina? Tātad, tas tikai nozīmē, heksadecimālo. Lai jūs varētu atcerēties, patiesībā, no PST 1, manuprāt, ir viens no iesildīšanās jautājumi faktiski jautāja par heksadecimālo notācija papildus binārā un decimālā. Un motivācija ir tāda, ka ar heksadecimālo Jums ir 16 ciparus jūsu rīcībā. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, kam seko ar a, b, c, d, e, f. Un, ja skaita visus tos uz augšu, jums kopā 16. Tātad tas ir pretrunā ar decimāldaļskaitlis, kur mums ir 10 cipari, 0 līdz deviņi. Tas ir pretstatā ar bināro kur mēs vienkārši ir 0 un 1. Bet beigās, dienā, jums var vienkārši pārstāv to pašu numuru, bet nedaudz savādāk. Un sešpadsmitnieku ir kopīgs, jo, kā izrādās - un mēs redzam vēlāk protams, - pat tad, kad mēs web programmēšanas kontekstā HTML un krāsu kodiem, heksadecimālo ir jauki. Jo katrs cipars, izrādās, pārstāv četri biti perfekti. Tātad, tas tikai veida līniju pat labi kā mēs galu galā redzēt. Tātad tas varētu būt Ox123 vai kaut ko piemēram, ka, apzīmējot adrese 123 kaut kur iekšpusē no manām datora atmiņā. Bet, protams, dažas problēmas rodas tādēļ pamatā esošo īstenošanu. Un atceros, ka man bija stab pie īstenojot funkciju, piemēram, šo - salīdzināt domuzīme 0 dot c pagājušajā nedēļā, ka pat ja tas izskatījās kā tas bija labi, tas vienkārši nav salīdzināt divas stīgas pareizi. Es esmu izmest galvenais, un es esmu izmet prom komentārus vienkārši vērsta uz kodu, kas ir interese šeit. Un tas ir sarkans, jo tas ir buggy. Kāda iemesla dēļ? Nu, top tur, kad es paziņoju string, kas īsti notiek zem pārsega? Nu, ļaujiet man iet vairāk nekā uz ekrāns šeit un izdarīt to. Tāpēc es paziņoja, atkal, String s GetString. Tāpēc es esmu gatavojas iet uz priekšu tagad izdarīt s par to, kas tas īsti ir. Tas būs kvadrātveida šeit. Un es esmu gatavojas pieprasīt ka tas ir 32 biti. Vismaz tas parasti ir, vismaz uz CS50 ar ierīce ir daudz datoru. Es esmu gatavojas, lai izsauktu to s. Bet tagad atgādināt, ka mēs sauc GetString. Tātad GetString atgriežas, Protams, virkne. Ja lietotājs veidu h-e-l-l-o ievadīt stīgu sveiki izpaužas atpakaļ. Un tas stīgu, kā mēs tikko teica, beidzas kaut kur jūsu datora atmiņā ar slīpsvītru 0 beigās. Es izdarīt to, piemēram, masīvs - vai blakus bloka rakstzīmēm - ka tas patiesībā ir. Un tagad, kas ir GetString faktiski atgriežas? Kas ir GetString ir atgriešanās visu laiku? Nu, mēs teiksim, nedēļu pirms, tā atgriež virkni. Bet vēl tehniski, ko dara GetString peļņu acīmredzot? Mērķauditorija: adresi. SPEAKER 1: adresi. Konkrēti tas atgriež adresi Pati pirmā kodums, kāds tas ir. Es tikai glabāt, izmantojot vienu, divas, trīs jo tas ir ērti. Tā atgriež adresi, kura pirmā rakstzīmju virknē. Un mēs teicām pagājušajā nedēļā, ka , kas ir pietiekams. Tāpēc, ka mēs vienmēr varam izdomāt, kur beigām virknes vienkārši atkārtojot pār to, varbūt, ar par cilpa, vai kamēr cilpa, vai kaut kas tamlīdzīgs ka tikai meklē "slīpsvītru 0", īpašais sargs raksturs. Un tad mēs zinām, ka virkne notiek, garuma - šajā gadījumā - pieci. Tātad, tehniski kādi GetString dara tas atgriežas Ox123 šajā lietā. Un tehniski to, kas tad notiek, ir ka mēs glabāt, iekšpusē s, Ox123. Beigās, dienā, pat tad, ja šis ir jauns jēdziens, norādes, viņi tikai mainīgie. Bet tie notiek, lai saglabātu biti, kolektīvi pārstāv adresi. Tātad tehniski visi tie izpaužas glabājas s ir Ox123. Bet mēs kā cilvēki - ieskaitot šodien Tālāka - tiešām nav gatavojas aprūpi, parasti, kāda faktiskā adrese ir Dažu rieciens atmiņas. Tas ir tikai, lai zemo sīki būt intelektuāli interesanti. Tāpēc es esmu gatavojas atsaukt to. Un tā vietā vairāk augsta līmeņa, vienkārši pateikt ka tad, kad mēs runājam par norādes Es esmu gatavojas tikai izdarīt vairāk lietotājam draudzīgu bultiņa, kas rada pati ideja un tēzes prom ziņas par to, ko faktiskā bāzes adrese ir. Tagad, ja mēs ejam atpakaļ uz kodu, ko notika pagājušajā nedēļā, ja mums ir virkne t vienāds GetString? Nu, ja es atkal, ierakstiet sveiki šoreiz es esmu gatavojas saņemt vēl rieciens atmiņas. h-e-l-l-o slīpsvītru 0. Bet tāpēc, ka es sauc GetString otro reizi - un es zinu, tas no apskatot pirmkods GetString - pat lai gan tā ir nejaušība, ka sveiki bija drukāti divreiz, GetString nav gatavojas izmēģināt, lai optimizētu un būt gudrs. Tas ir tikai gatavojas saņemt otru rieciens atmiņas no datora, kas ir būs citā adresē. Pieņemsim patvaļīgi tikai teikt 456. Un tad tas notiek, lai atgrieztos? Tas notiek, lai atgrieztos 456 un uzglabāt to t. Tātad, kas īsti notiek, par kreisā puse ir tā, man ir vēl viens gabals atmiņas, 32 biti parasti. Un tur ir gatavojas iet Ox456. Bet atkal, es neesmu ieinteresēts šajās konkrēti skaitļi vairs. Es esmu tikai gatavojas abstrakti izdarīt to kā bulta. Tātad tagad tas ir jauns skaidrojums. Bet tas ir pats precīzu ideja, ka ir noticis visu šo laiku. Un tā iemesls tam, ka šis pirmais versija salīdzināt bija bagijs pagājušajā nedēļā ir iemesls, kāpēc? Kad jūs darīt, ja s vienāds vienāds t, kas ir jūs patiešām zem motora pārsegs salīdzinot? Jūs esat salīdzinot adreses. Un tikai intuitīvi, skaidri, Ox123 nav gatavojas Ox456 vienāda. Šie skaitļi, šie biti ir tikai atšķirīgs. Un tā pastāvīgi, pagājušajā nedēļā tā teica Rakstot dažādas lietas, pat tad, ja vārdi bija burtiski pats. Tāpēc mēs noteikt šo. In lajs izteiksmē, kas bija noteikt? Mērķauditorija: Izmantojiet funkciju. SPEAKER 1: Izmantojiet funkciju. Vai zvaigznes ir noteikti iesaistīts, bet izmantot funkciju darīt? Mērķauditorija: Lai salīdzinātu stīgas. SPEAKER 1: Lai salīdzinātu stīgas. Tātad būtiska problēma šeit bija ka man bija tikai apsver kvalitātes stīgas jādefinē Salīdzinot to adreses. Un, protams, tas ir tikai mēms tagad, kad jūs saprotat, kas notiek zem motora pārsega. Lai patiesi salīdzināt virknes, lai redzētu, vai viņi vienādi tādā veidā, ka cilvēka apsvērtu divām stīgām, ir vienāda mums ir nepieciešams, lai salīdzinātu tos rakstzīmi rakstzīme raksturs. Tagad es varētu būt izdarīt tas ir ļoti tediously. Bet familiarly, mēs esam izmantojot uz cilpas. Un tikai salīdzināt s skavu i pret t bracket i. s kronšteins i plus 1 pret t grupā i plus 1, un tā tālāk, iekšpusē sava veida cilpa. Un, ja es uz vietas nekādas divas rakstzīmes, ka atšķiras, vai, ja es saprotu, ka ooh, s īsāks nekā t vai garāks nekā t Es varu uzreiz pateikt nepatiesa, viņi nav tas pats. Bet, ja es pa s un t un teikt tas pats, pats, pats, pats, pats, beigas abas virknes, es varu teikt, taisnība, tie ir vienādi. Nu, par laimi, gadus atpakaļ kāds rakstīja, ka kodu par mums. Un viņi to sauca StrComp par stīgu salīdzināt. Un, pat ja tas ir mazliet counter intuitīvs, StrComp atgriež 0, ja tie divas virknes, s un t ir vienādi. Bet tas atgriež negatīvu vērtību, ja s ir jānāk pirms t alfabēta vai pozitīva vērtība, ja tā būtu jānāk Pēc t alfabēta. Tātad, ja jūs kādreiz vēlaties kārtot kaut ko, izrādās, ka StrComp ir noderīga. Jo tas nav tikai teikt jā vai nē, ir vienāds vai ne. Tas dod jums sajūtu pasūtīšanu patīk vārdnīca varenību. Tātad StrComp, s komats t vienāds ir vienāds ar 0 nozīmē, ka stīgas ir patiesi vienlīdzīgi. Tāpēc, ka tas, kurš rakstīja šo funkciju gadus atpakaļ, iespējams, izmanto, lai cilpa vai kamēr cilpa, vai kaut kas tamlīdzīgs integrēt pa burtiem atkal un atkal un atkal. Bet problēma divas radās šeit. Tas bija copy0.c. Un sarkanā krāsā abiem ir tāpēc, ka tas ir kļūdains. Un ko mēs darām šeit? Nu, vispirms es sauc GetString. Un es saglabāti atgriezto vērtību s. Tātad tas ir diezgan daudz tāds pats kā šī augšējā daļa no attēla. Bet to, kas nāk pēc tam? Nu, ļaujiet man iet uz priekšu un tikt vaļā no visa ķekars šo. Mēs attītu laikā, kur mēs vienkārši ir S, kas ir tagad ir vienādi ar line vienu tur. Es varētu pārbaudīt. Ja s vienāds vienāds ar 0. Tagad, ātri pusē piezīmi, kad varētu GetString atgriezīsies 0? Tur nav pietiekami daudz atmiņas. Labi? Tas ir reti, ka tas notiks, protams, par datoru, kas ir saņēmu simtiem megs vai pat gigs RAM. Bet tas varētu, teorētiski, atgriezties 0, it īpaši, ja lietotājs nesadarbojas. Ir veidi, kā izlikties, piemēram, jums ir ne ienākošā vizuālā kaut ko un triks GetString par atgriešanos 0 efektīvi. Tātad, tas notiek, lai pārbaudītu to. Jo, ja kāds no jums ir sākuši get, kas jau, segmentācijas kļūdas - kas, iespējams, bijis avots zināma vilšanās - tie ir gandrīz vienmēr rezultāts atmiņas saistītas kļūdas. Kaut kā jums messed up attiecībā uz rādītājs, pat ja Jums nav saprast tur bija rādītājs. Tātad, jūs varētu būt izraisa segmentāciju kļūdas, kā jau nedēļu vienu, izmantojot kaut kas līdzīgs, lai cilpas vai atrodoties cilpas un masīvs, dodoties pārāk tālu garām dažu masīva robežas, kas Jums paziņoja, divās nedēļā īpaši. Jūs, iespējams, ir darījuši to pat problēmu noteikti četri ar Breakout. Pat ja jūs, iespējams, neesat redzējuši visas zvaigznes izplatīšanas kodu par Breakout, izrādās, ka tie GRect un GOval un citas tādas lietas, tie ir faktiski norādes zem motora pārsega. Bet Stanford, tāpat kā mums, kārtot Ādu ka detaļa vismaz par bibliotēku mērķiem, daudz, tāpat kā mēs teksta un char *. Bet GRect un GOval un visiem tiem, lietas, jūs puiši ir vai būs, izmantojot šonedēļ galu galā atmiņas adreses. Jūs vienkārši nezināt to. Tātad, tas nav pārsteigums, tad, iespējams, ka jūs varētu paklupt dažus segmentācijas kļūdas. Bet kas ir interesanti šeit tagad, ja pēc tam, kad mēs pārbaudītu 0 mēs darām stīgu t izpaužas s. Nu, ļaujiet man paziņot, t. Es esmu gatavojas izdarīt to kā laukumā, 32 biti, to sauc par t. Un tad es esmu gatavojas darīt izpaužas s. Nu, ko tas nozīmē? Nu, tas ir mazliet grūti iedomāties par to attēlu gudrs. Bet pieņemsim domāt par kas ir iekšā no x? Kas ir burtiski iekšā šo mainīgo? Vērtību Ox123. Tātad, kad es saku virkne t izpaužas s, ka tikai burtiski nozīmē veikt numurs s, kas ir Ox123 un nodot to Ox123. Vai gleznieciski, ja es veida abstrakti prom no minētā detalizēti tas ir efekts burtiski darīt šis kā labi. Tāpēc tagad, domāju, ka atpakaļ uz pagājušajā nedēļā, kad mēs turpināja kapitālisma T. I darīja T bracket 0. Nu, T kronšteins 0, pat ja tas ir rādītāju, jūs varat uzskatīt to kā gan tas ir masīvs, ar kvadrātveida kronšteins notācija. Tātad, kur ir T kronšteins 0? Nu, tas ir h. Un tad, kad mēs izmantojam šo rindiņu kodu, divi augšējais, kas ir, ka C type.h header failu, tas ir, ja tas ir deklarētas. Jūs esat gūstot šo H. Bet, protams, tas ir pats precīzu h, kas ir iekšpusē no s, tā sakot. Un tā tagad jums ir mainījušies vai kapitalizētas gan oriģināls un tā saukto kopiju. Tāpēc, ka jums nav padarīt kopiju veids, ka cilvēks gribētu, lai to. Tātad, kāds bija noteikt šeit, jo copy1.c pagājušajā nedēļā? Funkcijas, lai mēs varētu tiešām kopēt virkni. Un būtībā, ko mums vajag darīt, lai kopētu string? Nu, šajā zaļajā versijā šeit es esmu gatavojas to darīt diezgan zema līmeņa. Ir faktiski funkcijas viņi varētu palīdzēt ar to. Bet visvairāk pamata viens, un visvairāk pazīstams viens, vismaz, drīz būs pazīstams ar mums, ir šādi - tā viens no pirmās rindas koda zaļā krāsā tagad. Es tikai pārrakstīja s kā char *. Nav funkcionālas atšķirība tur. Es tikko aizmeta CS50 bibliotēku un Es esmu aicinot to, kas tas ir, char *. Tagad dot, dot, dot, jo bija daži kļūdu pārbaude, ka tas nav interesanti runāt vēlreiz. Tāpēc tagad t ir deklarēta. Tas arī ir char *. Tāpēc es vērsa maz kvadrātu uz ekrāns kā agrāk. Bet uz labajā pusē, malloc, mēs teicām, ir atmiņa piešķirt. Tātad piešķirt kādu gabalu no atmiņas. Un cik daudz baitu vai mēs patiešām vēlas piešķirt, tas šķiet? Nu, virknes garums s. Tātad, ja tas ir sveiki kas ir būs pieci. Mēs teikt h-e-l-l-o. Tātad pieci baiti. Bet tad plus 1, kāpēc 1? 0 raksturs. Ja mums nav jāatstāj šo puisis, mēs var nejauši radīt situāciju kur virkne ir h-e-l-l-o. Un tad nākamreiz GetString ir sauc, un es rakstīt, piemēram, David, D--v-i-d, dators ir iet domāt, ka s ir faktiski h-e-l-l-o-d-a-v-i-d jo tur nav pauze starp šiem vārdiem. Tāpēc mums ir nepieciešams šo pārtraukumu. Tāpēc mēs nevēlamies pieci. Mēs vēlamies sešas baiti. Un baiti es saku. Bet tas tiešām laiks lielums char. Tehniski simbols ir gandrīz vienmēr viens baits. Bet tikai, lai padarītu mūsu kodu portatīvie, tā sakot, lai tas darbojas uz dažādiem datoriem, pat tad, ja tie varētu būt nedaudz atšķirīgs zem kapuce, es esmu gatavojas vispārīgi saka lielums char, lai mans kods vienmēr strādā. Un man nav recompile to tikai jo es uzlabot manu datoru vai izmantojiet daži dažādas platformas. Tāpēc es esam ieguvuši 6 reizes lielāka char, kas notiek, ir 1. Tātad tas nozīmē, ka malloc varētu man sešas baiti. Kas ir tas, ka patiesībā dara? Nu, ļaujiet man roll atpakaļ laikā šeit , kur mēs esam stāstā. Tātad, ja es dodos atpakaļ šeit, es esmu deklarēta char * ko sauc par t. Esmu tagad sauc malloc sešus baitu. Un tagad es esmu gatavojas izdarīt šo sešu baiti tāpat kā masīvs agrāk. Bet es tiešām nezinu, kas ir iekšā šajā masīvā. Ja jūs piešķirt atmiņu izrādās, ka Jūs nevarat uzticēties, ka tur ir dažas zināma tur. Tas varēja izmantot kaut ko cits, dažas citas funkcijas, daži citi rindā kodu, ka jūs wrote. Tāpēc mēs parasti saucam šos atkritumus vērtības un izdarīt to, varbūt, jo jautājuma zīmes, tikai norādot, ka mēs nezinu, kas tas patiesībā ir. Un tas nav liels galā, tik ilgi, kamēr mēs ir pietiekami gudrs, lai pārrakstītu tiem atkritumu vērtības ar numuriem vai simboli, kas mums rūp. Tātad šajā gadījumā to, ko es esmu gatavojas darīt? Nu, mana līnija kods Nākamais, man ir četri. int man 0, n izpaužas virknes garums s. Tāpēc pārzina cilpu. Man ir mazāks par vai vienāds ar n, , kas parasti ir iepriekš. Bet šoreiz tas ir apzināts. I + +, un tad es vienkārši darīt t kronšteins i izpaužas s. Tāpēc, ka mana bilde izskatās kā šis šis brīdis, glabājas t ir adrese, tāpat izlases rieciens atmiņas , kuru vērtības ir zināma. Bet, tiklīdz es t skavu 0, kas liek man šeit. Un kas beidzas līdz kļūst sastādīts tur? Mēs galu galā liekot h. Jo tas, kas ir pie s skavas 0. Un tad tas pats par e, un l, un l, un o. n, kāpēc man iet uz augšu cauri vienāds ar n? Sakarā ar 0 raksturs. Tik vienkārši, lai būtu skaidrs, tad, ja es tiešām dzēst neatkarīgi no šo atkritumu vērtības, un tad faktiski izdarīt ko es gaidīt, tas ir s kronšteins 1, 2, 3, 4, kā arī, kas ir trailing jaunu raksturu. Un tāpēc tagad, ja mēs turpinājām garām dot, dot, dot šajā pareizo versiju un lielais t kronšteins 0 Es, protams, var gūstot tikai šo puisis šeit, kas konceptuāli, galu galā bija mērķis. Tā ka viss rādītājs ir. Un jūs esat bijis, izmantojot tos nedēļas Tagad saistībā ar stīgām. Bet zem pārsega viņi nedaudz sarežģītāka. Bet, ja jūs domājat par tiem šajā ilustrētā veidā es ierosinu, ka viņi iespējams, ne visi, ka biedējošu, jo tie varētu likties no pirmā acu uzmetiena, it īpaši ar šādu jaunu sintaksi. Kādi jautājumi par norādes, stīgas, vai chars? Yeah? Mērķauditorija: Vai jūs iet atpakaļ līdz [nedzirdamajā]? SPEAKER 1: Protams. Mērķauditorija: Tātad, cik nāk jūsu ļoti pēdējā line, jums nav * t līnija un * s ar līniju? Vai nav jums ir atsauce uz - SPEAKER 1: Ah, patiešām labs jautājums. Kāpēc man ir * t un * s? Jo īsi, pagājušajā nedēļā, tāpat kā mūsu swap funkcija, man bija teikt, ka tad, kad Jūs esat ieguvuši rādītāju līdzekļus, ar ko jūs iet tur, kā mēs to darījām fiziski uz skatuves, bija faktiski izmantot zvaigzne operatoru. Izrādās, ka šis square-kronšteins notācija ir tas, ko mēs saucam sintaktisko cukurs, kas ir tikai sexy veids sakot, ka tas ir stenogrāfija notāciju tieši to, ko jūs apraksta. Bet tas ir nedaudz vairāk intuitīvi. Un pastāv risks, ka tas, šķiet, vairāk sarežģīta, nekā tai vajadzētu būt, to, kas īsti notiek šeit ir šādas - Ja es saku * t, tas nozīmē, ka iet uz adrese uzglabā t. Tik burtiski, ja t ir uzglabātu adresi, h Sākotnēji, * t nozīmē iet šeit. Tagad, ko tas t kronšteins 0 nozīmē? Pats precīzu lieta. Tas ir tikai nedaudz vairāk lietotāju draudzīgi rakstīt. Bet es neesmu darīts vēl. Es nevaru vienkārši pateikt * t izpaužas * s. Jo tas, ko man darīt pēc tam? Es gribētu būt liekot h, h, h, h, h visa lieta. Labi? Jo * t ir doties uz adresi t. Bet mēs esam iekšpusē cilpas. Un kāda vērtība es palielināšanai, Protams, katrā atkārtojuma? i. Bet tur ir iespēja šeit, vai ne? Pat ja tas uzskata, tāpat kā tas kļūst nedaudz sarežģītākas nekā kvadrātveida stiprinājuma notācijas mēs esam izmanto kādu laiku - ļaujiet man atsaukt manu h izmaiņas tur - pat ja tas ir tagad kļūst nedaudz mīļotājs, pamatideja, ja * t ir šeit un * t ir tikai dodieties uz adresi t. Bet kāda bija adrese t? Skaitlis mēs turpinām izmantot? Tāpat Ox456, pieņemsim panākt, ka atkal tikai dēļ diskusiju. Nu, ja es vēlos saņemt pie e in t stīgu, es tikai gribu, lai dotos uz, būtībā, 456. Vai drīzāk, 457. Man vienkārši vajag pievienot. Bet es varu darīt, labi? Jo t, kaut gan es glabāt zīmējumu tagad kā bulta, tas ir tikai numuru, Ox456. Un, ja es pievienot vienu, ka, vai vairāk Parasti, ja es varu pievienot I līdz, ka es varu faktiski nokļūt tieši tur, kur es gribu. Tātad, ja es patiešām to dara - un tas ir tas, ko tagad sauc rādītājs aritmētika - Es varu noņemt šo līniju. Kas ir, atklāti sakot, es domāju, ka skaidrāka un nedaudz vairāk lietotājam draudzīgs, lai lasītu. Bet tas nav tik pareizs. Šī koda līnija tagad izmanto rādītājs aritmētika. Tas ir saprotams, dodieties uz Pēc adrese - neatkarīgi no t sākums ir, kas ir t plus i, kas sākotnēji ir 0, kas ir liels. Jo tas nozīmē, ka sākumā t plus 1, 2 plus, plus 3, un tā tālāk. Un pats nodarbojas ar s. Tātad sintaktisko cukuru par to. Bet izpratne par to, kas īsti notiek zem motora pārsega, es teiktu, ir faktiski noderīga, un pats par sevi. Jo tas nozīmē, tagad tur nav daudz burvju notiek zem motora pārsega. Tur nav būs daudz vairāk slāņi, ka mēs varam mizu atpakaļ uz jums. Tas ir c. Un tas ir programmēšana. Tiešām labs jautājums. Visas tiesības, tāpēc tas bija bagijs programma man bija atsaucoties uz agrāk. swap bija kļūdaina. Ja tomēr šķiet, darbu. Atgādināt, ka tāpat kā ar pienu un apelsīnu sula - ko es sāku dzeramā šodienas demonstrāciju. Tik vienkārši kā ar apelsīnu sulu un piens, mums nebija ir jāizmanto pagaidu mainīgo, TPP, turēt uz laiku, lai mēs varētu pēc tam mainīt savu vērtību, un pēc tam atjaunināt b. Bet šī funkcija, mēs teicām, vai šis programma, kurā šī funkcija bija rakstīts bija nepareizi un kļūdaini, kāpēc? Jā? Mērķauditorija: [nedzirdama]. SPEAKER 1: Tieši tā, ja zvanāt swap - vai, plašākā nozīmē, ja jūs zvanīt visvairāk jebkuru funkciju - ja argumenti, lai šo funkciju, ir primitīvas, tā sakot, Ints un chars un divvietīgi un plosti, lietas, bez zvaigznēm, jums ir iet ar kopiju arguments. Tātad, ja x ir 1 un y ir 2, kas notiek līdz būt 1 un b būs 2. Bet viņi būs dažādi gabali par biti, dažādu gabalos atmiņu, kas gadās būt uzglabāšanai identiskas vērtības. Tātad šis kods ir super perfekta pie pārnešana a un b. Tas nav labi pārnešana - pagājušās nedēļas piemērs - x un y. Jo atkal, viņi nepareizā jomā. Tagad, kā mēs iet par nosakot šo? Mums nācās veikt funkcijas izskatās nedaudz neglītāks. Bet atkal, jāapsver, ko tas tikai nozīmē. Un patiesībā, ļaujiet man, konsekvences, mainīt viena lieta, tāpēc tas ir identisks ko mēs tikko izdarījām. Kā jau es teicu pagājušajā nedēļā, tā nav svarīgi, kur tas notiek. Patiesībā, parasti jūs liktu zvaigzne pie mainīgā nosaukums. Bet es domāju, ka būtu mazliet vieglāk apsvērt * blakus datu tips, kas nozīmē, tas ir rādītājs līdz int šajā gadījumā. Tātad, ko es te daru? Es saku, nedod man int sekoja vēl viena int, aicinot viņus un b. Dodiet man adresi int. Iedodiet man adresi citā int. Sauktu pie adreses a un b. Un tad, izmantojot * apzīmējumu leju zemāk, iet uz katru no šīm adresēm kā nepieciešams vai nu saņemt vai noteikt tā vērtību. Bet tur ir izņēmums šeit. Kāpēc man nav * blakus TMP? Kāpēc man nav darīt, piemēram,? Tā uzskata, piemēram, es būtu tikai iet visiem , un labot visa lieta. Yeah? Mērķauditorija: [nedzirdama]. SPEAKER 1: Man nav deklarējuši tmp kā virkni. Tātad, tas paziņo, šajā gadījumā, TMP būt adresi int. Bet tas nav gluži tas, ko es gribu, uz pāris iemeslu dēļ. Mērķauditorija: Jūs nevēlaties, lai mijmaiņas tiem. SPEAKER 1: Tieši tā, es nevēlos, lai mijmaiņas kaut kas ar TMP. tmp ir tikai nedēļu vienu sīkumi. Viss, ko es vēlos, ir mainīgs uzglabāt kādu numuru. Man nav pat rūp adresēm šajā brīdī. Man tikai vajag 32 bitu vai tāpēc, lai saglabātu int. Un es gribu, lai šajos 32 bitiem kāds nav, tā teikt, bet kas ir, tikai, lai būtu precīzāks. Jo, ja ir adrese, * nozīmē, iet tur un saņemt vērtību 1. Piemēram, pagājušās nedēļas piemērs vai saskaņā ar B gadījumā, saņemt vērtību 2. Tātad, kas īsti notiek? Ļaujiet man uzzīmēt attēlu šeit, kas tikai kaitināt izņemot daļu no šodienas. Bet tas turpinās parādīties jau ilgu laiku. Tas, es apgalvo, ir tas, kas jūsu datora atmiņas izskatās, kad jūs darbināt programmu, jebkuru programmu. Palaižot programmu, tajā pašā augšā no jūsu datora RAM - tāpēc domāju, ka šis taisnstūris, patiesi, kā savu Datora RAM vai atmiņas, visi 101 miljards baitu no tā, viss divus miljardus baiti, visas divi gigabaiti no tā, kāds daudzums, jums ir, pieņemsim izdarīt to kā taisnstūris. Un es apgalvo, ka tad, kad jūs darbināt programmu piemēram, Microsoft Word vai Chrome vai kaut kas tamlīdzīgs, biti, kas Microsoft vai Google rakstīja - jo par minēto programmu gadījumos - tiek ielādēts datora atmiņā kur viņi var izpildīt vairāk ātri un iepludināt CPU, kas ir smadzenes no datora. Un TAM viņi uzglabā ļoti top savu programmu, lai runāt. Citiem vārdiem sakot, ja tas ir rieciens atmiņas, kad jūs dubultklikšķi uz Microsoft Word, biti nāk no cietā diska. Viņiem iekrauj RAM. Un mēs bāzt tos pašā augšā Šī taisnstūra konceptuāli. Nu, jūsu atmiņas pārējais ir izmanto dažādas lietas. Tajā pašā augšā jūs redzat sāktu dati un uninitialize datus. Tas ir jādara, lai lielākā daļa, ar konstantes vai globālie mainīgie kas ir vērtības. Bet vairāk par tiem citā laikā. Tad jums ir kaudze, kas mēs atgriezties. Bet apakšā ir daļa, kas ir Īpaši Germane tiesības tagad. Tas ir tā sauktais kaudze. Tātad, tāpat kā lielākā daļa jebkurā D zālē šeit Campus, jums ir tās paplātes, ka vienkārši kaudze virs otra, uz kura Jūs varat nodot pārtikas un plauktiņš. Kaudze datorsistēmā ir ļoti līdzīgs. Izņemot tā kā paplātes, kā mēs izmantojam ēdamzāle, protams, ir domāta veikt lietas paplātes vai rāmji - kā mēs tos saucam - jo datora atmiņa tiek izmantota, lai noturētu mainīgos un vērtības. Tātad, kas īsti notiek zem pārsega? Nu, ļaujiet man uzsist pa uz ekrāna šeit. Un pieņemsim koncentrēties tikai uz apakšējā daļa, uz brīdi. Ja tas ir apakšējā daļa no manām datora atmiņā izrādās, kad es zvanu funkcija galvenā - kas notiek, atklāti sakot, automātiski man - Man rieciens atmiņas par Apakšā mana RAM, lai runāt. Un tas ir, ja galvenais ir vietējās mainīgie iet. Tas ir, ja argc un argv varbūt iet, un visi mainīgie I atzīt iekšpusē galvenais. Viņi galu galā apakšā no mana datora RAM. Tagad pieņemsim, ka galvenie zvanus funkcijas piemēram, swap, tāpat kā tas bija pagājušajā nedēļā? Nu, mēs būtībā izvirza jaunu paplāti, jauns rāmis, uz manu rieciens atmiņas. Un es esmu gatavojas, lai aprakstītu to, kā , kas pieder uz apmaiņas funkciju. Tagad to, kas ir iekšpusē swap? Nu, balstoties uz pagājušās nedēļas programmu un Vienu mēs tikko redzējām fragmentu no, iekšpusē nomaiņu uz rāmja, vai mijmaiņas s paplāte, ir kādi mainīgie? Labi, un b. Tāpēc, ka tie bija tās vietējās argumenti, plus treškārt, tmp. Tik tiešām, es varētu izdarīt to nedaudz vairāk tīri. Ļaujiet man iet uz priekšu un atsaukt etiķeti. Un ļaujiet man apgalvot, ka jūs zināt, ko? ir iespējams, gatavojas, lai galu galā šeit. B gatavojas galu galā šeit. Un tmp gatavojas galu galā šeit. Tagad, pasūtījumi varētu būt nedaudz atšķirīgs. Bet konceptuāli tas ir ideja. Un tikai kolektīvi, tas ir tas, ko mēs saucam Mijmaiņas darījuma rāmi, vai ēdamzāle paplāte. Un tas pats galā ar galveno. Bet es ne ievilktu to. Bet tas ir, ja argc un argv un jebkuru tās vietējās mainīgo, piemēram, x un y varētu būt kā labi. Tātad tagad uzskata to, kas īsti notiek kad jūs zvanu swap. Kad zvanāt mijmaiņas, izpildot kodu, piemēram, tas, jūs iet uz, jo buggy versiju, un b kā kopijas x un y. Tātad, ja es tagad izdarīt to uz ekrāna - got labāk, šo - tāpēc stāsts man bija spēcīgi, lai sevi bija šajā buggy versijas, kad mēs zvanīt mijmaiņas iet burtiski un b kā veseli skaitļi, kas īsti notiek? Nu, kas īsti notiek, ir tas. Ļaujiet man iet uz priekšu un atsaukt tikai noskaidrot dažas vietas šeit. Tātad šī ir mana datora atmiņu. Tātad, ja man ir, piemēram, - faktiski pieņemsim darīt to šādā veidā - ja man apgalvo, ka tas ir x, uzglabājot vērtību 1, tāpat kā pagājušajā nedēļā. Un tas ir y, uzglabātu vērtību 2 tāpat kā pagājušajā nedēļā. Un tas ir galvenais, kad es zvanu swap, tādējādi nodrošinot sev pieeju un b un tmp, es esmu gatavojas apgalvot, ka Tas ir, un tas ir 1. Tas ir b. Tas ir 2. To sauc par TMP. Un sākumā, tā ir kāda atkritumu vērtība kamēr es tiešām uzglabāt tā, kas ir 1. Tad es iet uz priekšu un mainīt lai tas, ko? B s vērtību. Un tāpēc tagad man ir divi šeit. Un tad mēs teicām b izpaužas tmp. Atkal, tāpat kā veselība pārbaudītu, trešais rindā kodu šeit ir vienkārši šo viens, b izpaužas tmp. Un tā visbeidzot, ko man darīt? Es iet uz priekšu un mainīt b būt neatkarīgi no TMP vērtība ir, kas ir 1. Man nav pieskarties tmp vēlreiz. Bet tagad, problēma ir, tiklīdz aizstāšanas atgriežas, jo tas nav pārdalīšana atpakaļ uz kādu vērtību, nav atgriešanās paziņojums skaidri tajā. Kas patiesībā notiek? Nu, būtībā tas viss atmiņas - Labi, acīmredzot dzēšgumiju patīk tikai viens pirksts laikā, - vienkārši pazūd. Tagad patiesībā tas nav iet visur. Bet jūs varat domāt par to tagad, kā jautājuma zīmes. Jo tas vairs nav faktiski izmanto. Un nekas netiek darīts ar šīm vērtībām. Tātad, šajā gadījumā, ir zaļā versiju šis kods, kas tā vietā tiek pagājis vērā swap? Tātad adreses. Lai no x adrese un adresi y. Tātad, ja mēs vēlreiz pateikt, šis stāsts viena pēdējā laiku, un es tiešām izdarīt swap atkal, bet ar norādes, tas ir, šī ir b, un tas ir TMP, kas ir faktiski uzglabā šajā zaļa versija manas kodu, kur es esmu iet ar adresēm? Tas būs rādītāju x. Lai es varētu izdarīt bultiņu. Bet pieņemsim izmantot pašu patvaļīgu piemēram, kā iepriekš. Pieņemsim, ka tas ir kaut kas līdzīgs Ox123. Un tas būs Ox127, jo tas ir četri baiti prom, jo ​​tas ir int, tāpēc Ox127. Un atkal, es esmu ņemot dažas brīvību ar skaitļiem. Viņi ir daudz mazākas, nekā tās būtu faktiski un citā secībā. Bet tas ir kā attēls Tagad ir atšķirīgs. Bet, kad es izmantot šo zaļo kodu un man int tmp saņemt *. * Līdzeklis, kā darīt tālāk, ņem adresi, kas ir kas un iet uz to, kas ir 1. Un tas, ko es tad ieliek TPP. Tikmēr nākamajā līniju kodu šeit * saņem b, ko tas nozīmē? Nu, *, lai iet šeit izpaužas * b, kas nozīmē iet uz turieni. Un tas nozīmē nodot vērtību tur. Visbeidzot, pēdējā rindā kodu vienkārši teica * b izpaužas tmp. Tātad b saka iet uz turieni, un pārrakstīt to ar TMP, kas, šajā gadījumā, ir iet līdz būt, atkal, 1. Un tas ir iemesls, kāpēc zaļā versija mūsu kods strādā, bet sarkanais versija nekad nebija. Tas viss ir tikai vārīties uz leju, lai cik atmiņa ir izdevies, un, ja tas ir faktiski ievietots jūsu Datora RAM. Un par tagad, kas ir viens no lietām ka stack tiek izmantota, lai. Jautājumi par izkārtojumu? Par norādes? Vai par swap? Labi, tāpēc malloc, atsaukšana, tomēr kaut kas līdzīgs šim. Tas bija super vienkāršs piemērs. Un tas bija viens, ka mīkstās iepazīstināja mūs, kaut arī diezgan ātri, beigās klases. Dammit, tur mēs aiziet vēlreiz. Tik atceros, ka tas bija piemērs, kas Mīkstās iepazīstināja mūs, lai gan nedaudz ātri beigās klases. Un šeit mēs izmantojām malloc patiešām otro reizi. Jo pirmo reizi mēs to izmanto, lai izveidot pietiekami daudz RAM, piešķirt pietiekami daudz RAM uzglabāt virkni. Šoreiz mīkstās tur tā vienkārši. Tātad, tas ir, lai saglabātu tikai int, acīmredzot. Un tas ir pilnīgi naudas sodu. Tas ir mazliet dīvaini, godīgi sakot, lai izmantot malloc piešķirt vienu int. Bet Nika claymation punkts bija tiešām tikai pastāstīt stāstu par to, kas notiek vai nenotiek, ja Jūs kaitina atmiņu. Tātad, šajā gadījumā, šī programma bija dažas lietas. Pirmajā gadījumā šeit, tā paziņo rādītāju sauc par x, lai int. Pēc tam tā paziņo rādītāju ko sauc par y uz int. Pēc tam tā saglabā in x, ko? Kāds cits tagad. Kas izpaužas uzglabā x atbilstoši trešais līnija no šīs programmas? Mērķauditorija: [nedzirdama]. SPEAKER 1: Nu, ne gluži baiti, vienu pateikt. Precīzāk tagad. Kas izpaužas uzglabā x? Adresi, es domāju, ka es dzirdēju to. Tātad, ko tas malloc atgriezties? malloc behaviorally piešķir rieciens atmiņas. Bet kā tas ļauj piekļūt tai? Tā atgriež ko? Adrese pirmo baitu ar gabalu no atmiņas. Tagad tas ir super vienkārši. Tas ir tikai viens baits, kas nozīmē, risinātu mēs esam nonākuši atpakaļ ir adresi no visa lieta. Tātad uzglabā x tad ir adrese Šī rieciens atmiņas. Tikmēr, kas notiek tālāk? Tik tiešām, iesim uz priekšu un zīmēt šo out reālā ātri. Tātad, ja mēs ejam pāri uz ekrāna šeit un mēs spēlējam šo out int * x un int * y gatavojas darīt to, kas man? Man apgalvo, ka tas ir tikai gatavojas to darīt kaut kas līdzīgs šim, un to sauc par x, un šo un to sauc y. Tikmēr trešajā rindā kods ir gatavojas piešķirt lielumu int, kas notiek, - žēl, ja es teicu vienu pirms es nozīmēja vienu int - četri baiti uz tipisku datorā. Vismaz ar CS50 ierīci. Tātad tas ir gatavojas piešķirt tas, kurš zina? Kaut kur šeit. Un tas tiek uzglabāts dažas adrese Vērsis, kas zina? Bet to, kas notiek, lai saņemtu atpakaļ ir tā, ka adrese. Bet mēs izdarīt šo gleznieciski kā tikko bulta tāpat. Tagad nākamajā rindā * x izpaužas 42. Kāda * x nozīmē lajs izteiksmē? Vienkārši iet uz turieni. Iet uz šo adresi. Vai, citiem vārdiem sakot, sekojiet arrow un nodot 42 tur. Bet tad kaut kas slikts ir noticis uz mīkstās, vai ne? Atgādināt, ka līnija pieci šeit, * y izpaužas 13, patiešām nelaimīgs skaitlis, darīja to, ko par mums? Nu, * y nozīmē iet uz turieni. Nu, tas nav sniegta vērtība vēl, vai ne? Kods nav y ir inicializēts neko. Mums bija x tiek inicializēts uz kādu adresi. Bet y tika atzīts up top. Bet tad semikolu, nav vērtības faktiski tika likts tajā. Tātad tas ir godīgi, lai izsauktu šo atkritumu vērtību. Kurš zina, kas tur ir? Tas ir paliekas no bitiem, kas tika izmantoti ar kādu iepriekšējo līniju kodu mana programma. Tātad, ja es saku iet uz turieni, tas ir, piemēram, Man nav ne jausmas, kur tas bulta ir gatavojas galu galā. Un tas ir tad, kad jūs parasti saņemt segmentāciju vaina. Ja jūs nejauši dereference, tāpēc, lai runā, vai iet uz adresi, kas ir ne faktiski likumīga adrese, sliktas lietas notiek. Un tas ir tieši tas, kas notika domāt Binky. Tāpēc atgādina, ka stāsts, kas Nick bija stāsta šeit bija pati ideja, kāds Esmu izdarīt ar ilūziju krītu uz tāfeles tur. X un Y ir paziņots. Tad mēs piešķirti izmēru int un uzglabā to x. Tad nākamais rindā mēs * x. Tas bija Nika burvju nūjiņa no dereferencing. Kas izvirzīti 42 atmiņā norādīja x. Bet tas ir, ja lietas gāja briesmīgi nepareizi. Labi? Mēs mēģinājām dereference y. Bet y bija daži viltus vērtību, vai ne? Ka bultiņa apakšā kreisajā stūra, ir ne faktiski norādot uz kaut ko. Tas ir veids, kā darīt to, ko es bija šeit uz kuģa. Tātad sliktas lietas notiek, segmentācija vaina, vai mīkstās vaina, šajā gadījumā. Bet, ja mēs pēc tam noteikt, ka, veicot x izpaužas y kā tas stāsts pārmaiņas? Nu, ja man x izpaužas y, kas ir efektīvi Tikpat labi var teikt kāds tas ir, Vērsis, kaut būs tas pats šeit, Ox-kaut ko. Vai gleznieciski mēs izdarīt bultiņu. Tātad, šeit uz kuģa ar mīkstās, ar nākamo rindu kods, * y nozīmē iet uz turieni. Kur ir tur? Tas nozīmē, vairāk nekā šeit. Un, kad mēs atjaunināt ka, lai būtu 13 tas tikai nozīmē iet un rakstiski 13 šeit un tagad. Tātad, varbūt ne pilnīgi vienkārši pēc pirmā acu uzmetiena. Bet, lai vēlreiz apkopot un izmantot to pašu žargonu ka mīkstās bija, izmantojot šeit, tāpēc Pirmie divi piešķirt norādes, x un y, bet ne uz pointees. Un pointees ir ne parasti izmanto terminu. Bet rādītājs absolūti ir. Bet tas ir to, kas tiek norādīts pie in mīkstās s nomenklatūrā. Šis nākamais rindā, protams, piešķir int pointee. Tātad rieciens atmiņas - kā es vērsa pār labajā pusē tur - un komplekts x ir vienāds, lai norādītu uz to. Tas dereferences x uzglabāt 42 atmiņā, ka tas ir pavērsts. Un tad tas, protams, bija slikta lieta. Jo y netika norādot pie visa vēl. Tas nosaka to. Tātad tas joprojām buggy programma. Tikai tāpēc, ka mēs esam pūš cauri koda rindu pa rindai un sakot, oh labi, ļaujiet tai crash tur. Tas ir slikti. Izredzes ir programma, ir tikai gatavojas pārtraukt vispār šajā rindā. Bet, ja tu būtu, lai novērstu avarēja līnijā un aizstāt to ar pēdējo divu līnijas tur jūs piešķirat - izmantojot rādītāja uzdevumu - y norādīt uz X kā punktu t. Un tad jūs dereference y ir ļoti drošā veidā. Tātad, ja tas atstāj mūs? Nu, izrādās, ka zem motora pārsega ar CS50 bibliotēkā, norādes ir izmanto visā. Un mēs faktiski sākt lobīties atpakaļ, ka slānis pirms ilgi. Bet izrādās arī izteiksmi, ka daži no jums varētu būt pazīstams ar, jo īpaši ērtāk, ir faktiski, ka ļoti populārs mājas lapā, vai kaudze pārplūdes, šajās dienās. Bet tas tiešām ir ļoti tehniska nozīme. Mēs tagad zinām, kas kaudze ir. Tas ir tāpat kā kaudze paplātes iekšpusē ēdamzālē. Vai iekšpusē jūsu datora Atmiņas its šos rāmjus , kas tiek izmantots ar funkciju. Nu, izrādās, ka, jo to ļoti vienkārši īstenošana atmiņu un par tā saukto rāmji kaudze, jūs faktiski var kontrolēt no datorsistēmas diezgan viegli. Jūs varat kapāt sistēmā, ja cilvēki tāpat kā mums nav rakstīts mūsu kodu īpaši labi. Ja cilvēki kā mēs izmantot gabalos atmiņas vai izmantošanu masīvi - pat vairāk parasti - bet dažreiz aizmirst, lai pārbaudītu robežas mūsu masīvs, kā jūs varētu ir sevi reizēm, un atkārtoja pārāk tālu pagātnē beigām masīva. Labākajā gadījumā, jūsu programma var tikai crash. Segmentāciju vaina, kind mulsinošu. Nav liels, bet tas nav obligāti ļoti slikta lieta. Bet, ja jūsu programma ir faktiski uz reālā lietotāju datorus, ja tas darbojas uz mājas lapu, kas faktiski izlases cilvēki internetā ir hitting, ļaujot cilvēki izraisīt sliktas lietas jūsu kods ir parasti nav laba lieta, jo tas nozīmē iespēju veikt kontrole no datora. Un tas skatīsies nedaudz mistisks. Bet es domāju, ka man skandāla jums šis pēdējais piemērs šeit. Lūk koda piemērs. Un tur ir labs Wikipedia raksts, kas iet caur šo sīkāk. Man ir galvenais apakšā zvana foo, iet uz ARGV 1. Un tas ir tikai tāpēc, ka jūs varat palaist programmu un pāriet patvaļīgu ieejas. Un tad foo ir deklarēta up top kā pieņemot virkni, vai vairāk precīzi, char *. Pēc tam tā paziņo masīvu simboli. Call to buferi, plašākā nozīmē, no 12 izmēra. Līdz 12 simboli var ielikt Šī masīva sauc c. Un tad izmanto šo jauno funkciju, kas ir jauns, bet nav grūti saprotu, atmiņas kopiju. Tā kopijas atmiņu, no bāra, kas bija mainīgo pagātnes n, neatkarīgi lietotājs ievadījis 1 ARGV uz c. Cik baiti? Virknes garums bar. Tātad, citiem vārdiem sakot, ja lietotājs ir h-e-l-l-o ievadītu, virknes garums gada sveiki ir pieci. Tātad, pieci no tiem baitu gatavojas saņemt kopēt masīva sauc c, kas ir no 12 izmēra. Bet ko lietotājs veidu daudz ilgāk vārdu, kas ir 13 burti vai 14 rakstzīmes vai 100 rakstzīmes, vai vairāk? Kur viņi gatavojas iet? Labi, ka rāmis, ka paplāte ar ēdamzāle steku, viņi gatavojas iet uz turieni. Un tas ir tikai gatavojas sākt pārrakstot citi sīkumi, kas jau ir par šo steku, pārpildīta kaudze, lai runāt. Tātad gleznieciski, domāt par to šādā veidā. Tas ir tikai krāsains versija attēlu mēs esam zīmēšanas. Apakšā, teiksim, ir galvenais. Un uz augšu, ko jūs redzēt tagad ir rāmis, krāsu kodēti tagad, lai funkciju sauc foo. Bet kas ir interesanti šeit par foo ir tas, ka šeit ir tā rāmis. Tātad, tas ir sagatavots tāpat kā I darīju, bet gaiši zilā krāsā. Un tagad tas ir, ja c kronšteins 0 iet. Un tas ir, ja c kronšteins 11 gatavojas galu galā. Citiem vārdiem sakot, tas notiek ar tiks attēlots kā kvadrātu. Bet, ja jūs vienkārši glabāt plopping baiti uz leju - vai simboli - viņi gatavojas galu līdz atrašanās vietā 0 visu ceļu augšup līdz 11, jo tas ir 0 indeksēti. Bet kur ir 13 rakstzīmju gatavojas galu galā? Kur ir 14? Kur ir 50 rakstzīmju gatavojas galu galā? Tas notiek, lai saglabātu iet uz leju. Jo, pat ja mēs esam izdarīt attēlu ar kaudze aug, adreses, izrādās, iet no mazie adreses, mazie norādes, lieliem adresēm. Tātad tas tikai tur iet uz augšu un uz augšu. Tātad, ja lietotājs veidiem Sveiki, tas ir lieliski. Nav bug, nekādu problēmu, ikviena droši. Bet, ja lietotājs veidiem, ko mēs zvanu sacīkstes kodu, kuru pārstāv vispārīgi, kā, uzbrukums, uzbrukums, uzbrukums, uzbrukums, kas var notikt? Labi, ja visi no ieejas, ka lietotājs drukāti ir ne tikai daži draudzīgi vai aizskarošu rakstzīmju virkne. Tas ir tiešām rakstzīmju secība ka, ja jūs apkopot to, tas patiesībā ir kods. Varbūt tas ir kods, kas izdzēš visu failus uz jūsu cietā diska vai sūta surogātpastu vai kaut kas tamlīdzīgs. Ievērojiet, ka to, kas ir galvenais šeit ir tas, ka Ja slikts puisis got paveicies pārrakstīt sarkano rieciens atmiņas - kas man nebija izmantot manu attēlu, bet tas Wikipedia attēlu šeit ir - tā saukto atgriešanās adresi. Ja pārtikas atgriežas, kad mijmaiņas atdevi, kā tas dators zina, iet no šeit, lai šeit lejā? Vai par tehnoloģiju segmentā līdz iepriekš, kā tas zina, iet no mijmaiņas kods - 0 s un 1 s ka sacerēt swap - Atpakaļ uz galveno? Tur ir tā sauktās atgriešanās adrese glabājas tajā pašā kaudze rāmi, uz pats kafetērija paplāte. Tātad, ja slikts puisis ir pietiekami gudri, lai likts uzbrukuma kods, uzbrukums kods, uzbrukums kodu, un saņemt paveicies - bieži izmantojot izmēģinājumu un kļūdu - līdz pārrakstīt, ka sarkanā atpakaļadresi, ar adresi un paziņojums ļoti top. Paziņojums 0835C080. Tas ir rakstīts atpakaļ uz augšu top par iemesli, mēs, iespējams, pārskatīt. Tas ir, ka numurs. Tātad, ja slikts puisis izpaužas paveicies vai ir pietiekami gudrs, lai pārrakstītu sarkano atņemt atmiņas ar adresi kods, ka viņš vai viņa ir kaut kā ievada datorā, domāju, kura kods būs jāatdod tiklīdz foo tiek darīts izpildes? Slikts puisis kods. Tātad šī uzbrukuma kods, AAA, atkal varētu sūtīt mēstules, var dzēst visus failus uz jūsu cietā diska. Bet tas ir tas, kas patiešām kaudze pārplūdes ir, vai buferis pārsniegts, vai bufera pārpildes uzbrukumu. Un tas ir neticami, neticami bieži līdz šai dienai ar programmām rakstīts C, C + +, un pat dažas citas valodas. Uz šo baiso piezīmi, mēs ņemšu beidzas ar joks. [Smiekli] Tiekamies trešdien. Pie nākamā CS50 - Tāpēc es esmu visu no diska lampas šodien, bet pagaidiet, beztauku pienu, puse tālrunis grāmata, apelsīnu sula ka es dzēru šodien. USB kabelis, uzgriežņu atslēgu. [Mūzikas atskaņošanas]