1 00:00:00,000 --> 00:00:11,242 >> [Speel van musiek] 2 00:00:11,242 --> 00:00:16,630 >> David J. MALAN: Alle reg dit is CS50 en dit is die begin van die vyfde week. 3 00:00:16,630 --> 00:00:21,480 So vandag, onder jou sitplek kussings, jy sal dit nie vind nie. 4 00:00:21,480 --> 00:00:24,790 Maar bo, moet jy hierdie, 'n min teken van ons waardering vir 5 00:00:24,790 --> 00:00:26,970 al die werk wat jy in die spel van Vyftien. 6 00:00:26,970 --> 00:00:30,290 Eenvoudig verwyder die klein sirkel op die onderste om te begin speel vir die 7 00:00:30,290 --> 00:00:31,680 res van die klas. 8 00:00:31,680 --> 00:00:38,930 >> So onthou dat, of weet dat die probleem wat vier, wat uitgegaan het hierdie naweek, 9 00:00:38,930 --> 00:00:40,340 behels die skryf van 'n ander spel. 10 00:00:40,340 --> 00:00:43,740 Maar hierdie keer is dit behels die gebruik van 'n werklike grafiese gebruikerskoppelvlak, nie 'n 11 00:00:43,740 --> 00:00:46,310 tekstuele koppelvlak soos Spel van Vyftien was. 12 00:00:46,310 --> 00:00:50,210 En die wedstryd wat voorlê van julle, As jy nog nie gesien het nie hierdie volgende, 13 00:00:50,210 --> 00:00:52,310 lyk 'n bietjie iets soos hierdie. 14 00:00:52,310 --> 00:00:55,170 Ek gaan om te gaan in my terminale venster hier in GDB. 15 00:00:55,170 --> 00:00:58,600 En ek gaan om voort te gaan en die bedryf personeel oplossing, wat jy kan toegang 16 00:00:58,600 --> 00:01:01,010 na die uitvoer update 50 as gewoonlik. 17 00:01:01,010 --> 00:01:04,090 >> Maar ek gaan om dit te sit in 'n klein geheime af, 'n bietjie Easter eier, 18 00:01:04,090 --> 00:01:08,480 sogenaamde God af, deur om God in argv1. 19 00:01:08,480 --> 00:01:12,920 En ek het my eie rigtings te volg, loop dit in my eie 20 00:01:12,920 --> 00:01:14,220 probleem gestel gids. 21 00:01:14,220 --> 00:01:19,190 So nou sien jy 'n volledige weergawe van die spel van die tempo. 22 00:01:19,190 --> 00:01:21,090 In werklikheid, dit is nie-hande af. 23 00:01:21,090 --> 00:01:24,850 So dit is eintlik - 24 00:01:24,850 --> 00:01:26,470 monde van al sou jy wees - 25 00:01:26,470 --> 00:01:30,850 redelik triviaal God af te implementeer in Tempo, in teenstelling met spel van Vyftien, 26 00:01:30,850 --> 00:01:33,590 wat sommige van julle dalk aangepak het vir die hacker-uitgawe. 27 00:01:33,590 --> 00:01:37,890 >> In Breakout is dit voldoende om in God af om net te doen wat, 28 00:01:37,890 --> 00:01:41,220 intuïtief met die paddle? 29 00:01:41,220 --> 00:01:45,630 Net maak dit gelyk aan wat ook al die horisontale posisie van die bal. 30 00:01:45,630 --> 00:01:49,220 En so lank as wat jy doen in lockstep met die bal beweeg Hierdie wedstryd sal 31 00:01:49,220 --> 00:01:53,100 nooit, ooit, ooit mis die bal en jy sal elke keer wen. 32 00:01:53,100 --> 00:01:55,430 >> Maar in hierdie week se uitgawe hacker daar is meer as net God af. 33 00:01:55,430 --> 00:01:56,720 Daar is 'n aantal ander funksies. 34 00:01:56,720 --> 00:01:58,140 Onder hulle is, lasers. 35 00:01:58,140 --> 00:02:01,070 So dat as jy regtig ongeduldig raak jy kan begin af te skiet die stene 36 00:02:01,070 --> 00:02:02,120 en 'n paar ander. 37 00:02:02,120 --> 00:02:04,560 En vir dié van julle wat wil kalibreer standaard versus hacker 38 00:02:04,560 --> 00:02:08,750 uitgawe, kan ek sien dat hierdie week se hacker uitgawe is doelbewus 'n 39 00:02:08,750 --> 00:02:12,830 bietjie meer uitvoerbaar, sê, as God af was met die spel van Vyftien. 40 00:02:12,830 --> 00:02:15,300 >> So as jy op soek is na 'n rek en jy soek vir 'n paar ekstra pret 41 00:02:15,300 --> 00:02:18,400 funksies te doen duik in as van belang. 42 00:02:18,400 --> 00:02:21,280 Nou, meer prakties, laat my daarop uit een ding as well. 43 00:02:21,280 --> 00:02:24,780 GDB, wat sommige van julle kan nog nie ' raak persoonlik, wat is goed. 44 00:02:24,780 --> 00:02:28,530 Maar dit is nou regtig die tyd om gewoond te raak om hierdie en gemaklik met hierdie hulpmiddel 45 00:02:28,530 --> 00:02:31,510 want dit sal jou lewe baie makliker, werklik. 46 00:02:31,510 --> 00:02:34,900 >> Per Rob se lesing oor GDB 'n paar weke gelede, onthou 47 00:02:34,900 --> 00:02:36,810 dat GDB is 'n debugger. 48 00:02:36,810 --> 00:02:41,230 Dit is 'n instrument waarmee jy jou program, maar hardloop dit stap vir stap, lyn 49 00:02:41,230 --> 00:02:45,680 deur lyn, sodat jy kan rondom steek, sodat jy dinge sien gebeur, so 50 00:02:45,680 --> 00:02:47,310 wat jy kan uitdruk waardes van veranderlikes. 51 00:02:47,310 --> 00:02:50,580 In kort, dit gee jou soveel meer krag as printDef doen. 52 00:02:50,580 --> 00:02:52,900 >> Nou weliswaar, die koppelvlak is redelik arcane. 53 00:02:52,900 --> 00:02:55,180 Swart en wit tekstuele koppelvlak vir die grootste deel. 54 00:02:55,180 --> 00:02:57,400 Die opdragte is ietwat moeilike om te onthou by die eerste. 55 00:02:57,400 --> 00:03:01,230 Maar selfs al is dit dalk neem jy die helfte 'n uur, 'n uur, wat aan die begin te sit 56 00:03:01,230 --> 00:03:02,940 belegging van tyd in dit, glo my. 57 00:03:02,940 --> 00:03:06,440 Beslis deur semester se einde sal dit red jy 'n orde van grootte meer 58 00:03:06,440 --> 00:03:07,600 tyd as dit. 59 00:03:07,600 --> 00:03:09,200 >> So vroeg in die week duik in 60 00:03:09,200 --> 00:03:13,200 En in terme van tempo, weet dat jy kan dit doen so lank as wat jy 61 00:03:13,200 --> 00:03:18,230 die verspreiding kode of jou eie kode in vordering in jou Pst4 gids. 62 00:03:18,230 --> 00:03:21,680 Weet dat jy gdb kan hardloop. / Tempo. 63 00:03:21,680 --> 00:03:23,490 >> Dit gaan om oop te maak 'n venster soos hierdie. 64 00:03:23,490 --> 00:03:25,530 Kom ek gee myself meer van 'n terminale venster. 65 00:03:25,530 --> 00:03:27,770 En dan wat ek gaan om voort te gaan en doen nie, is dit nie net loop nie. 66 00:03:27,770 --> 00:03:30,690 Ek gaan na die eerste stel 'n breek punt Onthou, wat dit moontlik maak om jou te breek 67 00:03:30,690 --> 00:03:32,500 uitvoering op 'n spesifieke plek. 68 00:03:32,500 --> 00:03:35,750 >> Net om te hou dinge eenvoudig ek gaan te breek by lyn een net deur te tik 69 00:03:35,750 --> 00:03:37,000 die nommer een. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Laat my eintlik heropen hierdie venster want dit is om 'n 72 00:03:43,250 --> 00:03:45,700 bietjie klein daar. 73 00:03:45,700 --> 00:03:53,270 So wat ek nou gaan om hier te doen, is om As ek open my terminale venster. 74 00:03:53,270 --> 00:03:53,910 Kom op, daar gaan ons. 75 00:03:53,910 --> 00:03:59,850 >> So as ek nou terug te gaan na Dropbox, Pst4 en hardloop gdb. / tempo ingaan, sien 76 00:03:59,850 --> 00:04:02,600 Ek gaan om te breek een op te stel 'n breek punt op lyn een. 77 00:04:02,600 --> 00:04:04,840 En nou is ek gaan om te gaan voor en tipe voer. 78 00:04:04,840 --> 00:04:07,370 En wanneer ek dit doen, sien niks lyk om te gebeur. 79 00:04:07,370 --> 00:04:08,120 >> Daar is geen pop-up. 80 00:04:08,120 --> 00:04:09,790 Daar is geen grafiese gebruikerskoppelvlak nie. 81 00:04:09,790 --> 00:04:13,340 Maar dit is te verstane, want ek is letterlik by lyn een in my program. 82 00:04:13,340 --> 00:04:17,110 En sien dat ek vinnig het gestuur, nou spesifiek na 62, omdat al 83 00:04:17,110 --> 00:04:20,600 die dinge op die top van hierdie lêer dinge soos kommentaar en konstantes en 84 00:04:20,600 --> 00:04:22,460 oninteressante dinge vir nou. 85 00:04:22,460 --> 00:04:25,840 >> So nou is ek in die hoof-, dit lyk, op lyn 62. 86 00:04:25,840 --> 00:04:27,960 En dit is net die verspreiding kode, herroep. 87 00:04:27,960 --> 00:04:33,810 As ek oop hierdie deur gaan, op soortgelyke wyse, in my drop box gids in Pst4, 88 00:04:33,810 --> 00:04:35,450 in breakout.c. 89 00:04:35,450 --> 00:04:40,670 En as ek blaai af en af ​​en af, en laat my gaan voort en draai op 90 00:04:40,670 --> 00:04:44,990 my lyn nommers. 91 00:04:44,990 --> 00:04:50,300 >> Wat ek sal sien, as ek blaai af na lyn 62, is presies die lyn wat 92 00:04:50,300 --> 00:04:50,910 Ons het gestop op. 93 00:04:50,910 --> 00:04:53,720 So hierdie lyn hier, 62, is waar ons gaan wees. 94 00:04:53,720 --> 00:04:57,470 So nou in GDB, as ek gaan voort en tik nou volgende, gaan dit gaan 95 00:04:57,470 --> 00:04:58,450 voer die lyn. 96 00:04:58,450 --> 00:05:00,610 En siedaar, ons het die sogenaamde g venster. 97 00:05:00,610 --> 00:05:02,800 Indien nie vertroud met wat 'n GWindow is, nie te bekommer nie. 98 00:05:02,800 --> 00:05:05,740 Die spec sal jou bekendstel aan dit, soos sowel as 'n aantal walkthrough videos 99 00:05:05,740 --> 00:05:06,830 ingesluit in die spec. 100 00:05:06,830 --> 00:05:08,610 >> Maar laat ons nou maak dit 'n bietjie meer interessant. 101 00:05:08,610 --> 00:05:10,960 Laat my toe om die venster te beweeg oor aan die kant 'n bietjie. 102 00:05:10,960 --> 00:05:13,480 Laat my toe om die venster 'n bietjie groter, sodat ek kan sien nog baie meer. 103 00:05:13,480 --> 00:05:16,140 >> En nou, laat my gaan voort en die volgende weer doen. 104 00:05:16,140 --> 00:05:17,550 En daar is my bakstene. 105 00:05:17,550 --> 00:05:20,490 As ek tik die volgende weer nou sien ek die bal. 106 00:05:20,490 --> 00:05:23,520 En as ek tik die volgende weer nou sien ek die paddle. 107 00:05:23,520 --> 00:05:26,690 >> En gelukkig hierdie gedit is nie werklik saam te werk deur te wys my 108 00:05:26,690 --> 00:05:27,660 alles wat ek wil hê. 109 00:05:27,660 --> 00:05:30,820 Maar nou as ek volgende doen weer, volgende weer, ek is net 110 00:05:30,820 --> 00:05:32,260 verklaar 'n paar veranderlikes. 111 00:05:32,260 --> 00:05:34,750 En ek kan druk enige een van hierdie ouens uit. 112 00:05:34,750 --> 00:05:37,170 Print bakstene, afdrukke lewens. 113 00:05:37,170 --> 00:05:39,910 >> En nou as ek voortgaan om te doen volgende, merk dat ek sal 114 00:05:39,910 --> 00:05:40,870 binnekant van die loop. 115 00:05:40,870 --> 00:05:43,380 Maar die kode gaan uit te voer presies soos ek verwag. 116 00:05:43,380 --> 00:05:45,810 So toe ek hierdie funksie, wag vir Click, gaan dit te doen 117 00:05:45,810 --> 00:05:46,830 dit letterlik dat. 118 00:05:46,830 --> 00:05:48,870 So ek het skynbaar beheer verloor oor die program. 119 00:05:48,870 --> 00:05:50,480 >> GDB is nie gee my 'n ander vinnige. 120 00:05:50,480 --> 00:05:51,500 Maar nie te bekommer nie. 121 00:05:51,500 --> 00:05:53,720 Gaan na my spel, iewers klik. 122 00:05:53,720 --> 00:05:56,270 >> En siedaar, nou dit verder te line 86. 123 00:05:56,270 --> 00:05:59,460 So weer, dit is van onskatbare waarde, uiteindelik, vir ontfouting probleme. 124 00:05:59,460 --> 00:06:03,050 Want jy kan letterlik stap vir stap deur jou kode, druk dinge en nog baie, 125 00:06:03,050 --> 00:06:03,640 baie, baie meer. 126 00:06:03,640 --> 00:06:07,210 Maar vir nou, die instrumente alleen moet kry jy mooi ver. 127 00:06:07,210 --> 00:06:10,050 >> So ons is, natuurlik, 'n blik by Grafiese nou, al van 'n skielike. 128 00:06:10,050 --> 00:06:12,350 En nou het ons wêreld kry 'n bietjie meer interessant. 129 00:06:12,350 --> 00:06:15,680 En jy weet, dalk van 'n paar van die videos aanlyn dat ons hierdie 130 00:06:15,680 --> 00:06:18,280 kortbroek wat jy het al kyk as deel van die probleem stelle. 131 00:06:18,280 --> 00:06:20,460 >> En hulle het geskiet, doelbewus, teen 'n wit agtergrond. 132 00:06:20,460 --> 00:06:23,380 En sommige van hulle het die onderrig Genote trek 'n paar teks op die 133 00:06:23,380 --> 00:06:25,490 skerm wat is oorgetrek aan die kant van hulle. 134 00:06:25,490 --> 00:06:27,760 Maar natuurlik, dit is nie al wat interessant in die werklike wêreld. 135 00:06:27,760 --> 00:06:30,520 Dit is net 'n lesing saal met 'n groot wit skerm en 'n agtergrond. 136 00:06:30,520 --> 00:06:33,330 En ons wonderlike produksie span soort van maak alles lyk mooi 137 00:06:33,330 --> 00:06:36,620 na die feit deur opduik uit of oortreksel enigiets 138 00:06:36,620 --> 00:06:37,840 ons doen of wil nie. 139 00:06:37,840 --> 00:06:41,560 >> Nou net om te motiveer om hierdie week en regtig, waar jy kan gaan, uiteindelik, 140 00:06:41,560 --> 00:06:42,560 met 'n rekenaar wetenskap. 141 00:06:42,560 --> 00:06:44,260 Nie net na die probleem stel vier. 142 00:06:44,260 --> 00:06:48,240 Maar na 'n ander kursus of 'n hele kurrikulum dit is ongelooflik wat jy kan 143 00:06:48,240 --> 00:06:51,090 doen deesdae in terme van beelde in die besonder. 144 00:06:51,090 --> 00:06:53,440 >> Sommige van julle het dalk gesien het hierdie vloei rondom aanlyn. 145 00:06:53,440 --> 00:06:56,240 Maar ek het gedink ek wil wys, net vir 'n paar minute, 'n kykie van wat 146 00:06:56,240 --> 00:07:01,890 rekenaartegnologie en wat CGI, rekenaargrafika kan doen deesdae 147 00:07:01,890 --> 00:07:04,510 met 'n bekende lied en miskien film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIEK - LANA DEL Ray, "Jonk en mooi] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Spreker 1: Dit is net 'n bietjie amazing, miskien, net hoe 151 00:10:52,470 --> 00:10:52,857 alomteenwoordige - 152 00:10:52,857 --> 00:10:57,040 >> [Applous] 153 00:10:57,040 --> 00:10:59,230 >> Spreker 1: Ek het nou net afgelaai het. 154 00:10:59,230 --> 00:11:02,920 Maar dit is regtig ongelooflik, dink ek, net hoe alomteenwoordige sagteware en die kode en 155 00:11:02,920 --> 00:11:04,230 gereedskap soos dit werklik is. 156 00:11:04,230 --> 00:11:07,685 So dit is 'n voorsmakie van die rigting waarin jy kan gaan. 157 00:11:07,685 --> 00:11:10,620 O, nee meer toestel vandag. 158 00:11:10,620 --> 00:11:14,640 Wel, dit is eintlik tragies tydsberekening gegewe die punt wat ek net probeer maak. 159 00:11:14,640 --> 00:11:18,670 >> Alle reg, so laat ons begin Fusion weer. 160 00:11:18,670 --> 00:11:20,800 Herinner my later. 161 00:11:20,800 --> 00:11:24,190 Alle reg, en jy moet gekry het 'n e-pos as 'n eenkant as jy het 'n 162 00:11:24,190 --> 00:11:25,460 sien soos dit. 163 00:11:25,460 --> 00:11:29,940 Alle reg, so onthou dat dit die laaste week ons begin om te skil terug hierdie 164 00:11:29,940 --> 00:11:31,380 later bekend as string. 165 00:11:31,380 --> 00:11:34,700 >> string herinner aan 'n data tipe wat verklaar in die CS50 biblioteek. 166 00:11:34,700 --> 00:11:37,740 En dit is deel van die opleiding wiele wat sal nou begin om af te neem. 167 00:11:37,740 --> 00:11:41,280 Dit was 'n nuttige konsep vroeg op. 168 00:11:41,280 --> 00:11:43,750 Maar nou is dit gaan om meer te kry interessant en meer kragtige 169 00:11:43,750 --> 00:11:48,330 eintlik sien dat onder die enjinkap, 'n string is net wat het ons gesê? 170 00:11:48,330 --> 00:11:50,500 >> Ja, so dit is 'n sogenaamde char *. 171 00:11:50,500 --> 00:11:53,860 En die * daar dui dat daar 'n soort van adres betrokke is. 172 00:11:53,860 --> 00:11:58,690 En so wanneer jy sê char * jy net beteken 'n veranderlike wie se data tipe is 'n 173 00:11:58,690 --> 00:11:59,290 wyser nou. 174 00:11:59,290 --> 00:12:01,770 Die feit dat daar is die ster is daar beteken net dat jy 'n word verklaar 175 00:12:01,770 --> 00:12:03,020 sogenaamde wyser. 176 00:12:03,020 --> 00:12:06,220 En dit wyser gaan blykbaar slaan die adres van die, van 177 00:12:06,220 --> 00:12:07,810 Natuurlik, 'n kar. 178 00:12:07,810 --> 00:12:08,960 >> Nou hoekom maak dit sin? 179 00:12:08,960 --> 00:12:11,200 Wel, wat is 'n string onder die enjinkap? 180 00:12:11,200 --> 00:12:15,130 Wel, vir 'n geruime tyd het ons gesê: dat 'n string onder die enjinkap is 181 00:12:15,130 --> 00:12:18,460 net h-e-l-l-o, byvoorbeeld. 182 00:12:18,460 --> 00:12:21,585 >> Maar ons het gepraat oor hierdie as word, in wese, 'n skikking. 183 00:12:21,585 --> 00:12:25,410 En 'n skikking sal dan kyk 'n bietjie meer soos hierdie, met elk van hierdie 184 00:12:25,410 --> 00:12:26,460 toegang tot 'n byt. 185 00:12:26,460 --> 00:12:28,710 En dan het ons gesê dat daar is ' iets spesiaals hier agter, die 186 00:12:28,710 --> 00:12:31,270 agteroorskuisstreep 0, of nul Terminator. 187 00:12:31,270 --> 00:12:35,230 >> So al hierdie tyd, is dit hier is 'n string. 188 00:12:35,230 --> 00:12:38,320 Maar regtig, 'n string is eintlik 'n adres. 189 00:12:38,320 --> 00:12:43,210 En adresse, soos ons sal sien, is dikwels voorafgegaan met 0x deur konvensie. 190 00:12:43,210 --> 00:12:44,540 Wat beteken 0x dui? 191 00:12:44,540 --> 00:12:45,970 Is daar iemand weet? 192 00:12:45,970 --> 00:12:47,320 >> So dit beteken net heksadesimale. 193 00:12:47,320 --> 00:12:52,360 Sodat jy kan onthou, eintlik, van Pst 1, glo ek, een van die warm-up 194 00:12:52,360 --> 00:12:55,740 vrae eintlik gevra oor heksadesimale notasie in bykomend tot 195 00:12:55,740 --> 00:12:57,100 binêre en desimaal. 196 00:12:57,100 --> 00:13:00,460 En die motivering hier is dat met heksadesimale jy het 16 197 00:13:00,460 --> 00:13:01,770 syfers tot jou beskikking. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, gevolg deur a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> En as jy reken al die up, kry jy 'n totaal van 16. 200 00:13:10,430 --> 00:13:13,200 So dit is in teenstelling met desimale, waar ons 'n 10 201 00:13:13,200 --> 00:13:14,690 syfers, 0 tot nege. 202 00:13:14,690 --> 00:13:17,750 Dit is in teenstelling met die binêre waar ons moet net 0 en 1. 203 00:13:17,750 --> 00:13:21,450 >> Maar aan die einde van die dag kan jy net verteenwoordig dieselfde getalle nie, maar 204 00:13:21,450 --> 00:13:22,500 ietwat anders. 205 00:13:22,500 --> 00:13:25,840 En heksadesimale is algemeen omdat as dit blyk uit - en ons sal sien hierdie 206 00:13:25,840 --> 00:13:28,790 later in die loop - selfs wanneer ons op die web ontwikkeling in die konteks van 207 00:13:28,790 --> 00:13:32,100 HTML en kleur kodes, heksadesimale is lekker. 208 00:13:32,100 --> 00:13:36,390 Omdat elke syfer, blyk, verteenwoordig vier stukkies perfek. 209 00:13:36,390 --> 00:13:39,280 So is dit net 'n soort van lyne mooi as ons sal uiteindelik sien. 210 00:13:39,280 --> 00:13:44,720 So dit mag wees Ox123 of iets soos dié, wat die volgende aandui adres 123 211 00:13:44,720 --> 00:13:47,050 iewers binnekant van my rekenaar se geheue. 212 00:13:47,050 --> 00:13:50,600 >> Maar natuurlik, 'n paar probleme As gevolg van hierdie onderliggende 213 00:13:50,600 --> 00:13:51,520 implementering. 214 00:13:51,520 --> 00:13:55,930 En onthou dat ek 'n steek op implementering van 'n funksie soos hierdie - 215 00:13:55,930 --> 00:14:00,260 vergelyk stamp 0 dot c verlede week, wat selfs al is dit lyk soos dit was 216 00:14:00,260 --> 00:14:04,270 reg is, is dit eenvoudig nie vergelyk twee snare korrek. 217 00:14:04,270 --> 00:14:07,470 >> Ek het weg hoof gegooi, en ek het gegooi weg van die kommentaar net te fokus op 218 00:14:07,470 --> 00:14:08,970 die kode wat van belang hier. 219 00:14:08,970 --> 00:14:10,660 En dit is in rooi, want dit is karretjie. 220 00:14:10,660 --> 00:14:11,670 Om watter rede? 221 00:14:11,670 --> 00:14:15,890 >> Wel, op die top is daar wanneer ek verklaar 'n string, wat werklik aan die gang 222 00:14:15,890 --> 00:14:17,260 onder die enjinkap? 223 00:14:17,260 --> 00:14:19,530 Wel, laat ek gaan oor na die skerm hier en trek nie. 224 00:14:19,530 --> 00:14:23,230 So ek verklaar, weer, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> So ek gaan om voort te gaan en nou trek s vir wat dit werklik is. 226 00:14:26,640 --> 00:14:28,590 Dit gaan 'n vierkantige hier te wees. 227 00:14:28,590 --> 00:14:30,490 En ek gaan om te eis dat dit is 32 stukkies. 228 00:14:30,490 --> 00:14:32,890 Ten minste is dit gewoonlik, ten minste op die CS50 229 00:14:32,890 --> 00:14:34,520 toestel in 'n baie van rekenaars. 230 00:14:34,520 --> 00:14:35,980 Ek gaan om dit te noem s. 231 00:14:35,980 --> 00:14:39,070 >> Maar nou onthou dat ons genoem GetString. 232 00:14:39,070 --> 00:14:41,430 So GetString opbrengste, natuurlik, 'n string. 233 00:14:41,430 --> 00:14:45,790 As die gebruiker in h-e-l-l-o tree die string hallo kry teruggekeer. 234 00:14:45,790 --> 00:14:51,010 En dat string, as ons net sê, eindig iewers in jou rekenaar se geheue 235 00:14:51,010 --> 00:14:53,240 met 'n agteroorskuisstreep 0 aan die einde. 236 00:14:53,240 --> 00:14:56,650 Ek sal teken dit soos die skikking - of aangrensende blok karakters - 237 00:14:56,650 --> 00:14:58,330 dat dit eintlik. 238 00:14:58,330 --> 00:15:01,790 >> En nou, wat is GetString eintlik terugkeer? 239 00:15:01,790 --> 00:15:04,340 Wat het GetString is terug al hierdie tyd? 240 00:15:04,340 --> 00:15:07,520 Wel, sê ons, in weke voor, dit gee 'n string. 241 00:15:07,520 --> 00:15:10,250 Maar meer tegnies nie, wat GetString terugkeer glo? 242 00:15:10,250 --> 00:15:11,610 >> Publiek: 'n adres. 243 00:15:11,610 --> 00:15:12,600 >> Spreker 1: 'n adres. 244 00:15:12,600 --> 00:15:16,630 Spesifiek dit gee die adres van die eerste hap, wat dit ookal is. 245 00:15:16,630 --> 00:15:18,830 Ek hou net die gebruik van een, twee, drie want dit is gerieflik. 246 00:15:18,830 --> 00:15:21,380 >> Dit gee die adres van die eerste karakter in die string. 247 00:15:21,380 --> 00:15:23,510 En ons het verlede week gesê dat wat voldoende is. 248 00:15:23,510 --> 00:15:26,710 Want ons kan nie altyd uit te vind waar die einde van die tou net deur 249 00:15:26,710 --> 00:15:30,150 iterating oor dit, miskien, met 'n vir lus of 'n rukkie lus of iets soos 250 00:15:30,150 --> 00:15:34,990 dat, net op soek na "agteroorskuisstreep 0", die spesiale brandwag karakter. 251 00:15:34,990 --> 00:15:37,220 >> En dan weet ons dat die string gebeur om te wees van die lengte - 252 00:15:37,220 --> 00:15:37,980 in hierdie geval - 253 00:15:37,980 --> 00:15:38,670 vyf. 254 00:15:38,670 --> 00:15:43,800 So tegnies wat GetString doen is dit terug Ox123 in hierdie geval. 255 00:15:43,800 --> 00:15:53,670 En tegnies wat dan gebeur, is dat ons slaan, binnekant van s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Aan die einde van die dag, selfs al is dit is 'n nuwe konsep, wysers, hulle is 257 00:15:56,460 --> 00:15:57,350 net veranderlikes. 258 00:15:57,350 --> 00:16:00,440 Maar dit gebeur stukkies op te slaan wat gesamentlik verteenwoordig 'n adres. 259 00:16:00,440 --> 00:16:03,700 So tegnies al wat hulle kry gestoor in s is Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Maar ons mense - 261 00:16:04,680 --> 00:16:06,020 insluitende vandag af - 262 00:16:06,020 --> 00:16:09,290 is regtig nie van plan om te sorg, tipies, wat die werklike adres is 263 00:16:09,290 --> 00:16:10,520 van sommige stuk van die geheue. 264 00:16:10,520 --> 00:16:14,040 Dis net te lae vlak van detail te intellektueel interessant. 265 00:16:14,040 --> 00:16:15,440 So ek gaan om dit ongedaan te maak. 266 00:16:15,440 --> 00:16:19,810 En in plaas daarvan, meer 'n hoë vlak, sê net dat wanneer ons praat oor die wysers 267 00:16:19,810 --> 00:16:22,170 Ek gaan net trek meer gebruikers-vriendelike pyl wat dra die 268 00:16:22,170 --> 00:16:26,060 dieselfde idee en abstrakte weg van die Besonderhede van wat die werklike 269 00:16:26,060 --> 00:16:27,700 onderliggende adres is. 270 00:16:27,700 --> 00:16:33,290 >> Nou as ons gaan terug na die kode, wat verlede week gebeur het as ons string t 271 00:16:33,290 --> 00:16:34,510 gelyk GetString? 272 00:16:34,510 --> 00:16:38,630 Wel, as ek weer soort in Hello Hierdie keer het ek gaan kry 273 00:16:38,630 --> 00:16:40,460 'n ander deel van die geheue. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o agteroorskuisstreep 0. 275 00:16:44,820 --> 00:16:48,320 >> Maar omdat Ek geroep GetString 'n tweede keer - 276 00:16:48,320 --> 00:16:51,100 en ek weet dit uit te kyk na die bron-kode vir GetString - selfs 277 00:16:51,100 --> 00:16:54,350 al is dit toevallig dat hallo was getik in twee keer, GetString is nie 278 00:16:54,350 --> 00:16:55,890 gaan probeer om te optimaliseer en slim wees. 279 00:16:55,890 --> 00:16:58,550 Dit is net gaan nog 'n stuk van te kry geheue van die rekenaar, wat 280 00:16:58,550 --> 00:16:59,640 gaan wees by 'n ander adres. 281 00:16:59,640 --> 00:17:02,330 Kom ons arbitrêr sê net 456. 282 00:17:02,330 --> 00:17:04,079 >> En dan wat dit gaan om terug te keer? 283 00:17:04,079 --> 00:17:08,030 Dit gaan 456 om terug te keer en bêre dit in t. 284 00:17:08,030 --> 00:17:12,010 So, wat is werklik aan die gang, op die linkerkant is ek het nog 'n stuk 285 00:17:12,010 --> 00:17:14,260 van die geheue, 32 stukkies tipies. 286 00:17:14,260 --> 00:17:16,720 En daar gaan Ox456 om te gaan. 287 00:17:16,720 --> 00:17:20,140 Maar weereens, ek stel nie belang in hierdie spesifieke getalle nie. 288 00:17:20,140 --> 00:17:23,069 Ek gaan net om abstrak teken dit as 'n pyl. 289 00:17:23,069 --> 00:17:25,202 >> So, dit is nou 'n nuwe verduideliking. 290 00:17:25,202 --> 00:17:28,735 Maar dit is presies dieselfde idee wat gebeur al hierdie tyd. 291 00:17:28,735 --> 00:17:33,150 En so is die rede dan, dat hierdie eerste weergawe van vergelyk was karretjie 292 00:17:33,150 --> 00:17:34,480 verlede week is die rede waarom? 293 00:17:34,480 --> 00:17:38,000 Wanneer jy doen as s gelyk is gelyk aan t wat jy werklik 294 00:17:38,000 --> 00:17:40,550 onder die enjinkap te vergelyk? 295 00:17:40,550 --> 00:17:41,910 >> Jy vergelyk die adresse. 296 00:17:41,910 --> 00:17:47,950 En net intuïtief, duidelik, Ox123 gaan nie gelyk Ox456. 297 00:17:47,950 --> 00:17:49,380 Hierdie syfers, daardie stukkies is net anders. 298 00:17:49,380 --> 00:17:53,220 >> En so konsekwent, het verlede week gesê jy tik verskillende dinge, selfs al is die 299 00:17:53,220 --> 00:17:55,360 woorde is woordeliks dieselfde. 300 00:17:55,360 --> 00:17:58,770 Sodat ons dit regmaak. 301 00:17:58,770 --> 00:18:00,120 In leketaal, wat was die fix? 302 00:18:00,120 --> 00:18:02,110 >> GEHOOR: Gebruik 'n funksie. 303 00:18:02,110 --> 00:18:02,870 >> Spreker 1: Gebruik 'n funksie. 304 00:18:02,870 --> 00:18:05,190 Of sterre is beslis betrokke is, maar gebruik 'n funksie wat om te doen? 305 00:18:05,190 --> 00:18:05,962 >> Gehoor deur die toue te vergelyk. 306 00:18:05,962 --> 00:18:07,390 >> Spreker 1: die snare te vergelyk. 307 00:18:07,390 --> 00:18:11,030 So het die fundamentele probleem hier was dat ek net die oorweging van die 308 00:18:11,030 --> 00:18:15,870 kwaliteit van snare word gedefinieer deur vergelyking van hul adresse. 309 00:18:15,870 --> 00:18:18,540 En natuurlik dis net stom nou eenmaal jy verstaan ​​wat gaan aan 310 00:18:18,540 --> 00:18:19,510 onder die kap. 311 00:18:19,510 --> 00:18:23,270 Om werklik te vergelyk snare om te sien of Hulle is gelyk in die manier waarop 'n mens 312 00:18:23,270 --> 00:18:26,680 sal oorweeg om twee toue om gelyk te wees ons nodig het om hulle te vergelyk karakter vir 313 00:18:26,680 --> 00:18:28,070 karakter vir karakter. 314 00:18:28,070 --> 00:18:30,020 >> Nou ek kon gedoen hierdie baie tediously. 315 00:18:30,020 --> 00:18:32,240 Maar vertroulik, ons is gebruik van 'n for-lus. 316 00:18:32,240 --> 00:18:36,050 En net vergelyk s bracket i teen t bracket i. 317 00:18:36,050 --> 00:18:39,590 s bracket i plus 1 teen t bracket i plus 1, en so meer, binne 318 00:18:39,590 --> 00:18:40,580 'n soort van lus. 319 00:18:40,580 --> 00:18:44,950 En as ek sien enige twee karakters wat verskil, of as ek besef dat ooh, s is 320 00:18:44,950 --> 00:18:48,410 korter as t of langer as t Ek kan dadelik sê onwaar is, 321 00:18:48,410 --> 00:18:49,390 hulle is nie dieselfde nie. 322 00:18:49,390 --> 00:18:55,370 >> Maar as ek kry deur middel van s en t en sê dieselfde, dieselfde, dieselfde, dieselfde, dieselfde, die einde van die 323 00:18:55,370 --> 00:18:58,520 beide stringe, kan ek sê waar, hulle is gelyk. 324 00:18:58,520 --> 00:19:01,040 Wel, gelukkig, jare gelede iemand geskryf dat-kode vir ons. 325 00:19:01,040 --> 00:19:03,790 >> En hulle het dit StrComp vir string vergelyk. 326 00:19:03,790 --> 00:19:11,900 En selfs al is dit 'n bietjie counter intuïtief, StrComp terugkeer 0 indien daardie 327 00:19:11,900 --> 00:19:14,520 twee snare, s en t is dieselfde. 328 00:19:14,520 --> 00:19:18,090 Maar dit gee negatiewe waarde as s moet kom voor t alfabeties of 329 00:19:18,090 --> 00:19:20,610 positiewe waarde as dit moet kom na t alfabeties. 330 00:19:20,610 --> 00:19:24,030 >> So as jy ooit iets wil sorteer, dit blyk dat StrComp is nuttig. 331 00:19:24,030 --> 00:19:26,660 Omdat dit nie net sê Ja of nee, gelyk of nie. 332 00:19:26,660 --> 00:19:30,440 Dit gee jou 'n gevoel van die bestel graag 'n woordeboek krag. 333 00:19:30,440 --> 00:19:33,770 So StrComp, s komma t is gelyk aan gelyk aan 0 beteken dat die 334 00:19:33,770 --> 00:19:35,200 snare is werklik gelyk. 335 00:19:35,200 --> 00:19:38,680 Want wie het hierdie funksie jaar gelede vermoedelik gebruik om 'n lus vir 336 00:19:38,680 --> 00:19:42,840 of 'n rukkie lus of iets soos dit te integreer oor die karakters weer 337 00:19:42,840 --> 00:19:45,270 en weer en weer. 338 00:19:45,270 --> 00:19:47,300 >> Maar twee probleem ontstaan ​​hier. 339 00:19:47,300 --> 00:19:48,750 Dit was copy0.c. 340 00:19:48,750 --> 00:19:51,680 En die twee in rooi is want dit is gebrekkig. 341 00:19:51,680 --> 00:19:52,800 En wat het ons hier doen? 342 00:19:52,800 --> 00:19:54,310 Wel, ek het GetString. 343 00:19:54,310 --> 00:19:56,255 En ek geberg die terugkeer waarde in s. 344 00:19:56,255 --> 00:20:00,260 So dit is nogal baie dieselfde as hierdie top deel van die prentjie. 345 00:20:00,260 --> 00:20:01,490 >> Maar wat kom nadat dit? 346 00:20:01,490 --> 00:20:04,980 Wel, laat ek gaan voort en ontslae te raak van 'n hele klomp van hierdie. 347 00:20:04,980 --> 00:20:09,650 Ons sal rewind in die tyd waar ons net het s, wat nou in ooreenstemming met 348 00:20:09,650 --> 00:20:10,940 lyn een daar. 349 00:20:10,940 --> 00:20:11,400 >> Ek is so. 350 00:20:11,400 --> 00:20:13,450 As s gelyk aan 0. 351 00:20:13,450 --> 00:20:18,670 Nou, 'n vinnige kant nota, wanneer dalk GetString terugkeer 0? 352 00:20:18,670 --> 00:20:19,580 Daar is nie genoeg geheue. 353 00:20:19,580 --> 00:20:19,880 Reg? 354 00:20:19,880 --> 00:20:22,310 >> Dit is selde dat dit gaan gebeur nie, beslis op 'n rekenaar wat 355 00:20:22,310 --> 00:20:24,740 het honderde Megs of selfs gigs RAM. 356 00:20:24,740 --> 00:20:27,080 Maar dit kan, in teorie, terug 0, veral as die 357 00:20:27,080 --> 00:20:28,080 gebruiker nie saam te werk. 358 00:20:28,080 --> 00:20:31,640 Daar is maniere om te maak asof jy nie ingevoer enigiets en truuk 359 00:20:31,640 --> 00:20:34,100 GetString in die terugkeer 0 effektief. 360 00:20:34,100 --> 00:20:35,470 >> So dit gaan om te kyk vir daardie. 361 00:20:35,470 --> 00:20:39,430 Want as enige van julle het begin om te kry, reeds, segmentering foute - 362 00:20:39,430 --> 00:20:42,280 wat waarskynlik 'n bron van 'n paar frustrasie - 363 00:20:42,280 --> 00:20:46,150 dit is byna altyd die gevolg geheue-verwante fout. 364 00:20:46,150 --> 00:20:50,440 Een of ander manier wat jy deurmekaar met betrekking tot 'n wyser, selfs al is jy nie besef 365 00:20:50,440 --> 00:20:51,530 daar was 'n wyser. 366 00:20:51,530 --> 00:20:55,260 So kan jy dalk veroorsaak het segmentering foute so vroeg as week een gebruik 367 00:20:55,260 --> 00:21:02,100 iets soos 'n for-lus of 'n rukkie lus en 'n skikking deur te gaan te ver 368 00:21:02,100 --> 00:21:05,900 verby die grense van 'n skikking wat jy verklaar, in week twee in 369 00:21:05,900 --> 00:21:06,690 besonder. 370 00:21:06,690 --> 00:21:09,220 >> Jy kan dit gedoen het, selfs in probleem stel vier met tempo. 371 00:21:09,220 --> 00:21:12,910 Selfs al is jy waarskynlik nie gesien het nie enige sterre in die verspreiding kode vir 372 00:21:12,910 --> 00:21:17,410 Breakout, dit blyk dat diegene GRect en GOval en ander sulke dinge, 373 00:21:17,410 --> 00:21:19,650 dit is eintlik wenke onder die kap. 374 00:21:19,650 --> 00:21:23,430 >> Maar Stanford, soos ons, soort van huide dat die detail ten minste vir die biblioteke 375 00:21:23,430 --> 00:21:26,540 doeleindes, net soos wat ons doen vir string en char *. 376 00:21:26,540 --> 00:21:30,060 Maar GRect en GOval en al daardie dinge wat jy ouens is of sal gebruik word om 377 00:21:30,060 --> 00:21:32,630 hierdie week is uiteindelik geheue adresse. 378 00:21:32,630 --> 00:21:33,650 Jy weet net nie doen nie. 379 00:21:33,650 --> 00:21:37,240 >> Dit is dus nie verbasend dan, miskien, sodat julle reis oor 'n paar 380 00:21:37,240 --> 00:21:38,580 segmentering foute. 381 00:21:38,580 --> 00:21:41,290 Maar wat interessant is hier en nou, As nadat ons gaan vir 0 ons doen 382 00:21:41,290 --> 00:21:43,460 string t kry s. 383 00:21:43,460 --> 00:21:44,690 Wel, laat ek verklaar t. 384 00:21:44,690 --> 00:21:47,730 Ek gaan om dit te trek as 'n vierkant, 32 stukkies, noem dit t. 385 00:21:47,730 --> 00:21:49,740 En dan gaan ek te doen kry is. 386 00:21:49,740 --> 00:21:51,130 >> Wel, wat beteken dit? 387 00:21:51,130 --> 00:21:53,280 Wel, dit is 'n bietjie moeilik om te dink daaroor prentjie wys. 388 00:21:53,280 --> 00:21:55,025 Maar laat ons daaroor dink wat binne in x? 389 00:21:55,025 --> 00:21:59,430 Wat is letterlik binne hierdie veranderlike? 390 00:21:59,430 --> 00:22:01,500 Die waarde Ox123. 391 00:22:01,500 --> 00:22:05,815 >> So as ek sê string t kry s, wat net beteken letterlik neem die getal 392 00:22:05,815 --> 00:22:10,070 in s, wat Ox123 en sit dit Ox123. 393 00:22:10,070 --> 00:22:13,740 Of picturaal, as ek soort van abstrakte weg van die detail dit het die 394 00:22:13,740 --> 00:22:16,600 effek van letterlik doen hierdie so goed. 395 00:22:16,600 --> 00:22:22,110 >> So nou, dink terug aan verlede week toe ons voortgegaan om kapitalistiese T. Ek 396 00:22:22,110 --> 00:22:23,800 het T bracket 0. 397 00:22:23,800 --> 00:22:27,150 Wel, T bracket 0, selfs al is dit 'n wyser, kan jy hanteer dit asof 398 00:22:27,150 --> 00:22:29,220 dit is 'n skikking, met 'n vierkantige hakienotasie. 399 00:22:29,220 --> 00:22:31,550 >> So waar is die T bracket 0? 400 00:22:31,550 --> 00:22:32,990 Wel, dit is die h. 401 00:22:32,990 --> 00:22:36,800 En so wanneer ons dat die lyn van kode, twee boonste, wat in daardie c type.h 402 00:22:36,800 --> 00:22:38,460 kop lêer, dis waar dit verklaar. 403 00:22:38,460 --> 00:22:44,410 Jy kapitaliseer hierdie H. Maar Natuurlik, dit is presies dieselfde h dis 404 00:22:44,410 --> 00:22:46,540 binnekant van s, om so te spreek. 405 00:22:46,540 --> 00:22:51,930 En so nou het jy of verander gekapitaliseer beide die oorspronklike en die 406 00:22:51,930 --> 00:22:53,120 sogenaamde kopie. 407 00:22:53,120 --> 00:22:56,620 Omdat jy nie 'n kopie in die manier wat 'n mens sou wou hê dit moet wees. 408 00:22:56,620 --> 00:22:59,710 >> So wat was die fix hier, in copy1.c laaste week? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funksies, sodat ons kan eintlik kopieer die string. 411 00:23:05,580 --> 00:23:08,700 En fundamenteel, doen wat ons nodig het om te doen om die string te kopieer? 412 00:23:08,700 --> 00:23:12,070 >> Wel, in hierdie groen weergawe hier Ek is gaan dit redelik lae vlak te doen. 413 00:23:12,070 --> 00:23:14,260 Daar is eintlik funksies hulle kan help met hierdie. 414 00:23:14,260 --> 00:23:17,710 Maar die mees basiese een, en die mees bekende een, ten minste, sal binnekort 415 00:23:17,710 --> 00:23:19,600 bekend aan ons, is die volgende - 416 00:23:19,600 --> 00:23:21,910 so een op die eerste lyn van die kode in groen nou. 417 00:23:21,910 --> 00:23:23,970 >> Ek het net oorgeskryf is as char *. 418 00:23:23,970 --> 00:23:25,250 Daar is geen funksionele verskil daar. 419 00:23:25,250 --> 00:23:28,790 Ek het net weggegooi die CS50 biblioteek en Ek noem dit wat dit is, 'n char *. 420 00:23:28,790 --> 00:23:31,640 >> Nou dot, dot, dot, want daar was sommige foutkontroles dit is nie 421 00:23:31,640 --> 00:23:33,200 interessant om te praat oor die weer. 422 00:23:33,200 --> 00:23:34,710 So nou t verklaar word. 423 00:23:34,710 --> 00:23:35,780 Dit is ook 'n kar *. 424 00:23:35,780 --> 00:23:38,280 So ek het 'n bietjie vierkant op die skerm soos tevore. 425 00:23:38,280 --> 00:23:41,870 >> Maar op die regterkant, malloc, ons gesê het, is die geheue toeken. 426 00:23:41,870 --> 00:23:44,130 So ken sommige stuk van die geheue. 427 00:23:44,130 --> 00:23:48,830 En hoeveel grepe doen ons eintlik wil te ken, lyk dit? 428 00:23:48,830 --> 00:23:50,340 >> Wel, die string lengte van s. 429 00:23:50,340 --> 00:23:52,310 So as dit is hallo dis gaan wees vyf. 430 00:23:52,310 --> 00:23:53,950 Ons sal sê h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 So vyf grepe. 432 00:23:55,090 --> 00:23:57,960 >> Maar dan plus 1, waarom 1? 433 00:23:57,960 --> 00:23:58,830 Die 0 karakter. 434 00:23:58,830 --> 00:24:03,640 As ons laat nie ruimte vir hierdie man ons dalk per ongeluk 'n situasie skep 435 00:24:03,640 --> 00:24:05,600 waar die string is h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 En dan die volgende keer is GetString genoem en ek tik in, byvoorbeeld, 437 00:24:08,470 --> 00:24:14,020 David, D-'n-v-i-d, die rekenaar gaan om te dink dat s eintlik 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d, want daar is geen breek tussen in daardie woorde. 439 00:24:18,900 --> 00:24:19,810 >> Dus moet ons wat breek. 440 00:24:19,810 --> 00:24:20,720 So ons wil nie vyf. 441 00:24:20,720 --> 00:24:22,100 Ons wil ses grepe. 442 00:24:22,100 --> 00:24:23,110 >> En grepe wat ek sê. 443 00:24:23,110 --> 00:24:25,220 Maar dit is werklik tyd grootte van kar. 444 00:24:25,220 --> 00:24:28,040 Tegnies kar is byna altyd 'n enkele byte. 445 00:24:28,040 --> 00:24:31,030 >> Maar net om ons kode draagbare, om so te praat, sodat dit werk op 446 00:24:31,030 --> 00:24:33,750 verskillende rekenaars selfs al is hulle dalk wees ietwat anders onder die 447 00:24:33,750 --> 00:24:36,590 kap, ek gaan om te generies sê grootte van kar sodat 448 00:24:36,590 --> 00:24:37,660 my-kode altyd werk. 449 00:24:37,660 --> 00:24:40,610 En ek het dit nie te heropstel net omdat ek opgradeer my rekenaar of gebruik 450 00:24:40,610 --> 00:24:42,140 'n paar verskillende platform. 451 00:24:42,140 --> 00:24:45,300 >> So ek het 6 keer die grootte van 'n kar, wat gebeur om te wees 1. 452 00:24:45,300 --> 00:24:47,440 Dus beteken dit dat malloc kon gee my ses grepe. 453 00:24:47,440 --> 00:24:49,140 Wat is dit eintlik doen? 454 00:24:49,140 --> 00:24:52,810 Wel, laat my rol terug in tyd hier waar ons is in die storie. 455 00:24:52,810 --> 00:24:57,620 >> So as ek terug gaan hier, het ek verklaar 'n char * t genoem. 456 00:24:57,620 --> 00:25:00,280 Ek het nou genoem malloc vir ses grepe. 457 00:25:00,280 --> 00:25:06,400 En nou gaan ek daardie ses te trek grepe net soos die skikking vroeër. 458 00:25:06,400 --> 00:25:10,570 Maar ek weet eintlik nie wat is binne hierdie skikking. 459 00:25:10,570 --> 00:25:14,640 >> As jy geheue toeken dit blyk dat jy kan nie glo dat daar is 'n paar 460 00:25:14,640 --> 00:25:15,810 bekend waarde daar. 461 00:25:15,810 --> 00:25:18,400 Dit kon gewees het wat gebruik word deur iets anders, 'n ander funksie, 'n ander 462 00:25:18,400 --> 00:25:19,630 lyn van die kode wat jy geskryf het. 463 00:25:19,630 --> 00:25:22,870 Dus sal ons in die algemeen noem hierdie vullis waardes en trek hulle, miskien, as 464 00:25:22,870 --> 00:25:26,170 vraagtekens, net aandui dat ons weet nie wat is eintlik daar. 465 00:25:26,170 --> 00:25:30,390 En dit is nie 'n groot deal so lank as wat ons is slim genoeg om dié te vervang 466 00:25:30,390 --> 00:25:34,550 vullis waardes met nommers of karakters wat ons omgee. 467 00:25:34,550 --> 00:25:36,340 >> So in hierdie geval wat gaan ek doen? 468 00:25:36,340 --> 00:25:38,670 Wel, my lyn van die kode volgende, ek het vier. 469 00:25:38,670 --> 00:25:41,350 Int ek kry 0, n kry die string lengte van s. 470 00:25:41,350 --> 00:25:42,750 So 'n bekende vir lus. 471 00:25:42,750 --> 00:25:45,875 Ek is minder as of gelyk aan n, wat gewoonlik hierbo. 472 00:25:45,875 --> 00:25:47,500 >> Maar hierdie keer is dit doelbewuste. 473 00:25:47,500 --> 00:25:51,890 Ek + +, en dan het ek net doen t bracket ek kry is. 474 00:25:51,890 --> 00:25:56,320 Omdat my prentjie lyk soos hierdie by hierdie oomblik, gestoor in t is die 475 00:25:56,320 --> 00:25:59,530 adres van die ewekansige stuk van die geheue wie se waardes is onbekend. 476 00:25:59,530 --> 00:26:03,030 Maar so gou as wat ek doen t bracket 0 wat sit my hier. 477 00:26:03,030 --> 00:26:07,430 >> En wat eindig om daar geteken het? 478 00:26:07,430 --> 00:26:08,740 Ons eindig om h. 479 00:26:08,740 --> 00:26:11,170 Want dit is wat aan s bracket 0. 480 00:26:11,170 --> 00:26:14,300 En dan is dieselfde ding vir e, en l en l, en o. 481 00:26:14,300 --> 00:26:17,930 >> n, hoekom het ek gaan deur 'n gelyk is aan n? 482 00:26:17,930 --> 00:26:19,200 As gevolg van die 0 karakter. 483 00:26:19,200 --> 00:26:23,580 So net om duidelik te wees, dan, as ek eintlik vee wat hierdie gemors 484 00:26:23,580 --> 00:26:28,870 waardes is en dan eintlik trek wat ek verwag, is dit 's bracket 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus dit is sleep nuwe karakter. 486 00:26:32,440 --> 00:26:36,080 >> En so nou as ons voortgegaan om verby die kol, dot, dot in hierdie korrekte weergawe 487 00:26:36,080 --> 00:26:41,930 en gekapitaliseer t bracket 0 Ek sal, Natuurlik, kapitaliseer word net hierdie 488 00:26:41,930 --> 00:26:47,050 man hier, wat konseptueel, was uiteindelik die doel te bereik. 489 00:26:47,050 --> 00:26:48,040 So dit is al wat die wyser is. 490 00:26:48,040 --> 00:26:51,430 >> En jy is met behulp van hulle vir weke nou in die konteks van snare. 491 00:26:51,430 --> 00:26:53,530 Maar onder die enjinkap hulle 'n bietjie meer ingewikkeld. 492 00:26:53,530 --> 00:26:57,520 Maar as jy dink oor hulle in hierdie geïllustreerde vorm Ek stel voor dat hulle 493 00:26:57,520 --> 00:27:01,720 waarskynlik nie alles wat skrikwekkend soos hulle dalk die eerste lyk op die eerste oogopslag, 494 00:27:01,720 --> 00:27:04,730 veral met so 'n nuwe sintaks. 495 00:27:04,730 --> 00:27:07,290 Enige vrae oor die wysers, snare, of karakters? 496 00:27:07,290 --> 00:27:07,580 Ja? 497 00:27:07,580 --> 00:27:09,252 >> GEHOOR: Kan jy terug gaan na die [onhoorbaar]? 498 00:27:09,252 --> 00:27:10,502 >> Spreker 1: Natuurlik. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> GEHOOR: So hoe kom in jou heel laaste lyn, het jy nie 'n * t lyn 501 00:27:19,525 --> 00:27:21,513 en 'n * s in die lyn? 502 00:27:21,513 --> 00:27:23,004 Jy hoef nie die verwysing na die - 503 00:27:23,004 --> 00:27:24,640 >> Spreker 1: Ag, 'n baie goeie vraag. 504 00:27:24,640 --> 00:27:26,800 Hoekom het ek nie 'n * t en 'n * s? 505 00:27:26,800 --> 00:27:30,340 Omdat kortliks, verlede week, soos in ons ruil funksie, het ek sê dat wanneer 506 00:27:30,340 --> 00:27:33,350 jy het 'n wyser die wyse wat jy daar gaan soos ons gedoen het 507 00:27:33,350 --> 00:27:36,590 fisies op die verhoog, was om werklik gebruik om die ster operateur. 508 00:27:36,590 --> 00:27:40,570 >> Dit blyk dat hierdie vierkante-bracket notasie wat ons sal noem sintaktiese 509 00:27:40,570 --> 00:27:44,190 suiker, wat net 'n sexy manier sê dit is snelskriknotasie vir 510 00:27:44,190 --> 00:27:45,950 presies wat jy beskryf. 511 00:27:45,950 --> 00:27:49,385 Maar dit is 'n bietjie meer intuïtief. 512 00:27:49,385 --> 00:27:53,510 En op die risiko van die maak van hierdie lyk meer ingewikkeld as wat dit moet wees, 513 00:27:53,510 --> 00:27:56,990 wat regtig hier aangaan is die volgende - 514 00:27:56,990 --> 00:28:01,450 As ek sê * t wat beteken dat na die adres gestoor in t. 515 00:28:01,450 --> 00:28:04,350 >> So letterlik, as t is die stoor die adres van die h 516 00:28:04,350 --> 00:28:07,300 aanvanklik, * t beteken hier. 517 00:28:07,300 --> 00:28:10,730 Nou, wat beteken t bracket 0 beteken? 518 00:28:10,730 --> 00:28:11,560 Presies dieselfde ding. 519 00:28:11,560 --> 00:28:13,510 Dit is net 'n bietjie meer gebruiker vriendelik te skryf. 520 00:28:13,510 --> 00:28:14,430 >> Maar ek is nog nie klaar nie. 521 00:28:14,430 --> 00:28:17,800 Ek kan nie net sê * t kry * s. 522 00:28:17,800 --> 00:28:19,440 Want wat sou ek dan doen? 523 00:28:19,440 --> 00:28:22,950 Ek sal dit wees om h, h, h, h, h dwarsdeur die hele ding. 524 00:28:22,950 --> 00:28:22,995 Reg? 525 00:28:22,995 --> 00:28:26,020 >> Omdat * t is gaan na die adres in t. 526 00:28:26,020 --> 00:28:27,580 Maar ons is binnekant van 'n lus. 527 00:28:27,580 --> 00:28:32,150 En watter waarde ek die verhoog, natuurlik, op elke iterasie? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Maar daar is 'n geleentheid hier, reg? 530 00:28:34,590 --> 00:28:37,870 Selfs al is dit voel soos dit is om 'n bietjie meer gesofistikeerd 531 00:28:37,870 --> 00:28:40,730 as die vierkant-hakienotasie wat ons gebruik het vir 'n geruime tyd - 532 00:28:40,730 --> 00:28:43,840 laat my ongedaan my h verandering daar - 533 00:28:43,840 --> 00:28:48,870 selfs al is dit nou 'n bietjie Persoon, die basiese idee, as * t 534 00:28:48,870 --> 00:28:53,630 beteken hier en * t is net gaan na die adres in t. 535 00:28:53,630 --> 00:28:54,990 >> Maar wat was die adres in t? 536 00:28:54,990 --> 00:28:56,850 Die aantal hou ons gebruik? 537 00:28:56,850 --> 00:29:00,540 Soos Ox456, laat ons dit terug bring net ter wille van die bespreking. 538 00:29:00,540 --> 00:29:05,380 Wel, as ek wil om te kry op die e in t string, ek wil net om te gaan na, 539 00:29:05,380 --> 00:29:06,460 wese, 456. 540 00:29:06,460 --> 00:29:09,230 >> Of liewer, 457. 541 00:29:09,230 --> 00:29:10,590 Ek het net een nodig het om by te voeg. 542 00:29:10,590 --> 00:29:11,790 Maar ek kan dit doen nie, reg? 543 00:29:11,790 --> 00:29:14,680 Omdat t, selfs al het ek hou tekening dit is nou as 'n pyl, dit is net 'n 544 00:29:14,680 --> 00:29:16,570 nommer, Ox456. 545 00:29:16,570 --> 00:29:21,400 En as ek nog een dat, of meer in die algemeen, as ek voeg ek by dat ek kan 546 00:29:21,400 --> 00:29:24,350 kry eintlik presies waar ek wil. 547 00:29:24,350 --> 00:29:26,260 So as ek eintlik doen - 548 00:29:26,260 --> 00:29:28,970 en dit is wat nou bekend wyser rekenkundige - 549 00:29:28,970 --> 00:29:30,375 Ek kan verwyder hierdie lyn. 550 00:29:30,375 --> 00:29:33,550 Wat, eerlik, ek dink helderder en 'n bietjie meer gebruikersvriendelik te lees. 551 00:29:33,550 --> 00:29:35,970 Maar dit is nie minder nie korrek nie. 552 00:29:35,970 --> 00:29:38,570 >> Hierdie lyn van die kode nou is die gebruik van wyser rekenkundige. 553 00:29:38,570 --> 00:29:40,920 Dit sê gaan na die volgende adres - 554 00:29:40,920 --> 00:29:44,670 Wat ook al die begin van t is, wat is t plus i, wat aanvanklik 555 00:29:44,670 --> 00:29:45,730 is 0, wat is groot. 556 00:29:45,730 --> 00:29:49,280 Want dit beteken dat die begin van t plus 1, plus 2, plus 3, en so meer. 557 00:29:49,280 --> 00:29:51,030 En dieselfde deal met s. 558 00:29:51,030 --> 00:29:52,750 >> So sintaktiese suiker vir hierdie. 559 00:29:52,750 --> 00:29:55,900 Maar verstaan ​​wat regtig aangaan onder die kap, sou ek argumenteer, 560 00:29:55,900 --> 00:29:57,410 is werklik nuttig in en van die self. 561 00:29:57,410 --> 00:30:00,620 Want dit beteken nou is daar nie baie meer magie aan die gang 562 00:30:00,620 --> 00:30:01,620 onder die kap. 563 00:30:01,620 --> 00:30:03,920 Daar is nie van plan om baie meer lae wat ons kan terug skil vir jou. 564 00:30:03,920 --> 00:30:04,810 Dit is c. 565 00:30:04,810 --> 00:30:06,410 En dit is om die programmering. 566 00:30:06,410 --> 00:30:08,002 Regtig 'n goeie vraag. 567 00:30:08,002 --> 00:30:11,570 >> Alle reg, so hierdie was dat karretjie program wat ek het verwys na vroeër. 568 00:30:11,570 --> 00:30:12,650 swap gebrekkig was. 569 00:30:12,650 --> 00:30:14,070 Indien nie blyk te werk. 570 00:30:14,070 --> 00:30:17,390 Onthou dat net soos met die melk en die oranje sap - wat ek begin 571 00:30:17,390 --> 00:30:18,660 drink vandag se demonstrasie. 572 00:30:18,660 --> 00:30:22,220 So net soos met die oranje sap en die melk, het ons 'n te gebruik 573 00:30:22,220 --> 00:30:26,200 tydelike veranderlike, tmp, 'n te hou tydelik sodat ons kan dan 574 00:30:26,200 --> 00:30:28,820 verander sy waarde en dan werk b. 575 00:30:28,820 --> 00:30:32,870 >> Maar hierdie funksie, het ons gesê of hierdie program in wat hierdie funksie 576 00:30:32,870 --> 00:30:35,670 geskryf was verkeerd en verkeerd is, hoekom? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ja? 579 00:30:39,090 --> 00:30:42,471 >> GEHOOR: [onhoorbaar]. 580 00:30:42,471 --> 00:30:44,940 >> Spreker 1: Presies, wanneer jy noem ruil - 581 00:30:44,940 --> 00:30:47,820 of meer in die algemeen, wanneer jy noem die meeste 'n funksie - 582 00:30:47,820 --> 00:30:51,210 indien die argumente vir daardie funksie is primitief, so te sê, ints en karakters 583 00:30:51,210 --> 00:30:56,740 en dubbelspel en dryf, dinge sonder sterre, is jy verby in 'n afskrif van 584 00:30:56,740 --> 00:30:57,540 die argument. 585 00:30:57,540 --> 00:31:01,580 So as x is 1 en y was 2, is 'n lopende te wees 1 en b gaan wees 2. 586 00:31:01,580 --> 00:31:05,250 Maar hulle gaan om anders te wees stukke van stukkies, verskillende dele van 587 00:31:05,250 --> 00:31:07,540 geheue wat gebeur te stoor identiese waardes. 588 00:31:07,540 --> 00:31:12,160 >> So hierdie kode is super volmaakte op die uitruiling van a en b. 589 00:31:12,160 --> 00:31:13,850 Dit is nie goed op die uitruiling van - 590 00:31:13,850 --> 00:31:15,290 in verlede week se voorbeeld - 591 00:31:15,290 --> 00:31:16,390 x en y. 592 00:31:16,390 --> 00:31:18,780 Omdat weer, hulle is in die verkeerde omvang. 593 00:31:18,780 --> 00:31:21,310 >> Nou, hoe het ons gaan oor die belangrikheid van hierdie? 594 00:31:21,310 --> 00:31:23,140 Ons het die funksie te maak kyk 'n bietjie minder mooi. 595 00:31:23,140 --> 00:31:25,250 Maar weereens, oorweeg wat Dit beteken net. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> En eintlik, laat my, vir konsekwentheid, verander een ding en dit is dus identies aan 598 00:31:31,500 --> 00:31:33,200 wat ons nou net gedoen het. 599 00:31:33,200 --> 00:31:35,690 Soos ek genoem het verlede week, is dit nie saak waar dit gaan. 600 00:31:35,690 --> 00:31:38,120 In werklikheid, tipies sou jy sit die ster langs die veranderlike naam. 601 00:31:38,120 --> 00:31:40,750 Maar ek dink dit sou wees om 'n bietjie makliker te maak die * langs die oorweeg 602 00:31:40,750 --> 00:31:44,910 data tipe as wat beteken dit is 'n wyser na 'n int in hierdie geval. 603 00:31:44,910 --> 00:31:46,270 >> So, wat doen ek hier? 604 00:31:46,270 --> 00:31:49,590 Ek sê nie gee my 'n int gevolg deur 'n ander int, 605 00:31:49,590 --> 00:31:50,810 noem hulle A en B. 606 00:31:50,810 --> 00:31:52,460 Gee my die adres van 'n int. 607 00:31:52,460 --> 00:31:53,960 Gee my die adres van 'n ander int. 608 00:31:53,960 --> 00:31:56,330 Noem diegene spreek a en b. 609 00:31:56,330 --> 00:32:00,860 >> En dan met behulp van die * notasie af hieronder, gaan na elk van die adresse 610 00:32:00,860 --> 00:32:05,290 as wat nodig is om óf kry of stel die waarde daarvan. 611 00:32:05,290 --> 00:32:07,400 Maar daar is 'n uitsondering hier. 612 00:32:07,400 --> 00:32:11,130 Hoekom het ek nie 'n * by tmp? 613 00:32:11,130 --> 00:32:15,070 Hoekom moet ek dit nie doen nie, byvoorbeeld? 614 00:32:15,070 --> 00:32:19,370 Dit voel asof ek moet net almal gaan uit en stel die hele ding. 615 00:32:19,370 --> 00:32:19,752 Ja? 616 00:32:19,752 --> 00:32:21,002 >> GEHOOR: [onhoorbaar]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Spreker 1: Ek het nie verklaar tmp as 'n string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 So dit sou verklaar, in hierdie geval, 'n tmp om die adres van 'n int. 621 00:32:34,950 --> 00:32:37,380 Maar dit is nie heeltemal wat ek wil hê, vir 'n paar van die redes. 622 00:32:37,380 --> 00:32:38,616 >> Publiek: Jy wil nie om hulle te ruil. 623 00:32:38,616 --> 00:32:41,800 >> Spreker 1: Presies, ek wil nie te ruil iets met tmp. tmp is net 624 00:32:41,800 --> 00:32:42,790 week-een dinge. 625 00:32:42,790 --> 00:32:45,150 Al wat ek wil hê, is 'n veranderlike 'n nommer te stoor. 626 00:32:45,150 --> 00:32:47,330 Ek het nie eens omgee adresse op hierdie oomblik. 627 00:32:47,330 --> 00:32:50,530 >> Ek moet net 32 ​​stukkies of so 'n int te stoor. 628 00:32:50,530 --> 00:32:56,690 En ek wil om te sit in die 32 stukkies alles wat nie in 'n, om so te praat nie, maar 629 00:32:56,690 --> 00:33:01,260 wat op 'n, net om presies te wees. 630 00:33:01,260 --> 00:33:06,420 Want as 'n is 'n adres, * n beteken gaan daar en kry die waarde 1. 631 00:33:06,420 --> 00:33:10,560 Byvoorbeeld, in verlede week se voorbeeld of in B se geval, kry die waarde van 2. 632 00:33:10,560 --> 00:33:11,750 >> So, wat regtig aangaan? 633 00:33:11,750 --> 00:33:15,070 Laat my 'n prentjie hier wat net terg uitmekaar deel van vandag. 634 00:33:15,070 --> 00:33:18,580 Maar dit sal voortgaan om te verskyn vir 'n geruime tyd. 635 00:33:18,580 --> 00:33:22,430 >> Hierdie, ek eis, is wat jou rekenaar se geheue lyk soos wanneer jy 'n 636 00:33:22,430 --> 00:33:24,060 program, 'n program. 637 00:33:24,060 --> 00:33:28,340 Wanneer jy 'n program by die heel boonste van jou rekenaar se geheue - so dink 638 00:33:28,340 --> 00:33:33,530 hierdie reghoek, waarlik, as jou rekenaar se geheue of geheue, al 101 639 00:33:33,530 --> 00:33:36,920 miljard grepe van dit, al twee biljoen grepe, al twee GB van dit, 640 00:33:36,920 --> 00:33:39,910 ongeag die hoeveelheid wat jy het, is, Kom ons teken dit as 'n reghoek. 641 00:33:39,910 --> 00:33:43,260 En ek beweer dat wanneer jy 'n program soos Microsoft Word of Chrome 642 00:33:43,260 --> 00:33:49,220 of iets soos dit, die stukkies wat Microsoft of wat Google het - 643 00:33:49,220 --> 00:33:50,910 in die geval van die programme - 644 00:33:50,910 --> 00:33:54,490 gelaai word in jou rekenaar se geheue waar hulle kan meer word uitgevoer 645 00:33:54,490 --> 00:33:57,520 vinnig en gevoed in die CPU, wat is die brein van die rekenaar. 646 00:33:57,520 --> 00:34:00,940 >> En in TAM hulle gestoor word op die heel top van jou program, om so te praat. 647 00:34:00,940 --> 00:34:03,300 Met ander woorde, indien dit is 'n stuk van geheue, wanneer jy dubbel kliek op 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, die stukkies kom van die hardeskyf. 649 00:34:05,740 --> 00:34:06,680 Hulle raak gelaai in RAM. 650 00:34:06,680 --> 00:34:10,330 En ons sal stoot hulle tot op die heel boonste van hierdie reghoek konseptueel. 651 00:34:10,330 --> 00:34:13,010 >> Wel, die res van jou geheue is gebruik vir verskillende dinge. 652 00:34:13,010 --> 00:34:16,460 Op die heel boonste jy sien inisialiseer data en uninitialize data. 653 00:34:16,460 --> 00:34:20,500 Dit het te doen, vir die grootste deel, met konstantes of globale veranderlikes 654 00:34:20,500 --> 00:34:21,340 wat waardes. 655 00:34:21,340 --> 00:34:22,980 Maar meer op die ander tyd. 656 00:34:22,980 --> 00:34:25,150 >> Dan moet jy die hoop, wat Ons kom terug na. 657 00:34:25,150 --> 00:34:28,420 Maar aan die onderkant is die deel wat veral nou related. 658 00:34:28,420 --> 00:34:30,210 Dit is die sogenaamde stapel. 659 00:34:30,210 --> 00:34:33,850 So net soos in die meeste 'n D saal hier op kampus, moet jy die bak wat 660 00:34:33,850 --> 00:34:37,210 net stapel op die top van mekaar waarop jy kan sit kos en noem maar op. 661 00:34:37,210 --> 00:34:40,139 Die stapel in 'n rekenaarstelsel is baie soortgelyk. 662 00:34:40,139 --> 00:34:42,679 Behalwe dat die skinkbord, as ons gebruik in die eetsaal, natuurlik, is bedoel 663 00:34:42,679 --> 00:34:45,710 om dinge op die bak of die rame - 664 00:34:45,710 --> 00:34:49,469 as ons bel hulle - in 'n rekenaar geheue gebruik word om vas te hou 665 00:34:49,469 --> 00:34:51,610 veranderlikes en waardes. 666 00:34:51,610 --> 00:34:53,929 >> So, wat gaan regtig op onder die enjinkap? 667 00:34:53,929 --> 00:34:55,820 Wel, laat ek flip oor na die skerm hier. 668 00:34:55,820 --> 00:34:58,370 En laat ons fokus net op die onderste deel vir 'n oomblik. 669 00:34:58,370 --> 00:35:02,770 As dit is die onderste gedeelte van my rekenaar se geheue dit blyk toe ek 670 00:35:02,770 --> 00:35:05,350 noem die funksie hoof - wat gebeur, eerlik, 671 00:35:05,350 --> 00:35:06,950 outomaties vir my - 672 00:35:06,950 --> 00:35:10,510 Ek kry 'n stuk van die geheue op die onderkant van my RAM so te praat. 673 00:35:10,510 --> 00:35:13,390 En dit is waar die hoof is plaaslike veranderlikes te gaan. 674 00:35:13,390 --> 00:35:16,770 Dit is waar argc en bevat SPASIES miskien gaan, en enige veranderlikes ek 675 00:35:16,770 --> 00:35:18,170 verklaar binnekant van die belangrikste. 676 00:35:18,170 --> 00:35:20,260 Het hulle uiteindelik aan die onderkant van my rekenaar se geheue. 677 00:35:20,260 --> 00:35:25,040 >> Nou veronderstel dat hoof oproepe 'n funksie soos ruil, soos dit gedoen het die afgelope week? 678 00:35:25,040 --> 00:35:30,620 Wel, ons in wese 'n nuwe skinkbord, 'n nuwe raam, op my deel van die geheue. 679 00:35:30,620 --> 00:35:34,160 En ek gaan om dit te beskryf wat deel uitmaak van die ruil-funksie. 680 00:35:34,160 --> 00:35:35,770 >> Nou wat binne in ruil? 681 00:35:35,770 --> 00:35:39,240 Wel, gebaseer op verlede week se program en die een wat ons net 'n uittreksel uit gesien het, 682 00:35:39,240 --> 00:35:46,590 binnekant van ruil se raam, of ruil se skinkbord, is wat veranderlikes? 683 00:35:46,590 --> 00:35:47,970 Wel, a en b. 684 00:35:47,970 --> 00:35:51,850 Want dit was in die plaaslike argumente, plus 'n derde, tmp. 685 00:35:51,850 --> 00:35:54,470 So regtig, ek kon trek hierdie 'n bietjie meer skoon. 686 00:35:54,470 --> 00:35:56,680 Laat my gaan voort en ongedaan te maak die etiket. 687 00:35:56,680 --> 00:35:58,520 En laat my daarop aanspraak maak dat jy weet wat? 688 00:35:58,520 --> 00:36:00,560 >> 'n is waarskynlik gaan om te eindig hier. 689 00:36:00,560 --> 00:36:02,160 B gaan eindig hier. 690 00:36:02,160 --> 00:36:03,810 En tmp gaan eindig hier. 691 00:36:03,810 --> 00:36:05,160 Nou, die bestel mag 'n bietjie anders. 692 00:36:05,160 --> 00:36:06,840 Maar konseptueel dit is die idee. 693 00:36:06,840 --> 00:36:11,490 >> En net gesamentlik, dit is wat ons sal ruil se raam noem, of 694 00:36:11,490 --> 00:36:12,136 eetsaal skinkbord. 695 00:36:12,136 --> 00:36:13,150 En dieselfde deal met die hoof. 696 00:36:13,150 --> 00:36:14,040 Maar ek sal nie teken nie. 697 00:36:14,040 --> 00:36:17,810 Maar dit is waar argc en bevat SPASIES en enige van sy plaaslike veranderlikes soos x en y 698 00:36:17,810 --> 00:36:18,940 kan net so goed wees. 699 00:36:18,940 --> 00:36:22,170 >> So nou oorweeg wat regtig gebeur wanneer jy bel ruil. 700 00:36:22,170 --> 00:36:26,370 Wanneer jy bel ruil, uitvoering kode soos hierdie, is jy verby in, in die 701 00:36:26,370 --> 00:36:30,670 karretjie weergawe, A en B as afskrifte van x en y. 702 00:36:30,670 --> 00:36:34,300 So as ek trek nou nie hierdie op die skerm - 703 00:36:34,300 --> 00:36:36,700 gekry het om beter op hierdie - 704 00:36:36,700 --> 00:36:40,850 So het die storie wat ek vertel het om myself was in hierdie karretjie weergawe, wanneer ons 705 00:36:40,850 --> 00:36:46,130 noem ruil verby in letterlik a en b as heelgetalle, wat regtig gebeur? 706 00:36:46,130 --> 00:36:48,250 >> Wel, wat regtig gebeur is dit. 707 00:36:48,250 --> 00:36:52,850 Laat my gaan voort en ongedaan te maak net skoon te maak 'n paar ruimte hier. 708 00:36:52,850 --> 00:36:54,720 So dit is my rekenaar se geheue. 709 00:36:54,720 --> 00:36:57,510 >> So as ek, byvoorbeeld - 710 00:36:57,510 --> 00:36:58,910 eintlik Kom ons doen dit op hierdie manier - 711 00:36:58,910 --> 00:37:02,690 As ek beweer dat dit is x, stoor die waarde 1 Net soos verlede week. 712 00:37:02,690 --> 00:37:05,930 En dit is y, die stoor van die waarde 2 Net soos verlede week. 713 00:37:05,930 --> 00:37:11,370 En dit is die belangrikste, as ek roep, ruil, sodoende myself en toegang tot 'n 714 00:37:11,370 --> 00:37:15,150 b en tmp, ek gaan om te eis dit is 'n en dit is 1. 715 00:37:15,150 --> 00:37:16,080 >> Dit is b. 716 00:37:16,080 --> 00:37:17,010 Dit is 2. 717 00:37:17,010 --> 00:37:18,370 Dit is die sogenaamde tmp. 718 00:37:18,370 --> 00:37:23,360 >> En aanvanklik, dit het 'n gemors waarde totdat ek eintlik stoor in dit 'n, 719 00:37:23,360 --> 00:37:24,450 wat is 1. 720 00:37:24,450 --> 00:37:28,320 Toe het ek gaan voort en verander om 'n wat? 721 00:37:28,320 --> 00:37:29,720 B se waarde. 722 00:37:29,720 --> 00:37:31,980 >> En so nou het ek twee hier. 723 00:37:31,980 --> 00:37:34,050 En dan het ons gesê b kry tmp. 724 00:37:34,050 --> 00:37:37,670 Weer, net soos 'n gesonde verstand kyk, die derde reël van die kode hier is eenvoudig dit 725 00:37:37,670 --> 00:37:39,440 een, b kry tmp. 726 00:37:39,440 --> 00:37:41,730 >> En so laastens, wat doen ek? 727 00:37:41,730 --> 00:37:46,800 Ek gaan voort en verander b te wees wat die waarde van tmp is, wat is 1. 728 00:37:46,800 --> 00:37:48,390 Ek raak nie tmp weer. 729 00:37:48,390 --> 00:37:54,100 >> Maar nou is die probleem so gou as omruil opbrengste, want dit is nie uitdeel 730 00:37:54,100 --> 00:37:57,540 terug 'n bietjie waarde, is daar geen terugkeer verklaring uitdruklik in dit. 731 00:37:57,540 --> 00:37:59,080 Wat eintlik gebeur? 732 00:37:59,080 --> 00:38:03,480 Wel, in wese al die geheue - 733 00:38:03,480 --> 00:38:07,410 OK, blykbaar die uitveër hou net een vinger op 'n tyd - 734 00:38:07,410 --> 00:38:08,180 net verdwyn. 735 00:38:08,180 --> 00:38:10,070 >> Nou in werklikheid is dit nie iewers heen gaan. 736 00:38:10,070 --> 00:38:11,810 Maar jy kan dink dit nou as vraagtekens. 737 00:38:11,810 --> 00:38:14,040 Want dit is nie meer eintlik in gebruik. 738 00:38:14,040 --> 00:38:17,470 En niks word gedoen met daardie waardes. 739 00:38:17,470 --> 00:38:21,920 >> So in die geval van die groen weergawe van hierdie kode is wat in plaas om 740 00:38:21,920 --> 00:38:24,640 geslaag het in ruil? 741 00:38:24,640 --> 00:38:25,770 So spreek. 742 00:38:25,770 --> 00:38:28,520 So het die adres van x en die adres van y. 743 00:38:28,520 --> 00:38:35,790 So as ons hierdie storie 'n laaste her-vertel tyd, en ek eintlik trek ruil weer 744 00:38:35,790 --> 00:38:44,620 maar met wysers, dit is 'n, hierdie om b, en dit word tmp, wat 745 00:38:44,620 --> 00:38:49,080 eintlik gestoor in 'n in hierdie groen weergawe van my kode waar ek verby 746 00:38:49,080 --> 00:38:52,110 in adresse? 747 00:38:52,110 --> 00:38:53,780 >> Dit gaan 'n verwysing na x wees. 748 00:38:53,780 --> 00:38:54,890 So ek kan trek 'n pyl. 749 00:38:54,890 --> 00:38:57,310 Maar laat ons gebruik dieselfde arbitrêre byvoorbeeld as tevore. 750 00:38:57,310 --> 00:39:01,220 Kom ons sê dat dit iets soos Ox123. 751 00:39:01,220 --> 00:39:04,970 En dit gaan wees Ox127 omdat dit is vier grepe weg, want dit is 'n 752 00:39:04,970 --> 00:39:07,370 int, so Ox127. 753 00:39:07,370 --> 00:39:09,080 >> En weer, ek neem 'n paar vryhede met die nommers. 754 00:39:09,080 --> 00:39:11,430 Hulle is baie kleiner as wat hulle sou eintlik wees en in 'n ander orde. 755 00:39:11,430 --> 00:39:14,350 Maar dit is hoe die prentjie is nou anders. 756 00:39:14,350 --> 00:39:19,060 >> Maar toe ek die gebruik van hierdie groen-kode en ek kry int tmp nie * n. 757 00:39:19,060 --> 00:39:25,010 * 'N manier om die volgende te doen, neem die spreek dit is in 'n en gaan na dit, 758 00:39:25,010 --> 00:39:26,190 wat is 1. 759 00:39:26,190 --> 00:39:28,480 En dit is wat ek dan in tmp. 760 00:39:28,480 --> 00:39:32,480 Intussen, in die volgende lyn van die kode hier, * 'n kry b, wat beteken dit? 761 00:39:32,480 --> 00:39:36,910 >> Wel, * a, so hier gaan kry * b, wat beteken daar gaan. 762 00:39:36,910 --> 00:39:39,310 En dit beteken het die waarde daar. 763 00:39:39,310 --> 00:39:43,670 Ten slotte, die laaste reël van die kode eenvoudig sê * b kry tmp. 764 00:39:43,670 --> 00:39:48,900 >> So b sê daar gaan oorskryf met tmp wat, in hierdie geval, gaan 765 00:39:48,900 --> 00:39:51,520 te wees, weer, 1. 766 00:39:51,520 --> 00:39:54,920 En dit is die rede waarom die groen weergawe van ons kode werke, terwyl die rooi 767 00:39:54,920 --> 00:39:56,010 weergawe nooit gedoen het nie. 768 00:39:56,010 --> 00:39:59,020 Dit het alles net neer op hoe die geheue bestuur word en waar dit 769 00:39:59,020 --> 00:40:02,580 eintlik geplaas in jou rekenaar se geheue. 770 00:40:02,580 --> 00:40:07,270 En vir nou, dit is een van die dinge wat dat die stapel is wat gebruik word vir. 771 00:40:07,270 --> 00:40:09,225 >> Vrae oor die uitleg? 772 00:40:09,225 --> 00:40:10,380 Op riglyne? 773 00:40:10,380 --> 00:40:11,630 Of ruil? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Alle reg, so malloc, herroep, het iets soos hierdie. 776 00:40:17,043 --> 00:40:18,260 Dit was 'n super eenvoudige voorbeeld. 777 00:40:18,260 --> 00:40:20,550 En dit was die een wat Binky ingestel om ons te, al is dit heel 778 00:40:20,550 --> 00:40:21,870 vinnig aan die einde van die klas. 779 00:40:21,870 --> 00:40:24,480 Sjoe, daar gaan ons weer. 780 00:40:24,480 --> 00:40:28,780 >> So onthou dat dit was die voorbeeld wat Binky ingestel om ons te, al is dit 781 00:40:28,780 --> 00:40:30,360 ietwat vinnig aan die einde van die klas. 782 00:40:30,360 --> 00:40:33,640 En hier is ons gebruik malloc regtig vir die tweede keer. 783 00:40:33,640 --> 00:40:37,330 Omdat die eerste keer wat ons gebruik het om dit te skep genoeg geheue toeken genoeg RAM 784 00:40:37,330 --> 00:40:38,340 'n string te stoor. 785 00:40:38,340 --> 00:40:40,250 >> Hierdie tyd Binky het dit eenvoudig. 786 00:40:40,250 --> 00:40:42,465 So dit is net stoor 'n int, blykbaar. 787 00:40:42,465 --> 00:40:43,510 En dit is heeltemal fyn. 788 00:40:43,510 --> 00:40:46,560 Dit is 'n bietjie vreemd, eerlik, te gebruik malloc een int toe te ken. 789 00:40:46,560 --> 00:40:50,650 Maar die punt van Nick se Claymation was eintlik net die storie vertel van wat 790 00:40:50,650 --> 00:40:53,830 gebeur of nie gebeur wanneer jy mishandel geheue. 791 00:40:53,830 --> 00:40:56,520 >> So in hierdie geval, is hierdie program het 'n paar dinge. 792 00:40:56,520 --> 00:41:01,580 In die eerste geval is hier, dit verklaar 'n wyser genoem x na 'n int. 793 00:41:01,580 --> 00:41:04,480 Dit verklaar dan 'n wyser genoem y na 'n int. 794 00:41:04,480 --> 00:41:06,150 Dit slaan dan in x, wat? 795 00:41:06,150 --> 00:41:07,110 Iemand anders nou. 796 00:41:07,110 --> 00:41:09,685 Wat kry gestoor in x volgens die derde reël van hierdie program? 797 00:41:09,685 --> 00:41:12,380 >> GEHOOR: [onhoorbaar]. 798 00:41:12,380 --> 00:41:14,130 >> Spreker 1: Wel, nie heeltemal grepe, per sê. 799 00:41:14,130 --> 00:41:16,760 Meer presies te wees nou. 800 00:41:16,760 --> 00:41:18,325 Wat kry gestoor in x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 'N adres, ek dink ek het dit gehoor. 803 00:41:22,060 --> 00:41:23,570 >> So wat beteken malloc terugkeer? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally ken 'n stuk van die geheue. 805 00:41:26,030 --> 00:41:27,850 Maar hoe kry jy toegang tot dit? 806 00:41:27,850 --> 00:41:29,460 Dit gee wat? 807 00:41:29,460 --> 00:41:32,000 Die adres van die eerste byte in die deel van die geheue. 808 00:41:32,000 --> 00:41:33,020 >> Nou, dit is super eenvoudig. 809 00:41:33,020 --> 00:41:35,380 Dit is net een byte, wat beteken dat die spreek ons ​​terug kry is die 810 00:41:35,380 --> 00:41:37,300 adres van die hele ding. 811 00:41:37,300 --> 00:41:42,070 So gestoor in x dan is die adres van daardie deel van die geheue. 812 00:41:42,070 --> 00:41:43,400 Intussen, wat gebeur volgende? 813 00:41:43,400 --> 00:41:45,890 So eintlik, laat ons gaan voort en trek dit uit ware vinnig. 814 00:41:45,890 --> 00:41:52,490 >> So as ons gaan oor na die skerm hier en ons speel dit uit int * x en y int * 815 00:41:52,490 --> 00:41:53,740 gaan wat om te doen vir my? 816 00:41:53,740 --> 00:41:58,280 Ek beweer dat dit net gaan om te doen iets soos hierdie en noem dit x, en 817 00:41:58,280 --> 00:42:00,010 hierdie en noem dit y. 818 00:42:00,010 --> 00:42:03,110 Intussen het die derde reël van die kode is gaan die grootte van 'n int te ken, 819 00:42:03,110 --> 00:42:06,160 wat gebeur om te wees - jammer as ek sê een voor ek bedoel een int - 820 00:42:06,160 --> 00:42:08,280 vier grepe op 'n tipiese rekenaar. 821 00:42:08,280 --> 00:42:09,720 Ten minste met die CS50 toestel. 822 00:42:09,720 --> 00:42:11,490 >> So dit gaan om te wys dit, wie weet? 823 00:42:11,490 --> 00:42:12,800 Iewers hier. 824 00:42:12,800 --> 00:42:15,780 En dit gestoor word op 'n sekere adres Os, wie weet? 825 00:42:15,780 --> 00:42:18,330 Maar wat gaan kry terug is dat adres. 826 00:42:18,330 --> 00:42:22,270 Maar ons sal trek hierdie picturaal as net 'n pyl soos dit. 827 00:42:22,270 --> 00:42:25,430 >> Nou in die volgende lyn * x kry 42. 828 00:42:25,430 --> 00:42:29,400 Wat beteken * x beteken in leketaal? 829 00:42:29,400 --> 00:42:30,040 Gaan net daar. 830 00:42:30,040 --> 00:42:30,960 Gaan na daardie adres. 831 00:42:30,960 --> 00:42:35,900 Of in ander woorde, volg die pyl en sit 42 daar. 832 00:42:35,900 --> 00:42:38,140 Maar dan is daar iets sleg gebeur te Binky, reg? 833 00:42:38,140 --> 00:42:43,950 >> Onthou dat die lyn vyf hier, * y kry 13, inderdaad 'n ongelukkige nommer, 834 00:42:43,950 --> 00:42:44,760 gedoen het wat vir ons? 835 00:42:44,760 --> 00:42:47,320 Wel, * y beteken daar gaan. 836 00:42:47,320 --> 00:42:50,460 Wel, het dit nie gegee 'n waarde nie, reg? 837 00:42:50,460 --> 00:42:54,090 Die kode het nie y om geïnisialiseer na iets. 838 00:42:54,090 --> 00:42:56,120 Ons het x word geïnisialiseer na 'n adres. 839 00:42:56,120 --> 00:42:57,640 Maar y verklaar is tot bo-op. 840 00:42:57,640 --> 00:43:00,250 Maar dan moet 'n kommapunt, geen waarde is eintlik sit in dit. 841 00:43:00,250 --> 00:43:02,330 So dit is regverdig om dit te noem 'n gemors waarde. 842 00:43:02,330 --> 00:43:03,430 Wie weet wat is daar? 843 00:43:03,430 --> 00:43:07,160 Dit is die oorblyfsels van die stukkies wat gebruik is deur 'n paar vorige lyn van die kode in 844 00:43:07,160 --> 00:43:08,300 my program. 845 00:43:08,300 --> 00:43:13,250 >> So as ek sê daar gaan, dit is soos, Ek het geen idee waar hierdie pyl 846 00:43:13,250 --> 00:43:14,490 gaan aan die einde. 847 00:43:14,490 --> 00:43:17,720 En dit is wanneer jy gewoonlik kry 'n segmentering skuld. 848 00:43:17,720 --> 00:43:22,430 Indien jy per ongeluk dereference, so te praat, of gaan na 'n adres wat nie 849 00:43:22,430 --> 00:43:25,400 eintlik 'n wettige adres, slegte dinge gebeur. 850 00:43:25,400 --> 00:43:27,550 >> En dit is presies wat gebeur het Binky te dink. 851 00:43:27,550 --> 00:43:31,060 So onthou dat die storie wat Nick was vertel hier was dieselfde idee as wat 852 00:43:31,060 --> 00:43:34,050 Ek het getrek met die illusie van kryt op die bord is daar. 853 00:43:34,050 --> 00:43:35,960 X en Y is verklaar. 854 00:43:35,960 --> 00:43:39,690 >> Daarna het ons toegeken is die grootte van 'n int en bewaar dit in x. 855 00:43:39,690 --> 00:43:42,130 Toe het die volgende lyn wat ons gedoen het * x. 856 00:43:42,130 --> 00:43:46,070 Dit was Nick se towerstaffie van ontwysing. 857 00:43:46,070 --> 00:43:49,780 Dit het 42 in die geheue uitgewys deur x. 858 00:43:49,780 --> 00:43:51,600 >> Maar dit is hier waar dinge skeefgeloop het. 859 00:43:51,600 --> 00:43:51,820 Reg? 860 00:43:51,820 --> 00:43:53,550 Ons het probeer om dereference y. 861 00:43:53,550 --> 00:43:55,620 Maar y het 'n paar valse waarde, reg? 862 00:43:55,620 --> 00:43:57,720 >> Dit pyl in die onderste linker-hand draai, is dit nie 863 00:43:57,720 --> 00:43:58,950 eintlik verwys na iets. 864 00:43:58,950 --> 00:44:01,520 Dit is soort van doen wat ek het hier op die bord. 865 00:44:01,520 --> 00:44:05,900 So slegte dinge gebeur, segmentering skuld, of Binky skuld, in hierdie geval. 866 00:44:05,900 --> 00:44:10,800 >> Maar as ons dan los dat deur dit te doen x kry y hoe die storie verander? 867 00:44:10,800 --> 00:44:15,760 Wel, as ek doen x y kry, wat effektief dieselfde as om te sê 868 00:44:15,760 --> 00:44:19,235 wat ook al dit is, bees-iets gaan dieselfde wees hier, 869 00:44:19,235 --> 00:44:20,080 Bees-iets. 870 00:44:20,080 --> 00:44:22,970 Of picturaal ons sal trek 'n pyl. 871 00:44:22,970 --> 00:44:25,530 >> So hier op die bord met Binky, met die volgende lyn van 872 00:44:25,530 --> 00:44:28,350 kode, * y beteken daar gaan. 873 00:44:28,350 --> 00:44:29,400 Waar is daar? 874 00:44:29,400 --> 00:44:30,820 Dit beteken hier. 875 00:44:30,820 --> 00:44:36,050 >> En wanneer ons werk wat om te wees 13 dit behels net gaan en 876 00:44:36,050 --> 00:44:39,470 skryf 13 nou hier. 877 00:44:39,470 --> 00:44:44,130 So miskien nie heeltemal eenvoudig op die eerste oogopslag. 878 00:44:44,130 --> 00:44:47,740 Maar om te vat en dieselfde jargon te gebruik dat Binky is hier gebruik, so 879 00:44:47,740 --> 00:44:50,485 die eerste twee ken die wysers, x en y, maar nie die pointees. 880 00:44:50,485 --> 00:44:54,750 En pointees is nie 'n algemeen gebruikte term. 881 00:44:54,750 --> 00:44:56,120 Maar wyser is absoluut. 882 00:44:56,120 --> 00:44:59,200 Maar dit is wat daar gewys by in Binky se naam. 883 00:44:59,200 --> 00:45:01,660 >> Hierdie volgende reël, natuurlik, ken 'n int pointee. 884 00:45:01,660 --> 00:45:04,840 So 'n stuk van die geheue - as ek het oor op die regterkant is daar - en stel 885 00:45:04,840 --> 00:45:06,470 x gelyk te wys om dit te. 886 00:45:06,470 --> 00:45:11,350 Dit dereferences x 42 te slaan in die geheue wat dit is wys. 887 00:45:11,350 --> 00:45:13,380 En dan is dit natuurlik was 'n slegte ding nie. 888 00:45:13,380 --> 00:45:15,600 Omdat y is nie wys aan enigiets nie. 889 00:45:15,600 --> 00:45:16,530 Dit is vasgestel nie. 890 00:45:16,530 --> 00:45:18,240 So, dit is nog steeds karretjie program. 891 00:45:18,240 --> 00:45:21,580 Net omdat ons waai deur die kode reël vir reël en gesê: Ag wel, 892 00:45:21,580 --> 00:45:22,690 laat dit crash daar. 893 00:45:22,690 --> 00:45:23,420 Dit is 'n slegte ding nie. 894 00:45:23,420 --> 00:45:26,790 Kans is die program net gaan aborteer geheel en al op die lyn. 895 00:45:26,790 --> 00:45:30,550 Maar as jy was om te verwyder die ongeluk reël en vervang dit met die laaste twee 896 00:45:30,550 --> 00:45:32,470 lyne is daar wat jy ken - 897 00:45:32,470 --> 00:45:35,310 gebruik wyser opdrag - y om aan te dui x as punt t. 898 00:45:35,310 --> 00:45:39,280 En dan moet jy dereference y in 'n baie veilige manier. 899 00:45:39,280 --> 00:45:41,520 >> So waar laat dit ons? 900 00:45:41,520 --> 00:45:45,350 Wel, blyk dit dat onder die enjinkap in die CS50 biblioteek, wysers is 901 00:45:45,350 --> 00:45:46,320 deurgaans gebruik. 902 00:45:46,320 --> 00:45:48,910 En ons sal eintlik begin om te skil terug wat laag voor lank. 903 00:45:48,910 --> 00:45:51,740 Maar dit blyk ook 'n uitdrukking wat sommige van julle dalk bekend wees met, 904 00:45:51,740 --> 00:45:54,580 veral diegene wat meer gemaklik, is eintlik dié van 'n baie gewilde 905 00:45:54,580 --> 00:45:56,390 webwerf, of Stapeloorvloei, hierdie dae. 906 00:45:56,390 --> 00:45:58,720 >> Maar dit het eintlik baie tegniese betekenis. 907 00:45:58,720 --> 00:46:00,160 Ons weet nou wat 'n stapel is. 908 00:46:00,160 --> 00:46:02,550 Dit is soos 'n stapel van bak binnekant van 'n eetsaal. 909 00:46:02,550 --> 00:46:05,140 >> Of binnekant van jou rekenaar se geheue sy diegene rame 910 00:46:05,140 --> 00:46:06,900 wat gebruik word deur funksies. 911 00:46:06,900 --> 00:46:10,760 Wel, dit blyk dat as gevolg van daardie baie eenvoudige implementering van 912 00:46:10,760 --> 00:46:14,970 geheue en die rame op die sogenaamde stapel, kan jy eintlik beheer neem 913 00:46:14,970 --> 00:46:17,050 van 'n rekenaarstelsel redelik maklik. 914 00:46:17,050 --> 00:46:22,180 Jy kan hack in 'n stelsel as mense soos ons het nie geskryf nie ons kode 915 00:46:22,180 --> 00:46:23,300 besonder goed. 916 00:46:23,300 --> 00:46:26,670 >> As mense soos ons gebruik om stukke van die geheue of die gebruik skikkings - 917 00:46:26,670 --> 00:46:27,810 selfs meer algemeen - 918 00:46:27,810 --> 00:46:31,800 maar soms vergeet van die om te kyk grense van ons verskeidenheid as jy dalk 919 00:46:31,800 --> 00:46:38,470 jouself soms en herhaalde manier om te ver verby die einde 'n skikking. 920 00:46:38,470 --> 00:46:40,520 In die beste geval, jou program mag dalk net crash. 921 00:46:40,520 --> 00:46:42,280 Segmentering skuld, soort van verleentheid. 922 00:46:42,280 --> 00:46:45,480 Nie groot nie, maar dit is nie noodwendig 'n baie slegte ding. 923 00:46:45,480 --> 00:46:49,480 >> Maar as jou program is eintlik op 'n ware gebruikers se rekenaars, as dit is wat uitgevoer 924 00:46:49,480 --> 00:46:53,070 op 'n webwerf wat die werklike ewekansige mense op die internet is slaan, laat 925 00:46:53,070 --> 00:46:56,690 mense veroorsaak slegte dinge op jou kode is oor die algemeen nie 'n goeie ding, want 926 00:46:56,690 --> 00:46:59,930 beteken dit 'n geleentheid om te neem beheer van die rekenaar. 927 00:46:59,930 --> 00:47:01,350 En dit gaan om te kyk 'n bietjie kripties. 928 00:47:01,350 --> 00:47:04,570 Maar ek het gedink ek wil bang met hierdie laaste voorbeeld hier. 929 00:47:04,570 --> 00:47:05,650 >> Hier is 'n voorbeeld van die kode. 930 00:47:05,650 --> 00:47:07,370 En daar is 'n goeie Wikipedia artikel wat loop deur 931 00:47:07,370 --> 00:47:08,530 dit in meer detail. 932 00:47:08,530 --> 00:47:13,890 Ek het groot aan die onderkant roeping cat, verby in bevat SPASIES van 1. 933 00:47:13,890 --> 00:47:15,750 En dit is net sodat jy kan hardloop die program en slaag 934 00:47:15,750 --> 00:47:17,080 'n arbitrêre insette. 935 00:47:17,080 --> 00:47:20,180 >> En dan cat verklaar word tot bo as die aanvaarding van 'n string, of meer 936 00:47:20,180 --> 00:47:21,700 presies, 'n char *. 937 00:47:21,700 --> 00:47:23,860 Dit verklaar dan 'n verskeidenheid van karakters. 938 00:47:23,860 --> 00:47:27,130 Noem dit 'n buffer, meer in die algemeen, van grootte 12. 939 00:47:27,130 --> 00:47:30,900 So 12 karakters kan pas binne van die skikking met die naam c. 940 00:47:30,900 --> 00:47:33,510 >> En dan is dit gebruik maak van hierdie nuwe funksie, wat is 'n nuwe, maar nie moeilik om te 941 00:47:33,510 --> 00:47:34,930 verstaan, geheue kopie. 942 00:47:34,930 --> 00:47:39,290 Dit afskrifte van die geheue van die bar, wat die veranderlike afgelope n, wat ook al die 943 00:47:39,290 --> 00:47:42,080 gebruiker getik in 1 bevat SPASIES in c. 944 00:47:42,080 --> 00:47:43,090 Hoeveel grepe? 945 00:47:43,090 --> 00:47:44,260 Die string lengte van bar. 946 00:47:44,260 --> 00:47:48,380 >> So met ander woorde, indien die gebruiker in h-e-l-l-o betree, die string lengte 947 00:47:48,380 --> 00:47:49,260 van hallo is vyf. 948 00:47:49,260 --> 00:47:52,790 So vyf van dié grepe gaan kry gekopieer na die skikking met die naam c, wat 949 00:47:52,790 --> 00:47:54,110 is van grootte 12. 950 00:47:54,110 --> 00:47:58,710 Maar wat die gebruiker in 'n baie langer woord wat is 13 karakters of 14 951 00:47:58,710 --> 00:48:01,250 karakters of 100 karakters of meer? 952 00:48:01,250 --> 00:48:02,660 >> Waar gaan hulle om te gaan? 953 00:48:02,660 --> 00:48:06,090 Wel, dit raam, wat skinkbord in die eetsaal stapel, 954 00:48:06,090 --> 00:48:06,930 hulle gaan om daar te gaan. 955 00:48:06,930 --> 00:48:10,080 En dit is net gaan om te begin vervang ander dinge wat reeds 956 00:48:10,080 --> 00:48:12,880 op die stapel, oorloop die stapel, om so te spreek. 957 00:48:12,880 --> 00:48:14,780 >> So picturaal, dink dit op hierdie manier. 958 00:48:14,780 --> 00:48:17,970 Dit is net 'n kleurvolle weergawe van die prentjie het ons teken. 959 00:48:17,970 --> 00:48:20,060 Aan die onderkant, kom ons sê, is die vernaamste. 960 00:48:20,060 --> 00:48:24,690 En op die top, wat jy nou sien is die raam, kleurgekodeerde nou, vir 'n 961 00:48:24,690 --> 00:48:26,090 funksie genoem cat. 962 00:48:26,090 --> 00:48:30,170 Maar wat interessant is hier oor cat is dat hier is sy raam. 963 00:48:30,170 --> 00:48:32,860 So dit is getrek, net soos ek gedoen het, maar in die lig blou. 964 00:48:32,860 --> 00:48:35,220 En nou is dit is waar c bracket 0 gaan. 965 00:48:35,220 --> 00:48:37,410 En dit is waar c bracket 11 gaan beland. 966 00:48:37,410 --> 00:48:39,670 >> Met ander woorde, dit gebeur met verteenwoordig te word as 'n vierkant. 967 00:48:39,670 --> 00:48:42,320 Maar as jy net aanhou plop grepe af - of karakters - hulle gaan aan die einde 968 00:48:42,320 --> 00:48:46,070 tot by die plek 0 al die pad tot tot 11 want dit is 0 kruip. 969 00:48:46,070 --> 00:48:49,170 >> Maar waar is die 13de karakter gaan aan die einde? 970 00:48:49,170 --> 00:48:50,310 Waar is die 14de? 971 00:48:50,310 --> 00:48:52,430 Waar is die 50 karakter gaan aan die einde? 972 00:48:52,430 --> 00:48:54,070 >> Dit is die gang te hou om af te gaan. 973 00:48:54,070 --> 00:48:57,350 Want selfs al het ons getrek word om die prentjie met die stapel grootword, die 974 00:48:57,350 --> 00:48:59,920 adresse, dit blyk, gaan uit klein adresse, klein 975 00:48:59,920 --> 00:49:01,830 wysers, tot groot adresse. 976 00:49:01,830 --> 00:49:03,540 So hou dit net gaan op en op. 977 00:49:03,540 --> 00:49:05,660 >> Dus, as die gebruiker in hallo, dit is groot. 978 00:49:05,660 --> 00:49:08,650 Geen fout, geen probleem, almal se kluis. 979 00:49:08,650 --> 00:49:11,940 Maar as die gebruiker in wat ons sal noem opponerende kode, verteenwoordig 980 00:49:11,940 --> 00:49:16,040 generies as 'n, aanval, aanval, aanval, aanval, wat kan gebeur? 981 00:49:16,040 --> 00:49:19,760 >> Wel, as al die insette wat die gebruiker getik in is nie net 'n vriendelike 982 00:49:19,760 --> 00:49:21,540 of beledigende string van die karakters. 983 00:49:21,540 --> 00:49:24,050 Dit is eintlik 'n reeks van karakters dat as jy saamgestel het, 984 00:49:24,050 --> 00:49:26,050 dit is eintlik kode. 985 00:49:26,050 --> 00:49:29,570 Miskien is dit kode wat verwyder al die lêers op jou hardeskyf of stuur spam 986 00:49:29,570 --> 00:49:30,810 of iets soos dit. 987 00:49:30,810 --> 00:49:35,110 Let daarop dat wat is die sleutel hier is dat Indien die slegte ou het gelukkig genoeg is om te 988 00:49:35,110 --> 00:49:37,830 vervang die rooi deel van die geheue - 989 00:49:37,830 --> 00:49:41,080 wat ek nie trek op my foto, maar hierdie Wikipedia prentjie hier het - 990 00:49:41,080 --> 00:49:42,890 sy sogenaamde terugkeer adres. 991 00:49:42,890 --> 00:49:47,470 >> Wanneer kos opbrengste, toe ruil opbrengste, hoe weet die rekenaar om te gaan uit 992 00:49:47,470 --> 00:49:49,790 hier af hier? 993 00:49:49,790 --> 00:49:52,920 Of in die tegnologie segment bo, hoe beteken dit weet om te gaan van die ruil 994 00:49:52,920 --> 00:49:54,870 kode - die 0's en 1 se waaruit ruil - 995 00:49:54,870 --> 00:49:56,020 Terug na die hoof? 996 00:49:56,020 --> 00:50:00,450 Daar is 'n sogenaamde terugkeer adres gestoor in dieselfde stapel raam, op 997 00:50:00,450 --> 00:50:02,140 dieselfde kafeteria skinkbord. 998 00:50:02,140 --> 00:50:06,080 >> Dus, as die slegte ou is slim genoeg om te sit aanval kode, aanval kode, aanval 999 00:50:06,080 --> 00:50:07,960 kode, en kry gelukkig genoeg - 1000 00:50:07,960 --> 00:50:11,630 dikwels deur middel van verhoor en fout - te oor skryf dat die rooi adres, 1001 00:50:11,630 --> 00:50:14,360 met die adres en kennisgewing die heel boonste. 1002 00:50:14,360 --> 00:50:16,830 Kennisgewing 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Dit is geskryf agteruit tot bo vir redes sal ons dalk heroorweeg. 1004 00:50:20,650 --> 00:50:22,050 Dit is dat die getal. 1005 00:50:22,050 --> 00:50:25,790 >> So as die slegte man kry gelukkig genoeg is of is slim genoeg om die rooi te vervang 1006 00:50:25,790 --> 00:50:29,480 strook van die geheue met die adres van kode wat hy of sy een of ander manier het 1007 00:50:29,480 --> 00:50:34,980 ingespuit in jou rekenaar, raai wie se kode gaan word teruggekeer na 1008 00:50:34,980 --> 00:50:38,260 sodra cat gedoen uitvoering? 1009 00:50:38,260 --> 00:50:39,440 >> Die slegte ou se kode. 1010 00:50:39,440 --> 00:50:43,610 So hierdie aanval kode, AAA, weer, dalk stuur spam, kan verwyder al die lêers 1011 00:50:43,610 --> 00:50:44,500 op jou hardeskyf. 1012 00:50:44,500 --> 00:50:48,740 Maar dit is wat werklik 'n Stapeloorvloei is, of 'n Bufferschrijding, of 'n 1013 00:50:48,740 --> 00:50:51,060 buffer oorloop aanval. 1014 00:50:51,060 --> 00:50:54,400 >> En dit is ongelooflik, ongelooflik algemene tot hierdie dag saam met programme wat geskryf is in 1015 00:50:54,400 --> 00:50:58,220 C, C + +, en selfs 'n paar ander tale. 1016 00:50:58,220 --> 00:51:02,275 Op daardie vreesaanjaende noot, ons sal eindig met 'n grap. 1017 00:51:02,275 --> 00:51:03,230 >> [Gelag] 1018 00:51:03,230 --> 00:51:04,550 >> Sien julle op Woensdag. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 By die volgende CS50 - 1021 00:51:10,310 --> 00:51:15,920 So ek is al uit skyf lampe vandag nie, maar wag, vet-vrye melk, die helfte van die telefoon 1022 00:51:15,920 --> 00:51:17,850 boek, die oranje sap dat ek gedrink het vandag. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB kabel, 'n sleutel. 1025 00:51:22,780 --> 00:51:24,800 >> [Speel van musiek]