1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Speel van musiek] 3 00:00:11,261 --> 00:00:12,640 >> David J. Malan Alle regte. 4 00:00:12,640 --> 00:00:14,525 Dit is CS50. 5 00:00:14,525 --> 00:00:16,009 En dit is die begin van die week 5. 6 00:00:16,009 --> 00:00:18,050 En as jy dalk opgemerk het, sommige van die materiaal 7 00:00:18,050 --> 00:00:21,050 is om 'n bietjie meer kompleks, die klein digter. 8 00:00:21,050 --> 00:00:24,560 >> En dit is baie maklik, veral as jy is in die gewoonte om vir 'n geruime tyd, 9 00:00:24,560 --> 00:00:28,600 om te probeer om te krap af die meeste enigiets wat ons doen, sê ons in die klas. 10 00:00:28,600 --> 00:00:31,626 Maar besef dat dit nie dalk die ideale opvoedkundige benadering 11 00:00:31,626 --> 00:00:34,250 te leer om hierdie soort van materiaal, en materiaal meer algemeen. 12 00:00:34,250 --> 00:00:37,250 En so het ons is bly om te kondig dat CS50 se eie Gheng 13 00:00:37,250 --> 00:00:39,780 Gong het begin om voor te berei 'n kanoniese stel notas 14 00:00:39,780 --> 00:00:42,100 vir die kursus, die hoop van die wat is dat een van hierdie 15 00:00:42,100 --> 00:00:44,030 nie net dien as 'n verwysing en 'n hulpbron 16 00:00:44,030 --> 00:00:47,410 vir die hersiening van materiaal en gaan terug deur die materiaal wat dalk 17 00:00:47,410 --> 00:00:51,230 die eerste keer ontsnap jy rondom is, maar ook sodat julle hoofde kan wees meer 18 00:00:51,230 --> 00:00:53,740 up as af, wanneer dit kom die tyd om lesings, 19 00:00:53,740 --> 00:00:56,960 sodat jy kan betrek meer ingedagte, as 20 00:00:56,960 --> 00:00:59,170 teenoor meer scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Met wat gesê het, wat jy sal vind op die webwerf is die dokumente wat hierdie. 22 00:01:02,510 --> 00:01:04,660 En kennisgewing aan links bo, is daar nie net 'n tafel van die inhoud, 23 00:01:04,660 --> 00:01:06,920 maar ook tyd kodes wat sal dadelik spring jy 24 00:01:06,920 --> 00:01:09,077 aan die toepaslike deel in die video aanlyn. 25 00:01:09,077 --> 00:01:11,410 En wat Chang hier gedoen is, in wese, gedokumenteer 26 00:01:11,410 --> 00:01:13,340 wat gebeur het in hierdie bepaalde lesing. 27 00:01:13,340 --> 00:01:16,370 En baie van die lesings is nou reeds aanlyn met hierdie URL. 28 00:01:16,370 --> 00:01:20,110 En ons sal voortgaan om die res te plaas van dié wat deur die einde van hierdie week, 29 00:01:20,110 --> 00:01:22,380 so neem nie voordeel van die hulpbron. 30 00:01:22,380 --> 00:01:25,740 >> So, sonder verdere uitstel, ons begin om terug te skil 31 00:01:25,740 --> 00:01:28,180 die laag is string vir 'n geruime tyd. 32 00:01:28,180 --> 00:01:30,670 En wat het ons sê 'n string eintlik is verlede week? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 So kar ster. 35 00:01:32,900 --> 00:01:34,900 En kar ster, wel, wat het dit regtig beteken? 36 00:01:34,900 --> 00:01:37,150 Wel, al hierdie tyd, as ons gevra 'n funksie, 37 00:01:37,150 --> 00:01:40,450 soos getString, en berging die sogenaamde terugkeer 38 00:01:40,450 --> 00:01:42,910 waarde van getString in 'n variable-- dit genoem 39 00:01:42,910 --> 00:01:47,721 s tipe string-- het ons skryf die reël van die kode daar bo. 40 00:01:47,721 --> 00:01:49,970 En dit is net wanneer ek sien my handskrif hier vergroot 41 00:01:49,970 --> 00:01:51,930 besef ek net hoe afskuwelik dit is. 42 00:01:51,930 --> 00:01:54,180 >> Maar laat ons aanvaar dat, op die regterkant 43 00:01:54,180 --> 00:01:57,070 is nietemin 'n redelike uitbeelding van wat 44 00:01:57,070 --> 00:01:58,880 is aan die gang al hierdie tyd saam met getString. 45 00:01:58,880 --> 00:02:00,380 getString, natuurlik, kry 'n string. 46 00:02:00,380 --> 00:02:01,691 Maar wat beteken dit werklik? 47 00:02:01,691 --> 00:02:04,190 Dit beteken dat dit kry 'n deel van geheue van die bedryfstelsel 48 00:02:04,190 --> 00:02:06,040 deur die roeping van 'n funksie, genaamd malloc. 49 00:02:06,040 --> 00:02:07,390 Maar meer oor dit later. 50 00:02:07,390 --> 00:02:09,139 En dan is dit vult wat deel van die geheue 51 00:02:09,139 --> 00:02:11,764 met die letters van die gebruiker getik in, gevolg deur, natuurlik, 52 00:02:11,764 --> 00:02:14,800 'n nul karakter, of agteroorskuinsstreep nul aan die einde. 53 00:02:14,800 --> 00:02:18,280 >> Intussen, op die linkerkant van hierdie storie, al hierdie tyd, 54 00:02:18,280 --> 00:02:20,850 ons het waarby 'n veranderlike, soos s. 55 00:02:20,850 --> 00:02:24,770 En dat veranderlike is wat nou sal begin roep 'n wyser. 56 00:02:24,770 --> 00:02:29,190 Dit is nie 'n boks binnekant van wat ons het die string, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 maar eerder ons in die vierkant boks aan die linkerkant wat presies? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Ja? 60 00:02:35,390 --> 00:02:37,118 >> Publiek: Die adres van waar dit geleë is in die geheue. 61 00:02:37,118 --> 00:02:38,118 >> David J. Malan Presies. 62 00:02:38,118 --> 00:02:40,690 Die adres van waar Daven is geleë in die geheue. 63 00:02:40,690 --> 00:02:44,650 En nie waar al Daven is geleë is, per se nie, maar spesifiek die adres 64 00:02:44,650 --> 00:02:45,150 van wat? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Ja? 67 00:02:46,810 --> 00:02:47,460 >> Publiek: Eerste karakter. 68 00:02:47,460 --> 00:02:50,209 >> David J. Malan Die eerste karakter in Daven, wat in hierdie geval, 69 00:02:50,209 --> 00:02:53,820 Ek het voorgestel was arbitrêr en onrealisties 1, OX1, 70 00:02:53,820 --> 00:02:55,910 wat beteken net die heksadesimale getal 1. 71 00:02:55,910 --> 00:02:57,993 Maar dit is waarskynlik gaan 'n veel groter getal te wees 72 00:02:57,993 --> 00:03:01,260 sodat ons kan trek met 'n 0x as 'n voorvoegsel, 73 00:03:01,260 --> 00:03:02,806 verteenwoordig 'n heksadesimaal karakter. 74 00:03:02,806 --> 00:03:05,930 En omdat ons nie nodig om te weet waar die res van die karakters van Daven 75 00:03:05,930 --> 00:03:09,860 is, as gevolg van wat eenvoudige ontwerp besluit wat baie jare gelede gemaak is? 76 00:03:09,860 --> 00:03:10,548 Ja? 77 00:03:10,548 --> 00:03:11,651 >> Publiek: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. Malan Ja, presies. 79 00:03:12,900 --> 00:03:18,100 Agteroorskuisstreep 0 kan jy, al is dit in lineêre tyd, die string te deurkruis, 80 00:03:18,100 --> 00:03:20,400 loop van links na regs, met 'n lus vir, of 'n rukkie 81 00:03:20,400 --> 00:03:22,608 lus, of iets soos dat en bepaal, o, hier 82 00:03:22,608 --> 00:03:24,751 is die einde van hierdie spesifieke string. 83 00:03:24,751 --> 00:03:27,000 So met net die adres die begin van 'n string, 84 00:03:27,000 --> 00:03:30,290 ons kan die geheel van toegang nie, want dit alles terwyl, 85 00:03:30,290 --> 00:03:32,030 'n string is nou net 'n kar ster. 86 00:03:32,030 --> 00:03:36,370 >> So dit is beslis fyn om voort te gaan met behulp van die CS50 biblioteek en die onttrekking, 87 00:03:36,370 --> 00:03:38,440 om so te praat, maar ons sal begin om te sien presies 88 00:03:38,440 --> 00:03:41,230 wat is aan die gang onder die hele tyd. 89 00:03:41,230 --> 00:03:45,260 So kan jy hierdie voorbeeld onthou, Ook uit die laaste keer, vergelyk 0, 90 00:03:45,260 --> 00:03:47,300 wat nie eintlik vergelyk. 91 00:03:47,300 --> 00:03:49,070 Maar ons het begin om dit te los. 92 00:03:49,070 --> 00:03:52,020 >> Maar as miskien 'n opknappingskursusse, kan ek interesseer iemand 93 00:03:52,020 --> 00:03:54,261 in 'n pienk olifant vandag, ook deur Chang? 94 00:03:54,261 --> 00:03:55,760 Hoe gaan jy voor? [Onhoorbaar]. 95 00:03:55,760 --> 00:03:56,660 Kom op. 96 00:03:56,660 --> 00:03:58,740 >> En in die tussentyd, as jy kom, laat ons 97 00:03:58,740 --> 00:04:01,670 oorweeg vir 'n oomblik wat hierdie kode is eintlik. 98 00:04:01,670 --> 00:04:04,917 Dit verklaar twee veranderlikes op top, s en t, en roep getString. 99 00:04:04,917 --> 00:04:08,250 Dit is nie 'n baie gebruikers-vriendelike program, omdat dit nie vir jou sê wat om te doen. 100 00:04:08,250 --> 00:04:10,541 Maar laat ons net aanvaar ons fokus op die sappige deel. 101 00:04:10,541 --> 00:04:14,470 En dan moet ons doen, as s gelyk gelyk t, moet dit sê printf, 102 00:04:14,470 --> 00:04:16,170 jy dieselfde ding getik. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 Wat is jou naam? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. Malan Janelle, lekker om jou te ontmoet. 107 00:04:19,529 --> 00:04:21,800 So jou uitdaging aan hand vir hierdie olifant 108 00:04:21,800 --> 00:04:25,230 is om eers 'n prentjie van wat wat in die eerste twee verteenwoordig 109 00:04:25,230 --> 00:04:25,970 lyne. 110 00:04:25,970 --> 00:04:28,139 So s en t kan wees verteenwoordig hoe op die skerm? 111 00:04:28,139 --> 00:04:30,680 En jy kan net trek dit met jou vinger op die groot skerm. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> So is daar twee helftes te elke kant van die vergelyking. 114 00:04:34,510 --> 00:04:37,760 So is daar 's aan die linkerkant, en dan getString aan die regterkant. 115 00:04:37,760 --> 00:04:40,540 En dan is daar t aan die linkerkant, en dan getString aan die regterkant. 116 00:04:40,540 --> 00:04:42,630 So, hoe kan ons begin teken 'n prentjie wat 117 00:04:42,630 --> 00:04:46,340 verteenwoordig wat gaan aan hier in die geheue, sou jy sê? 118 00:04:46,340 --> 00:04:49,150 En laat my laat jy verduidelik wat jy doen as jy gaan. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Wel, die eerste, dit sou vra jy die insette string te kry. 121 00:04:58,890 --> 00:05:00,439 En dit sou store-- O, jammer. 122 00:05:00,439 --> 00:05:01,230 David J. Malan OK. 123 00:05:01,230 --> 00:05:01,730 Goed. 124 00:05:01,730 --> 00:05:03,330 En dit is genoem wat? 125 00:05:03,330 --> 00:05:03,950 O, OK. 126 00:05:03,950 --> 00:05:04,450 Voort te gaan. 127 00:05:04,450 --> 00:05:05,575 Ek het nie bedoel om te onderbreek. 128 00:05:05,575 --> 00:05:07,060 Janelle: Jammer. 129 00:05:07,060 --> 00:05:14,237 So dit sou insette dit in die adres of-- nie seker nie. 130 00:05:14,237 --> 00:05:17,320 Ek kan nie presies onthou die nommer, maar ek glo dit is wat begin met 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. Malan Dit is al wat reg is, want ek het die nommers op, 132 00:05:18,420 --> 00:05:19,650 so daar is geen regte antwoord. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Begin met die 0 boog. 134 00:05:22,105 --> 00:05:24,000 >> David J. Malan OK, so element 0. 135 00:05:24,000 --> 00:05:24,765 Seker nie. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: En dan as was soos net 'n twee-letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. Malan OK, terug na jou. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: So element 0, en dan element 1 of element 2. 139 00:05:33,629 --> 00:05:36,670 David J. Malan En wat stuk die prentjie is jy teken nou? 140 00:05:36,670 --> 00:05:37,690 Die oproep tot getString? 141 00:05:37,690 --> 00:05:38,830 Of die verklaring van s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Die verklaring van s, ek glo nie. 143 00:05:42,890 --> 00:05:45,980 O, die getString, want dit sou word in elke [ingevoer? gebied. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Goed. 145 00:05:46,510 --> 00:05:47,051 Presies. 146 00:05:47,051 --> 00:05:49,300 Selfs al is dit effektief terugkeer 'n skikking, onthou, 147 00:05:49,300 --> 00:05:53,300 wanneer ons terug 'n string, kan ons indeks in daardie string met behulp van 01 en 2. 148 00:05:53,300 --> 00:05:56,180 Tegnies, dit is waarskynlik verteenwoordig deur individuele adresse, 149 00:05:56,180 --> 00:05:57,100 maar dit is goed. 150 00:05:57,100 --> 00:06:00,170 >> So dink nie, as ek kan net vinnig stuur aan waar ons opgehou het 151 00:06:00,170 --> 00:06:04,320 laaste keer, as een van die snare was g 'n b e, 152 00:06:04,320 --> 00:06:10,337 agteroorskuinsstreep 0, daardeur verteenwoordig Gabe se insette, hoe kan ons verteenwoordig is nou? 153 00:06:10,337 --> 00:06:12,670 As dit is die geheue wat deur getString terug? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Sou dit verteenwoordig deur 'n boog? 156 00:06:17,610 --> 00:06:18,750 >> David J. Malan deur 'n boog? 157 00:06:18,750 --> 00:06:19,130 Wel, nee. 158 00:06:19,130 --> 00:06:21,171 Laat ons net sê, picturaal, laat my net voort te gaan 159 00:06:21,171 --> 00:06:25,710 en stel voor dat, indien dit is, is hierdie is die terugkeer waarde van getString. 160 00:06:25,710 --> 00:06:29,482 En jy het hierdie geteken as 0, 1, 2, wat is heel redelik, omdat ons 161 00:06:29,482 --> 00:06:30,940 kan kruip in die tou, as sodanig. 162 00:06:30,940 --> 00:06:33,340 Maar net om konsekwent te wees met laaste keer, laat my gaan voort 163 00:06:33,340 --> 00:06:37,310 en arbitrêr stel voor dat hierdie is adres 1, is dit adres 2, 164 00:06:37,310 --> 00:06:39,597 dit is posadres 3, en so meer. 165 00:06:39,597 --> 00:06:41,430 En ja, net om super wees duidelik, wat gaan 166 00:06:41,430 --> 00:06:44,580 om te gaan in s as 'n gevolg van daardie eerste lyn van kode, sou jy sê? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adres 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. Malan Presies. 169 00:06:46,420 --> 00:06:47,190 So spreek 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 En intussen, laat my voort te gaan en dupliseer baie van wat jy gedoen het 172 00:06:51,230 --> 00:06:52,740 en voeg my eie t hier. 173 00:06:52,740 --> 00:06:56,340 As ek om te tik in Gabe weer 'n tweede keer, 174 00:06:56,340 --> 00:07:01,530 wanneer dit gevra word met getString, waar, natuurlik, is Gabe gaan om te gaan? 175 00:07:01,530 --> 00:07:02,280 Wel, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Soos hier aan? 178 00:07:05,975 --> 00:07:06,850 David J. Malan Ja. 179 00:07:06,850 --> 00:07:08,516 Janelle: Of dit is ook in dieselfde bokse? 180 00:07:08,516 --> 00:07:11,940 David J. Malan Laat my stel, ja, presies, so in hierdie bykomende bokse. 181 00:07:11,940 --> 00:07:15,230 Maar wat is die sleutel is nou dat, selfs al het ek hierdie redelik naby getrek 182 00:07:15,230 --> 00:07:18,650 saam op 0x1, hierdie is 0x2-- in werklikheid, 183 00:07:18,650 --> 00:07:25,750 hierdie dalk nou adres 0x10 wees, byvoorbeeld, en 0x11 en 0x12, 184 00:07:25,750 --> 00:07:26,870 en so meer. 185 00:07:26,870 --> 00:07:29,955 En so, as dit die geval is, wat gaan om te eindig hier in t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. Malan Presies. 188 00:07:31,830 --> 00:07:33,180 So 0x10. 189 00:07:33,180 --> 00:07:34,570 En so nou, laaste vraag. 190 00:07:34,570 --> 00:07:37,510 Jy het, by verre, het die werk hardste vir 'n olifant tot dusver. 191 00:07:37,510 --> 00:07:42,650 Deur die nou, as ek trek die kode weer, wanneer ek dit doen, in lyn drie, 192 00:07:42,650 --> 00:07:47,630 As s gelyk gelyk t, wat ek eintlik vergelyk dat ons hier gevestig? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Die twee adresse? 194 00:07:49,271 --> 00:07:50,270 David J. Malan Presies. 195 00:07:50,270 --> 00:07:53,350 So ek sê is S gelyk gelyk aan t? 196 00:07:53,350 --> 00:07:56,210 Met ander woorde, is 1 gelyke gelyk aan 10? 197 00:07:56,210 --> 00:07:59,710 En natuurlik, die ooglopende antwoord is nou, no. 198 00:07:59,710 --> 00:08:02,920 En so is hierdie program uiteindelik gaan druk wat, sou jy sê? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Sou dit, jy dieselfde ding getik? 201 00:08:08,405 --> 00:08:11,446 >> David J. Malan So as s is 1 en t is 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Jy getik verskillende dinge. 203 00:08:13,320 --> 00:08:13,570 >> David J. Malan Presies. 204 00:08:13,570 --> 00:08:14,480 Jy getik verskillende dinge. 205 00:08:14,480 --> 00:08:14,850 Alle regte. 206 00:08:14,850 --> 00:08:16,714 So 'n rondte van applous, As ons kon, hier. 207 00:08:16,714 --> 00:08:17,214 [Applous] 208 00:08:17,214 --> 00:08:17,708 Dit was pynlik. 209 00:08:17,708 --> 00:08:18,208 Ek weet nie. 210 00:08:18,208 --> 00:08:19,684 Mooi gedoen. 211 00:08:19,684 --> 00:08:24,690 So nou, laat ons kyk of ons kan nie terg uitmekaar wat die fix was. 212 00:08:24,690 --> 00:08:28,040 En natuurlik, wanneer ons vaste this-- wat ek sal nou verteenwoordig in green-- 213 00:08:28,040 --> 00:08:29,690 ons het 'n paar verbeterings hier. 214 00:08:29,690 --> 00:08:32,409 Eerstens, net soos 'n gesonde verstand kyk, ek is die eerste kontrole 215 00:08:32,409 --> 00:08:35,110 As s gelyk aan nul en t gelyk aan nul. 216 00:08:35,110 --> 00:08:39,440 En net om duidelik te wees, wanneer mag s of t nul in die kode soos hierdie? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Wanneer kan s of t null. 219 00:08:44,490 --> 00:08:44,990 Ja? 220 00:08:44,990 --> 00:08:45,990 >> Publiek: [onhoorbaar]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. Malan Presies. 223 00:08:50,510 --> 00:08:52,840 As die tou wat die gebruiker getik is te lank 224 00:08:52,840 --> 00:08:56,140 te pas in die geheue, of 'n vreemde hoek geval soos dié, 225 00:08:56,140 --> 00:08:59,010 getString, soos ons sal sien, letterlik vandag, in sy dokumentasie, 226 00:08:59,010 --> 00:09:02,330 sê dit sal terugkeer null as 'n spesiale brandwag waarde, 227 00:09:02,330 --> 00:09:05,417 of net soort van 'n spesiale simbool wat beteken dat iets verkeerd geloop het. 228 00:09:05,417 --> 00:09:07,500 So ons wil om te kyk vir , want dit blyk 229 00:09:07,500 --> 00:09:09,720 wat nul is 'n baie gevaarlike waarde. 230 00:09:09,720 --> 00:09:14,250 >> Dikwels, as jy probeer om iets te doen het met null met 'n function-- om dit 231 00:09:14,250 --> 00:09:17,470 as insette vir instance-- daardie funksie dalk baie sal crash en, daarmee saam, 232 00:09:17,470 --> 00:09:19,090 haal jou hele program. 233 00:09:19,090 --> 00:09:22,570 So hierdie derde lyn is nou net 'n gesonde verstand kyk, foutopsporing, as jy wil. 234 00:09:22,570 --> 00:09:25,450 Dit is 'n goeie gewoonte want om ons te kry in 'n tyd wat ons 235 00:09:25,450 --> 00:09:28,050 probeer om 'n waarde te gebruik wat kon potensieel wees null. 236 00:09:28,050 --> 00:09:32,000 >> Nou, in die vierde reël hier, "As strcmp (s, t):" Wel, 237 00:09:32,000 --> 00:09:33,180 wat is dit verwys na? 238 00:09:33,180 --> 00:09:36,750 Wel, ons het gesê dit was 'n baie saaklik vernoem funksie string vergelyking. 239 00:09:36,750 --> 00:09:40,370 En sy doel in die lewe is om te vergelyk sy eerste argument daarteen tweede, 240 00:09:40,370 --> 00:09:44,640 maar nie in terme van hul adresse, soos ons gedoen het per ongeluk 'n oomblik 241 00:09:44,640 --> 00:09:48,270 gelede met die rooi-kode, maar eerder die twee te vergelyk 242 00:09:48,270 --> 00:09:53,210 snare in die menslik intuïtiewe manier deur dit te vergelyk, teen hierdie, 243 00:09:53,210 --> 00:09:56,690 teen hierdie, teen hierdie, en dan stop as en wanneer 'n mens 244 00:09:56,690 --> 00:09:59,590 of albei van my vingers tref 'n agteroorskuinsstreep 0. 245 00:09:59,590 --> 00:10:04,530 So iemand jare gelede geïmplementeer strcmp te implementeer vir ons die funksie 246 00:10:04,530 --> 00:10:08,890 dat ons hoop ons sou gekry het deur net vergelyk twee eenvoudige waardes. 247 00:10:08,890 --> 00:10:14,929 >> Nou eerlik, ek hou tekening al hierdie verskillende nommers. 248 00:10:14,929 --> 00:10:17,470 Maar die werklikheid is, ek het al die maak van hierdie die hele tyd. 249 00:10:17,470 --> 00:10:19,580 En so laat my net voort te gaan en krap dit uit 250 00:10:19,580 --> 00:10:23,100 'n punt te maak dat aan die einde van die dag en vorentoe te beweeg, 251 00:10:23,100 --> 00:10:30,160 ons is regtig nie van plan om te gee oor wat fokus op dinge is eintlik 252 00:10:30,160 --> 00:10:30,790 in die geheue. 253 00:10:30,790 --> 00:10:34,320 So ek gaan nie hierdie te trek soorte getalle so baie nie, 254 00:10:34,320 --> 00:10:38,970 Ek is net 'n abstrakte hierdie weg 'n bietjie meer vriendelik met net pyle. 255 00:10:38,970 --> 00:10:42,060 >> Met ander woorde, as s is 'n wyser, Wel, laat ons teken dit net letterlik 256 00:10:42,060 --> 00:10:45,430 as 'n wyser, 'n pyl van homself tot iets anders, 257 00:10:45,430 --> 00:10:48,280 en nie bekommerd te veel meer oor die minutia van hierdie adresse 258 00:10:48,280 --> 00:10:49,910 wat, weer, het ek tot in elk geval. 259 00:10:49,910 --> 00:10:52,680 Maar ons sal die adresse sien, Soms, wanneer die opsporing van kode. 260 00:10:52,680 --> 00:10:56,450 >> Nou intussen, hierdie program hier fixes, natuurlik, 261 00:10:56,450 --> 00:10:58,720 dat die probleem deur dit te vergelyk hierdie twee stringe. 262 00:10:58,720 --> 00:11:00,260 Maar ons het in 'n ander probleem. 263 00:11:00,260 --> 00:11:03,180 Dit was uit die afskrif program verlede tyd 264 00:11:03,180 --> 00:11:06,880 waardeur, het ek probeer om te kapitaliseer net die eerste karakter in 'n string. 265 00:11:06,880 --> 00:11:09,620 Maar wat was die simptoom ons het die vorige keer toe 266 00:11:09,620 --> 00:11:14,150 'n gebruiker getik in 'n waarde, soos Gabe in klein, vir s, 267 00:11:14,150 --> 00:11:19,310 dan het ons toegeken is in t, as in die derde reël is daar, 268 00:11:19,310 --> 00:11:22,900 en dan probeer ek te kapitaliseer t bracket 0? 269 00:11:22,900 --> 00:11:25,950 Wat was die effek van veranderende t bracket 0 hier? 270 00:11:25,950 --> 00:11:27,150 >> Publiek: Dit verander is. 271 00:11:27,150 --> 00:11:29,360 >> David J. Malan Ja, Ek verander is, as well. 272 00:11:29,360 --> 00:11:31,050 Want wat is werklik aan die gang? 273 00:11:31,050 --> 00:11:34,130 Wel, laat ek sien of ek kan skoon hierdie foto, soos volg. 274 00:11:34,130 --> 00:11:41,390 >> Indien s, weer, die woord g, a, b, e, in te voer, 0, en s 275 00:11:41,390 --> 00:11:44,084 Ons sal voortgaan om tekening as 'n boks hier, maar nie meer adresse. 276 00:11:44,084 --> 00:11:45,250 Kom ons hou op om dinge op. 277 00:11:45,250 --> 00:11:47,510 Kom ons teken net 'n foto die wêreld te vereenvoudig. 278 00:11:47,510 --> 00:11:52,640 >> Toe ek verklaar t met 'n tou t, wat skep wat deel van die geheue. 279 00:11:52,640 --> 00:11:55,850 Square gebeur om te wees 32 stukkies in die meeste rekenaars. 280 00:11:55,850 --> 00:11:59,530 In werklikheid, as jy al ooit gehoor van 'n rekenaar met 'n 32-bis argitektuur, 281 00:11:59,530 --> 00:12:03,000 regtig fancy-praat, wat net beteken dit gebruik 32-bis adresse. 282 00:12:03,000 --> 00:12:05,370 En as 'n tegniese eenkant, As jy al ooit gewonder 283 00:12:05,370 --> 00:12:09,630 waarom ouer rekenaars, as jy eintlik probeer om sop hulle met baie van die geheue, 284 00:12:09,630 --> 00:12:12,360 kon slegs 'n maksimum vier GB RAM, 285 00:12:12,360 --> 00:12:14,860 Wel, dit is omdat, letterlik, jou ou rekenaar kon net 286 00:12:14,860 --> 00:12:17,250 tel so hoog as 4 miljard, 4 miljard grepe, 287 00:12:17,250 --> 00:12:20,590 want dit was die gebruik van 32-bit nommers vir adresse. 288 00:12:20,590 --> 00:12:23,260 >> Maar in elk geval, in hierdie Byvoorbeeld, storie se baie makliker. 289 00:12:23,260 --> 00:12:27,250 t is net nog 'n wyser, of regtig 'n kar ster, aka string. 290 00:12:27,250 --> 00:12:30,860 En hoe wil ek hierdie foto te werk nou met die tweede lyn van kode, 291 00:12:30,860 --> 00:12:31,950 na die dot, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Wanneer ek dit doen string t gelyk is kommapunt, hoe hierdie foto verander? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Ja? 295 00:12:38,000 --> 00:12:38,916 >> Publiek: [onhoorbaar]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. Malan Ja. 298 00:12:42,020 --> 00:12:42,600 Presies. 299 00:12:42,600 --> 00:12:45,620 Ek het net 'n pyl uit die t boks na dieselfde adres, 300 00:12:45,620 --> 00:12:47,570 dieselfde eerste letter in gegee het. 301 00:12:47,570 --> 00:12:50,850 Of tegnies, as dit man is steeds op 0x1, 302 00:12:50,850 --> 00:12:53,052 dit is asof ek moes 0x1 hier en 0x1 hier. 303 00:12:53,052 --> 00:12:54,760 Maar weereens, wat omgee oor die adresse? 304 00:12:54,760 --> 00:12:56,345 Dis net die idee wat nou saak maak. 305 00:12:56,345 --> 00:12:57,720 So dit is wat hier gebeur. 306 00:12:57,720 --> 00:13:02,690 So natuurlik, as jy nie t bracket 0, wat is opgestel notasie, 307 00:13:02,690 --> 00:13:05,650 van course-- en eerlik, dit lyk soos daar is 'n verskeidenheid hier, 308 00:13:05,650 --> 00:13:07,340 maar nou is daar hierdie vreemde ding. 309 00:13:07,340 --> 00:13:11,160 Weet dat die programmeertaal C, bied hierdie funksie, 310 00:13:11,160 --> 00:13:14,650 waardeur, selfs as t is 'n wyser, of is 'n muis, 311 00:13:14,650 --> 00:13:18,050 jy kan nog steeds gebruik wat bekend is, gemaklik vierkante bracket 312 00:13:18,050 --> 00:13:22,520 notasie om te gaan na die eerste element, of die tweede element, of enige element 313 00:13:22,520 --> 00:13:26,130 dat wyser wys om gevolg, vermoedelik, dit 314 00:13:26,130 --> 00:13:29,410 is, soos in hierdie geval, wys op 'n sekere skikking. 315 00:13:29,410 --> 00:13:30,340 >> So hoe los ons dit? 316 00:13:30,340 --> 00:13:33,660 Om eerlik te wees, dit is waar dit 'n bietjie oorweldigend op die eerste oogopslag. 317 00:13:33,660 --> 00:13:35,340 Maar hier is 'n nuwe en verbeterde weergawe. 318 00:13:35,340 --> 00:13:37,460 >> So die eerste, ek kry ontslae te raak van die CS50 biblioteek, 319 00:13:37,460 --> 00:13:41,170 net bloot te stel wat is inderdaad 'n kar ster, net 'n sinoniem. 320 00:13:41,170 --> 00:13:43,540 En t is ook 'n kar ster. 321 00:13:43,540 --> 00:13:48,290 Maar wat gaan aan op die regterkant van die lyn 322 00:13:48,290 --> 00:13:49,970 waar t 'n waarde toegeken? 323 00:13:49,970 --> 00:13:50,790 >> Wat is malloc? 324 00:13:50,790 --> 00:13:51,630 Wat is dit strlen? 325 00:13:51,630 --> 00:13:52,547 Wat is sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Hoekom die heck doen dit lyn kyk so kompleks? 327 00:13:54,380 --> 00:13:55,713 Wat doen dit op 'n hoë vlak? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Wat is dit stoor in t? 330 00:13:57,440 --> 00:13:58,646 Ja? 331 00:13:58,646 --> 00:14:01,104 Publiek: Dit is die toekenning van 'n sekere bedrag van die geheue spasie. 332 00:14:01,104 --> 00:14:03,032 Dit is te slaan, dink ek, letters [onhoorbaar]. 333 00:14:03,032 --> 00:14:04,032 >> David J. Malan Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 Dit is die toekenning van 'n sekere hoeveelheid geheue ruimte 336 00:14:06,650 --> 00:14:08,940 te slaan, vermoedelik, toekomstige letters. 337 00:14:08,940 --> 00:14:11,310 En in die besonder, malloc dus terugkeer wat? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Publiek: Returning die [onhoorbaar]? 340 00:14:14,851 --> 00:14:15,850 David J. Malan Presies. 341 00:14:15,850 --> 00:14:18,850 Die terugkeer van die adres van die geheue, wat is 'n fancy manier om te sê, 342 00:14:18,850 --> 00:14:21,640 gee die adres van die eerste byte van die geheue. 343 00:14:21,640 --> 00:14:25,460 Die onus is op my om te onthou hoeveel geheue Ek het eintlik 344 00:14:25,460 --> 00:14:27,140 toegewys of gevra malloc vir. 345 00:14:27,140 --> 00:14:28,384 >> Nou hoeveel is dit? 346 00:14:28,384 --> 00:14:30,550 Wel, selfs al is daar 'n baie hakies hier 347 00:14:30,550 --> 00:14:32,970 malloc neem net 'n enkele argument. 348 00:14:32,970 --> 00:14:37,250 En ek spesifiseer strlen van s, so gee my soveel grepe as daar in s, 349 00:14:37,250 --> 00:14:37,800 maar voeg een. 350 00:14:37,800 --> 00:14:38,300 Hoekom? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Ja? 353 00:14:39,530 --> 00:14:40,840 >> Publiek: Die agteroorskuinsstreep 0. 354 00:14:40,840 --> 00:14:41,840 David J. Malan Presies. 355 00:14:41,840 --> 00:14:43,423 Ons het 'n bietjie huishouding te doen. 356 00:14:43,423 --> 00:14:45,970 So, want daar is 'n agteroorskuinsstreep 0, ons wil 'n beter onthou dat. 357 00:14:45,970 --> 00:14:47,310 Anders gaan ons 'n string te skep wat 358 00:14:47,310 --> 00:14:49,170 beteken nie dat die spesiale Terminator. 359 00:14:49,170 --> 00:14:52,640 >> Intussen, net om super wees anale, ek het sizeof (char), 360 00:14:52,640 --> 00:14:55,730 net in geval iemand loop my kode nie op die CS50 toestel, 361 00:14:55,730 --> 00:14:58,220 maar miskien 'n ander rekenaar heeltemal waar karakters 362 00:14:58,220 --> 00:15:01,470 is een byte deur konvensie, maar twee grepe, of iets groter as dit. 363 00:15:01,470 --> 00:15:04,490 Dit is net om te super wees, super sku vir foute. 364 00:15:04,490 --> 00:15:06,940 Selfs al is, in werklikheid, is dit waarskynlik gaan 'n 1. 365 00:15:06,940 --> 00:15:11,490 >> Nou, intussen, ek gaan voort en kopieer die string, t bracket i gelyk t bracket s. 366 00:15:11,490 --> 00:15:14,962 En Ek sal stel om verlede week se bron-kode om te sien wat aangaan. 367 00:15:14,962 --> 00:15:17,670 Maar die sleutel afhaal, en die Daarom het ek die kode nou in groen, 368 00:15:17,670 --> 00:15:22,520 is omdat dit heel laaste lyn, t bracket 0 gelyk toupper, 369 00:15:22,520 --> 00:15:25,230 het die effek van kapitaliseer wat string? 370 00:15:25,230 --> 00:15:26,960 t en / of s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Daardie laaste reël van die kode. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Net T, want wat is gebeur hierdie tyd, 375 00:15:35,560 --> 00:15:41,500 As ek effens ongedaan wat laaste stap, wat s'n gebeur het, toe ek noem malloc, 376 00:15:41,500 --> 00:15:45,380 Ek kry in wese 'n stuk van die geheue dit is dieselfde grootte as die oorspronklike, 377 00:15:45,380 --> 00:15:47,020 want dit is die rekenkundige ek gedoen het. 378 00:15:47,020 --> 00:15:50,920 Ek is die stoor in t die adres van daardie deel van die geheue. 379 00:15:50,920 --> 00:15:53,370 Selfs al is dit lyk mooi en mooi, mooi en leeg, 380 00:15:53,370 --> 00:15:56,882 Die werklikheid is daar is, wat ons sal hou die roeping, vullis waardes hier. 381 00:15:56,882 --> 00:15:59,340 Dit stuk van die geheue dalk baie goed het voorheen gebruik is, 382 00:15:59,340 --> 00:16:00,940 'n paar sekondes, 'n paar minute gelede. 383 00:16:00,940 --> 00:16:04,410 So kan daar absoluut nommers of letters daar, net deur 'n ongeluk. 384 00:16:04,410 --> 00:16:08,580 Maar hulle is nie geldig is, totdat ek myself vul hierdie stuk van die geheue 385 00:16:08,580 --> 00:16:12,510 met die werklike karakters, soos ek doen wat vir lus daar. 386 00:16:12,510 --> 00:16:13,180 Alle reg? 387 00:16:13,180 --> 00:16:16,180 >> So nou, die klimaks van hierdie drie voorbeelde 388 00:16:16,180 --> 00:16:20,730 wat is skynbaar die laaste keer gebreek, hierdie Swap Byvoorbeeld, hierdie funksie 389 00:16:20,730 --> 00:16:23,670 gewerk het in die sin dat dit omgeruil a en b. 390 00:16:23,670 --> 00:16:25,620 Maar dit het nie gewerk nie in watter ander sin? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Ja? 393 00:16:28,614 --> 00:16:29,612 >> Publiek: [onhoorbaar]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. Malan Presies. 396 00:16:36,700 --> 00:16:39,530 As ek hierdie funksie te roep van another-- byvoorbeeld 397 00:16:39,530 --> 00:16:42,870 van 'n funksie soos hoof, waar Ek het 'n veranderlike, x en y, as ek 398 00:16:42,870 --> 00:16:46,160 het verlede week, dieselfde kode, en ek slaag in x en y 399 00:16:46,160 --> 00:16:49,860 te ruil, en dan Swap-- hierdie skakel, natuurlik, is die korrekte weergawe 400 00:16:49,860 --> 00:16:52,220 is wat ons is oor te see-- dit nie gewerk het nie. 401 00:16:52,220 --> 00:16:53,770 So, wat is die oplossing? 402 00:16:53,770 --> 00:16:56,850 >> Wel, so net om te wees duidelik, laat my gaan voort 403 00:16:56,850 --> 00:17:05,450 and-- gee my 'n tweede hier, en kyk As ek jou kan wys die laaste een, wat 404 00:17:05,450 --> 00:17:12,464 sal wees in-- laat ons sien of ek kan vind hierdie vaste fast-- OK, [onhoorbaar]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, daar is dit. 407 00:17:19,240 --> 00:17:21,000 So ignoreer die opdragte is ek net te tik. 408 00:17:21,000 --> 00:17:23,780 Ek wil om dit te haal op die laaste minuut 'n voorbeeld 409 00:17:23,780 --> 00:17:27,960 van verlede tyd, wat nou genoem word nie ruil. 410 00:17:27,960 --> 00:17:30,200 >> So geen Swap is waar ons opgehou het om die laaste keer, 411 00:17:30,200 --> 00:17:32,930 waardeur ek geïnisialiseer x 1 en y 2. 412 00:17:32,930 --> 00:17:35,840 Ek het toe roep Swap, verby in 1 en 2. 413 00:17:35,840 --> 00:17:37,930 En dan om hierdie funksie gewerk het in 'n sekere sin, 414 00:17:37,930 --> 00:17:40,750 maar dit het geen permanente uitwerking op x en y. 415 00:17:40,750 --> 00:17:45,430 So die vraag aan die hand is nie, hoe nou ons eintlik hierdie probleem op te los? 416 00:17:45,430 --> 00:17:47,820 Wat is die oplossing aan die hand? 417 00:17:47,820 --> 00:17:53,150 >> Wel, in swap.c, wat is 'n nuwe vandag, sien 'n paar verskille. 418 00:17:53,150 --> 00:17:54,700 x en y is dieselfde. 419 00:17:54,700 --> 00:17:57,250 Maar wat is duidelik anders oor lyn 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Wat is nuut daar, as jy onthou wat dit lyk soos 'n tweede gelede? 422 00:18:01,715 --> 00:18:02,565 >> Publiek: [onhoorbaar]. 423 00:18:02,565 --> 00:18:03,440 >> David J. Malan Ja. 424 00:18:03,440 --> 00:18:06,680 So die-karakters is 'n nuwe stuk van sintaksis nie net in hierdie program, 425 00:18:06,680 --> 00:18:08,560 maar ook meer algemeen in CS50. 426 00:18:08,560 --> 00:18:10,680 Tot op datum, ek dink nie ons het gesien dat enige voorbeelde 427 00:18:10,680 --> 00:18:14,070 of eintlik gepraat oor hulle in enige detail, behalwe, miskien, preemptively 428 00:18:14,070 --> 00:18:16,467 in artikel, 'n ampersand soos hierdie. 429 00:18:16,467 --> 00:18:19,300 Wel, dit blyk ampersand is een van die laaste stukke van die nuwe sintaksis 430 00:18:19,300 --> 00:18:20,174 ons gaan om te leer. 431 00:18:20,174 --> 00:18:23,500 Al wat dit beteken, is die adres van sommige veranderlike. 432 00:18:23,500 --> 00:18:25,070 Op watter adres het x leef? 433 00:18:25,070 --> 00:18:26,510 Maar wat beteken adres y leef? 434 00:18:26,510 --> 00:18:28,700 Want as die fundamentele probleem voor 435 00:18:28,700 --> 00:18:32,970 is dat x en y is oorgedra afskrifte, wat ons regtig wil doen 436 00:18:32,970 --> 00:18:38,780 word voorsien Swap met soos 'n skat kaart wat lei tot waar x en y eintlik 437 00:18:38,780 --> 00:18:41,910 is in die geheue, sodat Swap kan die kaart volg 438 00:18:41,910 --> 00:18:47,760 en gaan na waar x of y punte die plek en verander die werklike waardes 1 en 2 439 00:18:47,760 --> 00:18:48,270 daar. 440 00:18:48,270 --> 00:18:50,710 >> So Swap moet effens te verander. 441 00:18:50,710 --> 00:18:53,760 En op die eerste oogopslag, dit mag lyk 'n bietjie soortgelyk aan kar ster. 442 00:18:53,760 --> 00:18:54,850 En inderdaad is dit. 443 00:18:54,850 --> 00:18:59,635 So 'n is 'n verwysing na watter tipe data, gebaseer op hierdie uitgelig gedeelte? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 So dit is 'n int. 446 00:19:01,620 --> 00:19:04,880 >> So 'n is nie meer 'n int, dit is die adres van 'n int. 447 00:19:04,880 --> 00:19:07,910 En so, b is nou gaan die adres van 'n int te wees. 448 00:19:07,910 --> 00:19:12,470 So as ek roep nou Swap van Main, Ek gaan nie Swap 1 en 2 te gee. 449 00:19:12,470 --> 00:19:15,540 Ek gaan om dit te gee soos Bees-iets en Os-iets, 450 00:19:15,540 --> 00:19:19,820 twee adresse wat sal lei Ruil vir hul werklike plekke 451 00:19:19,820 --> 00:19:21,310 in my rekenaar se geheue. 452 00:19:21,310 --> 00:19:25,580 >> So nou, my oorblywende implementering moet 'n bietjie te verander. 453 00:19:25,580 --> 00:19:28,650 Wat is natuurlik nou anders in hierdie drie reëls van die kode? 454 00:19:28,650 --> 00:19:31,350 Daar is hierdie damn sterre al oor die plek, alles reg? 455 00:19:31,350 --> 00:19:33,014 So, wat gaan hier aan? 456 00:19:33,014 --> 00:19:33,514 Ja? 457 00:19:33,514 --> 00:19:35,055 >> Publiek: Dit is natuurlik [onhoorbaar]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. Malan Presies. 460 00:19:37,990 --> 00:19:41,560 So in hierdie context-- en dit was nie die beste ontwerp besluit, weliswaar, 461 00:19:41,560 --> 00:19:42,530 jaar gelede. 462 00:19:42,530 --> 00:19:45,110 In hierdie konteks, waar jy moet net 'n ster, 463 00:19:45,110 --> 00:19:48,240 en jy het nie 'n data tipe, soos int, onmiddellik aan die linkerkant, 464 00:19:48,240 --> 00:19:53,146 plaas jy 'n gelyke teken, duidelik, in hierdie konteks, as jy sê sterre a, 465 00:19:53,146 --> 00:19:56,980 dit beteken dat na die adres wat in 'n. 466 00:19:56,980 --> 00:19:58,870 Volg die skat kaart, om so te praat. 467 00:19:58,870 --> 00:20:01,720 >> En intussen, in lyn 37, dit beteken dieselfde ding. 468 00:20:01,720 --> 00:20:05,460 Gaan na die adres a, en dit wat daar? 469 00:20:05,460 --> 00:20:09,520 Wat ook al is by die plek wat b spesifiseer. 470 00:20:09,520 --> 00:20:10,980 Met ander woorde, Gaan na B. 471 00:20:10,980 --> 00:20:12,130 Kry daardie waarde. 472 00:20:12,130 --> 00:20:15,620 Gaan na 'n, en volgens die gelyke teken, die opdrag operateur, 473 00:20:15,620 --> 00:20:17,010 sit dit waarde daar. 474 00:20:17,010 --> 00:20:19,272 >> Net so, int temp is net 'n int. 475 00:20:19,272 --> 00:20:20,730 Niks moet verander oor temp. 476 00:20:20,730 --> 00:20:24,810 Dit is net 'n ekstra glas uit Annenberg vir 'n paar melk of lemoensap. 477 00:20:24,810 --> 00:20:27,630 Maar ek het nie nodig om te sê, gaan na b. 478 00:20:27,630 --> 00:20:31,449 Gaan na die bestemming en het die waarde in temp daar. 479 00:20:31,449 --> 00:20:32,490 So wat dan gebeur? 480 00:20:32,490 --> 00:20:36,540 Toe ek dit noem Ruil hierdie tyd, indien hierdie eerste skinkbord hier verteenwoordig Main, 481 00:20:36,540 --> 00:20:42,270 hierdie tweede skinkbord verteenwoordig ruil, wanneer Ek slaag ampersand x en y ampersand 482 00:20:42,270 --> 00:20:47,150 Main te ruil, net om duidelik te wees, Wat is die stapel raam ontvang? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Ja? 485 00:20:49,200 --> 00:20:50,180 >> Publiek: [onhoorbaar]. 486 00:20:50,180 --> 00:20:51,180 David J. Malan Presies. 487 00:20:51,180 --> 00:20:53,129 Die adres van x en die adres van y. 488 00:20:53,129 --> 00:20:55,170 En jy kan dink van hierdie soos posadresse. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street en 35 Oxford Street, en jy 490 00:20:58,772 --> 00:21:01,230 wil hê dat die twee geboue te beweeg wat op daardie plekke. 491 00:21:01,230 --> 00:21:04,680 >> Dit is soort van 'n belaglike idee, maar dit is al wat ons bedoel met adres. 492 00:21:04,680 --> 00:21:07,000 Waar in die wêreld kan jy daardie twee ints vind? 493 00:21:07,000 --> 00:21:09,470 Waar in die wêreld kan jy vind die twee geboue? 494 00:21:09,470 --> 00:21:15,170 So as uiteindelik, na al hierdie tyd het ek gaan in vandag se bron-kode en stel 495 00:21:15,170 --> 00:21:22,110 Ruil en hardloop ./swap, uiteindelik, vir die eerste keer werklik sien ons dat 496 00:21:22,110 --> 00:21:25,330 my waardes inderdaad suksesvol verruil. 497 00:21:25,330 --> 00:21:30,860 En nou, ons kan selfs kennis van hierdie in, sê, gdb. 498 00:21:30,860 --> 00:21:32,740 >> So laat my gaan in dieselfde lêer. 499 00:21:32,740 --> 00:21:35,010 Laat my voort te gaan en uit te voer gdb van ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 En nou, in ruil, ek gaan om te gaan voort en stel 'n breek punt in Main. 502 00:21:40,547 --> 00:21:42,630 En nou is ek gaan om te gaan voor en hardloop die program. 503 00:21:42,630 --> 00:21:45,810 En nou sien ons my kode gestop by die lyn. 504 00:21:45,810 --> 00:21:48,330 >> As ek gaan voort en druk x, wat moet ek hier sien? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Dit is 'n vraag. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Sê weer? 509 00:21:51,530 --> 00:21:52,295 >> Publiek: [onhoorbaar]. 510 00:21:52,295 --> 00:21:53,910 >> David J. Malan So ewekansige getalle, miskien. 511 00:21:53,910 --> 00:21:56,010 Miskien kry ek gelukkig is, en dit is mooi en eenvoudig, soos 0. 512 00:21:56,010 --> 00:21:57,230 Maar miskien is dit 'n ewekansige getal. 513 00:21:57,230 --> 00:21:58,090 In hierdie geval, ek het gelukkig. 514 00:21:58,090 --> 00:21:59,030 Dit gebeur net te wees 0. 515 00:21:59,030 --> 00:22:00,780 Maar dit is inderdaad geluk, want nie totdat ek 516 00:22:00,780 --> 00:22:06,280 tik die volgende en druk dan x het dat lyn van kode, lyn 19, uitgevoer is. 517 00:22:06,280 --> 00:22:10,942 >> Intussen, as ek tik volgende keer, en nou druk y, ek gaan om te sien 2. 518 00:22:10,942 --> 00:22:13,900 Nou, as ek tik die volgende, dit gaan 'n bietjie verwarrend, want nou, 519 00:22:13,900 --> 00:22:17,250 die printf gaan op verskyn die skerm, soos dit gedoen het. x is 1. 520 00:22:17,250 --> 00:22:18,606 >> Kom ons doen dit weer. 521 00:22:18,606 --> 00:22:20,480 En nou, hier is waar dinge interessant. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Voordat ek noem Swap of selfs stap in dit, laat ons 'n bietjie loer. 524 00:22:26,580 --> 00:22:28,980 x is, weer, 1. 525 00:22:28,980 --> 00:22:33,240 Y is, natuurlik, vinnige gesonde verstand kyk, 2, so nie moeilik daar. 526 00:22:33,240 --> 00:22:35,740 Maar wat is ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Antwoord nie, dit is soort van funky soek. 529 00:22:39,350 --> 00:22:43,500 Maar die int ster in hakies is net BBP se manier om te sê dit is 'n adres. 530 00:22:43,500 --> 00:22:48,290 Dit is nie 'n int, dit is 'n verwysing na 'n int, of andersins bekend as 'n adres. 531 00:22:48,290 --> 00:22:49,742 >> Wat is hierdie mal ding? 532 00:22:49,742 --> 00:22:51,825 Ons het nog nooit so iets gesien hou dat voor. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 So dit is die adres in my rekenaar se geheue van waar x gebeur om te lewe. 535 00:22:58,120 --> 00:22:59,040 Dit is Os-iets. 536 00:22:59,040 --> 00:23:01,290 En dit is, eerlik, waarom Ek het begin trek pyle, 537 00:23:01,290 --> 00:23:03,340 in plaas van getalle, want wat regtig omgee 538 00:23:03,340 --> 00:23:06,890 dat jou int is op 'n bepaalde adres wat daardie groot. 539 00:23:06,890 --> 00:23:12,160 Maar bffff0c4, dit is al inderdaad hexadecimalen, 540 00:23:12,160 --> 00:23:13,720 wat 0 tot f. 541 00:23:13,720 --> 00:23:16,590 >> So ons gaan nie te woon lank oor wat die dinge is. 542 00:23:16,590 --> 00:23:19,400 Maar as ek druk y, natuurlik, ek sien 2. 543 00:23:19,400 --> 00:23:22,440 Maar ampersand y, ek sien dit adres. 544 00:23:22,440 --> 00:23:26,527 En kennisgewing vir die vreemde, Hoe ver is x en y? 545 00:23:26,527 --> 00:23:27,985 Jy kan ignoreer die meeste van die adres. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Vier grepe. 548 00:23:29,920 --> 00:23:33,510 En dit is in ooreenstemming met ons vroeër beweer dat hoe groot is 'n int? 549 00:23:33,510 --> 00:23:34,130 Vier grepe. 550 00:23:34,130 --> 00:23:37,420 So dit lyk asof alles se voering mooi, as jy dalk hoop, in die geheue. 551 00:23:37,420 --> 00:23:40,010 >> So nou, laat ons net vinnig vorentoe aan die einde van hierdie storie. 552 00:23:40,010 --> 00:23:43,290 Kom ons gaan voort en tik stap, om te duik in die Swap funksie. 553 00:23:43,290 --> 00:23:46,880 Nou sien, as ek tik 'n, is dit identies aan die adres van x. 554 00:23:46,880 --> 00:23:52,130 As ek tik b, dit is identies na die adres van y. 555 00:23:52,130 --> 00:23:57,020 So, wat moet ek kyk of ek en gesê: Gaan na die adres 'n? 556 00:23:57,020 --> 00:23:58,120 So druk ster a. 557 00:23:58,120 --> 00:24:00,130 So ster beteken daar gaan, in hierdie konteks. 558 00:24:00,130 --> 00:24:02,730 Ampersand beteken wat is die adres van. 559 00:24:02,730 --> 00:24:05,000 So ster 'n middel 1. 560 00:24:05,000 --> 00:24:09,590 En druk ster b gee my 2. 561 00:24:09,590 --> 00:24:15,750 >> En laat my aanvaar, vir die oomblik, dat ten minste die kode wat 562 00:24:15,750 --> 00:24:18,950 opbrengs nou voer kan geredeneer deur in die manier. 563 00:24:18,950 --> 00:24:21,150 Maar ons sal hierdie idee weer kort voor lank. 564 00:24:21,150 --> 00:24:23,850 So hierdie weergawe van Swap is nou korrek en kan 565 00:24:23,850 --> 00:24:26,650 ons hierdie spesifieke data tipe te ruil. 566 00:24:26,650 --> 00:24:29,120 >> So enige vrae dan op Swap? 567 00:24:29,120 --> 00:24:29,890 Op ster? 568 00:24:29,890 --> 00:24:30,690 Op adres van? 569 00:24:30,690 --> 00:24:33,270 En jy sal sien, met probleem stel 4, soort van, 570 00:24:33,270 --> 00:24:37,310 maar die probleem stel 5, beslis, hoe hierdie dinge is nuttig en kry veel meer 571 00:24:37,310 --> 00:24:39,584 gemaklik met hulle, as 'n gevolg. 572 00:24:39,584 --> 00:24:40,430 Enigiets? 573 00:24:40,430 --> 00:24:40,930 Alle regte. 574 00:24:40,930 --> 00:24:44,350 So malloc is, weer, hierdie funksie dat net ken geheue, geheue 575 00:24:44,350 --> 00:24:45,330 toekenning. 576 00:24:45,330 --> 00:24:47,024 En hoekom is dit nuttig? 577 00:24:47,024 --> 00:24:48,940 Wel, al hierdie tyd, jy het al met behulp malloc. 578 00:24:48,940 --> 00:24:52,230 As jy nou hoe oorweeg getString werke, vermoedelik, dit is 579 00:24:52,230 --> 00:24:56,140 is om iemand te vra vir 'n stuk van geheue, enige tyd die gebruiker 'n string 580 00:24:56,140 --> 00:24:59,040 in, want ons het beslis weet nie, as CS50 personeel, 581 00:24:59,040 --> 00:25:02,710 hoe groot die snare wat die mens gaan om te tik kan wees. 582 00:25:02,710 --> 00:25:07,910 >> So laat, vir die eerste keer begin om te skil terug hoe die CS50 biblioteek werke, 583 00:25:07,910 --> 00:25:10,990 deur middel van 'n paar voorbeelde wat ons daar sal lei. 584 00:25:10,990 --> 00:25:15,300 So as ek oopmaak gedit en maak scanf 0, 585 00:25:15,300 --> 00:25:17,055 ons gaan die volgende kode te sien. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, beskikbaar op die webwerf vir vandag, het relatief min reëls van die kode 588 00:25:23,530 --> 00:25:25,351 hier, 14 tot 20. 589 00:25:25,351 --> 00:25:26,600 En laat ons sien wat dit doen. 590 00:25:26,600 --> 00:25:28,920 Dit verklaar 'n int, genoem x. 591 00:25:28,920 --> 00:25:30,850 Dit sê iets soos, nommer asseblief. 592 00:25:30,850 --> 00:25:33,940 En nou sê dit, scanf% i, en x. 593 00:25:33,940 --> 00:25:35,620 So is daar 'n klomp van die nuwe dinge daar. 594 00:25:35,620 --> 00:25:38,420 >> Maar scanf, kan jy soort van dink van die teenoorgestelde van printf. 595 00:25:38,420 --> 00:25:40,090 printf, natuurlik, afdrukke na die skerm. 596 00:25:40,090 --> 00:25:44,410 scanf soort van skanderings van die gebruiker se klawerbord iets wat hy of sy getik het. 597 00:25:44,410 --> 00:25:46,550 >> % I is net soos printf. 598 00:25:46,550 --> 00:25:49,410 Dit beteken verwag dat die gebruiker 'n int te tik. 599 00:25:49,410 --> 00:25:52,820 En nou, waarom dink jy is ek kan aanstuur scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 As die doel in die lewe van scanf is iets van die gebruiker te kry, 602 00:25:57,770 --> 00:26:02,480 Wat is die betekenis van om dit, en x, nou? 603 00:26:02,480 --> 00:26:02,980 Ja? 604 00:26:02,980 --> 00:26:03,896 >> Publiek: [onhoorbaar]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. Malan Presies. 607 00:26:06,540 --> 00:26:12,900 Alles wat ek, die mens, tik, my insette gaan op die plek om gered te word. 608 00:26:12,900 --> 00:26:17,660 Dit is nie voldoende nie, onthou, net slaag in x, want ons het reeds gesien het, 609 00:26:17,660 --> 00:26:21,630 enige tyd wat jy slaag net 'n rou veranderlike, soos 'n int, aan 'n ander funksie, 610 00:26:21,630 --> 00:26:25,640 seker nie, kan dit verander dat veranderlike, maar nie permanent. 611 00:26:25,640 --> 00:26:27,360 Dit kan nie 'n effek op die Main. 612 00:26:27,360 --> 00:26:29,420 Dit kan net sy eie plaaslike afskrif verander. 613 00:26:29,420 --> 00:26:32,560 Maar as, in plaas, wat jy doen nie gee my die werklike int, 614 00:26:32,560 --> 00:26:36,640 maar jy gee my die aanwysings na dat int, ek nou, synde scanf, 615 00:26:36,640 --> 00:26:41,050 sekerlik, ek kan volg wat spreek en sit 'n aantal is daar 616 00:26:41,050 --> 00:26:43,280 so jy het toegang tot dit so goed. 617 00:26:43,280 --> 00:26:45,120 >> So toe ek hierdie program, laat ons sien. 618 00:26:45,120 --> 00:26:49,660 Maak scanf 0 dot streep scanf 0. 619 00:26:49,660 --> 00:26:54,030 En as ek tik nou 'n aantal soos 50, dankie vir die 50. 620 00:26:54,030 --> 00:26:58,150 As ek tik nou 'n aantal soos negatiewe 1, vir die negatiewe 1. 621 00:26:58,150 --> 00:27:04,200 Ek tik nou 'n aantal soos 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Waarom het my program ignoreer my? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Wel, omdat net, ek het dit 'n int net verwag. 625 00:27:09,880 --> 00:27:10,380 Alle regte. 626 00:27:10,380 --> 00:27:11,630 So dit is 'n weergawe van hierdie. 627 00:27:11,630 --> 00:27:16,600 Kom ons neem dinge op 'n kerf en stel voor dat dit is nie goed nie. 628 00:27:16,600 --> 00:27:20,530 En hierin lê 'n baie eenvoudige voorbeeld hoe kan ons skryf kode begin 629 00:27:20,530 --> 00:27:24,450 dat ander mense kan ontgin of kompromie doen slegte dinge. 630 00:27:24,450 --> 00:27:28,336 So lyn 16, sodat soortgelyke in die gees voor, 631 00:27:28,336 --> 00:27:29,960 maar ek is nie te verklaar dit int hierdie tyd. 632 00:27:29,960 --> 00:27:32,970 Ek verklaar dat dit char ster, aka string. 633 00:27:32,970 --> 00:27:35,190 >> Maar wat beteken dit werklik? 634 00:27:35,190 --> 00:27:38,790 So as ek 'n address-- spesifiseer nie en Ek noem dit arbitrêr, buffer, 635 00:27:38,790 --> 00:27:43,370 maar ek kon noem dit is, te simple-- wees en dan het ek dit doen, om my te verduidelik, 636 00:27:43,370 --> 00:27:48,630 As jy kon, gebaseer op die vorige logika, wat scanf doen in lyn 18, 637 00:27:48,630 --> 00:27:55,000 As pass% s en buffer, wat is 'n adres? 638 00:27:55,000 --> 00:27:58,210 Wat is scanf, as jy aansoek doen om die presies dieselfde logika as weergawe 0, 639 00:27:58,210 --> 00:28:00,640 gaan probeer om hier te doen, wanneer die gebruiker iets in? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Ja? 642 00:28:03,409 --> 00:28:04,407 >> Publiek: [onhoorbaar]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. Malan Presies. 645 00:28:08,890 --> 00:28:11,577 Scanf, deur die logika vroeër, gaan die string te neem 646 00:28:11,577 --> 00:28:13,410 dat die menslike getikte in-- dit is nou 'n string, 647 00:28:13,410 --> 00:28:15,790 dit is nie 'n getal, vermoedelik, indien hy of sy cooperates-- 648 00:28:15,790 --> 00:28:19,310 en dit gaan om te probeer om dit te sit string in die geheue op watter adres 649 00:28:19,310 --> 00:28:20,340 buffer bepaal. 650 00:28:20,340 --> 00:28:23,870 En dit is 'n groot, want buffer is inderdaad bedoel om 'n adres te wees nie. 651 00:28:23,870 --> 00:28:30,470 >> Maar ek eis die program is karretjie in 'n baie ernstige manier, want watter waarde is 652 00:28:30,470 --> 00:28:31,330 buffer by verstek? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Wat het ek in geïnisialiseer? 655 00:28:34,790 --> 00:28:35,770 Wat deel van die geheue? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ek het nie, reg? 658 00:28:38,620 --> 00:28:42,265 >> So selfs al het ek 'n toegekende kar ster wat is nie langer genoem is, 659 00:28:42,265 --> 00:28:48,030 dit is eerder genoem, buffer-- so Kom ons teken die veranderlike se naam 660 00:28:48,030 --> 00:28:53,380 nou as buffer-- as ek nie genoem getString of malloc hier 661 00:28:53,380 --> 00:28:56,030 wat effektief beteken dat buffer is net 'n paar vullis waarde. 662 00:28:56,030 --> 00:28:57,030 >> Nou wat beteken dit? 663 00:28:57,030 --> 00:29:00,220 Dit beteken dat ek gesê het scanf 'n string van die gebruiker om te verwag. 664 00:29:00,220 --> 00:29:01,300 En weet jy wat? 665 00:29:01,300 --> 00:29:03,883 Wat hierdie ding wys aan- en ek trek vraagteken, 666 00:29:03,883 --> 00:29:07,060 maar in werklikheid, is dit gaan wees iets soos OX1, 2, 3, reg? 667 00:29:07,060 --> 00:29:10,730 Dit is 'n paar valse waarde wat net gebeur daar voor. 668 00:29:10,730 --> 00:29:13,440 So het 'n ander manier, is dit asof buffer is net 669 00:29:13,440 --> 00:29:16,180 verwys na iets in die geheue. 670 00:29:16,180 --> 00:29:17,610 Ek het geen idee wat. 671 00:29:17,610 --> 00:29:24,130 >> So as ek tik in Gabe nou, gaan dit probeer g-'n-b-e / 0 te sit daar. 672 00:29:24,130 --> 00:29:25,530 Maar wie weet wat dit is? 673 00:29:25,530 --> 00:29:27,480 En in die verlede, 'n tyd het ons probeer om aan te raak 674 00:29:27,480 --> 00:29:29,770 geheue wat nie pas nie ons het wat gebeur het? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Of byna elke keer. 677 00:29:32,870 --> 00:29:34,310 Segmentering skuld, reg? 678 00:29:34,310 --> 00:29:37,829 >> Hierdie pyl, ek het geen idee waar dit is wys. dit is net 'n paar random waarde. 679 00:29:37,829 --> 00:29:40,370 En natuurlik, as jy interpreteer 'n ewekansige waarde as 'n adres, 680 00:29:40,370 --> 00:29:42,610 jy gaan om te gaan na 'n paar random bestemming. 681 00:29:42,610 --> 00:29:46,810 So Gabe mag wel ongeluk my program in hierdie geval hier. 682 00:29:46,810 --> 00:29:50,600 >> So, wat kan ons doen dit is amper so erg? 683 00:29:50,600 --> 00:29:52,660 Oorweeg die derde en finale voorbeeld van scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Hierdie weergawe is beter in watter sin? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 As jy gemaklik is met die vorige probleem, dit is beter. 688 00:30:01,400 --> 00:30:02,250 Hoekom? 689 00:30:02,250 --> 00:30:03,250 >> Publiek: [onhoorbaar]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Goed. 692 00:30:07,110 --> 00:30:09,970 So hierdie geval van die lyn 16 is beter, in die sin 693 00:30:09,970 --> 00:30:12,030 dat ons uitdruklik toekenning van 'n geheue. 694 00:30:12,030 --> 00:30:14,190 Ons is nie die gebruik van malloc, ons gebruik die week 2 695 00:30:14,190 --> 00:30:16,060 benadering van net verklaar 'n skikking. 696 00:30:16,060 --> 00:30:18,130 En ons voor dat 'n string gesê het is net 'n verskeidenheid van die karakters, 697 00:30:18,130 --> 00:30:19,690 so dit is heeltemal wettig is. 698 00:30:19,690 --> 00:30:22,910 Maar dit is natuurlik as u daarop let, vaste grootte, 16. 699 00:30:22,910 --> 00:30:25,440 >> So is hierdie program heeltemal veilig, as ek tik 700 00:30:25,440 --> 00:30:29,760 in een karakter snare, twee karakter snare, 15 karakter snare. 701 00:30:29,760 --> 00:30:34,970 Maar so gou as ek begin tik 16, 17, 18, 1000 karakterstringe, 702 00:30:34,970 --> 00:30:37,390 waar is dat die snaar gaan eindig? 703 00:30:37,390 --> 00:30:39,570 Dit gaan uiteindelik deels hier. 704 00:30:39,570 --> 00:30:42,820 Maar dan wie wat anders weet buite die grense 705 00:30:42,820 --> 00:30:44,270 van hierdie spesifieke verskeidenheid? 706 00:30:44,270 --> 00:30:48,015 >> Dit is asof ek het verklaar 16 bokse hier. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 So eerder as trek uit al 16, sal ons net voorgee dat ek getrek 16. 709 00:30:52,690 --> 00:30:56,540 Maar as ek probeer dan 'n string te lees dit is veel meer soos 50 karakters, 710 00:30:56,540 --> 00:31:01,270 Ek gaan om te begin om a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 En dit is vermoedelik 'n ander geheue segment 712 00:31:04,916 --> 00:31:06,790 wat weer kan veroorsaak my program om te crash, 713 00:31:06,790 --> 00:31:10,600 want ek het nie gevra vir niks meer as net 16 grepe. 714 00:31:10,600 --> 00:31:12,260 >> So wat omgee? 715 00:31:12,260 --> 00:31:13,880 Wel, hier is die CS50 biblioteek. 716 00:31:13,880 --> 00:31:17,220 En die meeste van hierdie is net soos instruksies tot bo. 717 00:31:17,220 --> 00:31:21,670 Die CS50 biblioteek, al hierdie tyd, het hierdie lyn in lyn 52. 718 00:31:21,670 --> 00:31:23,680 Ons het typedef gesien het, of jy sal sien typedef 719 00:31:23,680 --> 00:31:27,930 in pset 4, wat net skep 'n sinoniem waardeur kar ster meer kan wees 720 00:31:27,930 --> 00:31:29,290 eenvoudig na verwys as string. 721 00:31:29,290 --> 00:31:31,540 So, dit is een van die paar opleiding wiele 722 00:31:31,540 --> 00:31:34,120 ons het in die geheim gebruik onder die kap. 723 00:31:34,120 --> 00:31:36,490 >> Intussen, hier is die funksie, getChar. 724 00:31:36,490 --> 00:31:38,190 Nou glo, is daar geen liggaam om dit te. 725 00:31:38,190 --> 00:31:40,273 En in die feit, as ek hou blaai, ek doen nie eintlik 726 00:31:40,273 --> 00:31:42,080 sien nie die implementering van hierdie funksies. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 As 'n gesonde verstand tjek, hoekom is dit? 729 00:31:45,516 --> 00:31:46,795 >> Publiek: [onhoorbaar]. 730 00:31:46,795 --> 00:31:47,670 David J. Malan Ja. 731 00:31:47,670 --> 00:31:48,950 So, dit is die kop lêer. 732 00:31:48,950 --> 00:31:52,520 En kop lêers bevat prototipes, plus 'n paar ander dinge, dit lyk, 733 00:31:52,520 --> 00:31:53,780 soos typedefs. 734 00:31:53,780 --> 00:31:56,910 Maar in CS50.c, wat ons het nooit openlik aan jou gegee het, 735 00:31:56,910 --> 00:32:02,100 maar is in die CS50 toestel al hierdie tyd, diep binnekant van die dopgehou, 736 00:32:02,100 --> 00:32:04,990 agterkom dat daar is 'n hele n klomp van die funksies hier. 737 00:32:04,990 --> 00:32:06,720 >> In werklikheid, laat se rol af. 738 00:32:06,720 --> 00:32:08,810 Kom ons ignoreer die meeste van hulle, vir nou. 739 00:32:08,810 --> 00:32:12,670 Maar blaai af na getInt en sien hoe getInt werk. 740 00:32:12,670 --> 00:32:13,890 So hier is getInt. 741 00:32:13,890 --> 00:32:17,727 En as jy ooit regtig omgegee hoe kry int werk, hier is sy dokumentasie. 742 00:32:17,727 --> 00:32:19,560 En onder die dinge wat sê dit is dit vir jou vertel 743 00:32:19,560 --> 00:32:21,340 wat die omvang van die waardes wat dit kan terugkeer. 744 00:32:21,340 --> 00:32:24,400 Dit is in wese negatief 2000000000 positiewe 2000000000, gee of neem. 745 00:32:24,400 --> 00:32:26,420 >> En dit blyk dat al hierdie tyd, selfs al het ons nog nooit 746 00:32:26,420 --> 00:32:28,570 het jy gaan vir dit, as iets verkeerd gaan, 747 00:32:28,570 --> 00:32:30,680 dit blyk dat alle hierdie tyd, het getInt 748 00:32:30,680 --> 00:32:33,600 is die terugkeer van 'n spesiale konstante, nie null, 749 00:32:33,600 --> 00:32:36,760 maar eerder int_max, wat net 'n programmeerder se konvensie. 750 00:32:36,760 --> 00:32:38,846 Dit beteken hier is 'n spesiale waarde. 751 00:32:38,846 --> 00:32:41,470 Maak seker om te kyk vir hierdie, net in geval daar iets verkeerd gaan. 752 00:32:41,470 --> 00:32:43,261 Maar ons het nog nooit gepla met dat tot op datum, 753 00:32:43,261 --> 00:32:45,200 want weer, hierdie bedoel om te vereenvoudig. 754 00:32:45,200 --> 00:32:46,950 >> Maar hoe getInt raak geïmplementeer? 755 00:32:46,950 --> 00:32:48,450 Wel, een, dit neem geen argumente. 756 00:32:48,450 --> 00:32:49,390 Ons weet dat. 757 00:32:49,390 --> 00:32:50,820 Dit gee 'n int. 758 00:32:50,820 --> 00:32:51,950 Ons weet dat. 759 00:32:51,950 --> 00:32:54,460 So hoe werk dit onder die enjinkap? 760 00:32:54,460 --> 00:32:58,290 >> So is daar blykbaar 'n oneindige lus, ten minste die voorkoms van die een. 761 00:32:58,290 --> 00:33:00,290 Let daarop dat ons gebruik getString. 762 00:33:00,290 --> 00:33:04,000 So dit is interessant. getInt noem ons eie funksie, getString. 763 00:33:04,000 --> 00:33:05,645 En nou, waarom kan dit die geval wees? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Hoekom word ek verdedigende hier in lyn 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Wat kan gebeur in lyn 164, net om duidelik te wees? 768 00:33:15,639 --> 00:33:16,930 Dit is dieselfde antwoord as voorheen. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Dalk net uit die geheue. 771 00:33:20,089 --> 00:33:23,130 Iets verkeerd gaan met getString, ons het om in staat wees om dit te hanteer. 772 00:33:23,130 --> 00:33:27,070 En die rede waarom ek nie terugkeer nie nul is wat tegnies nul is 'n wyser. 773 00:33:27,070 --> 00:33:29,120 getInt het 'n int om terug te keer. 774 00:33:29,120 --> 00:33:31,060 So ek het arbitrêr besluit, in wese, 775 00:33:31,060 --> 00:33:34,600 dat 2 miljard gee of te neem, gaan 'n spesiale waarde te wees wat ek kan nooit 776 00:33:34,600 --> 00:33:35,970 eintlik kry van die gebruiker. 777 00:33:35,970 --> 00:33:39,930 Dis net die een waarde gaan ek mors 'n fout kode verteenwoordig. 778 00:33:39,930 --> 00:33:41,540 >> So nou, dinge 'n bietjie fancy. 779 00:33:41,540 --> 00:33:44,670 En dit is nie heeltemal dieselfde funksie soos voorheen, maar dit is baie soortgelyk. 780 00:33:44,670 --> 00:33:50,120 So sien, verklaar ek hier, in lyn 172, beide 'n int N en 'n kar c. 781 00:33:50,120 --> 00:33:53,600 En dan het ek gebruik om hierdie funky lyn, sscanf, wat dit blyk uit 782 00:33:53,600 --> 00:33:55,990 nie 'n string van die klawerbord scan. 783 00:33:55,990 --> 00:33:59,226 Dit staan ​​'n bestaande string wat die gebruiker het reeds getik in. 784 00:33:59,226 --> 00:34:02,100 So ek het reeds getString, genoem wat beteken dat ek 'n string in die geheue. 785 00:34:02,100 --> 00:34:05,020 sscanf is wat jy wil noem 'n ontleding funksie. 786 00:34:05,020 --> 00:34:07,760 Dit lyk op die string Ek het getik in, karakter deur karakter, 787 00:34:07,760 --> 00:34:09,250 en doen iets nuttig. 788 00:34:09,250 --> 00:34:10,969 Dit string gestoor word in die lyn. 789 00:34:10,969 --> 00:34:13,560 En ek weet dat slegs deur te gaan back-up hier en sê, O, OK, 790 00:34:13,560 --> 00:34:15,143 Ek het dit nie s die tyd, maar lyn. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> En nou is dit 'n bietjie anders. 793 00:34:18,080 --> 00:34:22,480 Maar dit effektief beteken, vir die redes ons sal 'n bietjie ons hande waai vandag, 794 00:34:22,480 --> 00:34:26,070 dat ons kontrole te sien of die gebruiker getik 795 00:34:26,070 --> 00:34:29,909 en int en miskien 'n ander karakter. 796 00:34:29,909 --> 00:34:33,610 As die gebruiker in 'n int getik, dit is gaan gestoor word in n, want ek is 797 00:34:33,610 --> 00:34:36,739 verby hierdie toespraak het die nuwe truuk wat ons vandag gesien het. 798 00:34:36,739 --> 00:34:41,570 As die gebruiker ook getik in soos 123x dat x 799 00:34:41,570 --> 00:34:45,060 gaan aan die einde 'n brief in karakter c. 800 00:34:45,060 --> 00:34:48,739 >> Nou is dit blyk dat sscanf sal vir my sê, intelligent, 801 00:34:48,739 --> 00:34:54,750 hoeveel veranderlikes is sscanf suksesvol te kan vul. 802 00:34:54,750 --> 00:34:58,770 So deur hierdie logika, as die funksie Ek is die uitvoering is getInt, 803 00:34:58,770 --> 00:35:00,900 maar ek nagaan, potensieel, vir die gebruiker 804 00:35:00,900 --> 00:35:04,190 in 'n int getik het gevolg deur iets anders, 805 00:35:04,190 --> 00:35:08,580 wat wil ek sscanf se terugkeer waarde werklik te wees? 806 00:35:08,580 --> 00:35:10,950 As die doel is om te kry net 'n int van die gebruiker? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> So as sscanf opbrengste 2, wat beteken dit? 809 00:35:19,300 --> 00:35:21,660 Die gebruiker getik iets soos, letterlik, 810 00:35:21,660 --> 00:35:24,770 123x, wat net nonsens. 811 00:35:24,770 --> 00:35:27,490 Dit is 'n fout toestand, en Ek wil om te kyk vir dit. 812 00:35:27,490 --> 00:35:32,960 >> So as die gebruiker in, en deur hierdie logika, wat beteken sscanf terugkeer, 813 00:35:32,960 --> 00:35:33,740 sou jy sê? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 So dit gaan om terug te keer 2, want die 123 gaan om te gaan in hier, 816 00:35:39,130 --> 00:35:41,580 en die x gaan eindig hier. 817 00:35:41,580 --> 00:35:43,970 Maar ek wil nie die x gevul te kry. 818 00:35:43,970 --> 00:35:48,580 Ek wil sscanf slegs daarin slaag om vul die eerste van sy veranderlikes. 819 00:35:48,580 --> 00:35:52,490 En dit is hoekom ek wil sscanf om terug te keer 1. 820 00:35:52,490 --> 00:35:55,750 >> En as dit 'n bietjie oor die kop vir die oomblik, dit is heeltemal fyn. 821 00:35:55,750 --> 00:36:00,030 Besef egter dat een van die waardes van getInt en getString 822 00:36:00,030 --> 00:36:03,630 is dat ons 'n heck van 'n doen baie foutkontroles soos hierdie so 823 00:36:03,630 --> 00:36:07,130 dat, tot op datum, kan jy so bietjie tik enigiets sleutelbord, 824 00:36:07,130 --> 00:36:08,490 en ons sal dit vang. 825 00:36:08,490 --> 00:36:10,592 En ons het beslis die personeel, sal beslis nie 826 00:36:10,592 --> 00:36:13,300 wees om die bron van 'n fout in jou program, want ons is defensief 827 00:36:13,300 --> 00:36:16,270 keur vir al die dom dinge wat 'n gebruiker kan doen, 828 00:36:16,270 --> 00:36:18,900 soos tik 'n string, wanneer jy regtig wou int. 829 00:36:18,900 --> 00:36:21,350 So vir now-- ons sal kom terug na hierdie voor long-- 830 00:36:21,350 --> 00:36:23,710 Maar al hierdie tyd, getString en getInt het 831 00:36:23,710 --> 00:36:29,950 is onder die enjinkap gebruik van hierdie basiese idee van adresse van die geheue. 832 00:36:29,950 --> 00:36:32,580 >> So nou, laat ons dinge wat 'n bietjie meer gebruikersvriendelik. 833 00:36:32,580 --> 00:36:38,740 As jy kan onthou, van Binky laaste time-- as my muis sal so cooperate-- 834 00:36:38,740 --> 00:36:42,560 ons het hierdie kode, wat eerlik, is redelik nonsens. 835 00:36:42,560 --> 00:36:45,330 Hierdie kode bereik niks nuttig, maar dit was die voorbeeld 836 00:36:45,330 --> 00:36:48,330 dat professor Parlante gebruik om voor te stel 837 00:36:48,330 --> 00:36:51,840 wat aan die gang was in 'n program wat die geheue. 838 00:36:51,840 --> 00:36:54,850 >> So laat ons vertel hierdie storie super kortliks. 839 00:36:54,850 --> 00:36:58,720 Die eerste twee lyne, in Engels, wat sou jy sê nie? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Net in 'n redelike mens, maar effens tegniese terme, 'n steek. 842 00:37:05,430 --> 00:37:06,346 Publiek: [onhoorbaar]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. Malan OK, jy stigting adresse vir jou x en y veranderlikes. 845 00:37:11,080 --> 00:37:15,520 Nie heeltemal nie, omdat x en y is nie veranderlikes in die tradisionele sin. 846 00:37:15,520 --> 00:37:18,054 x en y is adresse of sal slaan adres. 847 00:37:18,054 --> 00:37:19,220 So laat ons probeer om hierdie keer meer. 848 00:37:19,220 --> 00:37:21,010 Nie 'n slegte begin, al is. 849 00:37:21,010 --> 00:37:21,510 Ja? 850 00:37:21,510 --> 00:37:22,426 >> Publiek: [onhoorbaar]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Goed. 853 00:37:24,840 --> 00:37:26,173 Ek dink dit is 'n bietjie skoner. 854 00:37:26,173 --> 00:37:28,630 Verklaar twee wysers, twee heelgetalle. 855 00:37:28,630 --> 00:37:30,150 En ons noem dit x en y. 856 00:37:30,150 --> 00:37:32,790 Of as ons te trek dit as 'n foto, weer, 857 00:37:32,790 --> 00:37:36,410 onthou eenvoudig dat alle ons doen met die eerste reël 858 00:37:36,410 --> 00:37:39,690 is soos hierdie tekens van 'n boks, met 'n paar vullis waarde in dit, 859 00:37:39,690 --> 00:37:41,920 en noem dit x, en dan 'n ander vak soos hierdie, 860 00:37:41,920 --> 00:37:43,880 met 'n paar vullis waarde in dit, noem dit y. 861 00:37:43,880 --> 00:37:45,810 Ons het verklaar twee wysers wat uiteindelik 862 00:37:45,810 --> 00:37:47,860 sal die adres van 'n int stoor. 863 00:37:47,860 --> 00:37:49,170 So dit is alles daar. 864 00:37:49,170 --> 00:37:53,290 >> So wanneer Binky dit gedoen het, die klei net so gelyk. 865 00:37:53,290 --> 00:37:55,350 En Nick net soort van toegedraai die pyle, 866 00:37:55,350 --> 00:37:57,590 asof hulle nie op enige plek wys in die besonder, want hulle is net 867 00:37:57,590 --> 00:37:58,250 vullis waardes. 868 00:37:58,250 --> 00:38:01,670 Hulle is nie uitdruklik geïnisialiseer oral in die besonder. 869 00:38:01,670 --> 00:38:03,980 >> Nou is die volgende lyn van kode, onthou, was dit. 870 00:38:03,980 --> 00:38:07,510 So in 'n redelike gebruiker-vriendelike, maar ietwat tegniese Engels, 871 00:38:07,510 --> 00:38:09,790 Wat is hierdie reël van die kode te doen? 872 00:38:09,790 --> 00:38:10,391 Ja? 873 00:38:10,391 --> 00:38:11,333 >> Publiek: [onhoorbaar]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. Malan Perfect. 876 00:38:13,950 --> 00:38:17,016 Dit is die toekenning van die stuk van die geheue wat is die grootte van 'n int. 877 00:38:17,016 --> 00:38:18,140 En dit is die helfte van die antwoord. 878 00:38:18,140 --> 00:38:20,056 Jy antwoord die reg helfte van die uitdrukking. 879 00:38:20,056 --> 00:38:22,473 Wat gebeur op die linkerkant van die gelyk teken? 880 00:38:22,473 --> 00:38:22,972 Ja? 881 00:38:22,972 --> 00:38:24,814 Publiek: en ken dit aan die veranderlike x? 882 00:38:24,814 --> 00:38:27,690 >> David J. Malan en ken dit aan die veranderlike x. 883 00:38:27,690 --> 00:38:31,650 So om herhaling, regs toewys genoeg geheue 'n int te stoor. 884 00:38:31,650 --> 00:38:34,150 Maar malloc spesifiek gee die adres 885 00:38:34,150 --> 00:38:37,270 van daardie deel van die geheue, wat jy het net voorgestelde kry gestoor in x. 886 00:38:37,270 --> 00:38:42,560 >> So, wat Nick het die laaste keer met Binky is hy gesleep wat wyser uit die klei, 887 00:38:42,560 --> 00:38:46,820 wys nou op 'n wit stuk van die geheue wat gelyk is aan die grootte van 'n int. 888 00:38:46,820 --> 00:38:49,360 En inderdaad, dit is bedoel vier grepe te verteenwoordig. 889 00:38:49,360 --> 00:38:55,310 >> Nou, die volgende lyn van die kode het dit gedoen, ster x kry 42. 890 00:38:55,310 --> 00:38:58,530 So 42 is eenvoudig op die regs, betekenis van die lewe. 891 00:38:58,530 --> 00:39:00,500 Linkerkant, ster x beteken wat? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Dat daar te kan hê gone-- dit is OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Publiek: Eintlik, gaan na die [onhoorbaar] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Goed. 897 00:39:07,750 --> 00:39:08,760 Publiek: [onhoorbaar]. 898 00:39:08,760 --> 00:39:09,760 David J. Malan Presies. 899 00:39:09,760 --> 00:39:11,979 Linkerkant beteken gaan na x. 900 00:39:11,979 --> 00:39:12,520 x is adres. 901 00:39:12,520 --> 00:39:15,520 Dit is soos 33 Oxford Street, of OX1. 902 00:39:15,520 --> 00:39:18,690 En ster x beteken gaan na daardie spreek en dit wat daar? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> So ja, dit is presies wat Nick het. 905 00:39:21,290 --> 00:39:23,740 Hy het begin met deur, wese, verstandelik 906 00:39:23,740 --> 00:39:26,270 wys 'n vinger na x, na aanleiding van die pyl 907 00:39:26,270 --> 00:39:30,670 om die wit blokkie op die regterkant kant, en om die nommer 42 is daar. 908 00:39:30,670 --> 00:39:34,120 Maar toe het dinge 'n bietjie gevaarlik, reg? 909 00:39:34,120 --> 00:39:35,860 Binky se oor sy kop te verloor. 910 00:39:35,860 --> 00:39:39,465 >> Star y is gelyk aan 13, slegte geluk, beteken wat? 911 00:39:39,465 --> 00:39:43,620 So ster y middel gaan na die adres in y. 912 00:39:43,620 --> 00:39:45,630 Maar wat is die adres in y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Alle reg, dit is vullis waarde, reg? 915 00:39:49,440 --> 00:39:50,800 Ek het dit as 'n vraagteken. 916 00:39:50,800 --> 00:39:54,850 Nick het dit as 'n krul pyl. 917 00:39:54,850 --> 00:39:59,600 En so gou as wat jy probeer om te doen ster y, sê daar gaan, 918 00:39:59,600 --> 00:40:03,872 maar daar is nie 'n wettige adres, dit is 'n paar valse plek, 919 00:40:03,872 --> 00:40:05,080 die program gaan crash. 920 00:40:05,080 --> 00:40:08,580 En Binky se kop gaan vlieg af hier, soos dit gedoen het. 921 00:40:08,580 --> 00:40:12,130 >> So op die ou end, is hierdie program was net plat fout. 922 00:40:12,130 --> 00:40:13,540 Dit was 'n karretjie program. 923 00:40:13,540 --> 00:40:14,760 En dit nodig om te bepaal moet word. 924 00:40:14,760 --> 00:40:18,260 En die enigste manier om werklik te los dit sou wees, byvoorbeeld, hierdie lyn, 925 00:40:18,260 --> 00:40:21,010 wat ons het nie eens nie, want te gou die program neergestort het. 926 00:40:21,010 --> 00:40:26,170 Maar as ons dit op te los, wat effek het om y gelyk x hê? 927 00:40:26,170 --> 00:40:30,010 Wel, dit wys in wese y op watter waarde x wys op. 928 00:40:30,010 --> 00:40:32,430 >> So in Nick se storie, of Binky se storie, beide 929 00:40:32,430 --> 00:40:34,640 x en y is wat dui op die wit deel van die geheue, 930 00:40:34,640 --> 00:40:38,300 sodat, uiteindelik, wanneer jy nie ster y is gelyk aan 13 weer 931 00:40:38,300 --> 00:40:43,080 beland jy om 13 in die toepaslike plek. 932 00:40:43,080 --> 00:40:47,640 So al hierdie lyne is perfek wettige, behalwe vir hierdie een, 933 00:40:47,640 --> 00:40:51,730 toe dit gebeur het voordat jy eintlik wat y waarde. 934 00:40:51,730 --> 00:40:54,290 >> Nou gelukkig, jy doen nie het om te redeneer deur al 935 00:40:54,290 --> 00:40:56,560 van hierdie soort van probleme op jou eie. 936 00:40:56,560 --> 00:40:59,310 Laat my gaan voort en maak 'n terminaal venster hier 937 00:40:59,310 --> 00:41:03,050 en maak vir net 'n oomblik, 'n super kort program wat 938 00:41:03,050 --> 00:41:04,360 ook is 'n soort van nutteloos. 939 00:41:04,360 --> 00:41:05,152 Dit is lelik. 940 00:41:05,152 --> 00:41:06,610 Dit maak nie bereik nie nuttig. 941 00:41:06,610 --> 00:41:10,180 Maar dit beteken demonstreer kwessies geheue, so laat ons neem 'n blik. 942 00:41:10,180 --> 00:41:11,830 >> Main, super eenvoudig. 943 00:41:11,830 --> 00:41:14,830 Dit is dan blykbaar 'n funksie, f, en dan terug 0. 944 00:41:14,830 --> 00:41:16,310 Dit is soort van moeilik om te gemors dit op. 945 00:41:16,310 --> 00:41:18,540 So Main is redelik goed, so ver. 946 00:41:18,540 --> 00:41:20,100 >> So f is problematies. 947 00:41:20,100 --> 00:41:22,120 En net het nie veel sit moeite in die noem dit 948 00:41:22,120 --> 00:41:23,990 Hier is die fokus op die kode te hou. 949 00:41:23,990 --> 00:41:25,740 f het twee lyne. 950 00:41:25,740 --> 00:41:27,610 En laat ons sien wat nou aangaan. 951 00:41:27,610 --> 00:41:29,840 So aan die een kant here-- en laat my 952 00:41:29,840 --> 00:41:32,680 hierdie ooreenstemming met die vorige example-- aan die een kant, 953 00:41:32,680 --> 00:41:35,830 die linkerkant is doen wat, in Engels? 954 00:41:35,830 --> 00:41:36,493 Dit is-- 955 00:41:36,493 --> 00:41:37,701 Publiek: Skep 'n wyser. 956 00:41:37,701 --> 00:41:40,830 David J. Malan skep van 'n muis na 'n int en noem dit x. 957 00:41:40,830 --> 00:41:43,789 Dit is dus die skep van een van die bokse Ek hou tekening op die touch screen. 958 00:41:43,789 --> 00:41:45,913 En nou, op die regterkantste kant, malloc, natuurlik, 959 00:41:45,913 --> 00:41:47,420 is die toekenning van 'n stuk van die geheue. 960 00:41:47,420 --> 00:41:49,989 En net om duidelik te wees, hoe veel geheue is dit blykbaar 961 00:41:49,989 --> 00:41:52,030 toekenning, as jy net soort doen die wiskunde hier? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> So dit is 40 grepe. 964 00:41:54,040 --> 00:41:57,400 En ek weet dat net omdat ek weet 'n int, op die CS50 toestel, ten minste, 965 00:41:57,400 --> 00:41:58,060 is vier grepe. 966 00:41:58,060 --> 00:41:59,610 So 10 keer 4 is 40. 967 00:41:59,610 --> 00:42:04,924 So dit is 'n stoor x, die adres van die eerste uit 40 ints wat 968 00:42:04,924 --> 00:42:07,340 is die ruimte terug toegeken is, terug, terug, terug. 969 00:42:07,340 --> 00:42:08,470 >> En dit is wat die sleutel van malloc. 970 00:42:08,470 --> 00:42:11,261 Dit maak nie 'n bietjie geheue neem hier, 'n bietjie hier, 'n bietjie hier. 971 00:42:11,261 --> 00:42:14,220 Dit gee jou 'n stuk van die geheue, aansluitend, van die bedryfstelsel 972 00:42:14,220 --> 00:42:15,240 stelsel. 973 00:42:15,240 --> 00:42:18,500 >> Nou wat oor hierdie, x bracket 10 is gelyk aan 0? 974 00:42:18,500 --> 00:42:19,470 Arbitrêre reël van die kode. 975 00:42:19,470 --> 00:42:21,100 Dit maak nie bereik nie nuttig. 976 00:42:21,100 --> 00:42:26,128 Maar dit is interessant, omdat x bracket 10--? 977 00:42:26,128 --> 00:42:26,628 Ja? 978 00:42:26,628 --> 00:42:27,912 >> Publiek: [onhoorbaar]? 979 00:42:27,912 --> 00:42:30,500 >> David J. Malan x bracket 10 hoef nie nul wees. 980 00:42:30,500 --> 00:42:35,070 Die nul detail kom slegs in die spel met snare, aan die einde van 'n string. 981 00:42:35,070 --> 00:42:36,700 Maar 'n goeie gedagte. 982 00:42:36,700 --> 00:42:39,615 >> Hoe groot is hierdie verskeidenheid, selfs al het ek nog toegeken 40 grepe? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Dit is deur middel van nege 0, reg? 985 00:42:43,690 --> 00:42:45,120 Dit is 10 ints, totaal. 986 00:42:45,120 --> 00:42:48,790 40 grepe, maar 10 ints, kruip 0 tot 0. 987 00:42:48,790 --> 00:42:50,930 >> So wat is dit x bracket 10? 988 00:42:50,930 --> 00:42:53,090 Dit is eintlik 'n paar onbekend vullis waarde. 989 00:42:53,090 --> 00:42:54,780 Dit is die geheue wat nie aan my behoort. 990 00:42:54,780 --> 00:42:59,650 Ek moet raak nie dat byte nommer 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Ek is effens te ver. 992 00:43:01,420 --> 00:43:04,490 >> En inderdaad, as ek hardloop hierdie program, is dit dalk baie goed crash. 993 00:43:04,490 --> 00:43:05,790 Maar soms, sal ons gelukkig is. 994 00:43:05,790 --> 00:43:07,706 En so net om te demonstreer this-- en eerlik, 995 00:43:07,706 --> 00:43:11,000 jy weet nooit wat jy laat it-- nie se hardloop nie. 996 00:43:11,000 --> 00:43:12,480 Dit het nie eintlik crash. 997 00:43:12,480 --> 00:43:15,032 >> Maar as ek dit verander, vir Byvoorbeeld, om te wees soos 1000, 998 00:43:15,032 --> 00:43:16,740 dit werklik doelbewuste, laat ons sien 999 00:43:16,740 --> 00:43:18,710 As ons dit kan kry hierdie tyd te crash. 1000 00:43:18,710 --> 00:43:20,070 OK, het dit nie crash. 1001 00:43:20,070 --> 00:43:22,600 Hoe oor 100,000? 1002 00:43:22,600 --> 00:43:25,000 Kom ons remake dit, en nou tik dit. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Sjoe. 1005 00:43:25,960 --> 00:43:26,460 Alle regte. 1006 00:43:26,460 --> 00:43:29,090 So glo, weer, hierdie segmente van die geheue, so te sê, 1007 00:43:29,090 --> 00:43:32,660 is redelik groot, sodat ons kan kry gelukkig weer en weer. 1008 00:43:32,660 --> 00:43:36,510 Maar uiteindelik, wanneer jy belaglik en regtig ver uit op die skerm, 1009 00:43:36,510 --> 00:43:39,120 jy raak geheue wat regtig, regtig nie aan jou behoort. 1010 00:43:39,120 --> 00:43:40,870 >> Maar eerlik, hierdie vorme van foute gaan 1011 00:43:40,870 --> 00:43:43,020 te wees harder en harder om uit te vind op jou eie. 1012 00:43:43,020 --> 00:43:47,880 Maar gelukkig, as programmeerders, ons het gereedskap wat ons in staat stel om dit te doen vir ons. 1013 00:43:47,880 --> 00:43:50,140 So, dit is, miskien, 'n van die lelikste programme, 1014 00:43:50,140 --> 00:43:52,060 selfs leliker as gdb se uitset. 1015 00:43:52,060 --> 00:43:55,670 Maar dit is altyd 'n lyn of twee wat super nuttig. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind is 'n program wat help jy nie ontfout 'n program, per se, 1017 00:44:00,310 --> 00:44:03,500 maar vind geheue-verwante probleme, spesifiek. 1018 00:44:03,500 --> 00:44:07,590 Dit sal outomaties hardloop jou kode vir jy en kyk vir ten minste twee dinge. 1019 00:44:07,590 --> 00:44:10,680 Een, het jy iets doen toevallige soos touch geheue 1020 00:44:10,680 --> 00:44:11,980 wat nie aan jou behoort? 1021 00:44:11,980 --> 00:44:13,590 Dit sal jou help om daardie gevalle. 1022 00:44:13,590 --> 00:44:15,710 >> En twee, sal dit help jy iets genoem vind 1023 00:44:15,710 --> 00:44:19,270 geheue lekkasies, wat ons heeltemal geïgnoreer, naïef, 1024 00:44:19,270 --> 00:44:21,380 vir 'n geruime tyd en salig. 1025 00:44:21,380 --> 00:44:23,140 Maar dit blyk, al hierdie tyd, wanneer 1026 00:44:23,140 --> 00:44:26,620 jy getString ingeroep so baie van ons programme, 1027 00:44:26,620 --> 00:44:28,930 jy die bedryfstelsel is te vra stelsel vir die geheue, 1028 00:44:28,930 --> 00:44:32,070 maar jy het 'n herinnering ooit gee dit 1029 00:44:32,070 --> 00:44:36,169 terug, doen unalloc, of vry, soos dit genoem word. 1030 00:44:36,169 --> 00:44:37,960 Nee, want ons het nog nooit gevra om dit te doen. 1031 00:44:37,960 --> 00:44:41,250 >> Maar al hierdie tyd, die programme jy is skryf in C 1032 00:44:41,250 --> 00:44:43,800 is lek geheue, vra die bedryfstelsel 1033 00:44:43,800 --> 00:44:46,190 stelsel vir meer en meer geheue vir strykers en noem maar op, 1034 00:44:46,190 --> 00:44:47,870 maar nooit oorhandig dit terug. 1035 00:44:47,870 --> 00:44:50,080 En nou is dit 'n bietjie van 'n oorvereenvoudiging, 1036 00:44:50,080 --> 00:44:53,550 maar as jy al ooit loop jou Mac of jou rekenaar vir 'n geruime tyd, opening 1037 00:44:53,550 --> 00:44:55,790 baie van die programme, Miskien sluiting programme, 1038 00:44:55,790 --> 00:44:57,795 en selfs al is jou rekenaar het nie neergestort, 1039 00:44:57,795 --> 00:45:01,690 dit is om so veel stadiger, asof dit werklik 1040 00:45:01,690 --> 00:45:04,290 gebruik van 'n baie van die geheue of hulpbronne, selfs al is, 1041 00:45:04,290 --> 00:45:06,070 as jy nie eens raak die klawerbord, 1042 00:45:06,070 --> 00:45:10,430 wat kan be-- maar nie always-- kon wees dat die programme wat jy loop 1043 00:45:10,430 --> 00:45:11,920 hulself geheue lekkasies. 1044 00:45:11,920 --> 00:45:15,645 En hulle bly vra die bedryfstelsel vir meer en meer geheue, maar vergeet oor dit, 1045 00:45:15,645 --> 00:45:18,470 nie eintlik om dit te gebruik nie, maar dus neem geheue weg 1046 00:45:18,470 --> 00:45:20,500 uit ander programme wat dit dalk wil. 1047 00:45:20,500 --> 00:45:23,940 So dit is 'n algemene verduideliking. 1048 00:45:23,940 --> 00:45:25,940 Nou hier is waar Valgrind se produksie is heeltemal 1049 00:45:25,940 --> 00:45:29,290 gruwelike aan diegene wat minder en meer gemaklik gelyk. 1050 00:45:29,290 --> 00:45:32,690 Maar die interessante dinge is reg hier. 1051 00:45:32,690 --> 00:45:37,060 Dit is vir my 'n ongeldige skryf van grootte vier gebeur in hierdie program, 1052 00:45:37,060 --> 00:45:40,640 in die besonder, op lyn 21 van memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> As ek gaan na reël 21, hm, is daar inderdaad is 'n ongeldige skryf van grootte vier. 1054 00:45:45,450 --> 00:45:46,250 Hoekom grootte vier? 1055 00:45:46,250 --> 00:45:49,500 Wel, hierdie number-- en dit kon anything-- wees, is 'n int. 1056 00:45:49,500 --> 00:45:50,450 Dus is dit vier grepe. 1057 00:45:50,450 --> 00:45:52,550 So ek is om vier grepe waar hulle nie hoort nie. 1058 00:45:52,550 --> 00:45:55,080 Dit is wat Valgrind is my eintlik vertel. 1059 00:45:55,080 --> 00:45:57,600 Verder sal dit ook sê vir my, soos ons sal sien, 1060 00:45:57,600 --> 00:46:01,490 as jy loop dit in 'n toekomstige pset, indien en wanneer jy die geheue, wat inderdaad het uitgelek 1061 00:46:01,490 --> 00:46:05,300 Ek het, want ek het genoem malloc, maar ek het nie eintlik 1062 00:46:05,300 --> 00:46:08,010 genoem word, in hierdie geval, gratis, wat ons sal uiteindelik sien 1063 00:46:08,010 --> 00:46:09,830 is die teenoorgestelde van malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> So nou, dink ek, 'n finale voorbeeld. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 So hierdie een is 'n bietjie meer arcane, maar dit is dalk 1068 00:46:16,690 --> 00:46:19,180 Die grootste rede vir wees versigtig met die geheue, 1069 00:46:19,180 --> 00:46:24,490 en die rede dat baie programme en / of web bedieners, selfs tot vandag toe, 1070 00:46:24,490 --> 00:46:28,200 is oorgeneem deur die slegte ouens iewers op die internet wat een of ander manier 1071 00:46:28,200 --> 00:46:33,390 stuur valse pakkies na jou bediener probeer om jou rekeninge te onderhandel, 1072 00:46:33,390 --> 00:46:36,420 of neem jou data, of net algemeen oor te neem van 'n masjien. 1073 00:46:36,420 --> 00:46:38,910 Buffer oorloop, as die naam aandui, beteken 1074 00:46:38,910 --> 00:46:40,740 oorloop nie 'n int, maar 'n buffer. 1075 00:46:40,740 --> 00:46:43,490 En 'n buffer is net 'n fancy manier sê dit is 'n klomp van die geheue. 1076 00:46:43,490 --> 00:46:46,710 >> En inderdaad, ek het 'n string voor buffer, in plaas van s. 1077 00:46:46,710 --> 00:46:49,234 Want as dit is 'n buffer, soos in die YouTube sin, 1078 00:46:49,234 --> 00:46:52,400 of enige tyd wat jy 'n video is te kyk, Jy kan gesien het die woord buffer, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 Dit is ongelooflik irriterende. 1081 00:46:54,240 --> 00:46:55,990 En dit net beteken dat jou video speler 1082 00:46:55,990 --> 00:46:58,710 probeer baie om af te laai grepe, baie van grepe 1083 00:46:58,710 --> 00:47:00,170 van 'n video van die internet. 1084 00:47:00,170 --> 00:47:02,920 Maar dit is stadig, so dit is probeer 'n klomp van hulle af te laai 1085 00:47:02,920 --> 00:47:06,430 'n buffer, 'n houer, sodat in te vul jy genoeg grepe wat dit kan dan 1086 00:47:06,430 --> 00:47:09,174 wys die video, sonder voortdurend pousering. 1087 00:47:09,174 --> 00:47:11,340 Maar dit blyk, jy kan 'n buffer na hierdie groot. 1088 00:47:11,340 --> 00:47:15,710 Maar probeer dit baie data in te sit dit, en baie slegte dinge kan gebeur. 1089 00:47:15,710 --> 00:47:22,780 So byvoorbeeld, laat ons kyk na Hierdie finale teaser van 'n voorbeeld. 1090 00:47:22,780 --> 00:47:24,720 Dit is 'n ander program wat met die eerste oogopslag, 1091 00:47:24,720 --> 00:47:26,540 doen niks super nuttig. 1092 00:47:26,540 --> 00:47:29,590 Dit het 'n Main funksie wat vra dat funksie, f. 1093 00:47:29,590 --> 00:47:36,640 En daardie funksie, f, hier, het 'n kar skikking, genaamd c, grootte 12. 1094 00:47:36,640 --> 00:47:39,340 En dan is dit die gebruik van hierdie nuwe funksie genoem strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Dit blyk dat, met hierdie eenvoudige, eenvoudige reël van die kode, net twee lyne, 1097 00:47:45,190 --> 00:47:49,130 ons het my hele program gemaak, en daarom, my hele rekenaar, 1098 00:47:49,130 --> 00:47:54,000 en my rekening, en my hard ry potensieel kwesbaar vir iemand 1099 00:47:54,000 --> 00:47:58,170 wie weet, en is goed genoeg om te hardloop hierdie program met 'n sekere opdrag lyn 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Met ander woorde, as dit slegte ou sit binnekant van argvargv [1] deur te tik 1102 00:48:03,400 --> 00:48:08,750 op die klavier 'n baie spesiaal gemaak string, nie ABC, 123, maar in wese, 1103 00:48:08,750 --> 00:48:15,180 binêre simbole wat verteenwoordig uitvoerbare kode, 'n program wat hy of sy geskryf het, 1104 00:48:15,180 --> 00:48:19,190 Met hierdie eenvoudige program wat verteenwoordiger van duisende van die programme 1105 00:48:19,190 --> 00:48:23,610 wat soortgelyke kwesbare, daresay, hy of sy uiteindelik kan verwyder al 1106 00:48:23,610 --> 00:48:26,680 die lêers op my hardeskyf, 'n flikkerende vinnige, sodat hy of sy kan 1107 00:48:26,680 --> 00:48:30,170 tik opdragte op hul eie, e-pos al die lêers te myself. 1108 00:48:30,170 --> 00:48:34,660 Enigiets wat ek kan doen, het hy of sy kan doen met hierdie kode. 1109 00:48:34,660 --> 00:48:36,575 >> Ons sal nie heeltemal los dit nog nie. 1110 00:48:36,575 --> 00:48:38,700 En in die feit, dit gaan behels 'n bietjie prentjie 1111 00:48:38,700 --> 00:48:41,470 soos hierdie, wat ons binnekort sal kom om te verstaan ​​al hoe beter. 1112 00:48:41,470 --> 00:48:44,480 Maar vir vandag, laat eindig op Wat is, hopelik, 'n bietjie meer 1113 00:48:44,480 --> 00:48:48,360 verstaanbaar Kletskerk grap, totdat ons weer volgende keer. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Alle regte. 1116 00:48:51,600 --> 00:48:53,446 Sien julle op Woensdag. 1117 00:48:53,446 --> 00:48:54,754 >> [Speel van musiek] 1118 00:48:54,754 --> 00:48:57,790 >> Spreker: En nou, diep gedagtes, deur Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memory is soos spring in 'n hopie goue blare op 'n Sondagmiddag. 1121 00:49:04,770 --> 00:49:09,000 Wind waai, gooi jou hair-- O, ek mis die dae when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Gelag] 1124 00:49:12,650 --> 00:49:13,750