1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Musikk spilles] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: All right. 4 00:00:12,640 --> 00:00:14,525 Dette er CS50. 5 00:00:14,525 --> 00:00:16,009 Og dette er starten på uke fem. 6 00:00:16,009 --> 00:00:18,050 Og som du kanskje har lagt merke til, noe av materialet 7 00:00:18,050 --> 00:00:21,050 blir litt mer kompleks, den lille tettere. 8 00:00:21,050 --> 00:00:24,560 >> Og det er veldig lett, spesielt hvis du har hatt for vane i noen tid, 9 00:00:24,560 --> 00:00:28,600 å være å prøve å rable ned det meste alt vi gjør, vi sier i klassen. 10 00:00:28,600 --> 00:00:31,626 Men skjønner, det er ikke kanskje den ideelle pedagogisk tilnærming 11 00:00:31,626 --> 00:00:34,250 til å lære denne typen materiale, og materialet mer generelt. 12 00:00:34,250 --> 00:00:37,250 Og så vi er glade for å kunngjøre at CS50 egen Gheng 13 00:00:37,250 --> 00:00:39,780 Gong har begynt å forberede en kanonisk sett av notater 14 00:00:39,780 --> 00:00:42,100 for kurset, håpet som er at, en, disse 15 00:00:42,100 --> 00:00:44,030 ikke bare tjene som en referanse og en ressurs 16 00:00:44,030 --> 00:00:47,410 for gjennomgang av materiale og går tilbake gjennom materialet som kan ha 17 00:00:47,410 --> 00:00:51,230 rømte du i første omgang, men også slik at hodet kan være mer 18 00:00:51,230 --> 00:00:53,740 opp enn i bakken, da det gjelder tid til å forelese, 19 00:00:53,740 --> 00:00:56,960 slik at du kan engasjere seg mer gjennomtenkt, som 20 00:00:56,960 --> 00:00:59,170 motsetning til mer Scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Med det sagt, hva du finner på nettstedet er slike dokumenter som dette. 22 00:01:02,510 --> 00:01:04,660 Og legg merke til, øverst til venstre, er det ikke bare en innholdsfortegnelse, 23 00:01:04,660 --> 00:01:06,920 men også tid koder som vil umiddelbart hoppe deg 24 00:01:06,920 --> 00:01:09,077 til den aktuelle delen i video på nettet. 25 00:01:09,077 --> 00:01:11,410 Og hva Chang her har gjort er, i hovedsak, dokumentert 26 00:01:11,410 --> 00:01:13,340 hva som skjedde i dette bestemt forelesning. 27 00:01:13,340 --> 00:01:16,370 Og mange av forelesningene er allerede online nå med denne nettadressen. 28 00:01:16,370 --> 00:01:20,110 Og vi vil fortsette å legge ut resten av dem innen utgangen av denne uken, 29 00:01:20,110 --> 00:01:22,380 så dra nytte av den ressursen. 30 00:01:22,380 --> 00:01:25,740 >> Så uten videre, vi begynte å skrelle tilbake 31 00:01:25,740 --> 00:01:28,180 det laget som har vært strengen i noen tid. 32 00:01:28,180 --> 00:01:30,670 Og hva gjorde vi si en streng faktisk er i forrige uke? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Så røye stjerne. 35 00:01:32,900 --> 00:01:34,900 Og røye stjerne, vel, hva gjorde det egentlig betyr? 36 00:01:34,900 --> 00:01:37,150 Vel, hele denne tiden, hvis vi har vært ringer en funksjon, 37 00:01:37,150 --> 00:01:40,450 som getString og lagring den såkalte retur 38 00:01:40,450 --> 00:01:42,910 Verdien av getString i en variable-- det heter 39 00:01:42,910 --> 00:01:47,721 s typen string-- vi har skrevet kodelinjen oppe ovenfor. 40 00:01:47,721 --> 00:01:49,970 Og det er bare når jeg ser min håndskrift forstørret her 41 00:01:49,970 --> 00:01:51,930 jeg innser hvor fryktelig dette er. 42 00:01:51,930 --> 00:01:54,180 >> Men la oss anta at, på høyre side 43 00:01:54,180 --> 00:01:57,070 er, likevel, en rimelig skildring av hva som er 44 00:01:57,070 --> 00:01:58,880 pågått alt dette tid med getString. 45 00:01:58,880 --> 00:02:00,380 getString naturligvis får en streng. 46 00:02:00,380 --> 00:02:01,691 Men hva betyr det egentlig? 47 00:02:01,691 --> 00:02:04,190 Det betyr at det blir en del av minne fra operativsystemet 48 00:02:04,190 --> 00:02:06,040 ved å kalle en funksjon, kalt malloc. 49 00:02:06,040 --> 00:02:07,390 Men mer om det senere. 50 00:02:07,390 --> 00:02:09,139 Og da er det fylles som del av minne 51 00:02:09,139 --> 00:02:11,764 med bokstavene brukeren har skrevet inn, etterfulgt av, selvsagt 52 00:02:11,764 --> 00:02:14,800 en null karakter, eller omvendt skråstrek null helt på slutten. 53 00:02:14,800 --> 00:02:18,280 >> I mellomtiden, på den venstre side i denne historien, hele denne tiden, 54 00:02:18,280 --> 00:02:20,850 vi har vært å erklære en variabel, som s. 55 00:02:20,850 --> 00:02:24,770 Og at variabelen er det nå vil begynne å ringe en peker. 56 00:02:24,770 --> 00:02:29,190 Det er ikke en boks innsiden av som vi sette strengen, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 men heller vi satt i denne firkanten feltet til venstre for hva? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Yeah? 60 00:02:35,390 --> 00:02:37,118 >> PUBLIKUM: Adressen der den ligger i minnet. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Nettopp. 62 00:02:38,118 --> 00:02:40,690 Adressen der Daven er plassert i minnet. 63 00:02:40,690 --> 00:02:44,650 Og ikke hvor alle av Daven ligger, per se, men spesielt adresse 64 00:02:44,650 --> 00:02:45,150 av hva? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Yeah? 67 00:02:46,810 --> 00:02:47,460 >> PUBLIKUM: Første tegn. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: Det første tegnet i Daven, som i dette tilfellet, 69 00:02:50,209 --> 00:02:53,820 Jeg foreslo var vilkårlig og urealistisk 1, OX1, 70 00:02:53,820 --> 00:02:55,910 som bare menes heksadesimale nummer 1. 71 00:02:55,910 --> 00:02:57,993 Men det er trolig kommer å være en mye større tall 72 00:02:57,993 --> 00:03:01,260 at vi kan trekke med en 0x som prefiks, 73 00:03:01,260 --> 00:03:02,806 representerer en heksadesimale tegn. 74 00:03:02,806 --> 00:03:05,930 Og fordi vi ikke trenger å vite hvor resten av tegnene på Daven 75 00:03:05,930 --> 00:03:09,860 er, på grunn av det enkle utforming beslutning som ble gjort for mange år siden? 76 00:03:09,860 --> 00:03:10,548 Yeah? 77 00:03:10,548 --> 00:03:11,651 >> PUBLIKUM: Omvendt skråstrek 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Ja, akkurat. 79 00:03:12,900 --> 00:03:18,100 Backslash 0 kan du, om enn i lineær tid, for å traversere streng, 80 00:03:18,100 --> 00:03:20,400 gange fra venstre til høyre, med en for løkke, eller en stund 81 00:03:20,400 --> 00:03:22,608 loop, eller noe sånt det, og bestemme, oh, her 82 00:03:22,608 --> 00:03:24,751 er enden av denne strengen. 83 00:03:24,751 --> 00:03:27,000 Så med bare den adressen begynnelsen av en streng, 84 00:03:27,000 --> 00:03:30,290 vi kan få tilgang til helheten av det, fordi alt dette samtidig, 85 00:03:30,290 --> 00:03:32,030 en streng har nettopp vært en char stjerne. 86 00:03:32,030 --> 00:03:36,370 >> Så det er sikkert greit å fortsette å bruke den CS50 biblioteket og denne abstraksjon, 87 00:03:36,370 --> 00:03:38,440 så å si, men vi vil begynne å se nøyaktig 88 00:03:38,440 --> 00:03:41,230 hva som har skjedd på under hele denne tiden. 89 00:03:41,230 --> 00:03:45,260 Så du husker kanskje dette eksemplet også, fra sist gang, sammenligne 0, 90 00:03:45,260 --> 00:03:47,300 som ikke egentlig sammenligne. 91 00:03:47,300 --> 00:03:49,070 Men vi begynte å løse dette. 92 00:03:49,070 --> 00:03:52,020 >> Men som kanskje en oppfriskning, kan jeg interessere noen 93 00:03:52,020 --> 00:03:54,261 i en rosa elefant i dag, også laget av Chang? 94 00:03:54,261 --> 00:03:55,760 Hva med deg foran? [Uhørbart]. 95 00:03:55,760 --> 00:03:56,660 Kom opp. 96 00:03:56,660 --> 00:03:58,740 >> Og i mellomtiden, når du kommer opp, la oss 97 00:03:58,740 --> 00:04:01,670 vurdere for bare et øyeblikk hva denne koden ble faktisk gjør. 98 00:04:01,670 --> 00:04:04,917 Det erklærte to variabler opp toppen, s og t, og ringer getString. 99 00:04:04,917 --> 00:04:08,250 Dette er ikke en svært brukervennlig program fordi den ikke forteller deg hva du skal gjøre. 100 00:04:08,250 --> 00:04:10,541 Men la oss bare anta vi er fokus på den saftige delen. 101 00:04:10,541 --> 00:04:14,470 Og så vi gjør, hvis s lik er lik t, bør det si printf, 102 00:04:14,470 --> 00:04:16,170 du skrev det samme. 103 00:04:16,170 --> 00:04:16,670 Hei. 104 00:04:16,670 --> 00:04:17,050 Hva heter du? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, hyggelig å møte deg. 107 00:04:19,529 --> 00:04:21,800 Så din utfordring på hånden for denne elefant 108 00:04:21,800 --> 00:04:25,230 er først å trekke oss et bilde av hva som er å være representert i de to første 109 00:04:25,230 --> 00:04:25,970 linjer. 110 00:04:25,970 --> 00:04:28,139 Så s og t kan være representert hvor på skjermen? 111 00:04:28,139 --> 00:04:30,680 Og du kan bare trekke den med fingeren på dette store skjermen. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Så det er to halvdelene til hver side av ligningen. 114 00:04:34,510 --> 00:04:37,760 Så det er s til venstre, og deretter getString til høyre. 115 00:04:37,760 --> 00:04:40,540 Og så er det t til venstre, og deretter getString til høyre. 116 00:04:40,540 --> 00:04:42,630 Så hvordan kan vi begynne tegne et bilde som 117 00:04:42,630 --> 00:04:46,340 representerer hva som skjer her i minnet, vil du si? 118 00:04:46,340 --> 00:04:49,150 Og la meg fortelle deg forklare hva du gjør når du går. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 Vel, først, det ville være å spørre du å få input strengen. 121 00:04:58,890 --> 00:05:00,439 Og det ville store-- oh, sorry. 122 00:05:00,439 --> 00:05:01,230 DAVID J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Good. 124 00:05:01,730 --> 00:05:03,330 Og dette kalles hva? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Holde det gående. 127 00:05:04,450 --> 00:05:05,575 Jeg mente ikke å avbryte. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Beklager. 129 00:05:07,060 --> 00:05:14,237 Så det ville innspill den inn adressen of-- ikke sikker. 130 00:05:14,237 --> 00:05:17,320 Jeg kan ikke akkurat huske nummeret, men jeg tror det var begynt med 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Det er greit, fordi jeg gjorde tallene opp, 132 00:05:18,420 --> 00:05:19,650 så det er ingen riktig svar. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Fra og med 0 bue. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: OK, så element 0. 135 00:05:24,000 --> 00:05:24,765 Sure. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: Og så hvis var som bare en to-letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: OK, tilbake til deg. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Så element 0, og deretter element 1 eller element 2.. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: Og hvilken del av bildet er du tegne akkurat nå? 140 00:05:36,670 --> 00:05:37,690 Kallet til getString? 141 00:05:37,690 --> 00:05:38,830 Eller erklæringen av s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: Erklæringen av s, tror jeg. 143 00:05:42,890 --> 00:05:45,980 Oh, den getString, fordi det ville legges inn i hver [? området. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Good. 145 00:05:46,510 --> 00:05:47,051 Nettopp. 146 00:05:47,051 --> 00:05:49,300 Selv om dette effektivt returnerer en matrise, husker, 147 00:05:49,300 --> 00:05:53,300 når vi kommer tilbake en streng, kan vi indeks inn i strengen ved hjelp av 01 og 2. 148 00:05:53,300 --> 00:05:56,180 Teknisk sett er dette trolig representert av private adresser, 149 00:05:56,180 --> 00:05:57,100 men det er fint. 150 00:05:57,100 --> 00:06:00,170 >> Så antar, hvis jeg bare kan fort frem til der vi slapp 151 00:06:00,170 --> 00:06:04,320 siste tid, hvis en av strengene var g a b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, og dermed representerer Gabes input, hvordan kan vi representerer s nå? 153 00:06:10,337 --> 00:06:12,670 Hvis dette er minne som er blitt returnert av getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: Ville det være representert ved en bue? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: Ved en bue? 157 00:06:18,750 --> 00:06:19,130 Vel, nei. 158 00:06:19,130 --> 00:06:21,171 La oss bare si, billedlig, la meg bare gå videre 159 00:06:21,171 --> 00:06:25,710 og foreslår at, dersom dette er s, denne er returverdien av getString. 160 00:06:25,710 --> 00:06:29,482 Og du har tegnet dette som 0, 1, 2, som er helt rimelig, fordi vi 161 00:06:29,482 --> 00:06:30,940 kan indeksere inn i strengen, som sådan. 162 00:06:30,940 --> 00:06:33,340 Men bare for å være i samsvar med siste gang, la meg gå videre 163 00:06:33,340 --> 00:06:37,310 og vilkårlig foreslå at dette er adresse 1, dette er adresse 2, 164 00:06:37,310 --> 00:06:39,597 dette er adressen 3, og så videre. 165 00:06:39,597 --> 00:06:41,430 Og så, bare for å være super klart, hva skjer 166 00:06:41,430 --> 00:06:44,580 å gå i s som et resultat av at første linje med kode, vil du si? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Adresse 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Nettopp. 169 00:06:46,420 --> 00:06:47,190 Så ta 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Og i mellomtiden, la meg gå videre og duplisere mye av det du har gjort 172 00:06:51,230 --> 00:06:52,740 og legge til min egen t her. 173 00:06:52,740 --> 00:06:56,340 Hvis jeg skulle skrive inn Gabe igjen, en andre gang, 174 00:06:56,340 --> 00:07:01,530 når du blir bedt med getString, hvor, selvfølgelig er Gabe kommer til å gå? 175 00:07:01,530 --> 00:07:02,280 Vel, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Som på her? 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Yeah. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Eller det er også i de samme boksene? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: La meg foreslå, ja, nøyaktig, så i disse ekstra bokser. 181 00:07:11,940 --> 00:07:15,230 Men hva er nøkkelen nå er at selv om jeg har trukket disse ganske nær 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, dette er 0x2-- i virkeligheten, 183 00:07:18,650 --> 00:07:25,750 dette nå kan være adresse 0x10, for eksempel, og 0x11 og 0x12, 184 00:07:25,750 --> 00:07:26,870 og så videre. 185 00:07:26,870 --> 00:07:29,955 Og så, hvis det er tilfelle, hva som kommer til å ende opp her i t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Nettopp. 188 00:07:31,830 --> 00:07:33,180 Så 0x10. 189 00:07:33,180 --> 00:07:34,570 Og så nå, siste spørsmål. 190 00:07:34,570 --> 00:07:37,510 Du har langt, måtte jobbe hardest for en elefant så langt. 191 00:07:37,510 --> 00:07:42,650 Nå, hvis jeg trekker opp koden igjen, når jeg gjør det, på linje tre, 192 00:07:42,650 --> 00:07:47,630 hvis s lik lik t, hva er jeg faktisk sammenligne det vi har tegnet her? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: De to adresser? 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Nettopp. 195 00:07:50,270 --> 00:07:53,350 Så jeg sier er S lik lik t? 196 00:07:53,350 --> 00:07:56,210 Med andre ord, er en tilsvarende lik 10? 197 00:07:56,210 --> 00:07:59,710 Og selvfølgelig, åpenbare svaret er nå, nei. 198 00:07:59,710 --> 00:08:02,920 Og så dette programmet er slutt kommer til å skrive ut det, ville du si? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: Ville det være, du skrev det samme? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Så hvis s er 1, og t er 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: Du skrev forskjellige ting. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Nettopp. 204 00:08:13,570 --> 00:08:14,480 Du skrev forskjellige ting. 205 00:08:14,480 --> 00:08:14,850 Greit. 206 00:08:14,850 --> 00:08:16,714 Så en runde med applaus, hvis vi kunne, her. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 Det var smertefullt. 209 00:08:17,708 --> 00:08:18,208 Jeg vet. 210 00:08:18,208 --> 00:08:19,684 Pent gjort. 211 00:08:19,684 --> 00:08:24,690 Så nå la oss se om vi ikke kan erte hverandre hva reparasjonen var. 212 00:08:24,690 --> 00:08:28,040 Og selvfølgelig, når vi fikset dette-- som jeg skal nå representere i green-- 213 00:08:28,040 --> 00:08:29,690 vi gjorde et par forbedringer her. 214 00:08:29,690 --> 00:08:32,409 Først, akkurat som en mental helse sjekk, jeg først å sjekke 215 00:08:32,409 --> 00:08:35,110 hvis s er lik null og t er lik null. 216 00:08:35,110 --> 00:08:39,440 Og bare for å være klar, når kanskje s eller t være null i kode som dette? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Når kan s eller t være null. 219 00:08:44,490 --> 00:08:44,990 Yeah? 220 00:08:44,990 --> 00:08:45,990 >> PUBLIKUM: [uhørlig]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Nettopp. 223 00:08:50,510 --> 00:08:52,840 Hvis strengen som brukeren skrevet i er altfor lang 224 00:08:52,840 --> 00:08:56,140 til å passe inn i minnet, eller noen rare hjørne tilfelle sånn, 225 00:08:56,140 --> 00:08:59,010 getString, så vi får se, bokstavelig talt i dag, i sin dokumentasjon, 226 00:08:59,010 --> 00:09:02,330 sier det vil returnere null som en spesiell sentinel verdi, 227 00:09:02,330 --> 00:09:05,417 eller bare liksom et spesielt symbol det betyr at noe gikk galt. 228 00:09:05,417 --> 00:09:07,500 Så vi ønsker å se etter at, fordi det viser seg 229 00:09:07,500 --> 00:09:09,720 at null er en svært farlig verdi. 230 00:09:09,720 --> 00:09:14,250 >> Ofte, hvis du prøver å gjøre noe med null involverer en function-- passerer det 231 00:09:14,250 --> 00:09:17,470 som input, for instance-- at funksjonen kan meget vil krasje, og med det, 232 00:09:17,470 --> 00:09:19,090 ta ned hele programmet. 233 00:09:19,090 --> 00:09:22,570 Så denne tredje linjen er nå bare en mental helse sjekk, feilkontroll, hvis du vil. 234 00:09:22,570 --> 00:09:25,450 Det er en god vane nå for oss å komme inn hver gang vi 235 00:09:25,450 --> 00:09:28,050 prøver å bruke en verdi som kan potensielt være null. 236 00:09:28,050 --> 00:09:32,000 >> Nå, i den fjerde linje her, "Hvis strcmp (s, t)," vel, 237 00:09:32,000 --> 00:09:33,180 hva er det å henvise til? 238 00:09:33,180 --> 00:09:36,750 Vel, sa vi at dette var en veldig konsist oppkalt funksjon for streng sammenligning. 239 00:09:36,750 --> 00:09:40,370 Og dens formål i livet er å sammenligne sitt første argument mot det andre, 240 00:09:40,370 --> 00:09:44,640 men ikke i form av deres adresser, som vi gjorde utilsiktet et øyeblikk 241 00:09:44,640 --> 00:09:48,270 siden med den røde kode, men heller å sammenligne disse to 242 00:09:48,270 --> 00:09:53,210 strenger i menneskelig intuitive måte ved å sammenligne dette mot dette, 243 00:09:53,210 --> 00:09:56,690 mot dette, mot dette, og så stopper hvis og når en 244 00:09:56,690 --> 00:09:59,590 eller begge av fingrene treffer en backslash 0. 245 00:09:59,590 --> 00:10:04,530 Så noen år siden gjennomført strcmp å gjennomføre for oss funksjonaliteten 246 00:10:04,530 --> 00:10:08,890 at vi håpet vi ville ha fått bare ved å sammenligne to enkle verdier. 247 00:10:08,890 --> 00:10:14,929 >> Nå ærlig, jeg holder tegning alle disse ulike tall. 248 00:10:14,929 --> 00:10:17,470 Men realiteten er, jeg har vært noe som gjør disse opp hele tiden. 249 00:10:17,470 --> 00:10:19,580 Og så la meg bare gå videre og smøre disse ut 250 00:10:19,580 --> 00:10:23,100 å gjøre et punkt som, ved slutten av dagen og fremover, 251 00:10:23,100 --> 00:10:30,160 vi egentlig ikke kommer til å bry seg om hva løser ting er faktisk 252 00:10:30,160 --> 00:10:30,790 i minnet. 253 00:10:30,790 --> 00:10:34,320 Så jeg har ikke tenkt å trekke disse typer tall så mye lenger, 254 00:10:34,320 --> 00:10:38,970 Jeg er bare en abstrakt dette bort en litt mer vennlig med bare piler. 255 00:10:38,970 --> 00:10:42,060 >> Med andre ord, hvis s er en peker, vel, la oss bare tegne det, bokstavelig talt, 256 00:10:42,060 --> 00:10:45,430 som en peker, en pil som peker fra seg selv til noe annet, 257 00:10:45,430 --> 00:10:48,280 og ikke bekymre deg for mye mer om minutia av disse adressene 258 00:10:48,280 --> 00:10:49,910 som, igjen, gjorde jeg opp likevel. 259 00:10:49,910 --> 00:10:52,680 Men vi får se disse adressene, noen ganger, når debugging kode. 260 00:10:52,680 --> 00:10:56,450 >> Nå i mellomtiden, dette programmet opp her fikser, selvfølgelig, 261 00:10:56,450 --> 00:10:58,720 at problemet ved å sammenligne de to strenger. 262 00:10:58,720 --> 00:11:00,260 Men vi kjørte inn i et annet problem. 263 00:11:00,260 --> 00:11:03,180 Dette var fra kopien programmere siste gang, 264 00:11:03,180 --> 00:11:06,880 der, var jeg prøver å kapital bare det første tegn i en streng. 265 00:11:06,880 --> 00:11:09,620 Men det var symptomet vi så forrige gang når 266 00:11:09,620 --> 00:11:14,150 en bruker har skrevet inn en verdi, som Gabe med små bokstaver, for s, 267 00:11:14,150 --> 00:11:19,310 da vi tildelt s til t, som i den tredje linje der, 268 00:11:19,310 --> 00:11:22,900 og da jeg prøvde å kapitalisere t brakett 0? 269 00:11:22,900 --> 00:11:25,950 Det var effekten av skiftende t brakett 0 her? 270 00:11:25,950 --> 00:11:27,150 >> PUBLIKUM: Det endret s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Yeah, I forandret s, samt. 272 00:11:29,360 --> 00:11:31,050 Fordi hva som egentlig skjer? 273 00:11:31,050 --> 00:11:34,130 Vel, la meg se om jeg kan rydde opp dette bildet, som følger. 274 00:11:34,130 --> 00:11:41,390 >> Hvis s er, igjen, ordet g, a, b, e, skråstrek, 0 og s 275 00:11:41,390 --> 00:11:44,084 vi vil fortsette med tegningen som en boks Hit men ikke flere adresser. 276 00:11:44,084 --> 00:11:45,250 La oss slutte å gjøre ting opp. 277 00:11:45,250 --> 00:11:47,510 La oss bare tegne et bilde å forenkle hele verden. 278 00:11:47,510 --> 00:11:52,640 >> Når jeg erklærer t med hyssing t, som skaper som del av minnet. 279 00:11:52,640 --> 00:11:55,850 Square skjer for å være 32 biter i de fleste datamaskiner. 280 00:11:55,850 --> 00:11:59,530 Faktisk, hvis du noen gang hørt om en datamaskin med en 32-bits arkitektur, 281 00:11:59,530 --> 00:12:03,000 virkelig fancy-tale, som bare betyr at det bruker 32-bits adresser. 282 00:12:03,000 --> 00:12:05,370 Og som en teknisk side, hvis du noen gang har lurt 283 00:12:05,370 --> 00:12:09,630 hvorfor eldre datamaskiner, hvis du faktisk prøvde å suppe dem opp med masse RAM, 284 00:12:09,630 --> 00:12:12,360 bare kunne ha en maksimal av fire gigabyte RAM, 285 00:12:12,360 --> 00:12:14,860 vel det er fordi, bokstavelig talt, den gamle datamaskinen kunne bare 286 00:12:14,860 --> 00:12:17,250 teller så høyt som 4 milliarder kroner, 4 milliarder bytes, 287 00:12:17,250 --> 00:12:20,590 fordi det var ved hjelp av 32-bit tall for adresser. 288 00:12:20,590 --> 00:12:23,260 >> Men i alle fall i denne eksempel historien er mye enklere. 289 00:12:23,260 --> 00:12:27,250 t er bare en annen pekeren, eller virkelig en char stjerne, aka streng. 290 00:12:27,250 --> 00:12:30,860 Og hvordan gjør jeg vil oppdatere dette bildet nå med at andre linje med kode, 291 00:12:30,860 --> 00:12:31,950 etter dot, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Når jeg gjør strengen t tilsvarer s semikolon, hvordan endre dette bildet? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Yeah? 295 00:12:38,000 --> 00:12:38,916 >> PUBLIKUM: [uhørlig]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Yeah. 298 00:12:42,020 --> 00:12:42,600 Nettopp. 299 00:12:42,600 --> 00:12:45,620 Jeg bare sette en pil fra t boksen til den samme adresse, 300 00:12:45,620 --> 00:12:47,570 det samme første bokstaven i ga. 301 00:12:47,570 --> 00:12:50,850 Eller teknisk sett, hvis dette fyren var fortsatt på 0x1, 302 00:12:50,850 --> 00:12:53,052 det er som om jeg hadde 0x1 her og 0x1 her. 303 00:12:53,052 --> 00:12:54,760 Men igjen, hvem bryr seg om adresser? 304 00:12:54,760 --> 00:12:56,345 Det er bare tanken som nå teller. 305 00:12:56,345 --> 00:12:57,720 Så dette er hva som skjer her. 306 00:12:57,720 --> 00:13:02,690 Så selvfølgelig, hvis du gjør t brakett 0, som er array notasjon, 307 00:13:02,690 --> 00:13:05,650 av course-- og ærlig, ser det som om det er en rekke over her, 308 00:13:05,650 --> 00:13:07,340 men nå er det denne rare ting. 309 00:13:07,340 --> 00:13:11,160 Vet at programmeringsspråket, C, og tilbyr denne funksjonen, 310 00:13:11,160 --> 00:13:14,650 hvorved, selv om t er et pekeren, eller s er en peker, 311 00:13:14,650 --> 00:13:18,050 du kan fortsatt bruke den velkjente, komfortabel hakeparentes 312 00:13:18,050 --> 00:13:22,520 notasjon for å gå til det første elementet, eller det andre elementet, eller en hvilken som helst element 313 00:13:22,520 --> 00:13:26,130 at det pilen peker til grunn, antagelig, det 314 00:13:26,130 --> 00:13:29,410 er, som i dette tilfellet peke på noen array. 315 00:13:29,410 --> 00:13:30,340 >> Så hvordan løser vi dette? 316 00:13:30,340 --> 00:13:33,660 Oppriktig, dette er hvor den fikk en litt overveldende ved første øyekast. 317 00:13:33,660 --> 00:13:35,340 Men her er en ny og forbedret versjon. 318 00:13:35,340 --> 00:13:37,460 >> Så først, jeg får kvitt CS50 biblioteket, 319 00:13:37,460 --> 00:13:41,170 bare for å avsløre at S er faktisk en char stjerne, bare et synonym. 320 00:13:41,170 --> 00:13:43,540 Og t er også en røye stjerne. 321 00:13:43,540 --> 00:13:48,290 Men hva som skjer på høyre side av denne linjen 322 00:13:48,290 --> 00:13:49,970 hvor t er programmert med en verdi? 323 00:13:49,970 --> 00:13:50,790 >> Hva er malloc? 324 00:13:50,790 --> 00:13:51,630 Hva det er strlen? 325 00:13:51,630 --> 00:13:52,547 Hva er sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Hvorfor i all verden gjør dette Online ser så komplisert? 327 00:13:54,380 --> 00:13:55,713 Hva er det du gjør på et høyt nivå? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Hva er det lagring i t? 330 00:13:57,440 --> 00:13:58,646 Yeah? 331 00:13:58,646 --> 00:14:01,104 PUBLIKUM: Det er tildeling av en viss mengde plass i minnet. 332 00:14:01,104 --> 00:14:03,032 Det er å lagre, antar jeg, bokstaver [uhørbart]. 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 Det er tildeling av en viss Mengden av minne 336 00:14:06,650 --> 00:14:08,940 å lagre, formodentlig, fremtidige bokstaver. 337 00:14:08,940 --> 00:14:11,310 Og i særdeleshet, malloc derfor tilbake hva? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PUBLIKUM: Retur [uhørbart]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Nettopp. 341 00:14:15,850 --> 00:14:18,850 Returnere adressen til minne, som er en fancy måte å si: 342 00:14:18,850 --> 00:14:21,640 returnerer adressen til første byte av dette minnet. 343 00:14:21,640 --> 00:14:25,460 Den tyngende på meg å huske hvor mye minne jeg faktisk 344 00:14:25,460 --> 00:14:27,140 tildelt eller bedt malloc for. 345 00:14:27,140 --> 00:14:28,384 >> Nå hvor mye er det? 346 00:14:28,384 --> 00:14:30,550 Vel, selv om det er mange parenteser her, 347 00:14:30,550 --> 00:14:32,970 malloc tar bare ett argument. 348 00:14:32,970 --> 00:14:37,250 Og jeg spesifisere strlen av s, så gi meg så mange bytes som det er i s, 349 00:14:37,250 --> 00:14:37,800 men legg til en. 350 00:14:37,800 --> 00:14:38,300 Hvorfor? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Yeah? 353 00:14:39,530 --> 00:14:40,840 >> PUBLIKUM: The backslash 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Nettopp. 355 00:14:41,840 --> 00:14:43,423 Vi er nødt til å gjøre en liten rengjøring. 356 00:14:43,423 --> 00:14:45,970 Så fordi det er en skråstrek 0, ville vi bedre huske det. 357 00:14:45,970 --> 00:14:47,310 Ellers skal vi for å lage en streng som 358 00:14:47,310 --> 00:14:49,170 har ikke den spesielle terminator. 359 00:14:49,170 --> 00:14:52,640 >> I mellomtiden, bare for å være super anal, har jeg sizeof (char), 360 00:14:52,640 --> 00:14:55,730 bare i tilfelle noen kjører min koden ikke på CS50 apparatet, 361 00:14:55,730 --> 00:14:58,220 men kanskje en annen datamaskin tilsammen der chars 362 00:14:58,220 --> 00:15:01,470 er en byte, etter konvensjonen, men to bytes, eller noe større enn det. 363 00:15:01,470 --> 00:15:04,490 Det er bare å være super, super uvillig til feil. 364 00:15:04,490 --> 00:15:06,940 Selv om, i virkeligheten er det mest sannsynlig kommer til å være en 1. 365 00:15:06,940 --> 00:15:11,490 >> Nå, i mellomtiden, jeg gå videre og kopiere streng, t brakett jeg lik t brakett s. 366 00:15:11,490 --> 00:15:14,962 Og jeg vil utsette til siste ukes kildekoden for å se hva som skjer. 367 00:15:14,962 --> 00:15:17,670 Men nøkkelen takeaway, og grunnen til at jeg setter inn koden nå i grønt, 368 00:15:17,670 --> 00:15:22,520 er fordi det aller siste linje, t brakett 0 tilsvarer toupper, 369 00:15:22,520 --> 00:15:25,230 har den virkning aktivere denne som streng? 370 00:15:25,230 --> 00:15:26,960 t og / eller s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Det siste kodelinje. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Bare t, fordi det er skjedde denne gangen, 375 00:15:35,560 --> 00:15:41,500 hvis jeg angrer litt på at siste trinnet, hva som har skjedd er, når jeg kaller malloc, 376 00:15:41,500 --> 00:15:45,380 Jeg egentlig få en del av minne som er samme størrelse som originalen, 377 00:15:45,380 --> 00:15:47,020 fordi det er den aritmetiske jeg gjorde. 378 00:15:47,020 --> 00:15:50,920 Jeg lagring i t adressen av at del av minnet. 379 00:15:50,920 --> 00:15:53,370 Selv om dette ser fint og pen, fin og blank, 380 00:15:53,370 --> 00:15:56,882 realiteten er det er, hva vi vil holde ringer, søppel verdier her. 381 00:15:56,882 --> 00:15:59,340 Som del av minnet kan meget godt ha vært brukt før, 382 00:15:59,340 --> 00:16:00,940 noen sekunder, noen få minutter siden. 383 00:16:00,940 --> 00:16:04,410 Så det kan absolutt være tall eller bokstaver der, bare ved et uhell. 384 00:16:04,410 --> 00:16:08,580 Men de er ikke gyldig, før jeg meg selv fylle denne del av minne 385 00:16:08,580 --> 00:16:12,510 med faktiske tegn, som jeg gjøre ved at for sløyfe der. 386 00:16:12,510 --> 00:16:13,180 Greit? 387 00:16:13,180 --> 00:16:16,180 >> Så nå klimaks disse tre eksempler 388 00:16:16,180 --> 00:16:20,730 som ble tilsynelatende brutt forrige gang, dette Swap eksempel denne funksjonen 389 00:16:20,730 --> 00:16:23,670 arbeidet i den forstand at det byttet a og b. 390 00:16:23,670 --> 00:16:25,620 Men det fungerte ikke i hva andre forstand? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Yeah? 393 00:16:28,614 --> 00:16:29,612 >> PUBLIKUM: [uhørlig]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Nettopp. 396 00:16:36,700 --> 00:16:39,530 Hvis jeg skulle kalle denne funksjonen fra another-- f.eks 397 00:16:39,530 --> 00:16:42,870 fra en funksjon som hoved, der Jeg har en variabel, x og y, som jeg 398 00:16:42,870 --> 00:16:46,160 gjorde i forrige uke, samme koden, og jeg passere i x og y 399 00:16:46,160 --> 00:16:49,860 til Bytt, og deretter ringe Swap-- dette, selvfølgelig, er den korrekte versjonen 400 00:16:49,860 --> 00:16:52,220 er hva vi er i ferd med å see-- det ikke fungerte. 401 00:16:52,220 --> 00:16:53,770 Så hva er den fix? 402 00:16:53,770 --> 00:16:56,850 >> Vel, så bare for å være klar, la meg gå videre 403 00:16:56,850 --> 00:17:05,450 og-- gi meg ett sekund her, og se hvis jeg kan vise deg den siste, som 404 00:17:05,450 --> 00:17:12,464 vil være i-- la oss se om jeg kan finne dette ekte fast-- OK, [uhørbart]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, er det. 407 00:17:19,240 --> 00:17:21,000 Så ignorere kommandoene jeg bare skrive. 408 00:17:21,000 --> 00:17:23,780 Jeg vil at det skal hente om siste øyeblikk et eksempel 409 00:17:23,780 --> 00:17:27,960 fra forrige gang, som heter nå ingen Swap. 410 00:17:27,960 --> 00:17:30,200 >> Så ingen Swap er der vi slapp forrige gang, 411 00:17:30,200 --> 00:17:32,930 der, initialisert jeg x og y til 1 til 2. 412 00:17:32,930 --> 00:17:35,840 Jeg deretter ringe Swap, passerer i 1 og 2. 413 00:17:35,840 --> 00:17:37,930 Og så denne funksjonen jobbet i en viss forstand, 414 00:17:37,930 --> 00:17:40,750 men det hadde ingen permanent bevirke on x og y. 415 00:17:40,750 --> 00:17:45,430 Så spørsmålet på hånden er, hvordan nå gjør vi faktisk fikse dette problemet? 416 00:17:45,430 --> 00:17:47,820 Det er løsningen på hånden? 417 00:17:47,820 --> 00:17:53,150 >> Vel, i swap.c, som er nytt i dag, legge merke til et par forskjeller. 418 00:17:53,150 --> 00:17:54,700 x og y er de samme. 419 00:17:54,700 --> 00:17:57,250 Men hva er klart annerledes med linje 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Hva er nytt der, hvis du husker hvordan det så ut en andre siden? 422 00:18:01,715 --> 00:18:02,565 >> PUBLIKUM: [uhørlig]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Yeah. 424 00:18:03,440 --> 00:18:06,680 Så-tegn er en ny brikke syntaks, ikke bare i dette programmet, 425 00:18:06,680 --> 00:18:08,560 men også mer generelt i CS50. 426 00:18:08,560 --> 00:18:10,680 Til dags dato tror jeg ikke vi har sett noen eksempler 427 00:18:10,680 --> 00:18:14,070 eller egentlig snakket om dem på noen detalj, annet enn, kanskje, preemptively 428 00:18:14,070 --> 00:18:16,467 i snitt, et ampersand som dette. 429 00:18:16,467 --> 00:18:19,300 Vel, det viser seg ampersand er en av de siste bitene av ny syntaks 430 00:18:19,300 --> 00:18:20,174 vi kommer til å lære. 431 00:18:20,174 --> 00:18:23,500 Alt det betyr er Adressen noen variabel. 432 00:18:23,500 --> 00:18:25,070 På hvilken adresse lever x? 433 00:18:25,070 --> 00:18:26,510 Men hva adressen lever y? 434 00:18:26,510 --> 00:18:28,700 Fordi hvis den grunnleggende problem før 435 00:18:28,700 --> 00:18:32,970 ble det x og y ble passert som kopier, hva vi virkelig ønsker å gjøre 436 00:18:32,970 --> 00:18:38,780 er gi Swap med som en skatt kart som fører til der x og y faktisk 437 00:18:38,780 --> 00:18:41,910 er i RAM, slik at Swap kan følge det kartet 438 00:18:41,910 --> 00:18:47,760 og gå dit x eller y markerer stedet og endre de faktiske verdiene 1 og 2 439 00:18:47,760 --> 00:18:48,270 der. 440 00:18:48,270 --> 00:18:50,710 >> Så Swap må endres litt også. 441 00:18:50,710 --> 00:18:53,760 Og ved første øyekast, kan dette virke litt lik røye stjerne. 442 00:18:53,760 --> 00:18:54,850 Og faktisk er det. 443 00:18:54,850 --> 00:18:59,635 Så en er en peker til hva slags data, basert på denne uthevede delen? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Så det er en int. 446 00:19:01,620 --> 00:19:04,880 >> Slik at en ikke lenger er en int, det er adressen til en int. 447 00:19:04,880 --> 00:19:07,910 Og tilsvarende, er b nå skal å være adressen til en int. 448 00:19:07,910 --> 00:19:12,470 Så når jeg nå kaller Swap fra Main, Jeg har ikke tenkt å gi Swap 1 og 2. 449 00:19:12,470 --> 00:19:15,540 Jeg kommer til å gi det som Ox-noe og Ox-noe, 450 00:19:15,540 --> 00:19:19,820 to adresser som vil føre Bytt til deres faktiske steder 451 00:19:19,820 --> 00:19:21,310 i datamaskinens minne. 452 00:19:21,310 --> 00:19:25,580 >> Så nå, min gjenværende implementering må endres en smule. 453 00:19:25,580 --> 00:19:28,650 Hva er åpenbart annerledes nå i disse tre linjer med kode? 454 00:19:28,650 --> 00:19:31,350 Det er disse jævla stjerner alle over alt, ok? 455 00:19:31,350 --> 00:19:33,014 Så hva er det som skjer her? 456 00:19:33,014 --> 00:19:33,514 Yeah? 457 00:19:33,514 --> 00:19:35,055 >> PUBLIKUM: Det er tydeligvis [uhørbart]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Nettopp. 460 00:19:37,990 --> 00:19:41,560 Så i denne context-- og dette var ikke den beste designen avgjørelse, riktignok, 461 00:19:41,560 --> 00:19:42,530 år siden. 462 00:19:42,530 --> 00:19:45,110 I denne sammenheng, hvor du bare har en stjerne, 463 00:19:45,110 --> 00:19:48,240 og du ikke har en datatype, som int, umiddelbart til venstre, 464 00:19:48,240 --> 00:19:53,146 i stedet du har et likhetstegn, tydelig, i denne sammenheng, når du sier stjerners A, 465 00:19:53,146 --> 00:19:56,980 det betyr gå til adresse som er i en. 466 00:19:56,980 --> 00:19:58,870 Følg kartet skatten, så å si. 467 00:19:58,870 --> 00:20:01,720 >> Og i mellomtiden, i tråd 37, det betyr det samme. 468 00:20:01,720 --> 00:20:05,460 Gå til adressen en, og legge det der? 469 00:20:05,460 --> 00:20:09,520 Uansett er på plassering som b angir. 470 00:20:09,520 --> 00:20:10,980 Med andre ord, gå til b. 471 00:20:10,980 --> 00:20:12,130 Få denne verdien. 472 00:20:12,130 --> 00:20:15,620 Gå til en og, per likhets signere, oppdraget operatør, 473 00:20:15,620 --> 00:20:17,010 sette denne verdien der. 474 00:20:17,010 --> 00:20:19,272 >> Tilsvarende er int temp bare en int. 475 00:20:19,272 --> 00:20:20,730 Ingenting må endres om temp. 476 00:20:20,730 --> 00:20:24,810 Det er bare et ekstra glass fra Annenberg for melk eller appelsinsaft. 477 00:20:24,810 --> 00:20:27,630 Men jeg trenger å si, gå til b. 478 00:20:27,630 --> 00:20:31,449 Gå til denne destinasjonen og sette verdien i temp der. 479 00:20:31,449 --> 00:20:32,490 Så hva skjer da? 480 00:20:32,490 --> 00:20:36,540 Når jeg faktisk ringe Swap denne gangen, hvis denne første skuffen her representerer Main, 481 00:20:36,540 --> 00:20:42,270 denne andre brett representerer Swap, når Jeg passerer Ampersand x og ampersand y 482 00:20:42,270 --> 00:20:47,150 fra Main til Bytt, bare for å være klar, hva er dette stabel ramme mottak? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Yeah? 485 00:20:49,200 --> 00:20:50,180 >> PUBLIKUM: [uhørlig]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Nettopp. 487 00:20:51,180 --> 00:20:53,129 Adressen for x og adressen y. 488 00:20:53,129 --> 00:20:55,170 Og du kan tenke på disse som postadresser. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street og 35 Oxford Street, og du 490 00:20:58,772 --> 00:21:01,230 ønsker å flytte de to bygningene som finnes på disse steder. 491 00:21:01,230 --> 00:21:04,680 >> Det er liksom en latterlig idé, men det er alt vi mener med adresse. 492 00:21:04,680 --> 00:21:07,000 Hvor i verden kan du finner disse to ints? 493 00:21:07,000 --> 00:21:09,470 Hvor i verden kan du finne disse to bygningene? 494 00:21:09,470 --> 00:21:15,170 Så hvis endelig, etter all denne tiden jeg gå inn i dagens kildekoden og kompilere 495 00:21:15,170 --> 00:21:22,110 Swap og kjøre ./swap, til slutt, for den første gang vi faktisk se at 496 00:21:22,110 --> 00:21:25,330 mine verdier har faktisk blitt byttet vellykket. 497 00:21:25,330 --> 00:21:30,860 Og nå kan vi selv ta oppmerksom på dette i for eksempel gdb. 498 00:21:30,860 --> 00:21:32,740 >> Så la meg gå inn i samme fil. 499 00:21:32,740 --> 00:21:35,010 La meg gå videre og kjøre gdb av ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Og nå, i Swap, jeg kommer til å gå foran og sette en pause punkt i Main. 502 00:21:40,547 --> 00:21:42,630 Og nå kommer jeg til å gå videre og kjøre programmet. 503 00:21:42,630 --> 00:21:45,810 Og nå ser vi min kode pauset på den linjen. 504 00:21:45,810 --> 00:21:48,330 >> Hvis jeg går videre og print x, hva bør jeg se her? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Det er et spørsmål. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Si igjen? 509 00:21:51,530 --> 00:21:52,295 >> PUBLIKUM: [uhørlig]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: Så tilfeldige tall, kanskje. 511 00:21:53,910 --> 00:21:56,010 Kanskje jeg er heldig, og det er fin og enkel, som 0. 512 00:21:56,010 --> 00:21:57,230 Men kanskje det er noen tilfeldige tall. 513 00:21:57,230 --> 00:21:58,090 I dette tilfellet fikk jeg heldig. 514 00:21:58,090 --> 00:21:59,030 Det skjer bare for å være 0. 515 00:21:59,030 --> 00:22:00,780 Men det er faktisk flaks, fordi ikke før jeg 516 00:22:00,780 --> 00:22:06,280 skriv neste, og deretter skrive ut x har som kodelinje, linje 19, blitt henrettet. 517 00:22:06,280 --> 00:22:10,942 >> I mellomtiden, hvis jeg skriver neste gang, og nå skrive ut y, jeg kommer til å se 2. 518 00:22:10,942 --> 00:22:13,900 Nå, hvis jeg skriver neste, kommer det til å bli litt forvirrende, fordi nå, 519 00:22:13,900 --> 00:22:17,250 printf kommer til å vises på skjermen, som det gjorde. x er 1. 520 00:22:17,250 --> 00:22:18,606 >> La oss gjøre dette igjen. 521 00:22:18,606 --> 00:22:20,480 Og nå, her hvor ting blir interessant. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Før jeg kaller Swap eller trinn inn i det, la oss ta en liten titt. 524 00:22:26,580 --> 00:22:28,980 x er, igjen, 1. 525 00:22:28,980 --> 00:22:33,240 Y er, selvfølgelig, hurtig normalitet kontrollere, 2, slik at det ikke vanskelig. 526 00:22:33,240 --> 00:22:35,740 Men hva er tegnet x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Svar, er det slags funky utseende. 529 00:22:39,350 --> 00:22:43,500 Men int stjerne i parentes er bare BNP måte å si dette er en adresse. 530 00:22:43,500 --> 00:22:48,290 Det er ikke en int, er det en peker til en int, eller ellers kjent som en adresse. 531 00:22:48,290 --> 00:22:49,742 >> Hva er dette sprø ting? 532 00:22:49,742 --> 00:22:51,825 Vi har aldri sett noe ganske sånn før. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Så dette er adressen i datamaskinens minne om hvor x tilfeldigvis lever. 535 00:22:58,120 --> 00:22:59,040 Det er Ox-noe. 536 00:22:59,040 --> 00:23:01,290 Og dette er oppriktig, hvorfor Jeg har begynt å tegne piler, 537 00:23:01,290 --> 00:23:03,340 i stedet for tall, fordi som virkelig bryr seg 538 00:23:03,340 --> 00:23:06,890 at int er på et bestemt adresse som er så stor. 539 00:23:06,890 --> 00:23:12,160 Men bffff0c4, disse er alle faktisk heksadesimale siffer, 540 00:23:12,160 --> 00:23:13,720 som er 0 til f. 541 00:23:13,720 --> 00:23:16,590 >> Så vi ikke kommer til å dvele for lenge på hva disse tingene er. 542 00:23:16,590 --> 00:23:19,400 Men hvis jeg skriver ut y, selvfølgelig, ser jeg to. 543 00:23:19,400 --> 00:23:22,440 Men ampersand y, ser jeg denne adressen. 544 00:23:22,440 --> 00:23:26,527 Og legg merke til, for de nysgjerrige, hvor langt fra hverandre er x og y? 545 00:23:26,527 --> 00:23:27,985 Du kan ignorere det meste av adressen. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Fire byte. 548 00:23:29,920 --> 00:23:33,510 Og det er i tråd med vår tidligere hevder at hvor stor er en int? 549 00:23:33,510 --> 00:23:34,130 Fire byte. 550 00:23:34,130 --> 00:23:37,420 Så det ser ut som alt er lining opp pent, som du kanskje håper, i minnet. 551 00:23:37,420 --> 00:23:40,010 >> Så nå, la oss bare spole frem til slutten av denne historien. 552 00:23:40,010 --> 00:23:43,290 La oss gå videre og skriv skritt, å dykke inn i Swap-funksjonen. 553 00:23:43,290 --> 00:23:46,880 Nå legger merke til, hvis jeg skriver en, er det identisk med adressen til x. 554 00:23:46,880 --> 00:23:52,130 Hvis jeg skriver b, er det identisk til adressen y. 555 00:23:52,130 --> 00:23:57,020 Så hva skal jeg se om jeg si, gå til adressen en? 556 00:23:57,020 --> 00:23:58,120 Så ut stjerners en. 557 00:23:58,120 --> 00:24:00,130 Så stjerne betyr gå dit, i denne sammenheng. 558 00:24:00,130 --> 00:24:02,730 Ampersand mener det er adressen. 559 00:24:02,730 --> 00:24:05,000 Så stjerners et middel en. 560 00:24:05,000 --> 00:24:09,590 Og print stjerners b gir meg to. 561 00:24:09,590 --> 00:24:15,750 >> Og la meg anta, for øyeblikket, at i det minste den kode som 562 00:24:15,750 --> 00:24:18,950 fortsetter å kjøre nå kan være begrunnet gjennom på den måten. 563 00:24:18,950 --> 00:24:21,150 Men vi vil se denne ideen før lenge. 564 00:24:21,150 --> 00:24:23,850 Så denne versjonen av Swap er nå riktig og lar 565 00:24:23,850 --> 00:24:26,650 oss til å bytte denne datatypen. 566 00:24:26,650 --> 00:24:29,120 >> Så noen spørsmål deretter på Swap? 567 00:24:29,120 --> 00:24:29,890 På stjerne? 568 00:24:29,890 --> 00:24:30,690 På adressen? 569 00:24:30,690 --> 00:24:33,270 Og du vil se, med Problemet satt fire, liksom, 570 00:24:33,270 --> 00:24:37,310 men problemet satt fem, definitivt, hvordan disse ting er nyttige og få mye mer 571 00:24:37,310 --> 00:24:39,584 komfortabel med dem, som et resultat. 572 00:24:39,584 --> 00:24:40,430 Noe som helst? 573 00:24:40,430 --> 00:24:40,930 Greit. 574 00:24:40,930 --> 00:24:44,350 Så malloc er, igjen, denne funksjonen som bare tildeler minne, minne 575 00:24:44,350 --> 00:24:45,330 tildeling. 576 00:24:45,330 --> 00:24:47,024 Og hvorfor er dette nyttig? 577 00:24:47,024 --> 00:24:48,940 Vel, hele denne tiden, du har brukt malloc. 578 00:24:48,940 --> 00:24:52,230 Hvis du vurderer nå hvordan getString verk, antagelig er det 579 00:24:52,230 --> 00:24:56,140 vært stille noen for en del av minne, når som helst brukeren skriver en streng 580 00:24:56,140 --> 00:24:59,040 i, fordi vi absolutt ikke visste, som CS50 ansatte, 581 00:24:59,040 --> 00:25:02,710 hvor store disse strengene som mennesker kommer til å skrive kan være. 582 00:25:02,710 --> 00:25:07,910 >> Så la oss, for første gang, begynner å Vipp hvordan CS50 bibliotek fungerer, 583 00:25:07,910 --> 00:25:10,990 ved hjelp av et par eksempler som vil føre oss dit. 584 00:25:10,990 --> 00:25:15,300 Så hvis jeg åpner opp gedit og åpne opp scanf 0, 585 00:25:15,300 --> 00:25:17,055 vi kommer til å se følgende kode. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, som er tilgjengelig på nettsiden for i dag, har relativt få linjer med kode 588 00:25:23,530 --> 00:25:25,351 her, 14 gjennom 20. 589 00:25:25,351 --> 00:25:26,600 Og la oss se hva det gjør. 590 00:25:26,600 --> 00:25:28,920 Det erklærer en int, kalt x. 591 00:25:28,920 --> 00:25:30,850 Det sier noe sånt, antall takk. 592 00:25:30,850 --> 00:25:33,940 Og nå sier det, scanf% i, og x. 593 00:25:33,940 --> 00:25:35,620 Så det er en haug med nye ting der. 594 00:25:35,620 --> 00:25:38,420 >> Men scanf, kan du slags tror av som det motsatte av printf. 595 00:25:38,420 --> 00:25:40,090 printf, selvfølgelig, utskrifter til skjermen. 596 00:25:40,090 --> 00:25:44,410 scanf slags skanner fra brukerens tastaturet noe han eller hun har skrevet. 597 00:25:44,410 --> 00:25:46,550 >> % I er akkurat som printf. 598 00:25:46,550 --> 00:25:49,410 Dette betyr forvente at brukeren å skrive en int. 599 00:25:49,410 --> 00:25:52,820 Og nå, hvorfor tror du jeg kanskje passerer scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Hvis hensikten i livet av scanf er å få noe fra brukeren, 602 00:25:57,770 --> 00:26:02,480 hva er meningen med passerer den, og x, nå? 603 00:26:02,480 --> 00:26:02,980 Yeah? 604 00:26:02,980 --> 00:26:03,896 >> PUBLIKUM: [uhørlig]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Nettopp. 607 00:26:06,540 --> 00:26:12,900 Uansett hva jeg, det menneskelige, skriv inn, mitt innspill kommer til å bli frelst på den plasseringen. 608 00:26:12,900 --> 00:26:17,660 Det er ikke tilstrekkelig, husker, å bare passere i x, fordi vi har sett allerede, 609 00:26:17,660 --> 00:26:21,630 hver gang du passerer bare en rå variabel, som en int, til en annen funksjon, 610 00:26:21,630 --> 00:26:25,640 sikker, kan det endre det variabel, men ikke permanent. 611 00:26:25,640 --> 00:26:27,360 Det kan ikke ha en effekt på Main. 612 00:26:27,360 --> 00:26:29,420 Det kan bare endre sin egen lokale kopi. 613 00:26:29,420 --> 00:26:32,560 Men hvis, i stedet, trenger du ikke gi meg den faktiske int, 614 00:26:32,560 --> 00:26:36,640 men du gir meg veibeskrivelse til som int, jeg nå, blir scanf, 615 00:26:36,640 --> 00:26:41,050 sikkert, kan jeg følge at adresse og sette et tall der 616 00:26:41,050 --> 00:26:43,280 slik at du har tilgang til det også. 617 00:26:43,280 --> 00:26:45,120 >> Så når jeg kjører dette programmet, la oss se. 618 00:26:45,120 --> 00:26:49,660 Gjør scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Og hvis jeg nå skriver inn et tall som 50, takk for den 50. 620 00:26:54,030 --> 00:26:58,150 Hvis jeg nå skriver inn et tall som negative 1, for den negative 1. 621 00:26:58,150 --> 00:27:04,200 Jeg nå skriver inn et tall som 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Hvorfor gjorde mitt program ignorere meg? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Vel, fordi rett og slett, jeg fortalte det å forvente bare en int. 625 00:27:09,880 --> 00:27:10,380 Greit. 626 00:27:10,380 --> 00:27:11,630 Så det er en versjon av dette. 627 00:27:11,630 --> 00:27:16,600 La oss ta ting opp et hakk og foreslå at dette ikke er bra. 628 00:27:16,600 --> 00:27:20,530 Og her ligger et veldig enkelt eksempel av hvordan vi kan begynne å skrive kode 629 00:27:20,530 --> 00:27:24,450 at andre mennesker kan utnytte eller kompromiss ved å gjøre dårlige ting. 630 00:27:24,450 --> 00:27:28,336 Så linje 16, så like i ånden til før, 631 00:27:28,336 --> 00:27:29,960 men jeg er ikke erklære det int denne gangen. 632 00:27:29,960 --> 00:27:32,970 Jeg erklære det røye stjerne, aka streng. 633 00:27:32,970 --> 00:27:35,190 >> Men hva betyr det egentlig? 634 00:27:35,190 --> 00:27:38,790 Så hvis jeg ikke spesifiserer en address-- og Jeg kaller det tilfeldig, buffer, 635 00:27:38,790 --> 00:27:43,370 men jeg kan kalle det s, for å være simple-- og så gjør jeg dette, forklare meg, 636 00:27:43,370 --> 00:27:48,630 hvis du kunne, basert på den forrige logikk, hva er scanf gjør i linje 18, 637 00:27:48,630 --> 00:27:55,000 hvis pass% s og buffer, som er en adresse? 638 00:27:55,000 --> 00:27:58,210 Hva er scanf, hvis du bruker det nøyaktig samme logikk som versjon 0, 639 00:27:58,210 --> 00:28:00,640 skal prøve å gjøre her, når brukeren skriver noe i? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Yeah? 642 00:28:03,409 --> 00:28:04,407 >> PUBLIKUM: [uhørlig]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Nettopp. 645 00:28:08,890 --> 00:28:11,577 Scanf, av logikken tidligere kommer til å ta strengen 646 00:28:11,577 --> 00:28:13,410 at den menneskelige maskinskrevet i-- det er nå en streng, 647 00:28:13,410 --> 00:28:15,790 det er ikke et tall, formodentlig, hvis han eller hun cooperates-- 648 00:28:15,790 --> 00:28:19,310 og det kommer til å prøve å sette det string i minnet på uansett adresse 649 00:28:19,310 --> 00:28:20,340 buffer angir. 650 00:28:20,340 --> 00:28:23,870 Og dette er flott, fordi buffer faktisk er ment å være en adresse. 651 00:28:23,870 --> 00:28:30,470 >> Men jeg hevder dette programmet er buggy i en svært alvorlig måte, fordi hva verdien er 652 00:28:30,470 --> 00:28:31,330 buffer som standard? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Hva har jeg initialisert inn? 655 00:28:34,790 --> 00:28:35,770 Hva mengde minne? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Jeg har ikke, ikke sant? 658 00:28:38,620 --> 00:28:42,265 >> Så selv om jeg har tildelt en røye stjerne som ikke lenger heter s, 659 00:28:42,265 --> 00:28:48,030 det i stedet heter, buffer-- så la oss trekke variabelen navn 660 00:28:48,030 --> 00:28:53,380 nå som buffer-- om jeg har ikke kalt getString eller malloc her, 661 00:28:53,380 --> 00:28:56,030 som effektivt gjør at buffer er bare noen søppel verdi. 662 00:28:56,030 --> 00:28:57,030 >> Nå hva betyr det? 663 00:28:57,030 --> 00:29:00,220 Det betyr at jeg har fortalt scanf å forvente en streng fra brukeren. 664 00:29:00,220 --> 00:29:01,300 Og vet du hva? 665 00:29:01,300 --> 00:29:03,883 Uansett hva denne tingen peker til-- og jeg tegner spørsmålstegn, 666 00:29:03,883 --> 00:29:07,060 men i virkeligheten, det kommer til å være noe sånt OX1, 2, 3, ikke sant? 667 00:29:07,060 --> 00:29:10,730 Det er noen falsk verdi som bare skjer for å være der fra før. 668 00:29:10,730 --> 00:29:13,440 Så sagt på en annen måte, er det som om buffer er bare 669 00:29:13,440 --> 00:29:16,180 peke på noe i minnet. 670 00:29:16,180 --> 00:29:17,610 Jeg aner ikke hva. 671 00:29:17,610 --> 00:29:24,130 >> Så hvis jeg skriver i Gabe nå, det kommer å prøve å sette g-a-b-e / 0 der. 672 00:29:24,130 --> 00:29:25,530 Men hvem vet hva det er? 673 00:29:25,530 --> 00:29:27,480 Og i det siste, noe gang vi har prøvd å røre 674 00:29:27,480 --> 00:29:29,770 minne som ikke hører til oss, hva har skjedd? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Eller nesten hver gang. 677 00:29:32,870 --> 00:29:34,310 Segmentering feil, ikke sant? 678 00:29:34,310 --> 00:29:37,829 >> Denne pilen, jeg har ingen anelse om hvor det er peker. det er bare noen tilfeldig verdi. 679 00:29:37,829 --> 00:29:40,370 Og selvfølgelig, hvis du tolker en tilfeldig verdi som en adresse, 680 00:29:40,370 --> 00:29:42,610 du kommer til å gå til noen tilfeldig destinasjon. 681 00:29:42,610 --> 00:29:46,810 Så Gabe kan faktisk krasj mitt program i dette tilfellet her. 682 00:29:46,810 --> 00:29:50,600 >> Så hva kan vi gjøre som er nesten like ille? 683 00:29:50,600 --> 00:29:52,660 Tenk på dette tredje og siste eksempel på scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Denne versjonen er bedre i hvilken forstand? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Hvis du er komfortabel med Forrige problem, dette er bedre. 688 00:30:01,400 --> 00:30:02,250 Hvorfor? 689 00:30:02,250 --> 00:30:03,250 >> PUBLIKUM: [uhørlig]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Good. 692 00:30:07,110 --> 00:30:09,970 Så dette tilfelle av linje 16 er bedre, i den forstand 693 00:30:09,970 --> 00:30:12,030 at vi er eksplisitt allokere minne. 694 00:30:12,030 --> 00:30:14,190 Vi bruker ikke malloc, vi bruker den uke 2 695 00:30:14,190 --> 00:30:16,060 tilnærming av bare å erklære en matrise. 696 00:30:16,060 --> 00:30:18,130 Og vi har sagt før at en streng er bare en rekke tegn, 697 00:30:18,130 --> 00:30:19,690 så dette er helt legitim. 698 00:30:19,690 --> 00:30:22,910 Men det er selvsagt, som du merke, fast størrelse, 16. 699 00:30:22,910 --> 00:30:25,440 >> Så dette programmet er helt trygt, hvis jeg skriver 700 00:30:25,440 --> 00:30:29,760 i ett tegnstrenger, to karakter strenger, 15 tegnstrenger. 701 00:30:29,760 --> 00:30:34,970 Men så snart jeg begynner å skrive 16, 17, 18, 1000 tegnstrenger, 702 00:30:34,970 --> 00:30:37,390 hvor er denne strengen kommer til å ende opp? 703 00:30:37,390 --> 00:30:39,570 Det kommer til å ende opp med delvis her. 704 00:30:39,570 --> 00:30:42,820 Men så hvem vet hva annet er utenfor grensene 705 00:30:42,820 --> 00:30:44,270 av denne spesielle array? 706 00:30:44,270 --> 00:30:48,015 >> Det er som om jeg har erklærte 16 bokser her. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Så i stedet for å trekke ut alle 16, vil vi bare late som at jeg har trukket 16. 709 00:30:52,690 --> 00:30:56,540 Men hvis jeg da prøve å lese en streng det er mye lenger, som 50 tegn, 710 00:30:56,540 --> 00:31:01,270 Jeg kommer til å begynne å sette a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Og dette er antakelig noen andre minnesegment 712 00:31:04,916 --> 00:31:06,790 som, igjen, kan forårsake mitt program til å krasje, 713 00:31:06,790 --> 00:31:10,600 fordi jeg ikke har bedt om noe mer enn bare 16 bytes. 714 00:31:10,600 --> 00:31:12,260 >> Så hvem bryr seg? 715 00:31:12,260 --> 00:31:13,880 Vel, her er CS50 biblioteket. 716 00:31:13,880 --> 00:31:17,220 Og mesteparten av dette er bare som instruksjoner opp toppen. 717 00:31:17,220 --> 00:31:21,670 Den CS50 bibliotek, hele denne tiden, har hatt denne linjen på linje 52. 718 00:31:21,670 --> 00:31:23,680 Vi har sett typedef, eller vil du se typedef 719 00:31:23,680 --> 00:31:27,930 i PSet 4, som bare danner en synonym der røye stjerne kan være mer 720 00:31:27,930 --> 00:31:29,290 ganske enkelt referert til som strengen. 721 00:31:29,290 --> 00:31:31,540 Så dette er en av de få trening hjul 722 00:31:31,540 --> 00:31:34,120 vi har brukt i hemmelighet under panseret. 723 00:31:34,120 --> 00:31:36,490 >> I mellomtiden, her er funksjon, getchar. 724 00:31:36,490 --> 00:31:38,190 Nå tydeligvis er det ingen kropp til det. 725 00:31:38,190 --> 00:31:40,273 Og faktisk, hvis jeg holder rulling, det gjør jeg faktisk ikke 726 00:31:40,273 --> 00:31:42,080 se noen implementeringer av disse funksjonene. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Som en mental helse sjekk, hvorfor er det? 729 00:31:45,516 --> 00:31:46,795 >> PUBLIKUM: [uhørlig]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Yeah. 731 00:31:47,670 --> 00:31:48,950 Så dette er topptekstfilen. 732 00:31:48,950 --> 00:31:52,520 Og header-filer inneholder prototyper, pluss noen andre ting, virker det, 733 00:31:52,520 --> 00:31:53,780 som typedefs. 734 00:31:53,780 --> 00:31:56,910 Men i CS50.c, som vi har aldri gitt deg direkte, 735 00:31:56,910 --> 00:32:02,100 men har vært i CS50 apparatet alle denne gangen, dypt inne i sine mapper, 736 00:32:02,100 --> 00:32:04,990 merke til at det er en hel haug av funksjoner her inne. 737 00:32:04,990 --> 00:32:06,720 >> Faktisk, la oss bla nedover. 738 00:32:06,720 --> 00:32:08,810 La oss se bort fra de fleste av dem, for nå. 739 00:32:08,810 --> 00:32:12,670 Men bla ned til getInt og se hvordan getInt fungerer. 740 00:32:12,670 --> 00:32:13,890 Så her er getInt. 741 00:32:13,890 --> 00:32:17,727 Og hvis du noen gang virkelig brydde seg hvordan får int fungerer, her er dokumentasjonen. 742 00:32:17,727 --> 00:32:19,560 Og blant de tingene den sier er den forteller deg 743 00:32:19,560 --> 00:32:21,340 hva verdiområder det kan returnere. 744 00:32:21,340 --> 00:32:24,400 Det er hovedsaklig negative 2 milliarder til positiv 2 milliarder, gi eller ta. 745 00:32:24,400 --> 00:32:26,420 >> Og det viser seg, alt dette tid, selv om vi har aldri 746 00:32:26,420 --> 00:32:28,570 du hadde se etter det, hvis noe går galt, 747 00:32:28,570 --> 00:32:30,680 det viser seg at alle Foreløpig har getInt 748 00:32:30,680 --> 00:32:33,600 vært tilbake en spesiell konstant, ikke null, 749 00:32:33,600 --> 00:32:36,760 men heller int_max, som er bare en programmerer konvensjon. 750 00:32:36,760 --> 00:32:38,846 Det betyr at her er en spesiell verdi. 751 00:32:38,846 --> 00:32:41,470 Sørg for å sjekke om dette, bare i tilfelle noe går galt. 752 00:32:41,470 --> 00:32:43,261 Men vi har aldri brydd med at til dags dato, 753 00:32:43,261 --> 00:32:45,200 fordi igjen, denne er ment å forenkle. 754 00:32:45,200 --> 00:32:46,950 >> Men hvordan getInt bli gjennomført? 755 00:32:46,950 --> 00:32:48,450 Vel, en, tar det ingen argumenter. 756 00:32:48,450 --> 00:32:49,390 Vi vet det. 757 00:32:49,390 --> 00:32:50,820 Den returnerer en int. 758 00:32:50,820 --> 00:32:51,950 Vi vet det. 759 00:32:51,950 --> 00:32:54,460 Så hvordan fungerer det under panseret? 760 00:32:54,460 --> 00:32:58,290 >> Så det er tydeligvis en uendelig sløyfe, i det minste utseende av en. 761 00:32:58,290 --> 00:33:00,290 Legg merke til at vi bruker getString. 762 00:33:00,290 --> 00:33:04,000 Så det er interessant. getInt kaller vår egen funksjon, getString. 763 00:33:04,000 --> 00:33:05,645 Og nå hvorfor dette kan være tilfelle? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Hvorfor blir jeg defensiv her på linje 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Hva kan skje i tråd 164, bare for å være klar? 768 00:33:15,639 --> 00:33:16,930 Det er det samme svaret som før. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Kan bare være ut av minnet. 771 00:33:20,089 --> 00:33:23,130 Noe går galt med getString, vi må være i stand til å håndtere det. 772 00:33:23,130 --> 00:33:27,070 Og grunnen til at jeg ikke kommer tilbake null er det, teknisk sett, er null en peker. 773 00:33:27,070 --> 00:33:29,120 getInt har til å returnere en int. 774 00:33:29,120 --> 00:33:31,060 Så jeg har vilkårlig besluttet, i hovedsak, 775 00:33:31,060 --> 00:33:34,600 at 2 milliarder, gi eller ta, kommer å være en spesiell verdi som jeg kan aldri 776 00:33:34,600 --> 00:33:35,970 faktisk komme fra brukeren. 777 00:33:35,970 --> 00:33:39,930 Det er bare én verdi jeg skal å kaste bort for å representere en feilkode. 778 00:33:39,930 --> 00:33:41,540 >> Så nå, ting blir litt fancy. 779 00:33:41,540 --> 00:33:44,670 Og det er ikke helt den samme funksjonen som før, men det er svært lik. 780 00:33:44,670 --> 00:33:50,120 Så legger merke til, erklærer jeg her, i tråd 172, både en int n og en char c. 781 00:33:50,120 --> 00:33:53,600 Og så bruker jeg denne funky linje, sscanf, som det viser seg 782 00:33:53,600 --> 00:33:55,990 skanner ikke en streng fra tastaturet. 783 00:33:55,990 --> 00:33:59,226 Det står en eksisterende streng som brukeren allerede har skrevet i. 784 00:33:59,226 --> 00:34:02,100 Så jeg allerede kalt getString, som betyr at jeg har en streng i minnet. 785 00:34:02,100 --> 00:34:05,020 sscanf er hva du kaller en analysefunksjon. 786 00:34:05,020 --> 00:34:07,760 Den ser på strengen jeg har skrevet inn, tegn for tegn, 787 00:34:07,760 --> 00:34:09,250 og gjør noe nyttig. 788 00:34:09,250 --> 00:34:10,969 At strengen er lagret i linje. 789 00:34:10,969 --> 00:34:13,560 Og jeg vet at bare ved å gå sikkerhetskopiere her og si, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Jeg kalte det ikke s denne gangen, men linjen. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Og nå er dette litt annerledes. 793 00:34:18,080 --> 00:34:22,480 Men dette betyr effektivt, av grunner vi vil noe bølge våre hender i dag, 794 00:34:22,480 --> 00:34:26,070 at vi sjekker til se om brukeren skrev inn 795 00:34:26,070 --> 00:34:29,909 og int og kanskje en annen karakter. 796 00:34:29,909 --> 00:34:33,610 Hvis brukeren har skrevet i en int, er det kommer til å bli lagret i n, fordi jeg er 797 00:34:33,610 --> 00:34:36,739 passerer dette ved adresse, nytt triks vi har sett i dag. 798 00:34:36,739 --> 00:34:41,570 Hvis brukeren har også skrevet i like 123x, at x 799 00:34:41,570 --> 00:34:45,060 kommer til å ende opp med en brev i karakter c. 800 00:34:45,060 --> 00:34:48,739 >> Nå viser det seg at sscanf vil fortelle meg, intelligent, 801 00:34:48,739 --> 00:34:54,750 hvor mange variabler ble sscanf med hell kunne fylle. 802 00:34:54,750 --> 00:34:58,770 Så ved denne logikk, hvis funksjon Jeg implementere er getInt, 803 00:34:58,770 --> 00:35:00,900 men jeg sjekker, potensielt, for brukeren 804 00:35:00,900 --> 00:35:04,190 å ha skrevet i en int etterfulgt av noe annet, 805 00:35:04,190 --> 00:35:08,580 hva vil jeg sscanf sin returverdien virkelig å være? 806 00:35:08,580 --> 00:35:10,950 Hvis hensikten er å komme bare en int fra brukeren? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Så hvis sscanf avkastning 2, hva betyr det? 809 00:35:19,300 --> 00:35:21,660 Brukeren har skrevet i noe sånt som, bokstavelig talt, 810 00:35:21,660 --> 00:35:24,770 123x, som er bare tull. 811 00:35:24,770 --> 00:35:27,490 Det er en feil, og Jeg vil se etter det. 812 00:35:27,490 --> 00:35:32,960 >> Så hvis brukeren skriver dette i, ved denne logikken, hva gjør sscanf tilbake, 813 00:35:32,960 --> 00:35:33,740 ville du si? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Så det kommer til å gå tilbake 2, fordi 123 kommer til å gå inn her, 816 00:35:39,130 --> 00:35:41,580 og x kommer til å ende opp i her. 817 00:35:41,580 --> 00:35:43,970 Men jeg ikke vil at x å få fylt. 818 00:35:43,970 --> 00:35:48,580 Jeg ønsker å sscanf å bare lykkes i å fylle den første av variablene. 819 00:35:48,580 --> 00:35:52,490 Og så det er derfor jeg ønsker sscanf å returnere en. 820 00:35:52,490 --> 00:35:55,750 >> Og hvis dette er litt over hodet for øyeblikket, det er helt greit. 821 00:35:55,750 --> 00:36:00,030 Innse skjønt, at en av de verdier av getInt og getString 822 00:36:00,030 --> 00:36:03,630 er at vi gjør en pokker for en Mange feilkontroll som dette så 823 00:36:03,630 --> 00:36:07,130 som til dags dato, kan du ganske mye skriver noe på tastaturet, 824 00:36:07,130 --> 00:36:08,490 og vi vil ta det. 825 00:36:08,490 --> 00:36:10,592 Og vi sikkert, personale, vil definitivt ikke 826 00:36:10,592 --> 00:36:13,300 være kilden til en feil i din program, fordi vi er defensivt 827 00:36:13,300 --> 00:36:16,270 sjekke for alle de dumme ting som en bruker kan gjøre, 828 00:36:16,270 --> 00:36:18,900 som å skrive en streng, når du virkelig ønsket int. 829 00:36:18,900 --> 00:36:21,350 Så for now-- vi kommer tilbake til dette før long-- 830 00:36:21,350 --> 00:36:23,710 men hele denne tiden, getString og getInt har 831 00:36:23,710 --> 00:36:29,950 vært under panseret bruker denne grunnleggende ideen av adresser til hukommelsen. 832 00:36:29,950 --> 00:36:32,580 >> Så nå, la oss gjøre ting litt mer brukervennlig. 833 00:36:32,580 --> 00:36:38,740 Som du kanskje husker, fra Binky siste tid-- hvis min mus vil cooperate-- så 834 00:36:38,740 --> 00:36:42,560 vi hadde denne koden, som ærlig, er ganske meningsløse. 835 00:36:42,560 --> 00:36:45,330 Denne koden oppnår ingenting nyttig, men det var eksempelet 836 00:36:45,330 --> 00:36:48,330 at professor Parlante anvendes for å representere 837 00:36:48,330 --> 00:36:51,840 hva som foregikk i en program som involverer hukommelse. 838 00:36:51,840 --> 00:36:54,850 >> Så la oss gjenfortelle dette Historien super kort. 839 00:36:54,850 --> 00:36:58,720 Disse første to linjer, i Engelsk, hva ville du si? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Bare i rimelig menneskelig, men litt tekniske termer, ta et stikk. 842 00:37:05,430 --> 00:37:06,346 PUBLIKUM: [uhørlig]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: OK, du etablere adresser for din x og y-variabler. 845 00:37:11,080 --> 00:37:15,520 Ikke helt, fordi x og y ikke er variabler i tradisjonell forstand. 846 00:37:15,520 --> 00:37:18,054 x og y er adresser eller vil lagre adressen. 847 00:37:18,054 --> 00:37:19,220 Så la oss prøve dette på nytt. 848 00:37:19,220 --> 00:37:21,010 Ikke en dårlig start, skjønt. 849 00:37:21,010 --> 00:37:21,510 Yeah? 850 00:37:21,510 --> 00:37:22,426 >> PUBLIKUM: [uhørlig]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Good. 853 00:37:24,840 --> 00:37:26,173 Jeg tror det er litt renere. 854 00:37:26,173 --> 00:37:28,630 Erklærte to pekere, to heltall. 855 00:37:28,630 --> 00:37:30,150 Og vi ringer dem x og y. 856 00:37:30,150 --> 00:37:32,790 Eller hvis vi skulle trekke dette som et bilde, igjen, 857 00:37:32,790 --> 00:37:36,410 husker rett og slett at alle vi gjør med den første linjen 858 00:37:36,410 --> 00:37:39,690 er å tegne en boks som dette, med en viss verdi i den søppel, 859 00:37:39,690 --> 00:37:41,920 og kaller det X, og en annen boks som dette, 860 00:37:41,920 --> 00:37:43,880 med noen søppel verdi i det, kaller det y. 861 00:37:43,880 --> 00:37:45,810 Vi har erklært to pekere som til slutt 862 00:37:45,810 --> 00:37:47,860 vil lagre adressen til en int. 863 00:37:47,860 --> 00:37:49,170 Så det er alt der. 864 00:37:49,170 --> 00:37:53,290 >> Så når Binky gjorde dette, leire bare så ut som dette. 865 00:37:53,290 --> 00:37:55,350 Og Nick bare slags pakket opp pilene, 866 00:37:55,350 --> 00:37:57,590 som om de ikke peker noe sted spesielt, fordi de er bare 867 00:37:57,590 --> 00:37:58,250 søppel verdier. 868 00:37:58,250 --> 00:38:01,670 De er ikke eksplisitt initialisert hvor som helst i særdeleshet. 869 00:38:01,670 --> 00:38:03,980 >> Nå er det neste linje kode, husker, var dette. 870 00:38:03,980 --> 00:38:07,510 Så i rimelig brukervennlig, men noe teknisk engelsk, 871 00:38:07,510 --> 00:38:09,790 hva er denne linjen med kode gjør? 872 00:38:09,790 --> 00:38:10,391 Yeah? 873 00:38:10,391 --> 00:38:11,333 >> PUBLIKUM: [uhørlig]. 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 Det er å fordele den del av minne som er på størrelse med en int. 877 00:38:17,016 --> 00:38:18,140 Og det er halve svaret. 878 00:38:18,140 --> 00:38:20,056 Du svarte riktig halvparten av uttrykket. 879 00:38:20,056 --> 00:38:22,473 Hva som skjer på venstre side av likhetstegnet? 880 00:38:22,473 --> 00:38:22,972 Yeah? 881 00:38:22,972 --> 00:38:24,814 PUBLIKUM: Og redere det til variabelen x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: Og redere det til variabelen x. 883 00:38:27,690 --> 00:38:31,650 Så til oppsummering, høyre side Tildeler nok minne til å lagre en int. 884 00:38:31,650 --> 00:38:34,150 Men malloc spesifikt returnerer adressen 885 00:38:34,150 --> 00:38:37,270 av at mengde minne, som du har bare foreslått blir lagret i x. 886 00:38:37,270 --> 00:38:42,560 >> Så hva Nick gjorde sist gang med Binky er han dro at pekeren ut, leire, 887 00:38:42,560 --> 00:38:46,820 å peke nå på en hvit blings av minne som er lik størrelsen på en int. 888 00:38:46,820 --> 00:38:49,360 Og ja, som er ment å representere fire byte. 889 00:38:49,360 --> 00:38:55,310 >> Nå, den neste linje med kode gjorde dette, stjerne x blir 42. 890 00:38:55,310 --> 00:38:58,530 Så 42 er grei på høyre side, meningen med livet. 891 00:38:58,530 --> 00:39:00,500 Venstre side, betyr stjerne x hva? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Som også kan ha gone-- det er OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> PUBLIKUM: I utgangspunktet, gå til [uhørbart] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Good. 897 00:39:07,750 --> 00:39:08,760 PUBLIKUM: [uhørlig]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Nettopp. 899 00:39:09,760 --> 00:39:11,979 Venstre del gå til x. 900 00:39:11,979 --> 00:39:12,520 x er adressen. 901 00:39:12,520 --> 00:39:15,520 Det er som 33 Oxford Street, eller OX1. 902 00:39:15,520 --> 00:39:18,690 Og stjerne x betyr gå til den ta og sette det der ute? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Så ja, det er akkurat hva Nick gjorde. 905 00:39:21,290 --> 00:39:23,740 Han startet med ved, i hovedsak, mentalt 906 00:39:23,740 --> 00:39:26,270 peker en finger på x, etter pilen 907 00:39:26,270 --> 00:39:30,670 til den hvite boksen på høyre hånd side, og å sette nummer 42 der. 908 00:39:30,670 --> 00:39:34,120 Men så fikk en litt farlig, ikke sant? 909 00:39:34,120 --> 00:39:35,860 Binky er i ferd med å miste hodet. 910 00:39:35,860 --> 00:39:39,465 >> Stjerners y er lik 13, uflaks, betyr hva? 911 00:39:39,465 --> 00:39:43,620 Så stjerne y del gå til adressen i y. 912 00:39:43,620 --> 00:39:45,630 Men hva er adressen i y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Greit, det er søppel verdi, ikke sant? 915 00:39:49,440 --> 00:39:50,800 Jeg tegnet det som et spørsmålstegn. 916 00:39:50,800 --> 00:39:54,850 Nick trakk det som en krøllet opp pil. 917 00:39:54,850 --> 00:39:59,600 Og så snart du prøver å Star y, sier dra dit, 918 00:39:59,600 --> 00:40:03,872 men det er ikke en legitim adresse, er det noen falsk beliggenhet, 919 00:40:03,872 --> 00:40:05,080 programmet kommer til å krasje. 920 00:40:05,080 --> 00:40:08,580 Og Binky hode kommer å fly av her, som det gjorde. 921 00:40:08,580 --> 00:40:12,130 >> Så til slutt, dette programmet var bare flate ut feil. 922 00:40:12,130 --> 00:40:13,540 Det var en buggy program. 923 00:40:13,540 --> 00:40:14,760 Og det behøvde å bli bestemt. 924 00:40:14,760 --> 00:40:18,260 Og den eneste måten, egentlig, for å fikse det vil være, for eksempel, denne linje, 925 00:40:18,260 --> 00:40:21,010 som vi ikke engang få til, fordi programmet krasjet for tidlig. 926 00:40:21,010 --> 00:40:26,170 Men hvis vi skulle fikse dette, hva Effekten gjør gjør y lik x ha? 927 00:40:26,170 --> 00:40:30,010 Vel, i hovedsak peker den y på uansett verdi x peker på. 928 00:40:30,010 --> 00:40:32,430 >> Så i Nick historie, eller Binky historie, både 929 00:40:32,430 --> 00:40:34,640 x og y var peker på den hvite del av minnet, 930 00:40:34,640 --> 00:40:38,300 slik at, til slutt, når du Star y lik 13 igjen, 931 00:40:38,300 --> 00:40:43,080 du ender opp med å sette 13 i riktig sted. 932 00:40:43,080 --> 00:40:47,640 Så alle disse linjer er helt legitim, bortsett fra denne ene, 933 00:40:47,640 --> 00:40:51,730 når det skjedde før du faktisk tildelt y noen verdi. 934 00:40:51,730 --> 00:40:54,290 >> Nå heldigvis, trenger du ikke nødt til å resonnere gjennom alle 935 00:40:54,290 --> 00:40:56,560 av slike saker på egen hånd. 936 00:40:56,560 --> 00:40:59,310 La meg gå videre og åpne opp et terminalvindu her 937 00:40:59,310 --> 00:41:03,050 og åpne opp, for bare et øyeblikk, en super kort program som 938 00:41:03,050 --> 00:41:04,360 også er slags meningsløs. 939 00:41:04,360 --> 00:41:05,152 Den er stygg. 940 00:41:05,152 --> 00:41:06,610 Det oppnår ikke noe nyttig. 941 00:41:06,610 --> 00:41:10,180 Men det gjør demonstrere problemer minne, så la oss ta en titt. 942 00:41:10,180 --> 00:41:11,830 >> Main, super enkelt. 943 00:41:11,830 --> 00:41:14,830 Det krever tydeligvis en funksjon, f, og deretter returnerer 0. 944 00:41:14,830 --> 00:41:16,310 Det er litt vanskelig å rote dette opp. 945 00:41:16,310 --> 00:41:18,540 Så Main er ganske bra, så langt. 946 00:41:18,540 --> 00:41:20,100 >> Så f er problematisk. 947 00:41:20,100 --> 00:41:22,120 Og bare ikke legge mye arbeid i å navngi den 948 00:41:22,120 --> 00:41:23,990 her, for å holde fokus på koden. 949 00:41:23,990 --> 00:41:25,740 f har to linjer. 950 00:41:25,740 --> 00:41:27,610 Og la oss se hva som nå skjer. 951 00:41:27,610 --> 00:41:29,840 Så på den ene side her-- og la meg gjøre 952 00:41:29,840 --> 00:41:32,680 dette sammenfallende med tidligere example-- på den ene side, 953 00:41:32,680 --> 00:41:35,830 venstre side er gjør hva, på engelsk? 954 00:41:35,830 --> 00:41:36,493 Det er-- 955 00:41:36,493 --> 00:41:37,701 PUBLIKUM: Lage en peker. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Lage en peker til en int og kaller det x. 957 00:41:40,830 --> 00:41:43,789 Så det å lage en av disse boksene Jeg holder tegning på berøringsskjermen. 958 00:41:43,789 --> 00:41:45,913 Og nå, på høyre hånd side, malloc naturligvis 959 00:41:45,913 --> 00:41:47,420 er å fordele en del av minnet. 960 00:41:47,420 --> 00:41:49,989 Og bare for å være klar, hvordan mye minne er det tilsynelatende 961 00:41:49,989 --> 00:41:52,030 tildeling, hvis du bare slags gjøre regnestykket her? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Så det er 40 bytes. 964 00:41:54,040 --> 00:41:57,400 Og jeg vet at bare fordi jeg vet en int, på CS50 apparatet, i det minste 965 00:41:57,400 --> 00:41:58,060 er fire byte. 966 00:41:58,060 --> 00:41:59,610 Så 10 ganger 4 er 40. 967 00:41:59,610 --> 00:42:04,924 Så dette er lagring av en x, adressen av det første av 40 ints at 968 00:42:04,924 --> 00:42:07,340 har fått tildelt plass tilbake, til rygg, og bakover, mot rygg. 969 00:42:07,340 --> 00:42:08,470 >> Og det er det som er nøkkelen om malloc. 970 00:42:08,470 --> 00:42:11,261 Det tar ikke et lite minne her, litt her, litt her. 971 00:42:11,261 --> 00:42:14,220 Det gir deg en del av minnet, tilgrensende, fra operasjons 972 00:42:14,220 --> 00:42:15,240 system. 973 00:42:15,240 --> 00:42:18,500 >> Hva nå om dette, x brakett 10 lik 0? 974 00:42:18,500 --> 00:42:19,470 Vilkårlig linje med kode. 975 00:42:19,470 --> 00:42:21,100 Det oppnår ikke noe nyttig. 976 00:42:21,100 --> 00:42:26,128 Men det er interessant, fordi x brakett 10--? 977 00:42:26,128 --> 00:42:26,628 Yeah? 978 00:42:26,628 --> 00:42:27,912 >> PUBLIKUM: [uhørlig]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN: x brakett 10 trenger ikke å være null. 980 00:42:30,500 --> 00:42:35,070 Null detalj kommer bare inn i bildet med strenger, ved enden av en streng. 981 00:42:35,070 --> 00:42:36,700 Men en god tanke. 982 00:42:36,700 --> 00:42:39,615 >> Hvor stor er denne matrisen, selv om jeg har frigjort 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Det er 0 til ni, ikke sant? 985 00:42:43,690 --> 00:42:45,120 Det er 10 ints, totalt. 986 00:42:45,120 --> 00:42:48,790 40 bytes, men 10 ints, indeksert 0 til 0. 987 00:42:48,790 --> 00:42:50,930 >> Så hva er det x brakett 10? 988 00:42:50,930 --> 00:42:53,090 Det er faktisk noen ukjent søppel verdi. 989 00:42:53,090 --> 00:42:54,780 Det er minne som ikke tilhører meg. 990 00:42:54,780 --> 00:42:59,650 Jeg skal ikke berøre det byte nummer 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Jeg kommer litt for langt. 992 00:43:01,420 --> 00:43:04,490 >> Og ja, hvis jeg kjører dette program, kan det meget vel krasje. 993 00:43:04,490 --> 00:43:05,790 Men noen ganger, vil vi få heldige. 994 00:43:05,790 --> 00:43:07,706 Og så bare for å demonstrere dette-- og ærlig, 995 00:43:07,706 --> 00:43:11,000 du vet aldri før du gjør it la oss kjøre dette. 996 00:43:11,000 --> 00:43:12,480 Det gjorde faktisk ikke krasje. 997 00:43:12,480 --> 00:43:15,032 >> Men hvis jeg endre dette, for eksempel, til å være som 1,000, 998 00:43:15,032 --> 00:43:16,740 å gjøre dette virkelig bevisst, la oss se 999 00:43:16,740 --> 00:43:18,710 hvis vi kan få den til å krasje denne gangen. 1000 00:43:18,710 --> 00:43:20,070 OK, det gjorde ikke krasje. 1001 00:43:20,070 --> 00:43:22,600 Hva med 100.000? 1002 00:43:22,600 --> 00:43:25,000 La oss remake det, og nå kjøre den. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 Greit. 1006 00:43:26,460 --> 00:43:29,090 Så tilsynelatende, igjen, disse segmenter av minne, så å si, 1007 00:43:29,090 --> 00:43:32,660 er rimelig stor, så vi kan få heldige igjen og igjen. 1008 00:43:32,660 --> 00:43:36,510 Men til slutt, når du får latterlig og virkelig gå langt ut på skjermen, 1009 00:43:36,510 --> 00:43:39,120 du berører minne som virkelig, egentlig ikke tilhører deg. 1010 00:43:39,120 --> 00:43:40,870 >> Men ærlig talt, disse typer feil kommer 1011 00:43:40,870 --> 00:43:43,020 å være hardere og hardere å finne ut på egen hånd. 1012 00:43:43,020 --> 00:43:47,880 Men heldigvis, som programmerere, har vi verktøy som tillater oss å gjøre dette for oss. 1013 00:43:47,880 --> 00:43:50,140 Så dette er kanskje en av de styggeste programmer, 1014 00:43:50,140 --> 00:43:52,060 enda styggere enn gdb utgang. 1015 00:43:52,060 --> 00:43:55,670 Men det har alltid en linje eller to som er super nyttig. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind er et program som hjelper du ikke feilsøke et program, per se, 1017 00:44:00,310 --> 00:44:03,500 men finner minne-relatert problemer, spesielt. 1018 00:44:03,500 --> 00:44:07,590 Det vil automatisk kjøre koden din for deg og se etter minst to ting. 1019 00:44:07,590 --> 00:44:10,680 One, har du gjort noe utilsiktet lignende touch minne 1020 00:44:10,680 --> 00:44:11,980 som ikke tilhører deg? 1021 00:44:11,980 --> 00:44:13,590 Det vil hjelpe deg å finne disse tilfellene. 1022 00:44:13,590 --> 00:44:15,710 >> Og to, vil det hjelpe du finner noe som heter 1023 00:44:15,710 --> 00:44:19,270 minnelekkasjer, som vi har fullstendig ignorert, naivt, 1024 00:44:19,270 --> 00:44:21,380 for en tid og et trettitalls. 1025 00:44:21,380 --> 00:44:23,140 Men det viser seg, alt dette tidspunkt, når 1026 00:44:23,140 --> 00:44:26,620 du har kalt getString i så mange av våre programmer, 1027 00:44:26,620 --> 00:44:28,930 du spør drifts system for minne, 1028 00:44:28,930 --> 00:44:32,070 men du har noen erindring av stadig å gi det 1029 00:44:32,070 --> 00:44:36,169 tilbake, gjør unalloc, eller fri, som det heter. 1030 00:44:36,169 --> 00:44:37,960 Nei, fordi vi har aldri ba deg om å gjøre det. 1031 00:44:37,960 --> 00:44:41,250 >> Men alt denne gangen, programmene du har skrevet i C 1032 00:44:41,250 --> 00:44:43,800 har vært lekker minne, spør drifts 1033 00:44:43,800 --> 00:44:46,190 system for mer og mer minne for strykere og whatnot, 1034 00:44:46,190 --> 00:44:47,870 men aldri levere det tilbake. 1035 00:44:47,870 --> 00:44:50,080 Og nå er dette litt av en overforenkling, 1036 00:44:50,080 --> 00:44:53,550 men hvis du noen gang har kjørt din Mac eller PC for en stund, åpning 1037 00:44:53,550 --> 00:44:55,790 mange programmer, kanskje lukke programmer, 1038 00:44:55,790 --> 00:44:57,795 og selv om din Datamaskinen har ikke krasjet, 1039 00:44:57,795 --> 00:45:01,690 det blir så mye tregere, som om det er virkelig 1040 00:45:01,690 --> 00:45:04,290 bruker mye minne eller ressurser, selv om, 1041 00:45:04,290 --> 00:45:06,070 hvis du ikke selv å trykke på tastaturet, 1042 00:45:06,070 --> 00:45:10,430 som kunne be-- men ikke always-- kunne være at programmene du kjører 1043 00:45:10,430 --> 00:45:11,920 har selv minnelekkasjer. 1044 00:45:11,920 --> 00:45:15,645 Og de fortsette å spørre OS for mer og mer minne, men glemme det, 1045 00:45:15,645 --> 00:45:18,470 faktisk ikke bruke det, men derfor tar minne bort 1046 00:45:18,470 --> 00:45:20,500 fra andre programmer som kanskje ønsker det. 1047 00:45:20,500 --> 00:45:23,940 Så det er en vanlig forklaring. 1048 00:45:23,940 --> 00:45:25,940 Nå her er der Valgrind sin produksjonen er helt 1049 00:45:25,940 --> 00:45:29,290 fryktelig til de mindre og mer like komfortabel. 1050 00:45:29,290 --> 00:45:32,690 Men det interessante ting er rett her oppe. 1051 00:45:32,690 --> 00:45:37,060 Det er å fortelle meg en ugyldig skrive av størrelse fire som skjer i dette programmet, 1052 00:45:37,060 --> 00:45:40,640 Særlig i linje 21 av memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Hvis jeg går til linje 21, hm, det faktisk er en ugyldig skrive av størrelse fire. 1054 00:45:45,450 --> 00:45:46,250 Hvorfor størrelse fire? 1055 00:45:46,250 --> 00:45:49,500 Vel, dette number-- og det kan være noe-- er en int. 1056 00:45:49,500 --> 00:45:50,450 Så det er fire byte. 1057 00:45:50,450 --> 00:45:52,550 Så jeg setter fire bytes der de ikke hører hjemme. 1058 00:45:52,550 --> 00:45:55,080 Det er det Valgrind er faktisk å fortelle meg. 1059 00:45:55,080 --> 00:45:57,600 Videre vil det også fortell meg, så vi får se, 1060 00:45:57,600 --> 00:46:01,490 som du kjører dette i en fremtidig PSet, hvis og når du har lekket minne, som faktisk 1061 00:46:01,490 --> 00:46:05,300 Jeg har, fordi jeg har kalt malloc, men jeg har faktisk ikke 1062 00:46:05,300 --> 00:46:08,010 heter, i dette tilfellet, fri, som vi vil til slutt se 1063 00:46:08,010 --> 00:46:09,830 er det motsatte av malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Så nå, tror jeg, en siste eksempel. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Så dette er litt mer uforståelige, men det er kanskje 1068 00:46:16,690 --> 00:46:19,180 den største grunnen til være forsiktig med minne, 1069 00:46:19,180 --> 00:46:24,490 og på grunn av at mange programmer og / eller webservere, selv til denne dagen, 1070 00:46:24,490 --> 00:46:28,200 overtas av skurkene sted på internett som er en eller annen måte 1071 00:46:28,200 --> 00:46:33,390 sende falske pakker til serveren din prøver å kompromittere kontoene dine, 1072 00:46:33,390 --> 00:46:36,420 eller ta dine data, eller bare som regel overtar en maskin. 1073 00:46:36,420 --> 00:46:38,910 Buffer overløp, som navnet antyder, betyr 1074 00:46:38,910 --> 00:46:40,740 fylte ikke en int, men en buffer. 1075 00:46:40,740 --> 00:46:43,490 Og en buffer er bare en fancy måte for å si det er en haug med minne. 1076 00:46:43,490 --> 00:46:46,710 >> Og ja, jeg ringte en streng før buffer, i stedet for s. 1077 00:46:46,710 --> 00:46:49,234 For hvis det er en buffer, som i YouTube forstand, 1078 00:46:49,234 --> 00:46:52,400 eller helst du ser på en video, du kanskje har sett ordet bufring, 1079 00:46:52,400 --> 00:46:53,040 prikk, prikk, prikk. 1080 00:46:53,040 --> 00:46:54,240 Det er utrolig irriterende. 1081 00:46:54,240 --> 00:46:55,990 Og det betyr bare at din videospiller 1082 00:46:55,990 --> 00:46:58,710 prøver å laste ned masse byte, masse bytes 1083 00:46:58,710 --> 00:47:00,170 fra en video fra internett. 1084 00:47:00,170 --> 00:47:02,920 Men det er treg, så det er prøver å laste ned en haug av dem 1085 00:47:02,920 --> 00:47:06,430 å fylle en buffer, en beholder, slik at du har nok byte som det kan da 1086 00:47:06,430 --> 00:47:09,174 vise deg videoen, uten pause hele tiden. 1087 00:47:09,174 --> 00:47:11,340 Men det viser seg, kan du ha en buffer til denne store. 1088 00:47:11,340 --> 00:47:15,710 Men prøv å sette dette mye data i det, og veldig dårlige ting kan skje. 1089 00:47:15,710 --> 00:47:22,780 Så for eksempel, la oss se på dette siste teaser av et eksempel. 1090 00:47:22,780 --> 00:47:24,720 Dette er et annet program som, ved første øyekast, 1091 00:47:24,720 --> 00:47:26,540 gjør ikke noe super nyttig. 1092 00:47:26,540 --> 00:47:29,590 Det har en hovedfunksjon som kaller denne funksjonen, f. 1093 00:47:29,590 --> 00:47:36,640 Og den funksjonen, f, her oppe, har en char array, kalt c, på størrelse 12. 1094 00:47:36,640 --> 00:47:39,340 Og så er det ved hjelp av dette ny funksjon kalt strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Det viser seg at med denne enkle, enkel linje med kode, bare to linjer, 1097 00:47:45,190 --> 00:47:49,130 vi har gjort hele mitt program, og derfor hele min datamaskin, 1098 00:47:49,130 --> 00:47:54,000 og min brukerkonto, og mine hardt kjøre potensielt sårbar for alle 1099 00:47:54,000 --> 00:47:58,170 som kjenner og er god nok til å kjøre dette programmet med en viss kommandolinje 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Med andre ord, hvis denne skurken setter innsiden av argvargv [1] ved å skrive 1102 00:48:03,400 --> 00:48:08,750 på tastaturet en meget spesiallaget streng, ikke abc, 123, men i hovedsak, 1103 00:48:08,750 --> 00:48:15,180 binære symboler som representerer kjørbar kode, et program som han eller hun skrev, 1104 00:48:15,180 --> 00:48:19,190 Med denne enkle program, som er representant for tusenvis av programmer 1105 00:48:19,190 --> 00:48:23,610 som er like sårbare, daresay, han eller hun kan til slutt slette alle 1106 00:48:23,610 --> 00:48:26,680 filene på harddisken min, få en blinkende teksten slik at han eller hun kan 1107 00:48:26,680 --> 00:48:30,170 skriver kommandoer på egen hånd, e alle filene til meg selv. 1108 00:48:30,170 --> 00:48:34,660 Noe jeg kan gjøre, han eller hun kan gjøre med denne koden. 1109 00:48:34,660 --> 00:48:36,575 >> Vi vil ikke helt løse dette ennå. 1110 00:48:36,575 --> 00:48:38,700 Og faktisk, det kommer til å innebære et lite bilde 1111 00:48:38,700 --> 00:48:41,470 som dette, som vi vil snart komme å forstå alle bedre. 1112 00:48:41,470 --> 00:48:44,480 Men for i dag, la oss avslutte på hva er, forhåpentligvis, en litt mer 1113 00:48:44,480 --> 00:48:48,360 forståelig XKCD spøk, før vi fortsette neste gang. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Greit. 1116 00:48:51,600 --> 00:48:53,446 Ser deg på onsdag. 1117 00:48:53,446 --> 00:48:54,754 >> [Musikk spilles] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Og nå, dyp tanker, etter Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Minne er som å hoppe inn i en haug av gylne blader på en søndag ettermiddag. 1121 00:49:04,770 --> 00:49:09,000 Vinden blåser, kaste din hair-- oh, jeg savner dagene when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Latter] 1124 00:49:12,650 --> 00:49:13,750