1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: Greit, velkommen tilbake. 3 00:00:12,580 --> 00:00:13,290 Dette er CS50. 4 00:00:13,290 --> 00:00:15,130 Dette er starten på uke syv. 5 00:00:15,130 --> 00:00:18,890 Så det har gått en stund, så jeg trodde vi skulle ta en rask tur hvor vi 6 00:00:18,890 --> 00:00:20,760 slapp og hvor vi er nå i gang. 7 00:00:20,760 --> 00:00:23,310 >> Så denne tingen her kan ha forårsaket noen angst i begynnelsen. 8 00:00:23,310 --> 00:00:27,680 Men forhåpentligvis, du begynner å akklimatisere seg til hva dette betyr her - 9 00:00:27,680 --> 00:00:32,670 stjerne representerer en peker, som er akkurat det, i mer lekmann vilkår? 10 00:00:32,670 --> 00:00:33,400 Så det er en adresse. 11 00:00:33,400 --> 00:00:35,490 >> Så det er adressen til noe i minnet. 12 00:00:35,490 --> 00:00:38,260 Og vi begynte å skrelle tilbake lagene et par uker siden, ting liker 13 00:00:38,260 --> 00:00:41,800 GetString og andre slike funksjoner hele denne tiden har vært tilbake 14 00:00:41,800 --> 00:00:46,010 adressene til ting i minnet, som Adressen til det første tegnet i 15 00:00:46,010 --> 00:00:46,990 noen sekvens. 16 00:00:46,990 --> 00:00:50,360 >> Så vi også innført Valgrind, som du vil begynne å bruke for dette problemet 17 00:00:50,360 --> 00:00:53,380 angitt, spesielt for den neste Problemet apparat i tillegg. 18 00:00:53,380 --> 00:00:54,980 Og Valgrind gjør hva for oss? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Den sjekker for minnelekkasjer, og det også sjekker for misbruk av minne. 21 00:01:01,020 --> 00:01:05,890 >> Det kan, med en viss sannsynlighet, oppdage om koden din kommer til å berøre minne 22 00:01:05,890 --> 00:01:07,100 at det rett og slett ikke burde. 23 00:01:07,100 --> 00:01:10,410 Så ikke nødvendigvis en lekkasje, men hvis du gå utover grensene for noen 24 00:01:10,410 --> 00:01:14,730 array, og du faktisk kjøre Valgrind og indusere at atferd mens 25 00:01:14,730 --> 00:01:17,870 Valgrind kjører i programmet er kjører inne i den, vil du få 26 00:01:17,870 --> 00:01:21,460 meldinger som dette - "ugyldig skrive av størrelse 4 ", som husker et par 27 00:01:21,460 --> 00:01:25,880 uker siden betydde at jeg hadde et uhell som på en int for langt 28 00:01:25,880 --> 00:01:27,250 over grensene av en matrise. 29 00:01:27,250 --> 00:01:30,790 Og så størrelse 4 her betyr størrelsen av den aktuelle int. 30 00:01:30,790 --> 00:01:35,260 >> Så ta oppmuntring i det faktum at Valgrind utgang, formatet på det, 31 00:01:35,260 --> 00:01:36,170 er bare fryktelig. 32 00:01:36,170 --> 00:01:40,180 Det er virkelig vanskelig å se gjennom rotet for interessant informasjon. 33 00:01:40,180 --> 00:01:42,910 Så det vi har gjort her er bare utdrag noen av de par mer 34 00:01:42,910 --> 00:01:43,850 interessante linjer. 35 00:01:43,850 --> 00:01:46,760 Men innser at 80% av Valgrind er produksjonen kommer til å være litt av en 36 00:01:46,760 --> 00:01:47,650 distraksjon. 37 00:01:47,650 --> 00:01:52,820 >> Bare se etter mønstre som dette - ugyldig høyre, ugyldig lese, 40 bytes 38 00:01:52,820 --> 00:01:56,690 og et antall blokker er definitivt tapt, søkeord sånn. 39 00:01:56,690 --> 00:02:01,920 Og hva vil du forhåpentligvis se er noen slags spor av hvilken funksjon 40 00:02:01,920 --> 00:02:03,340 feil er faktisk i. 41 00:02:03,340 --> 00:02:07,195 I dette tilfellet er her, i hvilken linje koden min var feilen tilsynelatende? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 i en fil kalt memory.c, som var eksempelet vi lekte med 44 00:02:14,130 --> 00:02:14,890 på den tiden. 45 00:02:14,890 --> 00:02:16,460 Så det er nok ikke i malloc. 46 00:02:16,460 --> 00:02:18,630 Det var trolig i koden min i stedet. 47 00:02:18,630 --> 00:02:20,910 Så får vi se dette igjen og igjen før lenge. 48 00:02:20,910 --> 00:02:24,080 >> Så scanf, kom dette opp i en par av skjemaer så langt. 49 00:02:24,080 --> 00:02:26,410 Vi så sscanf kort. 50 00:02:26,410 --> 00:02:28,330 Det var noe en rekke du stupte inn i din 51 00:02:28,330 --> 00:02:29,535 forberedelsene til quiz. 52 00:02:29,535 --> 00:02:33,130 Og scanf er faktisk hva CS50 Biblioteket er brukt under 53 00:02:33,130 --> 00:02:36,560 hette i ganske lang tid for å få input fra brukeren. 54 00:02:36,560 --> 00:02:40,420 >> For eksempel, hvis jeg flytter over til CS50 apparatet her, la meg åpne opp en 55 00:02:40,420 --> 00:02:45,315 eksempel i dag som kalles scanf-0.c Og det er super enkelt. 56 00:02:45,315 --> 00:02:46,590 Det er bare noen få linjer med kode. 57 00:02:46,590 --> 00:02:50,880 Men det viser egentlig hvor getInt har arbeidet hele denne tiden. 58 00:02:50,880 --> 00:02:54,710 >> I dette programmet her, på linje 16. Legg merke til at jeg erklære en int. 59 00:02:54,710 --> 00:02:57,270 Så ingen pekere, ingenting magisk der, bare en int. 60 00:02:57,270 --> 00:03:00,330 Så i linje 17, ber jeg brukeren etter et nummer, takk. 61 00:03:00,330 --> 00:03:02,930 Så i slutten av 18, jeg bruker scanf her. 62 00:03:02,930 --> 00:03:06,910 Og jeg er spesifisert, type som printf, at jeg venter sitat 63 00:03:06,910 --> 00:03:08,110 unquote prosent i. 64 00:03:08,110 --> 00:03:10,920 >> Så prosent I selvsagt betegner en int. 65 00:03:10,920 --> 00:03:14,580 Men legg merke til hva den andre argumentet til scanf er. 66 00:03:14,580 --> 00:03:17,350 Hvordan vil du beskrive den andre argumentet etter kommaet? 67 00:03:17,350 --> 00:03:19,450 Hva er det? 68 00:03:19,450 --> 00:03:20,670 >> Det er adressen til x. 69 00:03:20,670 --> 00:03:25,490 Så dette er nyttig fordi ved å gi scanf med adressen til x, hva gjør 70 00:03:25,490 --> 00:03:29,560 som mulig for den funksjonen å gjøre? 71 00:03:29,560 --> 00:03:33,010 Ikke bare gå dit, men også gjøre det? 72 00:03:33,010 --> 00:03:34,060 >> Gjøre en endring til det. 73 00:03:34,060 --> 00:03:38,080 Fordi du kan gå der, det er liksom som et kart til et sted i minnet. 74 00:03:38,080 --> 00:03:41,900 Og så lenge du gir scanf, eller noen funksjon med et slikt kart, som 75 00:03:41,900 --> 00:03:45,840 Funksjonen kan gå dit, og ikke bare se på verdien, men det kan også 76 00:03:45,840 --> 00:03:49,670 endre denne verdien, noe som er nyttig hvis hensikten i livet til scanf er å 77 00:03:49,670 --> 00:03:53,060 skanne input fra brukeren, spesielt fra tastaturet. 78 00:03:53,060 --> 00:03:57,830 Og f betegner formatert, akkurat som printf, betegner f en formatert 79 00:03:57,830 --> 00:03:58,930 streng som du vil skrive ut. 80 00:03:58,930 --> 00:04:04,430 >> Så kort sagt, denne linjen 18 bare sier, prøver å lese en int fra brukerens 81 00:04:04,430 --> 00:04:10,420 tastatur og lagre den på innsiden av x, på uansett adresse x tilfeldigvis lever. 82 00:04:10,420 --> 00:04:14,860 Og så til slutt, linje 19 bare sier, takk for int, i dette tilfellet. 83 00:04:14,860 --> 00:04:15,940 >> Så la meg gå videre og gjøre dette. 84 00:04:15,940 --> 00:04:18,570 Så gjør scanf 0. 85 00:04:18,570 --> 00:04:20,130 La meg gå videre og zoome inn 86 00:04:20,130 --> 00:04:22,960 Jeg skal gå og kjøre denne med prikker slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nummer, please? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Takk for 50. 90 00:04:25,730 --> 00:04:27,270 Så det er ganske enkel. 91 00:04:27,270 --> 00:04:28,160 >> Nå hva er det ikke å gjøre? 92 00:04:28,160 --> 00:04:29,940 Det er ikke å gjøre en hel haug av feilsjekking. 93 00:04:29,940 --> 00:04:33,000 For eksempel, hvis jeg ikke samarbeider, og jeg ikke skriver inn et nummer, men 94 00:04:33,000 --> 00:04:37,860 stedet jeg skriver noe sånt som "hallo", det er bare ganske rar. 95 00:04:37,860 --> 00:04:41,130 Og så en av de tingene CS50 Biblioteket har gjort for oss for noen 96 00:04:41,130 --> 00:04:43,440 Klokken er at reprompting og reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Retry setning tilbakekallingen var i cs50.c, og det er grunnen til at getInt i 98 00:04:49,320 --> 00:04:51,670 den CS50 biblioteket er faktisk en hel haug med linjer lange, fordi vi er 99 00:04:51,670 --> 00:04:53,190 sjekker for dumme ting som dette. 100 00:04:53,190 --> 00:04:55,730 Visste brukeren ikke gi oss, faktisk, en int? 101 00:04:55,730 --> 00:04:57,910 Har han eller hun gi oss noe som en alfabetisk brevet? 102 00:04:57,910 --> 00:05:01,410 I så fall ønsker vi å oppdage det og kjefte på dem. 103 00:05:01,410 --> 00:05:03,915 >> Men ting blir mer interessant i denne neste eksempel. 104 00:05:03,915 --> 00:05:09,840 Hvis jeg går til scanf-1.c, er hva en ting som er fundamentalt endret i 105 00:05:09,840 --> 00:05:11,135 dette neste eksempel? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Jeg bruker char *, selvfølgelig, i stedet for int. 108 00:05:16,010 --> 00:05:19,210 >> Så dette er interessant, fordi røye *, husker, er egentlig bare 109 00:05:19,210 --> 00:05:20,190 samme som streng. 110 00:05:20,190 --> 00:05:23,840 Så det føles som kanskje dette er en super enkel implementering av GetString. 111 00:05:23,840 --> 00:05:26,010 Men jeg har skrelles tilbake layer av CS50-biblioteket, så jeg er 112 00:05:26,010 --> 00:05:27,550 kalle dette røye * nå. 113 00:05:27,550 --> 00:05:30,070 Så la oss se der, hvis noe, vi går galt. 114 00:05:30,070 --> 00:05:30,840 >> Linje 17 - 115 00:05:30,840 --> 00:05:33,950 Jeg igjen si, kan du gi meg noe, i dette tilfellet, en streng. 116 00:05:33,950 --> 00:05:37,940 Og så i neste linje, kaller jeg scanf, igjen, gir det et format kode, 117 00:05:37,940 --> 00:05:39,310 men denne gangen prosent s. 118 00:05:39,310 --> 00:05:41,900 Og så denne gangen er jeg gir det buffer. 119 00:05:41,900 --> 00:05:43,550 >> Legg merke til nå, er jeg ikke bruker -tegnet. 120 00:05:43,550 --> 00:05:47,120 Men hvorfor er det sannsynligvis OK her? 121 00:05:47,120 --> 00:05:49,760 Fordi det er buffer allerede? 122 00:05:49,760 --> 00:05:50,770 Det er allerede en peker. 123 00:05:50,770 --> 00:05:51,650 Det er allerede en adresse. 124 00:05:51,650 --> 00:05:54,510 >> Og la oss dette ordet "forvirre", la meg bare kalle det er, for eksempel, for 125 00:05:54,510 --> 00:05:55,050 enkelhet. 126 00:05:55,050 --> 00:05:58,250 Men jeg har kalt det bufre fordi i Generelt, i programmering, hvis du har en 127 00:05:58,250 --> 00:06:02,130 del av minnet som en streng virkelig bare er, kan du kalle det en buffer. 128 00:06:02,130 --> 00:06:04,460 Det er et sted å lagre informasjon. 129 00:06:04,460 --> 00:06:07,400 >> I likhet med ting som YouTube, da de er bufring, så å si, at 130 00:06:07,400 --> 00:06:10,270 betyr bare at det er nedlasting av biter fra Internett og lagre dem i en 131 00:06:10,270 --> 00:06:14,160 lokale array, en lokal del av minnet slik at du kan se det senere uten 132 00:06:14,160 --> 00:06:16,830 det hoppe eller henger på deg mens du spiller. 133 00:06:16,830 --> 00:06:20,930 >> Så det er et problem her skjønt, fordi jeg forteller scanf, forventer en 134 00:06:20,930 --> 00:06:22,320 strengen fra brukeren. 135 00:06:22,320 --> 00:06:24,410 Her er adressen til en del av minnet. 136 00:06:24,410 --> 00:06:26,180 Sett at strengen der. 137 00:06:26,180 --> 00:06:31,230 Hvorfor er det bundet gi problemer for oss, skjønt? 138 00:06:31,230 --> 00:06:33,490 >> Hva er det? 139 00:06:33,490 --> 00:06:35,510 Har jeg lov til å få tilgang den del av hukommelsen? 140 00:06:35,510 --> 00:06:36,250 Du vet, jeg vet ikke. 141 00:06:36,250 --> 00:06:39,210 Fordi har buffer blitt initialisert til noe? 142 00:06:39,210 --> 00:06:39,820 Ikke egentlig. 143 00:06:39,820 --> 00:06:43,090 Og så det er hva vi har ringt en søppel verdi, hvilken 144 00:06:43,090 --> 00:06:44,040 er ikke en formell ord. 145 00:06:44,040 --> 00:06:49,200 Det betyr bare vi har ingen anelse om hva bits er innsiden av de fire byte som 146 00:06:49,200 --> 00:06:51,240 Jeg har avsatt som buffer. 147 00:06:51,240 --> 00:06:52,450 >> Jeg har ikke kalt malloc. 148 00:06:52,450 --> 00:06:53,940 Jeg har definitivt ikke kalt GetString. 149 00:06:53,940 --> 00:06:56,380 Så hvem vet hva som faktisk er innsiden av buffer? 150 00:06:56,380 --> 00:07:00,550 Og likevel fortelle scanf blindt, går det og plassere hva brukeren har skrevet. 151 00:07:00,550 --> 00:07:04,460 >> Så hva er sannsynlig å forårsake i koden vår hvis vi kjøre den? 152 00:07:04,460 --> 00:07:05,700 Sannsynligvis en segfault. 153 00:07:05,700 --> 00:07:07,970 Kanskje ikke, men sannsynligvis en segfault. 154 00:07:07,970 --> 00:07:10,620 Og jeg sier kanskje ikke fordi noen ganger du gjør, noen ganger 155 00:07:10,620 --> 00:07:11,380 du får ikke en segfault. 156 00:07:11,380 --> 00:07:14,280 Noen ganger får du bare heldig, men det likevel kommer til å være 157 00:07:14,280 --> 00:07:15,340 en bug i programmet vårt. 158 00:07:15,340 --> 00:07:17,060 >> Så la meg gå videre og kompilere dette. 159 00:07:17,060 --> 00:07:18,280 Jeg kommer til å gjøre det på den gamle skolen måte. 160 00:07:18,280 --> 00:07:23,825 Så klang dash 0, scanf-en, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Oops, også gamle skolen. 162 00:07:24,720 --> 00:07:26,550 La oss se. 163 00:07:26,550 --> 00:07:28,440 Hvor gikk jeg? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, takk - 167 00:07:35,130 --> 00:07:36,930 Lagre, OK - 168 00:07:36,930 --> 00:07:37,690 svært gamle skolen. 169 00:07:37,690 --> 00:07:38,900 Greit, det har vært en stund. 170 00:07:38,900 --> 00:07:41,720 >> Så jeg har nettopp reddet filen etter noe som gjør at midlertidig 171 00:07:41,720 --> 00:07:42,700 endre et øyeblikk siden. 172 00:07:42,700 --> 00:07:46,090 Og nå har jeg samlet det manuelt med Clang. 173 00:07:46,090 --> 00:07:49,500 Og nå skal jeg gå videre og kjøre scanf-en, Enter. 174 00:07:49,500 --> 00:07:50,290 String behage. 175 00:07:50,290 --> 00:07:51,600 Jeg skal skrive inn "hei." 176 00:07:51,600 --> 00:07:54,070 >> Og nå, her er der, ærlig, printf kan er litt irriterende. 177 00:07:54,070 --> 00:07:56,020 Det er faktisk ikke kommer til segfault i dette tilfellet. 178 00:07:56,020 --> 00:07:59,860 Printf er litt spesiell fordi det er så super vanlig at 179 00:07:59,860 --> 00:08:03,570 hovedsak printf gjør oss en tjeneste og realisere, 180 00:08:03,570 --> 00:08:04,830 det er ikke en gyldig peker. 181 00:08:04,830 --> 00:08:09,080 La meg ta det på meg å bare skrive ut i parentes null, selv 182 00:08:09,080 --> 00:08:13,340 men det er ikke nødvendigvis hva vi selv forventet. 183 00:08:13,340 --> 00:08:16,940 >> Så vi kan egentlig lett indusere en segfault med dette, men klart dette 184 00:08:16,940 --> 00:08:18,600 er ikke oppførselen jeg ønsket. 185 00:08:18,600 --> 00:08:19,800 Så hva er den enkle løsningen? 186 00:08:19,800 --> 00:08:25,650 Vel, i scanf-2, la meg foreslå at i stedet for å faktisk bare tildeling av en 187 00:08:25,650 --> 00:08:30,100 char *, la meg være litt smartere om dette, og la meg allokere buffer 188 00:08:30,100 --> 00:08:32,940 som en sekvens av 16 tegn. 189 00:08:32,940 --> 00:08:34,200 >> Så jeg kan gjøre dette i et par måter. 190 00:08:34,200 --> 00:08:35,610 Jeg kunne absolutt bruke malloc. 191 00:08:35,610 --> 00:08:38,980 Men jeg kan gå tilbake til uke to når Jeg trengte bare en hel haug med 192 00:08:38,980 --> 00:08:39,620 tegn. 193 00:08:39,620 --> 00:08:40,860 Det er bare en matrise. 194 00:08:40,860 --> 00:08:44,870 Så la meg i stedet omdefinere buffer å være en matrise av 16 tegn. 195 00:08:44,870 --> 00:08:47,340 >> Og nå, når jeg passerer buffer i - 196 00:08:47,340 --> 00:08:49,940 og dette er noe vi ikke snakke om i uke to - 197 00:08:49,940 --> 00:08:53,730 men du kan behandle en matrise som om det er en adresse. 198 00:08:53,730 --> 00:08:56,390 Teknisk sett, som vi har sett, er de litt annerledes. 199 00:08:56,390 --> 00:09:01,290 Men scanf vil ikke tankene hvis du passerer det navnet på en matrise, fordi det 200 00:09:01,290 --> 00:09:05,030 Clang vil gjøre for oss er egentlig behandle navnet på denne matrisen som 201 00:09:05,030 --> 00:09:08,280 adressen til blings av 16 byte. 202 00:09:08,280 --> 00:09:09,550 >> Så dette er bedre. 203 00:09:09,550 --> 00:09:12,110 Dette betyr nå at jeg kan forhåpentligvis gjør du følgende. 204 00:09:12,110 --> 00:09:16,800 La meg zoome ut et øyeblikk og gjør scanf-2, utarbeidet OK. 205 00:09:16,800 --> 00:09:19,390 Nå la meg gjøre fikk slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 String behage. "Hello". Og det syntes å fungere denne gangen. 207 00:09:22,430 --> 00:09:26,020 >> Men kan noen foreslå et scenario der ikke kan det fortsatt virke? 208 00:09:26,020 --> 00:09:28,550 Yeah? 209 00:09:28,550 --> 00:09:30,640 Noe lengre enn 16 tegn. 210 00:09:30,640 --> 00:09:32,020 Og faktisk, kan vi være litt mer presis. 211 00:09:32,020 --> 00:09:36,540 Noe lenger enn 15 tegn, fordi vi virkelig trenger å huske på 212 00:09:36,540 --> 00:09:39,920 at vi trenger at backslash null implisitt ved enden av strengen, 213 00:09:39,920 --> 00:09:42,950 som er en side scanf vil typisk ta vare på for oss. 214 00:09:42,950 --> 00:09:46,210 >> Så la meg gjøre noe sånt - 215 00:09:46,210 --> 00:09:48,040 Noen ganger kan vi bare la det sånn. 216 00:09:48,040 --> 00:09:50,630 OK, så vi har nå indusert vår segmentering feil. 217 00:09:50,630 --> 00:09:51,000 Hvorfor? 218 00:09:51,000 --> 00:09:54,940 Fordi jeg skrev til mer enn 15 tegn, og så vi har faktisk 219 00:09:54,940 --> 00:09:58,280 rørte minne som jeg faktisk ikke burde ha. 220 00:09:58,280 --> 00:10:00,180 >> Så hva er egentlig løsningen her? 221 00:10:00,180 --> 00:10:02,210 Vel, hva om vi trenger en lengre streng? 222 00:10:02,210 --> 00:10:03,960 Vel, vi kanskje gjøre det 32 ​​bytes. 223 00:10:03,960 --> 00:10:05,160 Vel, hva om det ikke er lenge nok? 224 00:10:05,160 --> 00:10:06,040 Hvordan ca 64 bytes? 225 00:10:06,040 --> 00:10:07,080 Hva hvis det ikke er lenge nok? 226 00:10:07,080 --> 00:10:09,640 Hva med 128 eller 200 bytes? 227 00:10:09,640 --> 00:10:12,660 Hva er egentlig løsningen her i generelle tilfellet, hvis vi ikke vet i 228 00:10:12,660 --> 00:10:14,460 avansere hva brukeren kommer til å skrive? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Det er bare slags en stor smerte i ræva, for å være ærlig, det er derfor den 231 00:10:23,050 --> 00:10:29,050 CS50 Biblioteket har et par dusin linjer kode som kollektivt implementere 232 00:10:29,050 --> 00:10:32,390 GetString streng på en måte som vi ikke må vite på forhånd hva 233 00:10:32,390 --> 00:10:33,430 brukeren kommer til å skrive. 234 00:10:33,430 --> 00:10:37,370 Spesielt hvis du ser tilbake på cs50.c fra to uker siden, vil du se 235 00:10:37,370 --> 00:10:40,480 at GetString faktisk gjør Ikke bruk scanf på denne måten. 236 00:10:40,480 --> 00:10:43,720 Snarere, leser det ett tegn gangen. 237 00:10:43,720 --> 00:10:46,010 >> Fordi en fin ting om lese ett tegn er at vi kan 238 00:10:46,010 --> 00:10:48,490 garantere oss til alltid har minst en røye. 239 00:10:48,490 --> 00:10:51,740 Jeg kan bare erklære en røye, og deretter ta disse virkelig små steg til bare 240 00:10:51,740 --> 00:10:54,380 lese ett tegn på at en tid fra tastaturet. 241 00:10:54,380 --> 00:10:58,240 Og så, hva du vil se GetString gjør er hver gang den går tom for, 242 00:10:58,240 --> 00:11:02,280 si, 16 byte minne, bruker den malloc, eller en fetter av denne, til 243 00:11:02,280 --> 00:11:06,810 tildele mer minne, kopiere gamle minnet inn i det nye, og deretter krypende 244 00:11:06,810 --> 00:11:09,900 sammen, får ett tegn om gangen, og når den går ut av det 245 00:11:09,900 --> 00:11:13,370 del av minnet, kaster det bort, griper en større del av minnet, kopierer gamle 246 00:11:13,370 --> 00:11:14,750 inn i nye, og gjentar. 247 00:11:14,750 --> 00:11:18,480 Og det er virkelig en smerte å faktisk gjennomføre noe så enkelt som 248 00:11:18,480 --> 00:11:19,710 få innspill fra en bruker. 249 00:11:19,710 --> 00:11:21,090 >> Så du kan bruke scanf. 250 00:11:21,090 --> 00:11:22,430 Du kan bruke andre lignende funksjoner. 251 00:11:22,430 --> 00:11:25,420 Og mange av lærebøker og online eksempler gjør, men de er alle 252 00:11:25,420 --> 00:11:27,210 sårbare for problemer som dette. 253 00:11:27,210 --> 00:11:29,550 Og til slutt, får en segfault er litt irriterende. 254 00:11:29,550 --> 00:11:30,680 Det er ikke bra for brukeren. 255 00:11:30,680 --> 00:11:33,560 >> Men i verste fall, hva gjør det fundamentalt sette 256 00:11:33,560 --> 00:11:37,160 kode i fare for? 257 00:11:37,160 --> 00:11:39,250 En slags angrep, potensielt. 258 00:11:39,250 --> 00:11:41,680 Vi snakket om et slikt anfall - overfylte stabelen. 259 00:11:41,680 --> 00:11:44,660 Men generelt, hvis du har lov til overflow en buffer, som vi gjorde en 260 00:11:44,660 --> 00:11:48,070 par uker siden, med bare å skrive mer enn "hei" på stakken, du 261 00:11:48,070 --> 00:11:52,330 kan faktisk ta over, potensielt, en datamaskin, eller i det minste få på data som 262 00:11:52,330 --> 00:11:53,510 ikke tilhører deg. 263 00:11:53,510 --> 00:11:55,970 >> Så kort sagt, dette er grunnen til at vi har de trening hjul. 264 00:11:55,970 --> 00:11:59,090 Men nå begynner vi å ta dem av, som våre programmer ikke trenger lenger, 265 00:11:59,090 --> 00:12:00,610 nødvendigvis, input fra brukeren. 266 00:12:00,610 --> 00:12:03,960 Men i tilfelle av problemet satt seks, dine innspill vil komme fra et stort 267 00:12:03,960 --> 00:12:07,520 ordlistefilen med 150 noen Odd tusen ord. 268 00:12:07,520 --> 00:12:10,330 >> Så du slipper å bekymre deg for brukerens vilkårlig inngang. 269 00:12:10,330 --> 00:12:13,720 Vi vil gi deg noen forutsetninger om filen. 270 00:12:13,720 --> 00:12:20,340 Eventuelle spørsmål om pekere eller scanf eller brukerundersøkelser generelt? 271 00:12:20,340 --> 00:12:24,450 >> Ok, så en rask titt da på en etterfølgende tema fra to uker siden. 272 00:12:24,450 --> 00:12:28,590 Og det var denne tanken om en struct. 273 00:12:28,590 --> 00:12:34,180 Ikke det - denne tanken om en konstruere, som var det? 274 00:12:34,180 --> 00:12:35,430 Hva gjorde struct gjøre for oss? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definer - 277 00:12:39,860 --> 00:12:41,710 beklager? 278 00:12:41,710 --> 00:12:42,820 Definere en variabel type. 279 00:12:42,820 --> 00:12:44,410 Så liksom. 280 00:12:44,410 --> 00:12:46,180 Vi faktisk kombinere to emner. 281 00:12:46,180 --> 00:12:49,510 Så med typedef, husker at vi kan erklære en type vår egen, som en 282 00:12:49,510 --> 00:12:51,500 synonym, som snor etter røye *. 283 00:12:51,500 --> 00:12:56,200 Men ved hjelp av typedef og struct, kan vi skape virkelig våre egne datastrukturer. 284 00:12:56,200 --> 00:12:59,600 >> For eksempel, hvis jeg går tilbake til gedit her for en liten stund, og jeg går videre 285 00:12:59,600 --> 00:13:08,230 og gjøre noe sånt, la meg spare dette som, la oss si, structs.c 286 00:13:08,230 --> 00:13:10,840 midlertidig, jeg bare kommer å gå videre og omfatte 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main ugyldig. 288 00:13:14,360 --> 00:13:18,960 Og så i her, antar at jeg vil å skrive et program som lagrer 289 00:13:18,960 --> 00:13:21,840 flere studenter fra flere hus, for eksempel. 290 00:13:21,840 --> 00:13:24,430 Så det er som en registrarial database av noe slag. 291 00:13:24,430 --> 00:13:29,550 >> Så hvis jeg trenger navnet en student, jeg kan gjøre noe sånt char * navn, 292 00:13:29,550 --> 00:13:31,570 og jeg skal gjøre noe sånt - 293 00:13:31,570 --> 00:13:34,410 faktisk, la oss bruke CS50 bibliotek for bare et øyeblikk å gjøre dette til en 294 00:13:34,410 --> 00:13:38,380 litt enklere, så vi kan låne de dusinvis av linjer med kode. 295 00:13:38,380 --> 00:13:39,340 Og la oss holde bare det enkelt. 296 00:13:39,340 --> 00:13:42,610 Vi vil holde det streng, og nå GetString. 297 00:13:42,610 --> 00:13:47,420 >> Så jeg hevder nå at jeg har lagret navnet av noen student, og huset 298 00:13:47,420 --> 00:13:50,240 noen student, bare ved hjelp av variabler som vi gjorde, og i uke en. 299 00:13:50,240 --> 00:13:52,370 Men antar jeg nå ønsker å støtte flere studenter. 300 00:13:52,370 --> 00:13:58,460 All right, så mine instinkter er å gjøre string navn2, blir GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 får GetString. 302 00:14:01,370 --> 00:14:05,850 Og da er vår tredje student, la oss gjøre NAME3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Ok, så dette er forhåpentligvis slående du som en slags dum, 304 00:14:09,170 --> 00:14:11,580 fordi denne prosessen er egentlig aldri kommer til å ende, og det er bare kommer til 305 00:14:11,580 --> 00:14:13,130 gjøre mitt koden ser verre og verre og verre. 306 00:14:13,130 --> 00:14:14,810 Men vi løste dette også i uke to. 307 00:14:14,810 --> 00:14:19,450 Hva var vår relativt ren løsning når vi hadde flere variabler av 308 00:14:19,450 --> 00:14:23,580 samme datatype som alle er i slekt, men vi ønsker ikke dette fryktelig rot 309 00:14:23,580 --> 00:14:26,870 av lignende navn variabler? 310 00:14:26,870 --> 00:14:30,060 Hva gjorde vi i stedet? 311 00:14:30,060 --> 00:14:31,260 >> Så jeg tror jeg hørte noen steder. 312 00:14:31,260 --> 00:14:32,590 Vi hadde en matrise. 313 00:14:32,590 --> 00:14:37,110 Hvis du vil ha flere forekomster av noe, hvorfor ikke vi rydde alt dette 314 00:14:37,110 --> 00:14:39,540 opp og bare si, gi meg matrise kalt navn? 315 00:14:39,540 --> 00:14:41,640 >> Og for nå, la oss hardt kode tre. 316 00:14:41,640 --> 00:14:44,450 Og så gi meg en annen matrise kalt hus, og la meg for 317 00:14:44,450 --> 00:14:45,800 nå hardt kode tre. 318 00:14:45,800 --> 00:14:49,220 Og jeg har massivt ryddet opp rotet som jeg nettopp opprettet. 319 00:14:49,220 --> 00:14:52,400 Nå har jeg fortsatt hard kodet tre, men selv 3 kan den dynamisk komme fra 320 00:14:52,400 --> 00:14:54,350 brukeren, eller argv eller lignende. 321 00:14:54,350 --> 00:14:55,720 Så dette er allerede renere. 322 00:14:55,720 --> 00:15:00,100 >> Men det som er irriterende om dette er at nå, er at selv om et navn eller annen måte 323 00:15:00,100 --> 00:15:02,280 fundamentalt knyttet til en student hus - 324 00:15:02,280 --> 00:15:04,720 det er en student som jeg virkelig ønsker å representere - 325 00:15:04,720 --> 00:15:08,080 Jeg har nå to arrays som er parallelle i den forstand at de er 326 00:15:08,080 --> 00:15:13,930 samme størrelse, og navnene brakett 0 formodentlig kart til hus brakett 0, 327 00:15:13,930 --> 00:15:16,600 og navnene brakett en maps til hus bracket en. 328 00:15:16,600 --> 00:15:19,280 Med andre ord, at studenten bor i det huset, og at andre student 329 00:15:19,280 --> 00:15:20,530 bor i det andre huset. 330 00:15:20,530 --> 00:15:23,720 Men sikkert dette kan være gjort enda mer renslig. 331 00:15:23,720 --> 00:15:24,990 >> Vel, det kan, faktisk. 332 00:15:24,990 --> 00:15:28,730 Og la meg gå videre og åpne opp structs.h, og du vil 333 00:15:28,730 --> 00:15:31,130 se denne ideen her. 334 00:15:31,130 --> 00:15:34,905 Legg merke til at jeg har brukt typedef, som du hentydet til et øyeblikk siden å erklære vår 335 00:15:34,905 --> 00:15:35,570 egen datatype. 336 00:15:35,570 --> 00:15:39,660 Men jeg er også bruker denne andre søkeord kalt struct som gir meg en ny 337 00:15:39,660 --> 00:15:40,790 datastruktur. 338 00:15:40,790 --> 00:15:43,980 >> Og dette datastruktur jeg påstå kommer ha to ting på innsiden av 339 00:15:43,980 --> 00:15:47,060 det - en streng kalt navn, og en streng kalt huset. 340 00:15:47,060 --> 00:15:49,820 Og navnet jeg kommer til å gi til dette datastruktur kommer 341 00:15:49,820 --> 00:15:51,005 å bli kalt student. 342 00:15:51,005 --> 00:15:54,030 Jeg kan kalle det hva jeg vil, men dette semantisk gjøre 343 00:15:54,030 --> 00:15:55,810 mening for meg i mitt sinn. 344 00:15:55,810 --> 00:15:59,160 >> Så nå, hvis jeg åpner opp en bedre versjon av programmet begynte jeg å skrive 345 00:15:59,160 --> 00:16:00,390 der, la meg bla til toppen. 346 00:16:00,390 --> 00:16:03,190 Og det er noen flere linjer med kode her, men la meg fokusere for 347 00:16:03,190 --> 00:16:04,160 øyeblikket på en. 348 00:16:04,160 --> 00:16:07,790 Jeg har erklært en konstant kalt studenter og hardkodet 3 for nå. 349 00:16:07,790 --> 00:16:11,110 Men nå merke til hvor rent min kode begynner å få. 350 00:16:11,110 --> 00:16:15,030 >> I tråd 22, erklærer jeg spekter av studenter. 351 00:16:15,030 --> 00:16:18,760 Og legg merke til at studenten er tilsynelatende nå en datatype. 352 00:16:18,760 --> 00:16:23,360 Fordi på toppen av denne filen, merker Jeg har tatt med at header-fil 353 00:16:23,360 --> 00:16:24,820 at jeg trakk opp bare et øyeblikk siden. 354 00:16:24,820 --> 00:16:28,820 Og at header-fil rett og slett hadde denne definisjonen av en student. 355 00:16:28,820 --> 00:16:32,470 >> Så nå har jeg laget mine egne data type som forfatterne av C år 356 00:16:32,470 --> 00:16:33,890 siden ikke tenke på på forhånd. 357 00:16:33,890 --> 00:16:34,570 Men ikke noe problem. 358 00:16:34,570 --> 00:16:35,870 Jeg kan gjøre det selv. 359 00:16:35,870 --> 00:16:39,050 Så dette er en matrise som kalles studenter, hver av medlemmene 360 00:16:39,050 --> 00:16:41,100 er en student struktur. 361 00:16:41,100 --> 00:16:44,270 Og jeg vil ha tre av de i matrisen. 362 00:16:44,270 --> 00:16:46,030 >> Og nå, hva gjør resten av dette programmet gjøre? 363 00:16:46,030 --> 00:16:47,550 Jeg trengte noe litt vilkårlig. 364 00:16:47,550 --> 00:16:51,450 Så fra online 24 og framover, Jeg iterere 0-3. 365 00:16:51,450 --> 00:16:54,000 Jeg deretter be brukeren om studentens navn. 366 00:16:54,000 --> 00:16:56,110 Og så jeg bruker GetString som før. 367 00:16:56,110 --> 00:16:59,410 Så jeg ber om studentens huset, og jeg bruker GetString som før. 368 00:16:59,410 --> 00:17:01,780 >> Men legg merke til - litt nytt stykke syntaks - 369 00:17:01,780 --> 00:17:07,010 Jeg kan fortsatt indeksen til i-te student, men hvordan får jeg på spesifikke data 370 00:17:07,010 --> 00:17:08,354 Feltet innsiden av struct? 371 00:17:08,354 --> 00:17:11,770 Vel, hva er tilsynelatende nytt stykke av syntaks? 372 00:17:11,770 --> 00:17:13,339 Det er bare prikken operatør. 373 00:17:13,339 --> 00:17:14,510 >> Vi har egentlig ikke sett dette før. 374 00:17:14,510 --> 00:17:17,819 Du har sett det i PSett fem hvis du har kastet seg allerede med bitmap-filer. 375 00:17:17,819 --> 00:17:22,372 Men prikken betyr bare innsiden av denne struct eller flere felt, gi dot 376 00:17:22,372 --> 00:17:24,510 navn, eller gi meg dot huset. 377 00:17:24,510 --> 00:17:28,690 Det betyr gå på innsiden av struct og få de aktuelle feltene. 378 00:17:28,690 --> 00:17:30,200 >> Hva gjør resten av dette programmet? 379 00:17:30,200 --> 00:17:31,190 Det er ikke alle som sexy. 380 00:17:31,190 --> 00:17:34,640 Legg merke til at jeg iterere 0-3 igjen, og jeg bare lage en engelsk 381 00:17:34,640 --> 00:17:40,500 setning som så og så er i en slik og et slikt hus, passerer i dot navn fra 382 00:17:40,500 --> 00:17:43,320 i-te student og deres huset også. 383 00:17:43,320 --> 00:17:47,560 >> Og så til slutt, nå skal vi begynne å bli anal om dette, nå som vi er 384 00:17:47,560 --> 00:17:49,580 kjent med hva malloc og andre funksjoner har vært 385 00:17:49,580 --> 00:17:50,570 gjør hele denne tiden. 386 00:17:50,570 --> 00:17:54,220 Hvorfor trenger jeg å frigjøre både navn og hus, selv om jeg 387 00:17:54,220 --> 00:17:56,960 ikke kalle malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString gjorde. 389 00:17:58,020 --> 00:18:00,930 Og det var den skitne lille hemmelighet for flere uker, men GetString har 390 00:18:00,930 --> 00:18:03,530 vært lekker minne over hele plassere alle semester så langt. 391 00:18:03,530 --> 00:18:05,990 Og Valgrand vil til slutt avsløre dette til oss. 392 00:18:05,990 --> 00:18:10,730 >> Men det er ikke en stor avtale, fordi jeg vet at jeg kan rett og slett frigjøre navnet 393 00:18:10,730 --> 00:18:15,750 og huset, men teknisk, til være super, super trygg, bør jeg være 394 00:18:15,750 --> 00:18:17,890 gjøre noen feilsjekking her. 395 00:18:17,890 --> 00:18:19,040 Hva er dine instinkter forteller deg? 396 00:18:19,040 --> 00:18:22,480 Hva bør jeg se etter før jeg frigjøre hva som er en 397 00:18:22,480 --> 00:18:25,470 string, aka som en røye *? 398 00:18:25,470 --> 00:18:33,460 >> Jeg burde egentlig være å sjekke om elevene brakett i dot navnet ikke er 399 00:18:33,460 --> 00:18:34,840 lik null. 400 00:18:34,840 --> 00:18:40,400 Da kan det være OK å gå videre og gratis som peker, og samme eller den annen 401 00:18:40,400 --> 00:18:41,160 en også. 402 00:18:41,160 --> 00:18:46,860 Hvis elevene brakett i dot huset er ikke lik null, dette nå vil beskytte 403 00:18:46,860 --> 00:18:52,520 mot hjørnet tilfelle hvor GetString returnerer noe sånt null. 404 00:18:52,520 --> 00:18:57,310 Og vi så for et øyeblikk siden, printf vil beskytte oss her oppe ved å bare si 405 00:18:57,310 --> 00:18:58,990 null, som kommer til å se rart. 406 00:18:58,990 --> 00:19:02,340 Men minst det ikke vil segfault, som vi har sett. 407 00:19:02,340 --> 00:19:05,990 >> Vel, la meg gjøre en annen ting her. structs-0 er en slags dum program 408 00:19:05,990 --> 00:19:09,700 fordi jeg inn alle disse dataene, og deretter det er tapt når programmet avsluttes. 409 00:19:09,700 --> 00:19:10,940 Men la meg gå videre og gjøre dette. 410 00:19:10,940 --> 00:19:12,830 La meg gjøre terminalen vinduet litt større. 411 00:19:12,830 --> 00:19:17,000 La meg gjøre structs-1, som er en ny versjon av denne. 412 00:19:17,000 --> 00:19:18,520 >> Jeg vil zoome inn litt. 413 00:19:18,520 --> 00:19:21,620 Og nå la meg kjøre dot slash structs-en. 414 00:19:21,620 --> 00:19:22,590 Studentens navn - 415 00:19:22,590 --> 00:19:31,500 David Mather, la oss gjøre Rob Kirkland, la oss gjøre Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Det interessante er nå varsel - 417 00:19:33,650 --> 00:19:35,540 og jeg bare vet dette fordi Jeg skrev programmet - 418 00:19:35,540 --> 00:19:38,930 det er en fil nå på min nåværende katalog kalt students.csv. 419 00:19:38,930 --> 00:19:40,420 Noen av dere har kanskje sett disse i den virkelige verden. 420 00:19:40,420 --> 00:19:42,980 >> Hva er en CSV-fil? 421 00:19:42,980 --> 00:19:44,170 Komma-separerte verdier. 422 00:19:44,170 --> 00:19:46,670 Det er liksom som en fattig mann versjon av en Excel-fil. 423 00:19:46,670 --> 00:19:50,580 Det er en tabell med rader og kolonner som du kan åpne i et program som Excel, 424 00:19:50,580 --> 00:19:51,800 eller Numbers på en Mac. 425 00:19:51,800 --> 00:19:55,180 >> Og hvis jeg åpner denne filen her på gedit, varsel - og tallene er ikke der. 426 00:19:55,180 --> 00:19:57,360 Det er gedit bare forteller meg linjenummer. 427 00:19:57,360 --> 00:19:59,740 Legg merke på den første linje i denne filen er David og Mather. 428 00:19:59,740 --> 00:20:01,450 Den neste linjen er Rob komma Kirkland. 429 00:20:01,450 --> 00:20:04,170 Og den tredje linjen er Lauren komma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Så hva har jeg laget? 431 00:20:05,480 --> 00:20:09,580 Jeg har nå skrevet et C-program som effektivt kan generere regneark 432 00:20:09,580 --> 00:20:11,840 som kan åpnes i en program som Excel. 433 00:20:11,840 --> 00:20:15,520 Ikke alle som overbevisende et datasett, men hvis du har mye større biter av 434 00:20:15,520 --> 00:20:18,440 data som du faktisk ønsker å manipulere og lage grafer av og 435 00:20:18,440 --> 00:20:21,260 liker, er dette kanskje en måte å skape disse dataene. 436 00:20:21,260 --> 00:20:25,370 Videre CSVs er faktisk super felles bare for lagring av enkle data - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, for eksempel, hvis du får aksjekurser via deres såkalte 438 00:20:28,940 --> 00:20:33,180 API, gratis tjeneste som lar deg får strøm up-to-the-date lager 439 00:20:33,180 --> 00:20:35,650 sitater for selskapene, de gi dataene tilbake i 440 00:20:35,650 --> 00:20:37,800 super enkelt CSV-format. 441 00:20:37,800 --> 00:20:39,380 >> Så hvordan gjorde vi det? 442 00:20:39,380 --> 00:20:42,530 Vel merke, det meste av dette programmets nesten den samme. 443 00:20:42,530 --> 00:20:46,870 Men legg merke til her nede, snarere enn ut elevene ut, på linje 35 444 00:20:46,870 --> 00:20:51,040 framover, hevder jeg at jeg sparer den studenter til disk, så sparer en fil. 445 00:20:51,040 --> 00:20:53,630 >> Så merker jeg erklære en FIL * - 446 00:20:53,630 --> 00:20:57,260 nå, er denne typen av en anomali i C. For uansett grunn, er FIL alle caps, 447 00:20:57,260 --> 00:21:00,690 som ikke er som de fleste andre datatyper i C. Men dette er en innebygd 448 00:21:00,690 --> 00:21:02,320 datatype, FILE *. 449 00:21:02,320 --> 00:21:05,900 Og jeg erklære en peker til en fil, er hvordan du kan tenke på det. 450 00:21:05,900 --> 00:21:08,070 >> fopen betyr åpen fil. 451 00:21:08,070 --> 00:21:09,470 Hvilken fil du vil åpne? 452 00:21:09,470 --> 00:21:12,620 Jeg ønsker å åpne en fil som jeg vil vilkårlig ringe students.csv. 453 00:21:12,620 --> 00:21:14,480 Jeg kan kalle det hva jeg vil. 454 00:21:14,480 --> 00:21:15,200 >> Og deretter ta en gjetning. 455 00:21:15,200 --> 00:21:18,960 Hva gjør det andre argumentet til fopen trolig bety? 456 00:21:18,960 --> 00:21:21,480 Høyre, w for skriving, kunne være r for lese. 457 00:21:21,480 --> 00:21:24,120 Det er en for append hvis du ønsker å legge til rader og ikke 458 00:21:24,120 --> 00:21:25,200 overskrive hele greia. 459 00:21:25,200 --> 00:21:28,005 >> Men jeg ønsker bare å opprette denne filen gang, så jeg skal bruke quote unquote w. 460 00:21:28,005 --> 00:21:31,880 Og jeg vet at det bare fra å ha lest dokumentasjonen, eller mannen siden. 461 00:21:31,880 --> 00:21:35,100 Hvis filen ikke er null - med andre ord, hvis noe gikk galt der - 462 00:21:35,100 --> 00:21:37,820 la meg iterere over studenter 0-3. 463 00:21:37,820 --> 00:21:40,410 >> Og nå merker det er noe aldri så litt annerledes 464 00:21:40,410 --> 00:21:42,110 om linjen 41 her. 465 00:21:42,110 --> 00:21:42,960 Det er ikke printf. 466 00:21:42,960 --> 00:21:46,530 Det er fprintf for fil printf. 467 00:21:46,530 --> 00:21:47,790 Så det kommer til å skrive til fil. 468 00:21:47,790 --> 00:21:48,860 Hvilken fil? 469 00:21:48,860 --> 00:21:53,630 Den ene som pekeren du angir som det første argumentet. 470 00:21:53,630 --> 00:21:55,940 >> Da kan vi angi et format streng. 471 00:21:55,940 --> 00:21:59,660 Da kan vi spesifisere hva strengen vi ønsker å plug in for første prosent s, og 472 00:21:59,660 --> 00:22:04,320 deretter en annen variabel eller den andre prosent s. 473 00:22:04,320 --> 00:22:06,760 Da vi lukke filen med fclose. 474 00:22:06,760 --> 00:22:09,380 Enn jeg frigjøre minne som før, skjønt Jeg skal gå tilbake og legge 475 00:22:09,380 --> 00:22:10,540 noen sjekker for null. 476 00:22:10,540 --> 00:22:12,090 >> Og det er det. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, gir fclose meg evne til å skape tekstfiler. 478 00:22:16,960 --> 00:22:19,640 Nå vil du se i oppgavesettet fem, som innebærer bilder, vil du skal bruke 479 00:22:19,640 --> 00:22:20,990 binære filer i stedet. 480 00:22:20,990 --> 00:22:24,200 Men fundamentalt, er tanken den samme, selv om funksjonene du vil 481 00:22:24,200 --> 00:22:28,710 se er litt annerledes. 482 00:22:28,710 --> 00:22:32,580 >> Så rask tur, men du vil få altfor kjent med fil I/O-- 483 00:22:32,580 --> 00:22:34,960 inngang og utgang - med PSett fem. 484 00:22:34,960 --> 00:22:38,607 Og på spørsmål om innledende grunnleggende her? 485 00:22:38,607 --> 00:22:39,857 Yeah? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Hva om du prøver å frigjøre en nullverdi? 488 00:22:43,710 --> 00:22:48,880 Jeg tror, ​​med mindre gratis har fått en litt mer brukervennlig, kan du 489 00:22:48,880 --> 00:22:49,890 potensielt segfault. 490 00:22:49,890 --> 00:22:54,160 Passerer det null er dårlig fordi jeg ikke tror gratis gidder å sjekke for deg, 491 00:22:54,160 --> 00:22:57,330 fordi det ville potensielt være bortkastet tid for den å gjøre seg selv for 492 00:22:57,330 --> 00:22:59,022 alle i verden. 493 00:22:59,022 --> 00:23:00,590 Godt spørsmål, though. 494 00:23:00,590 --> 00:23:04,300 >> Greit, så denne typen blir oss til et interessant tema. 495 00:23:04,300 --> 00:23:07,010 Temaet for oppgavesettet fem er etterforskning. 496 00:23:07,010 --> 00:23:08,420 Minst som er en del av problemet settet. 497 00:23:08,420 --> 00:23:12,030 Forensics refererer vanligvis til gjenoppretting av informasjon som kan eller 498 00:23:12,030 --> 00:23:14,110 kanskje ikke har blitt slettet bevisst. 499 00:23:14,110 --> 00:23:18,680 Og så jeg tenkte jeg skulle gi deg en rask smak av hva som egentlig skjer hele 500 00:23:18,680 --> 00:23:21,230 denne gang under panseret på datamaskinen. 501 00:23:21,230 --> 00:23:23,960 >> For eksempel, hvis du har på innsiden av din bærbare eller stasjonære datamaskinen en 502 00:23:23,960 --> 00:23:28,040 harddisk, er det enten en mekanisk enhet som faktisk spinner - 503 00:23:28,040 --> 00:23:31,650 det er sirkulære ting som kalles fat som ser ganske like det jeg 504 00:23:31,650 --> 00:23:34,540 bare hadde opp på skjermen her, skjønt dette er stadig gamle skolen. 505 00:23:34,540 --> 00:23:37,370 Dette er en tre-og-en-halv-tommers harddisk. 506 00:23:37,370 --> 00:23:40,070 Og tre og en halv inches refererer til med på ting når du installerer den 507 00:23:40,070 --> 00:23:40,890 i en datamaskin. 508 00:23:40,890 --> 00:23:44,890 >> Mange av dere gutta i din bærbare nå har SSD-disker eller SSD, 509 00:23:44,890 --> 00:23:46,260 som ikke har noen bevegelige deler. 510 00:23:46,260 --> 00:23:49,170 De er mer som RAM og mindre som disse mekaniske enheter. 511 00:23:49,170 --> 00:23:51,450 Men ideene er fortsatt den samme, sikkert som de forholder 512 00:23:51,450 --> 00:23:52,790 til problemet satt fem. 513 00:23:52,790 --> 00:23:57,400 >> Og hvis du tenker på nå en harddisk representerer være en sirkel, som 514 00:23:57,400 --> 00:23:58,930 Jeg skal tegne som dette her. 515 00:23:58,930 --> 00:24:02,290 Når du oppretter en fil på datamaskinen, enten det er en SSD, eller i 516 00:24:02,290 --> 00:24:06,610 dette tilfellet, en eldre skole harddisk, at filen består av flere biter. 517 00:24:06,610 --> 00:24:10,510 La oss si at det er dette 0 og 1, en hel haug med 0'er og 1'ere. 518 00:24:10,510 --> 00:24:11,660 Så dette er min hele harddisken. 519 00:24:11,660 --> 00:24:13,225 Dette er tydeligvis en ganske stor fil. 520 00:24:13,225 --> 00:24:18,080 Og det er å bruke opp 0'er og 1'ere på den del av den fysiske tallerken. 521 00:24:18,080 --> 00:24:19,750 >> Vel, hva er det fysiske delen? 522 00:24:19,750 --> 00:24:25,310 Vel, det viser seg at på en harddisk, i det minste av denne type, er det 523 00:24:25,310 --> 00:24:27,340 disse bitte små magnetiske partikler. 524 00:24:27,340 --> 00:24:32,630 Og de i hovedsak har nord og sør poler til dem, slik at hvis du 525 00:24:32,630 --> 00:24:35,710 snu en av de magnetiske partiklene denne måten, kan du si at det er 526 00:24:35,710 --> 00:24:36,720 representerer en en. 527 00:24:36,720 --> 00:24:39,340 Og hvis det er opp ned sør til nord, kan du si at det er 528 00:24:39,340 --> 00:24:40,390 representerer en 0. 529 00:24:40,390 --> 00:24:43,660 >> Så i den virkelige fysiske verden, det er hvordan du kan representere noe i 530 00:24:43,660 --> 00:24:45,670 binær tilstand av 0 og 1. 531 00:24:45,670 --> 00:24:46,720 Så det er alt en fil er. 532 00:24:46,720 --> 00:24:49,300 Det er en hel haug med magnetisk partikler som er deres denne måten, eller 533 00:24:49,300 --> 00:24:51,920 på denne måten, skaper mønstre av 0'er og 1'ere. 534 00:24:51,920 --> 00:24:56,760 >> Men det viser seg når du lagrer en fil, litt informasjon lagres separat. 535 00:24:56,760 --> 00:25:00,000 Så dette er et lite bord, en katalog, så å si. 536 00:25:00,000 --> 00:25:05,810 Og jeg skal kalle denne kolonnen navn, og Jeg vil kalle denne kolonnen plassering. 537 00:25:05,810 --> 00:25:08,850 >> Og jeg kommer til å si, anta dette er min CV. 538 00:25:08,850 --> 00:25:14,050 Min resume.doc lagres på plassering, la oss si 123. 539 00:25:14,050 --> 00:25:15,390 Jeg går alltid for dette nummeret. 540 00:25:15,390 --> 00:25:18,810 Men nok det å si at akkurat som i RAM, kan du ta en harddisk 541 00:25:18,810 --> 00:25:22,350 det er en gigabyte eller 200 gigabyte eller en terabyte, og du kan 542 00:25:22,350 --> 00:25:23,750 antall alle bytes. 543 00:25:23,750 --> 00:25:26,480 Du kan telle alle biter av 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Så vi vil si at dette er beliggenheten 123. 545 00:25:29,030 --> 00:25:32,070 Så denne katalogen innsiden av drifts min Systemet husker at min 546 00:25:32,070 --> 00:25:34,250 CV er på stedet 123. 547 00:25:34,250 --> 00:25:36,850 Men det blir interessant når du sletter en fil. 548 00:25:36,850 --> 00:25:37,820 >> Så for eksempel - 549 00:25:37,820 --> 00:25:40,790 og heldigvis, har de fleste av verdens fanget inn dette - hva som skjer når 550 00:25:40,790 --> 00:25:45,040 du drar en fil til Mac OS Trash eller Windows papirkurven? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Hva er hensikten med å gjøre det? 553 00:25:50,510 --> 00:25:53,860 Det er åpenbart for å bli kvitt filen, men hva betyr det lov å dra og 554 00:25:53,860 --> 00:25:57,550 slippe inn i papirkurven eller din Recycle Bin gjøre på en datamaskin? 555 00:25:57,550 --> 00:25:59,230 >> Absolutt ingenting, egentlig. 556 00:25:59,230 --> 00:26:00,320 Det er akkurat som en mappe. 557 00:26:00,320 --> 00:26:01,800 Det er en spesiell mappe, for å være sikker. 558 00:26:01,800 --> 00:26:04,460 Men betyr det faktisk slette filen? 559 00:26:04,460 --> 00:26:06,780 >> Vel, nei, fordi noen av dere sikkert har vært som, oh faen, det gjorde du ikke 560 00:26:06,780 --> 00:26:07,420 mener å gjøre det. 561 00:26:07,420 --> 00:26:09,130 Så du dobbeltklikker på Papirkurven eller papirkurven. 562 00:26:09,130 --> 00:26:11,630 Du har lett rundt, og du har gjenopprettet filen bare ved å dra den 563 00:26:11,630 --> 00:26:12,110 ut av det. 564 00:26:12,110 --> 00:26:14,420 Så klart, det er ikke nødvendigvis slette den. 565 00:26:14,420 --> 00:26:15,990 >> OK, du er smartere enn som så. 566 00:26:15,990 --> 00:26:18,860 Du vet at bare dra den inn i Trash eller papirkurven betyr ikke 567 00:26:18,860 --> 00:26:19,930 du tømme papirkurven. 568 00:26:19,930 --> 00:26:24,110 Så du går opp til menyen, og du sier Tøm papirkurv eller Tøm papirkurven. 569 00:26:24,110 --> 00:26:25,360 Hva skjer da? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ja, så det er slettes mer. 572 00:26:32,530 --> 00:26:37,660 Men alt som skjer er dette. 573 00:26:37,660 --> 00:26:45,350 Datamaskinen glemmer hvor resume.doc var. 574 00:26:45,350 --> 00:26:47,400 >> Men hva har ikke forandret tilsynelatende i bildet? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Bitene, den 0'er og 1'ere som jeg hevder er på stedet av noen fysiske aspektet av 577 00:26:55,570 --> 00:26:56,280 maskinvaren. 578 00:26:56,280 --> 00:26:57,110 De er fortsatt der. 579 00:26:57,110 --> 00:26:58,930 Det er bare at datamaskinen har glemt hva de er. 580 00:26:58,930 --> 00:27:03,160 >> Så det er egentlig frigjort filens biter, slik at de kan brukes på nytt. 581 00:27:03,160 --> 00:27:06,940 Men ikke før du oppretter flere filer, og flere filer, og flere filer vil 582 00:27:06,940 --> 00:27:12,150 probabilistically, de 0'er og 1'ere, de magnetiske partikler, får gjenbrukt, 583 00:27:12,150 --> 00:27:16,220 opp eller høyre side opp, for andre filer, 0'er og 1'ere. 584 00:27:16,220 --> 00:27:17,980 >> Så du har dette vindu av tid. 585 00:27:17,980 --> 00:27:19,860 Og det er ikke for forutsigbar lengde, egentlig. 586 00:27:19,860 --> 00:27:22,240 Det avhenger av størrelsen på harddisken din stasjonen og hvor mange filer du har og 587 00:27:22,240 --> 00:27:23,490 hvor raskt du lage nye. 588 00:27:23,490 --> 00:27:27,050 Men det er dette vindu av tid under som at filen er fortsatt helt 589 00:27:27,050 --> 00:27:27,770 gjenvinnbart. 590 00:27:27,770 --> 00:27:31,050 >> Så hvis du noen gang bruke programmer som McAfee eller Norton å forsøke å gjenopprette 591 00:27:31,050 --> 00:27:35,680 data, alt de gjør forsøk på å gjenopprette denne såkalte katalogen til 592 00:27:35,680 --> 00:27:37,340 finne ut hvor filen var. 593 00:27:37,340 --> 00:27:40,605 Og noen ganger Norton og vil si, Filen er 93% gjenvinnbare. 594 00:27:40,605 --> 00:27:42,020 Vel, hva betyr det? 595 00:27:42,020 --> 00:27:45,690 Det betyr bare at noen andre filer tilfeldigvis endte opp med, sier 596 00:27:45,690 --> 00:27:48,920 de bitene ut av den opprinnelige filen. 597 00:27:48,920 --> 00:27:51,950 >> Så hva er egentlig involvert i å gjenopprette data? 598 00:27:51,950 --> 00:27:55,720 Vel, hvis du ikke har noe sånt Norton forhåndsinstallert på datamaskinen, 599 00:27:55,720 --> 00:27:59,510 det beste du kan noen ganger gjøre er å se på hele harddisken på jakt etter 600 00:27:59,510 --> 00:28:00,510 punktmønstre. 601 00:28:00,510 --> 00:28:05,350 Og en av temaene i oppgavesettet fem er at du vil søke på 602 00:28:05,350 --> 00:28:09,570 tilsvarer en harddisk, en rettsmedisinsk bilde av et Compact Flash-kort fra en 603 00:28:09,570 --> 00:28:13,660 digitalkamera, søker etter 0s og 1s som typisk, med høy 604 00:28:13,660 --> 00:28:16,720 sannsynlighet, representerer starten på et JPEG-bilde. 605 00:28:16,720 --> 00:28:21,120 >> Og dere kan gjenopprette disse bildene ved forutsatt, hvis jeg ser dette mønsteret av 606 00:28:21,120 --> 00:28:24,380 biter på den rettsmedisinske bilde, med høy sannsynlighet, som markerer 607 00:28:24,380 --> 00:28:25,650 starten på en JPEG. 608 00:28:25,650 --> 00:28:29,520 Og hvis jeg ser det samme mønsteret igjen, som markerer starten på sannsynligvis 609 00:28:29,520 --> 00:28:32,440 annet JPEG, og en annen JPEG, og en annen JPEG. 610 00:28:32,440 --> 00:28:34,970 Og dette er typisk hvordan data utvinning vil fungere. 611 00:28:34,970 --> 00:28:37,870 Hva er fint om JPEG er selv om filformatet i seg selv er noe 612 00:28:37,870 --> 00:28:44,400 kompleks, i begynnelsen av hver slik filen er egentlig ganske identifiserbare 613 00:28:44,400 --> 00:28:47,370 og enkel, som du vil se, hvis du har ikke allerede. 614 00:28:47,370 --> 00:28:50,270 >> Så la oss ta en nærmere titt under hetten som til nøyaktig hva som har vært 615 00:28:50,270 --> 00:28:53,360 skjer, og hva disse 0'er og 1'ere er, for å gi deg litt mer av en 616 00:28:53,360 --> 00:28:55,330 kontekst for denne utfordringen. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEOAVSPILLING] 618 00:28:55,510 --> 00:28:58,700 >> -Hvor din PC lagrer mest av sine faste data. 619 00:28:58,700 --> 00:29:03,390 For å gjøre det, reiser data fra RAM sammen med programvare signaler som forteller 620 00:29:03,390 --> 00:29:06,110 harddisken hvordan å lagre disse dataene. 621 00:29:06,110 --> 00:29:09,410 Harddisken kretser oversette disse signalene til spenning 622 00:29:09,410 --> 00:29:10,870 svingninger. 623 00:29:10,870 --> 00:29:14,970 Disse i sin tur, kontrollere harddiskens bevegelige deler, noen av de få 624 00:29:14,970 --> 00:29:17,910 bevegelige deler igjen i moderne datamaskin. 625 00:29:17,910 --> 00:29:22,130 >> Noen av de signaler som styrer en motor som spinner metall-belagt fat. 626 00:29:22,130 --> 00:29:25,470 Dine data er faktisk lagret på disse platene. 627 00:29:25,470 --> 00:29:28,610 Andre signaler flytte lese / skrive hoder til å lese eller 628 00:29:28,610 --> 00:29:30,710 skrive data på platene. 629 00:29:30,710 --> 00:29:35,450 Dette maskineriet så presis at et menneske hår ikke engang kunne passere mellom 630 00:29:35,450 --> 00:29:37,280 hoder og spinning fat. 631 00:29:37,280 --> 00:29:40,316 Likevel, det fungerer alt på kjempefint hastigheter. 632 00:29:40,316 --> 00:29:40,660 >> [END VIDEOAVSPILLING] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom inn litt dypere nå på hva som er 634 00:29:42,190 --> 00:29:44,360 faktisk på disse platene. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEOAVSPILLING] 636 00:29:44,720 --> 00:29:47,660 >> -La oss se på hva vi nettopp så i slow motion. 637 00:29:47,660 --> 00:29:51,710 Når en kort puls av elektrisitet er sendes til lese / skrive-hodet, hvis flipper 638 00:29:51,710 --> 00:29:54,650 på en liten elektromagnetisk for en brøkdel av et sekund. 639 00:29:54,650 --> 00:29:58,970 Magneten skaper et felt, som endrer polaritet av en bitteliten 640 00:29:58,970 --> 00:30:02,850 del av de metallpartikler som frakk hver tallerken overflaten. 641 00:30:02,850 --> 00:30:05,940 >> Et mønster serie av disse små, ladet opp områder på disken 642 00:30:05,940 --> 00:30:08,470 representerer en enkelt bit av data i det binære tallet 643 00:30:08,470 --> 00:30:10,530 system som brukes av datamaskiner. 644 00:30:10,530 --> 00:30:13,775 Hvis nå strømmen sendes en vei gjennom lese / skrive-hodet, området 645 00:30:13,775 --> 00:30:15,970 er polarisert i en retning. 646 00:30:15,970 --> 00:30:17,950 Hvis strømmen blir sendt i motsatt retning, 647 00:30:17,950 --> 00:30:19,930 polarisering er reversert. 648 00:30:19,930 --> 00:30:22,370 >> Hvordan du får data fra harddisken? 649 00:30:22,370 --> 00:30:24,090 Bare reversere prosessen. 650 00:30:24,090 --> 00:30:26,550 Så det er partiklene på disken som får strømmen i 651 00:30:26,550 --> 00:30:27,960 lese / skrive-hodet i bevegelse. 652 00:30:27,960 --> 00:30:30,700 Sette sammen millioner av disse magnetisert segmenter, og 653 00:30:30,700 --> 00:30:32,160 du har en fil. 654 00:30:32,160 --> 00:30:36,060 >> Nå, biter av en enkelt fil kan bli spredt over et stasjonens 655 00:30:36,060 --> 00:30:39,970 fat, type som rotet papirer på pulten din. 656 00:30:39,970 --> 00:30:43,500 Så en spesiell ekstra fil holder styr hvor alt er. 657 00:30:43,500 --> 00:30:45,985 Tror ikke du ønske du hadde noe sånt? 658 00:30:45,985 --> 00:30:46,470 >> [END VIDEOAVSPILLING] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, sannsynligvis ikke. 660 00:30:47,820 --> 00:30:52,070 Så hvor mange av dere vokste opp med disse? 661 00:30:52,070 --> 00:30:53,970 OK, så det er færre og færre hender hvert år. 662 00:30:53,970 --> 00:30:56,550 Men jeg er glad du er minst kjent med dem, fordi dette og vår egen 663 00:30:56,550 --> 00:31:00,520 bok demo, dessverre, er å dø en svært langsom død her av fortrolighet. 664 00:31:00,520 --> 00:31:04,010 >> Men dette er hva jeg, i hvert fall, tilbake i videregående skole, brukte bruk for sikkerhetskopier. 665 00:31:04,010 --> 00:31:08,110 Og det var fantastisk, fordi du kunne lagre 1,4 megabyte på 666 00:31:08,110 --> 00:31:08,930 denne disken. 667 00:31:08,930 --> 00:31:12,260 Og dette var det høy tetthet versjon, som indikert av HD, som har 668 00:31:12,260 --> 00:31:14,240 noe som betyr at før dagens HD-videoer. 669 00:31:14,240 --> 00:31:16,400 >> Standard tetthet var 800 kilobyte. 670 00:31:16,400 --> 00:31:18,640 Og før det, var det 400-kilobyte disker. 671 00:31:18,640 --> 00:31:23,120 Og før det, var det 5 og 1/4 tommers disker, som var virkelig floppy, 672 00:31:23,120 --> 00:31:25,680 og litt bredere og høyere enn disse tingene her. 673 00:31:25,680 --> 00:31:29,150 Men du kan faktisk se den såkalte floppy aspekt av disse diskene. 674 00:31:29,150 --> 00:31:32,630 >> Og funksjonelt, de er faktisk ganske lik harddisker av ved 675 00:31:32,630 --> 00:31:33,570 minst denne typen. 676 00:31:33,570 --> 00:31:37,270 Igjen, SSD i nyere datamaskiner fungerer litt annerledes. 677 00:31:37,270 --> 00:31:41,530 Men hvis du flytter den lille metal-kategorien, du kan faktisk se en liten informasjonskapsel, 678 00:31:41,530 --> 00:31:42,560 eller tallerken. 679 00:31:42,560 --> 00:31:43,830 >> Det er ikke metall som denne. 680 00:31:43,830 --> 00:31:46,000 Dette er faktisk litt billigere plastmateriale. 681 00:31:46,000 --> 00:31:46,750 Og du kan slags vrikke den. 682 00:31:46,750 --> 00:31:50,310 Og du har slett bare tørkes av noen antall biter eller magnetiske partikler 683 00:31:50,310 --> 00:31:51,220 fra denne disken. 684 00:31:51,220 --> 00:31:52,710 >> Så heldigvis, det er ingenting på det. 685 00:31:52,710 --> 00:31:55,790 Hvis den tingen er i veien - og dekke øynene og de av din nabo - 686 00:31:55,790 --> 00:31:58,865 du kan bare slags trekke dette Hele kappe av sånn. 687 00:31:58,865 --> 00:32:01,900 Men det er en liten fjær, så vær klar over at med øynene. 688 00:32:01,900 --> 00:32:03,620 Så nå har du virkelig en diskett. 689 00:32:03,620 --> 00:32:07,090 >> Og hva er bemerkelsesverdig om dette er at i så mye som dette er en 690 00:32:07,090 --> 00:32:10,830 liten-skala fremstilling av en større harddisk, disse tingene er super, 691 00:32:10,830 --> 00:32:11,590 super enkelt. 692 00:32:11,590 --> 00:32:15,170 Hvis du klemme bunnen av det, nå som at metall ting er av, og skrell 693 00:32:15,170 --> 00:32:20,990 dem åpne, er alt det er to stykker av filt og den såkalte diskett 694 00:32:20,990 --> 00:32:22,930 med et stykke metall på innsiden. 695 00:32:22,930 --> 00:32:25,990 >> Og det går halvparten av min disk innholdet. 696 00:32:25,990 --> 00:32:27,540 Det går en halv av dem. 697 00:32:27,540 --> 00:32:31,375 Men det er alt som var spinning inne av datamaskinen i en svunnen tid. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Og igjen, for å sette dette i perspektiv, hvor stor er det meste av din 700 00:32:38,310 --> 00:32:39,560 harddisker i disse dager? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabyte, en terabyte, kanskje i en stasjonær datamaskin, to terabyte, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabyte, ikke sant? 704 00:32:47,630 --> 00:32:52,480 Dette er en megabyte, gi eller ta, som ikke selv passer en typisk MP3 705 00:32:52,480 --> 00:32:55,310 lenger i disse dager, eller noen lignende musikkfil. 706 00:32:55,310 --> 00:32:59,500 >> Så en liten suvenir for deg i dag, og også å bidra til å kontekstualisere hva 707 00:32:59,500 --> 00:33:03,570 Vi skal ta for gitt nå i problemet satt fem. 708 00:33:03,570 --> 00:33:04,820 Så de er ditt for alltid. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Så la meg overgang til der vil være tilbringe neste PSett også. 711 00:33:13,370 --> 00:33:18,470 Så vi har nå satt denne siden for - oh, et par kunngjøringer raskt. 712 00:33:18,470 --> 00:33:21,730 >> Denne fredagen, hvis du ønsker delta CS50 til lunsj, gå til den vanlige plassen, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Og endelig prosjekt - 715 00:33:25,100 --> 00:33:28,520 så per pensum, har vi lagt ut siste prosjektet spesifikasjonen allerede. 716 00:33:28,520 --> 00:33:31,410 Innse at det betyr ikke at det er på grunn særlig snart. 717 00:33:31,410 --> 00:33:33,990 Det er lagt ut, egentlig, bare for å få dere tenke på det. 718 00:33:33,990 --> 00:33:37,620 Og ja, en super betydelig prosentandel av dere vil bli taklinger 719 00:33:37,620 --> 00:33:40,780 siste prosjekter på materiale som vi har ikke engang fått til i klassen, 720 00:33:40,780 --> 00:33:42,730 men vil så tidlig som neste uke. 721 00:33:42,730 --> 00:33:45,530 >> Legg imidlertid merke til at spesifikasjonen krever noen forskjellige komponenter i 722 00:33:45,530 --> 00:33:46,190 endelige prosjektet. 723 00:33:46,190 --> 00:33:49,590 Den første, i et par uker, er en pre-proposal, en ganske uformell e-post til 724 00:33:49,590 --> 00:33:52,760 din TF å fortelle ham eller hva du er tenker for prosjektet, med 725 00:33:52,760 --> 00:33:53,650 ingen forpliktelse. 726 00:33:53,650 --> 00:33:56,710 Forslaget vil være din spesielle engasjement, sa her, dette er hva 727 00:33:56,710 --> 00:33:57,770 Jeg ønsker å gjøre for mitt prosjekt. 728 00:33:57,770 --> 00:33:58,250 Hva tror du? 729 00:33:58,250 --> 00:33:58,650 For stor? 730 00:33:58,650 --> 00:33:59,145 For liten? 731 00:33:59,145 --> 00:34:00,330 Er det overkommelig? 732 00:34:00,330 --> 00:34:02,230 Og ser du spec for flere detaljer. 733 00:34:02,230 --> 00:34:05,060 >> Par uker etter at det er status rapporten, som er en tilsvarende 734 00:34:05,060 --> 00:34:08,260 uformell e-post til TF for å si akkurat hvor langt bak du er i den endelige 735 00:34:08,260 --> 00:34:12,360 prosjektets gjennomføring, etterfulgt av den CS50 Hackathon som alle 736 00:34:12,360 --> 00:34:17,520 er invitert, som vil være en hendelse fra 20:00 på en kveld til 07:00 737 00:34:17,520 --> 00:34:19,150 AM neste morgen. 738 00:34:19,150 --> 00:34:22,560 Pizza, som jeg kanskje har nevnt i uken null, bli wil servert på 9:00, 739 00:34:22,560 --> 00:34:24,120 Kinesisk mat på 1:00. 740 00:34:24,120 --> 00:34:27,929 Og hvis du fortsatt er våken på 05:00, vi tar deg til IHOP for frokost. 741 00:34:27,929 --> 00:34:31,310 >> Så Hackathon er en av de mer minneverdige opplevelser i klassen. 742 00:34:31,310 --> 00:34:35,290 Da gjennomføringen skyldes, og da den klimatiske CS50 skyet. 743 00:34:35,290 --> 00:34:38,070 Flere detaljer på samtlige av disse i ukene som kommer. 744 00:34:38,070 --> 00:34:40,739 >> Men la oss gå tilbake til noe gamle skolen - 745 00:34:40,739 --> 00:34:41,920 igjen, en matrise. 746 00:34:41,920 --> 00:34:45,040 Så en matrise var hyggelig, fordi det løser problemer som vi så bare en 747 00:34:45,040 --> 00:34:49,290 øyeblikk siden med student strukturer å få litt ut av kontroll hvis vi 748 00:34:49,290 --> 00:34:52,405 ønsker å ha student en, student to, student tre, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 noen vilkårlig antall studenter. 750 00:34:54,400 --> 00:34:58,850 >> Så arrays, for noen uker siden, slo inn og løste alle våre problemer av ikke 751 00:34:58,850 --> 00:35:03,340 vite på forhånd hvor mange ting av noen type kan vi ønsker. 752 00:35:03,340 --> 00:35:07,390 Og vi har sett at structs kan hjelpe oss ytterligere organisere vår kode og holde 753 00:35:07,390 --> 00:35:11,660 konseptuelt lignende variabler, som en navn og et hus sammen, slik at vi 754 00:35:11,660 --> 00:35:15,570 kan behandle dem som en enhet, inne som det er mindre biter. 755 00:35:15,570 --> 00:35:17,810 >> Men matriser har noen ulemper. 756 00:35:17,810 --> 00:35:19,780 Hva er noen av ulempene vi har støtt på 757 00:35:19,780 --> 00:35:22,320 med matriser så langt? 758 00:35:22,320 --> 00:35:23,450 Hva er det? 759 00:35:23,450 --> 00:35:28,130 Fast størrelse - så selv om du kanskje være i stand til å fordele minne for en 760 00:35:28,130 --> 00:35:32,310 array, når du vet hvor mange studenter du har, hvor mange tegn du har 761 00:35:32,310 --> 00:35:35,460 fra brukeren, når du har tildelt rekken, har du slags malt 762 00:35:35,460 --> 00:35:36,740 selv inn i et hjørne. 763 00:35:36,740 --> 00:35:40,600 >> Fordi du ikke kan sette inn nye elementer inn i midten av en matrise. 764 00:35:40,600 --> 00:35:43,660 Du kan ikke sette inn flere elementer ved slutten av en matrise. 765 00:35:43,660 --> 00:35:47,750 Virkelig, må du ty til å skape en helt ny array, som vi har diskutert, 766 00:35:47,750 --> 00:35:49,320 kopiere den gamle til den nye. 767 00:35:49,320 --> 00:35:52,610 Og igjen, er at hodepine som GetString avtaler med for deg. 768 00:35:52,610 --> 00:35:56,170 >> Men igjen, du kan ikke engang sette inn noe inn i midten av matrisen 769 00:35:56,170 --> 00:35:58,200 hvis prisen ikke er helt fylt. 770 00:35:58,200 --> 00:36:03,010 For eksempel, hvis denne matrise av størrelse her seks har bare fem ting i det, 771 00:36:03,010 --> 00:36:06,080 Vel, du kan bare tack noe mot slutten. 772 00:36:06,080 --> 00:36:08,200 Men hva hvis du vil sette inn noe inn i midten av den 773 00:36:08,200 --> 00:36:11,280 matrise, selv om det kan ha fem av seks ting i det? 774 00:36:11,280 --> 00:36:14,250 >> Vel, hva vi gjør når vi hadde alle av våre frivillige på scenen i 775 00:36:14,250 --> 00:36:15,110 uker tidligere? 776 00:36:15,110 --> 00:36:18,710 Hvis vi ønsket å sette noen her, enten disse menneskene hvordan de skal flytte dette 777 00:36:18,710 --> 00:36:22,540 måte, eller disse menneskene hvordan de skal flytte dette måte, og det ble dyr. 778 00:36:22,540 --> 00:36:26,950 Skiftende av mennesker inne i en matrise endte opp med å legge opp og kostnadskalkyle 779 00:36:26,950 --> 00:36:31,240 oss tid, derav mye av vår n kvadrat kjøretider som innsetting sortere, for 780 00:36:31,240 --> 00:36:32,550 eksempel, i verste fall. 781 00:36:32,550 --> 00:36:36,520 Så arrays er flott, men du må vet på forhånd hvor store du vil ha dem. 782 00:36:36,520 --> 00:36:38,030 >> Så OK, her er en løsning. 783 00:36:38,030 --> 00:36:43,860 Hvis jeg ikke vet på forhånd hvor mange studentene jeg kan ha, og jeg vet en gang 784 00:36:43,860 --> 00:36:47,870 Jeg bestemmer meg, men jeg er stuck med det mange studenter, hvorfor gjør jeg ikke bare alltid 785 00:36:47,870 --> 00:36:51,740 allokere dobbelt så mye plass som jeg kanskje tror jeg trenger? 786 00:36:51,740 --> 00:36:54,450 Er det ikke en rimelig løsning? 787 00:36:54,450 --> 00:36:58,240 >> Realistisk, tror jeg ikke at vi er kommer til å trenge mer enn 50 plasser 788 00:36:58,240 --> 00:37:02,190 i en matrise for en middels stor klasse, så la oss bare runde opp. 789 00:37:02,190 --> 00:37:07,040 Jeg skal lage 100 plasser i matrise min, bare slik at vi kan definitivt få 790 00:37:07,040 --> 00:37:10,330 antall studenter jeg forventer å være i noen mellomstore klassen. 791 00:37:10,330 --> 00:37:14,320 Så hvorfor ikke bare runde opp og fordele mer minne, typisk, for en matrise 792 00:37:14,320 --> 00:37:16,290 enn du tror du kanskje trenger? 793 00:37:16,290 --> 00:37:20,190 Hva er dette enkle pushback til at ideen? 794 00:37:20,190 --> 00:37:21,440 >> Du bare sløse minne. 795 00:37:21,440 --> 00:37:25,350 Bokstavelig talt hvert program du skriver deretter er kanskje å bruke dobbelt så mye minne som 796 00:37:25,350 --> 00:37:26,680 du faktisk trenger. 797 00:37:26,680 --> 00:37:28,990 Og det bare føles ikke som en spesielt elegant løsning. 798 00:37:28,990 --> 00:37:31,990 Dessuten minsker det bare Sannsynligheten for et problem. 799 00:37:31,990 --> 00:37:35,300 Hvis du tilfeldigvis har en populær kurs ett semester og du har 101 800 00:37:35,300 --> 00:37:39,610 studenter, er programmet fortsatt fundamentalt overfor det samme problemet. 801 00:37:39,610 --> 00:37:44,280 >> Så heldigvis, det er en løsning å denne annonsen alle våre problemer i form 802 00:37:44,280 --> 00:37:46,790 av datastrukturer som er mer kompleks enn de 803 00:37:46,790 --> 00:37:47,970 vi har sett så langt. 804 00:37:47,970 --> 00:37:50,530 Dette, jeg hevder, er en lenket liste. 805 00:37:50,530 --> 00:37:51,920 Dette er en liste med tall - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, og 34 - 807 00:37:54,970 --> 00:38:00,120 som er koblet sammen ved hjelp av hva jeg har tatt som piler. 808 00:38:00,120 --> 00:38:03,580 >> Med andre ord, hvis jeg ønsket å representere en matrise, kunne jeg gjøre 809 00:38:03,580 --> 00:38:04,910 noe sånt som dette. 810 00:38:04,910 --> 00:38:07,310 Og jeg skal sette dette på overhead på bare et øyeblikk. 811 00:38:07,310 --> 00:38:09,970 Jeg kunne gjøre - 812 00:38:09,970 --> 00:38:12,520 hallo, all right. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Ny datamaskin her, klar - 815 00:38:17,360 --> 00:38:18,090 all right. 816 00:38:18,090 --> 00:38:21,730 >> Så hvis jeg har disse tallene i array - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ikke nødvendigvis å skalere. 819 00:38:30,530 --> 00:38:33,730 Ok, så her er min array - 820 00:38:33,730 --> 00:38:34,980 oh my god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Ok, så her er min array. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh my god. 825 00:38:45,050 --> 00:38:48,820 >> [Latter] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Pretend. 827 00:38:49,440 --> 00:38:52,330 Det er for mye krefter på å gå tilbake og fikse det, så det - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Så har vi denne matrisen av 9, 17, 22, 26, og 34.. 830 00:38:57,650 --> 00:39:00,260 For de av dere kan se pinlig tabbe jeg bare gjort, 831 00:39:00,260 --> 00:39:00,830 det er det. 832 00:39:00,830 --> 00:39:04,490 >> Så jeg påstå at dette er en svært effektiv løsning. 833 00:39:04,490 --> 00:39:07,310 Jeg har tildelt så mange ints som Jeg trenger - en, to, tre, 834 00:39:07,310 --> 00:39:09,100 fire, fem og seks - 835 00:39:09,100 --> 00:39:11,660 og jeg har da lagret tallene innsiden av denne matrisen. 836 00:39:11,660 --> 00:39:15,220 Men sett, så ønsker jeg å sette inn en verdi som nummer 8? 837 00:39:15,220 --> 00:39:16,100 Vel, hvor det går? 838 00:39:16,100 --> 00:39:18,530 Anta ønsker jeg å sette inn et tall som 20. 839 00:39:18,530 --> 00:39:19,790 Vel, hvor det går? 840 00:39:19,790 --> 00:39:23,160 Et sted der i midten, eller tallet 35 må gå 841 00:39:23,160 --> 00:39:24,010 et eller annet sted på slutten. 842 00:39:24,010 --> 00:39:25,320 Men jeg er alt for liten plass. 843 00:39:25,320 --> 00:39:29,120 >> Og så dette er en grunnleggende utfordring av matriser som ikke er løsningen. 844 00:39:29,120 --> 00:39:32,280 Jeg hevdet en stund siden, GetString løser dette problemet. 845 00:39:32,280 --> 00:39:37,380 Hvis du vil sette inn en sjette nummer inn i denne matrise, hvilken er i det minste ett 846 00:39:37,380 --> 00:39:40,090 løsning du kan falle tilbake på for sikker, akkurat som vi gjør med GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Hva er det? 849 00:39:46,030 --> 00:39:48,190 >> Vel, gjøre den større er lettere sagt enn gjort. 850 00:39:48,190 --> 00:39:52,810 Vi kan ikke nødvendigvis gjøre matrisen større, men hva kan vi gjøre? 851 00:39:52,810 --> 00:39:56,570 Lag en ny matrise som er større, av størrelse 6, eller kanskje størrelse 10, hvis vi ønsker 852 00:39:56,570 --> 00:40:00,490 å komme i forkant av ting, og deretter kopiere den gamle matrisen i den nye, og deretter 853 00:40:00,490 --> 00:40:01,680 frigjøre den gamle array. 854 00:40:01,680 --> 00:40:05,770 >> Men hva er kjøretiden nå av denne prosessen? 855 00:40:05,770 --> 00:40:09,870 Det er stor O n, fordi kopiering kommer til å koste deg noen enheter av 856 00:40:09,870 --> 00:40:13,480 tid, så ikke så ideelt hvis vi må tildele en ny rekke, som kommer 857 00:40:13,480 --> 00:40:15,610 å konsumere to ganger så mye minne midlertidig. 858 00:40:15,610 --> 00:40:16,660 Kopier gamle til nye - 859 00:40:16,660 --> 00:40:18,800 Jeg mener, det er bare en hodepine, som er, igjen, hvorfor vi skrev 860 00:40:18,800 --> 00:40:19,920 GetString for deg. 861 00:40:19,920 --> 00:40:21,380 >> Så hva kan vi gjøre i stedet? 862 00:40:21,380 --> 00:40:25,000 Vel, hva om vår datastruktur faktisk har hull i det? 863 00:40:25,000 --> 00:40:30,790 Anta at jeg slapp mitt mål om å ha sammenhengende biter av minne, der ni 864 00:40:30,790 --> 00:40:34,500 er rett ved siden av 17, som er like ved 22, og så videre. 865 00:40:34,500 --> 00:40:39,570 >> Og anta at 9 kan være over her i RAM og 17 kan være over her i RAM, 866 00:40:39,570 --> 00:40:40,990 og 22 kan være over her i RAM. 867 00:40:40,990 --> 00:40:43,610 Med andre ord, jeg trenger dem selv rygg til rygg lenger. 868 00:40:43,610 --> 00:40:47,850 Jeg bare må liksom træ en nål gjennom hver av disse tallene, eller hvert 869 00:40:47,850 --> 00:40:51,010 av disse nodene, som vi kaller rektangler som jeg har tegnet dem, til 870 00:40:51,010 --> 00:40:55,670 huske hvordan du får til den siste slik node fra den første. 871 00:40:55,670 --> 00:40:59,940 >> Så hva er programmering konstruere vi har sett ganske nylig som jeg 872 00:40:59,940 --> 00:41:03,030 kan implementere den tråden, eller trukket her, som jeg kan 873 00:41:03,030 --> 00:41:05,430 implementere disse pilene? 874 00:41:05,430 --> 00:41:06,500 Så pekere, ikke sant? 875 00:41:06,500 --> 00:41:09,560 Hvis jeg bevilge ikke bare en int, men en node - og ved 876 00:41:09,560 --> 00:41:10,810 node, jeg mener bare container. 877 00:41:10,810 --> 00:41:12,900 Og visuelt, mener jeg et rektangel. 878 00:41:12,900 --> 00:41:16,420 Så en node trenger tydeligvis å inneholde to verdier - 879 00:41:16,420 --> 00:41:21,490 den int seg selv, og da som følger av den nederste halvdelen av rektangelet, 880 00:41:21,490 --> 00:41:23,010 nok plass til en int. 881 00:41:23,010 --> 00:41:26,130 >> Så bare tenke fremover her, hvor stor er denne noden, dette 882 00:41:26,130 --> 00:41:27,170 container i spørsmålet? 883 00:41:27,170 --> 00:41:29,250 Hvor mange byte for int? 884 00:41:29,250 --> 00:41:31,310 Antagelig 4, hvis det er det samme som vanlig. 885 00:41:31,310 --> 00:41:33,270 Og deretter hvor mange byte for pekeren? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Så denne beholderen, eller denne noden, er kommer til å være en 8-byte struktur. 888 00:41:37,940 --> 00:41:41,760 Oh, og det er en lykkelig tilfeldighet at vi nettopp introdusert denne oppfatningen av 889 00:41:41,760 --> 00:41:44,400 en struct, eller en C-struktur. 890 00:41:44,400 --> 00:41:48,890 >> Så jeg påstår at jeg ønsker å ta et skritt mot dette mer sofistikerte 891 00:41:48,890 --> 00:41:52,560 gjennomføring av en liste med tall, en lenket liste med tall, jeg trenger å gjøre en 892 00:41:52,560 --> 00:41:56,920 litt mer tenkning opp foran og erklære ikke bare en int, men en struct 893 00:41:56,920 --> 00:41:58,620 at jeg skal ringe, konvensjonelt her, node. 894 00:41:58,620 --> 00:42:01,630 Vi kan kalle det noe vi ønsker, men node skal være tematisk i mange 895 00:42:01,630 --> 00:42:03,560 av de tingene vi begynne å se på nå. 896 00:42:03,560 --> 00:42:06,480 >> Innsiden av den noden er en int n. 897 00:42:06,480 --> 00:42:09,350 Og så dette syntaks, litt merkelig ved første øyekast - 898 00:42:09,350 --> 00:42:12,960 struct node * neste. 899 00:42:12,960 --> 00:42:16,900 Vel billedlig, hva er det? 900 00:42:16,900 --> 00:42:21,000 Det er den nedre halvdelen av rektangelet som vi så 901 00:42:21,000 --> 00:42:22,730 bare et øyeblikk siden. 902 00:42:22,730 --> 00:42:27,600 >> Men hvorfor jeg sier struct node * i motsetning til bare node *? 903 00:42:27,600 --> 00:42:31,370 Fordi hvis det pekeren peker på en annen node, det er bare det 904 00:42:31,370 --> 00:42:32,760 adressen til en node. 905 00:42:32,760 --> 00:42:35,630 Som er i samsvar med det vi har diskutert om pekere så langt. 906 00:42:35,630 --> 00:42:39,690 Men hvorfor, hvis jeg hevder denne strukturen er kalt node, må jeg si struct 907 00:42:39,690 --> 00:42:42,660 node inni her? 908 00:42:42,660 --> 00:42:43,190 >> Nettopp. 909 00:42:43,190 --> 00:42:46,490 Det er liksom en dum virkelighet C. Den typedef, så å si, har ikke 910 00:42:46,490 --> 00:42:47,220 skjedd ennå. 911 00:42:47,220 --> 00:42:48,510 C er super bokstavelig. 912 00:42:48,510 --> 00:42:51,050 Den leser koden topp til bunn, venstre til høyre. 913 00:42:51,050 --> 00:42:54,930 Og inntil treffer det at semikolon på bunnlinjen, gjett hva som ikke 914 00:42:54,930 --> 00:42:57,590 eksistere som en datatype? 915 00:42:57,590 --> 00:42:59,060 Node, sitat unquote node. 916 00:42:59,060 --> 00:43:03,050 >> Men på grunn av den mer utførlig Erklæringen jeg gjorde på første linje - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 fordi det kom først, før klammeparentes, det er liksom som 919 00:43:08,790 --> 00:43:11,800 pre-utdanne Clang at du Vet du hva, gi meg en struct 920 00:43:11,800 --> 00:43:13,570 kalt struct node. 921 00:43:13,570 --> 00:43:16,270 Ærlig talt, jeg liker ikke ringer ting struct node, struct node alle 922 00:43:16,270 --> 00:43:17,090 hele koden min. 923 00:43:17,090 --> 00:43:20,660 Men jeg skal bare bruke det en gang, rett innenfor, slik at jeg kan effektivt 924 00:43:20,660 --> 00:43:25,010 skape en slags sirkulær referanse, ikke en peker til meg per se, men en 925 00:43:25,010 --> 00:43:29,400 pekeren til en annen av en identisk type. 926 00:43:29,400 --> 00:43:32,330 >> Så det viser seg at på en datastruktur som dette, det er noen 927 00:43:32,330 --> 00:43:34,470 operasjoner som kan være av interesse for oss. 928 00:43:34,470 --> 00:43:37,460 Vi ønsker kanskje å sette inn inn i en liste som dette. 929 00:43:37,460 --> 00:43:39,850 Vi ønsker kanskje å slette fra en liste som dette. 930 00:43:39,850 --> 00:43:43,490 Vi ønsker kanskje å søke i listen for en verdi, eller mer generelt, travers. 931 00:43:43,490 --> 00:43:46,410 Og travers er bare en fancy måte å sier start på venstre og flytte alle 932 00:43:46,410 --> 00:43:47,650 vei til høyre. 933 00:43:47,650 --> 00:43:52,640 >> Og legg merke til, selv med dette litt mer sofistikerte data struktur, la 934 00:43:52,640 --> 00:43:56,510 meg foreslå at vi kan låne noen av ideene til de siste to ukene og 935 00:43:56,510 --> 00:43:58,410 implementere en funksjon som heter søke som dette. 936 00:43:58,410 --> 00:44:01,360 Det kommer til å returnere true eller falsk, som indikerer, ja eller 937 00:44:01,360 --> 00:44:03,390 nei, er n i listen. 938 00:44:03,390 --> 00:44:05,960 Sin andre argument er en peker til listen selv, slik at en 939 00:44:05,960 --> 00:44:07,920 peker til en node. 940 00:44:07,920 --> 00:44:10,350 >> Alt jeg skal da gjøre er å erklære en midlertidig variabel. 941 00:44:10,350 --> 00:44:12,730 Vi kaller det ptr av konvensjonen, for pekeren. 942 00:44:12,730 --> 00:44:15,220 Og jeg tilordne den lik begynnelsen av listen. 943 00:44:15,220 --> 00:44:16,680 >> Og nå merke til mens loop. 944 00:44:16,680 --> 00:44:20,640 Så lenge pekeren er ikke lik til null, kommer jeg til å sjekke. 945 00:44:20,640 --> 00:44:24,520 Er Pekerpilen n lik n som ble vedtatt i? 946 00:44:24,520 --> 00:44:26,410 Og vent litt - ny stykke syntaks. 947 00:44:26,410 --> 00:44:29,324 Hva er pilen plutselig? 948 00:44:29,324 --> 00:44:30,574 Yeah? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Nettopp. 951 00:44:34,810 --> 00:44:38,860 Så mens noen minutter siden, brukte vi dot notasjon for å få tilgang til noe 952 00:44:38,860 --> 00:44:43,080 innsiden av en struct, hvis den variable du har ikke den struct 953 00:44:43,080 --> 00:44:47,420 seg selv, men en peker til en struct, heldigvis, et stykke syntaks som 954 00:44:47,420 --> 00:44:48,620 endelig gjør intuitiv følelse. 955 00:44:48,620 --> 00:44:52,360 Pilen betyr å følge pekeren, som våre piler vanligvis bety 956 00:44:52,360 --> 00:44:56,570 billedlig, og gå på data felt inne. 957 00:44:56,570 --> 00:44:59,700 Så pilen er det samme som prikk, men du bruke den når du har en peker. 958 00:44:59,700 --> 00:45:05,270 >> Så bare for å gjenerobre da, hvis n-feltet innsiden av struct kalles pekeren 959 00:45:05,270 --> 00:45:07,760 lik lik n, returnere true. 960 00:45:07,760 --> 00:45:11,970 Ellers denne linjen her - pekeren tilsvarer markøren ved siden. 961 00:45:11,970 --> 00:45:17,540 Så hva dette gjør, varsel, er hvis jeg er for tiden peker på struct 962 00:45:17,540 --> 00:45:21,430 inneholdende 9, og 9 er ikke antallet Jeg ser etter - antar jeg ser 963 00:45:21,430 --> 00:45:22,830 for n tilsvarer 50 - 964 00:45:22,830 --> 00:45:25,930 Jeg kommer til å oppdatere min midlertidig pekeren å ikke peke på denne noden 965 00:45:25,930 --> 00:45:31,190 lenger, men peker pilen ved siden av, som kommer til å sette meg opp her. 966 00:45:31,190 --> 00:45:34,270 >> Nå innså jeg er en virvelvind introduksjon. 967 00:45:34,270 --> 00:45:37,380 På onsdag skal vi faktisk gjøre dette med noen mennesker, og med litt mer 968 00:45:37,380 --> 00:45:38,900 koden på et langsommere tempo. 969 00:45:38,900 --> 00:45:42,990 Men skjønner, er vi nå gjøre våre data strukturer mer komplisert, slik at våre 970 00:45:42,990 --> 00:45:45,780 algoritmer kan få mer effektive, noe som kommer til å være nødvendig for 971 00:45:45,780 --> 00:45:50,500 seks PSett, når vi legger i igjen, de 150 000 ord, men trenger å gjøre det 972 00:45:50,500 --> 00:45:55,650 effektivt, og ideelt, skape en program som kjører for våre brukere ikke er i 973 00:45:55,650 --> 00:46:00,460 lineære, ikke i N kvadrat, men i konstant tid, i det ideelle. 974 00:46:00,460 --> 00:46:02,300 >> Vi ser deg på onsdag. 975 00:46:02,300 --> 00:46:07,240 >> SPEAKER: Ved neste CS50, David glemmer sin base case. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Og det er hvordan du sender tekstmeldinger med C. Hva i - 977 00:46:12,770 --> 00:46:14,020 >> [DIVERSE TEKSTMELDING Varslingslydene] 978 00:46:14,020 --> 00:46:19,734