1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Muziciranja] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Malan: U redu. 4 00:00:12,640 --> 00:00:14,525 Ovo je CS50. 5 00:00:14,525 --> 00:00:16,009 I ovo je početak tjedna 5. 6 00:00:16,009 --> 00:00:18,050 I kao što ste primijetili, Neki od materijala 7 00:00:18,050 --> 00:00:21,050 dobiva malo više kompleks, malo gušće. 8 00:00:21,050 --> 00:00:24,560 >> I to je vrlo lako, pogotovo ako se bili ste u naviku za neko vrijeme, 9 00:00:24,560 --> 00:00:28,600 da se pokušava piskarati dolje najviše ništa što činimo, govorimo u klasi. 10 00:00:28,600 --> 00:00:31,626 Ali shvatite, da nije možda Idealna pedagoški pristup 11 00:00:31,626 --> 00:00:34,250 učenju ovu vrstu materijala, i materijal općenito. 12 00:00:34,250 --> 00:00:37,250 I tako smo zadovoljstvom objaviti da je CS50 vlastiti Gheng 13 00:00:37,250 --> 00:00:39,780 Gong je počeo pripremati kanonsko Skup bilješke 14 00:00:39,780 --> 00:00:42,100 za tečaj, nada što je to, jedan, to 15 00:00:42,100 --> 00:00:44,030 ne služe samo kao Referentna i resursa 16 00:00:44,030 --> 00:00:47,410 za pregledavanje materijala i ide natrag kroz materijal koji bi mogli imati 17 00:00:47,410 --> 00:00:51,230 pobjegao vam prvi put okolo, ali također, tako da vaše glave može biti više 18 00:00:51,230 --> 00:00:53,740 gore nego prema dolje, kada ga dođe vrijeme za predavanje, 19 00:00:53,740 --> 00:00:56,960 tako da bi mogao angažirati više zamišljeno, kao 20 00:00:56,960 --> 00:00:59,170 za razliku od više scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Uz to, rekao je, ono što ćete naći na Web stranica je takve dokumente koji to. 22 00:01:02,510 --> 00:01:04,660 I obavijest, u gornjem lijevom uglu, postoji ne samo sadržaj, 23 00:01:04,660 --> 00:01:06,920 ali i vremenski kodovi koji odmah će vam skočiti 24 00:01:06,920 --> 00:01:09,077 u odgovarajućem dijelu u video online. 25 00:01:09,077 --> 00:01:11,410 A što je Chang ovdje je učinio je, u biti, dokumentirani 26 00:01:11,410 --> 00:01:13,340 ono što se dogodilo u ovom Posebno predavanje. 27 00:01:13,340 --> 00:01:16,370 A mnogi od predavanja su Već sada online s ovim URL. 28 00:01:16,370 --> 00:01:20,110 I dalje ćemo objaviti ostatak onih do kraja ovog tjedna, 29 00:01:20,110 --> 00:01:22,380 pa ne iskoristiti taj resurs. 30 00:01:22,380 --> 00:01:25,740 >> Dakle, bez dodatnih teškoća, počeli smo guliti natrag 31 00:01:25,740 --> 00:01:28,180 sloj koji je bio Niz za neko vrijeme. 32 00:01:28,180 --> 00:01:30,670 A ono što smo rekli niz zapravo je prošlog tjedna? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Dakle char zvijezda. 35 00:01:32,900 --> 00:01:34,900 I char zvijezda, dobro, što nije to zapravo znači? 36 00:01:34,900 --> 00:01:37,150 Pa, sve ovo vrijeme, ako ste Zvao funkciju, 37 00:01:37,150 --> 00:01:40,450 kao getString i skladištenje tzv povratnog 38 00:01:40,450 --> 00:01:42,910 Vrijednost getString u variable-- to se zove 39 00:01:42,910 --> 00:01:47,721 S Type string-- smo pisanje linija koda tamo gore. 40 00:01:47,721 --> 00:01:49,970 I to je samo kad vidim da Rukopis ovdje veliča 41 00:01:49,970 --> 00:01:51,930 ne shvaćam koliko je to grozno. 42 00:01:51,930 --> 00:01:54,180 >> Međutim, pretpostavimo da je, Na desnoj strani 43 00:01:54,180 --> 00:01:57,070 je, ipak, razumni prikaz onoga što je 44 00:01:57,070 --> 00:01:58,880 odlazeći na sve ovo Vrijeme s getString. 45 00:01:58,880 --> 00:02:00,380 getString, naravno, dobiva niz. 46 00:02:00,380 --> 00:02:01,691 No, što to zapravo znači? 47 00:02:01,691 --> 00:02:04,190 To znači da dobiva komad memorije od operativnog sustava 48 00:02:04,190 --> 00:02:06,040 pozivom funkcije, nazvao malloc. 49 00:02:06,040 --> 00:02:07,390 No, više o tome kasnije. 50 00:02:07,390 --> 00:02:09,139 I onda se popunjava koji komad memorije 51 00:02:09,139 --> 00:02:11,764 sa slovima korisnik upisali u, nakon čega, naravno, 52 00:02:11,764 --> 00:02:14,800 null karakter, ili Obrnuta kosa crta nula na samom kraju. 53 00:02:14,800 --> 00:02:18,280 >> U međuvremenu, na lijevoj strani ove priče, sve ovo vrijeme, 54 00:02:18,280 --> 00:02:20,850 mi smo bili proglašenja varijable, kao što ih godina. 55 00:02:20,850 --> 00:02:24,770 I to je ono što se sada varijabla će početi pozivati ​​pokazivač. 56 00:02:24,770 --> 00:02:29,190 Nije okvir unutar kojega stavimo string, Daven, sama po sebi, 57 00:02:29,190 --> 00:02:32,550 već smo stavili na tom trgu okvir s lijeve strane što točno? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Da? 60 00:02:35,390 --> 00:02:37,118 >> PUBLIKA: adresu gdje se nalazi u memoriji. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Malan: Točno. 62 00:02:38,118 --> 00:02:40,690 Adresu gdje Daven Nalazi se u memoriji. 63 00:02:40,690 --> 00:02:44,650 A ne gdje svi Daven nalazi, po sebi, ali je posebno adresa 64 00:02:44,650 --> 00:02:45,150 od čega? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Da? 67 00:02:46,810 --> 00:02:47,460 >> PUBLIKA: Prvi znak. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Malan: Prvi znak u Daven, koji, u ovom slučaju, 69 00:02:50,209 --> 00:02:53,820 Predložio sam bio samovoljno i nerealno 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 što samo znači heksadecimalni broj 1. 71 00:02:55,910 --> 00:02:57,993 No, to vjerojatno ide biti mnogo veći broj 72 00:02:57,993 --> 00:03:01,260 da bismo mogli izvući s 0x kao prefiks, 73 00:03:01,260 --> 00:03:02,806 predstavlja heksadecimalni karakter. 74 00:03:02,806 --> 00:03:05,930 I zato nam ne treba znati gdje Ostatak od likova Daven 75 00:03:05,930 --> 00:03:09,860 su, zbog onoga što jednostavan dizajn Odluka da je napravljen prije mnogo godina? 76 00:03:09,860 --> 00:03:10,548 Da? 77 00:03:10,548 --> 00:03:11,651 >> PUBLIKA: Kosa crtica 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Malan: Da, točno. 79 00:03:12,900 --> 00:03:18,100 Obrnuta kosa crta 0 omogućuje, iako u linearnog vremena, proći niz, 80 00:03:18,100 --> 00:03:20,400 hoda s lijeva na desno, sa za petlju, ili neko vrijeme 81 00:03:20,400 --> 00:03:22,608 petlje, ili nešto slično da, i odrediti, oh, ovdje 82 00:03:22,608 --> 00:03:24,751 je kraj ovom nizu. 83 00:03:24,751 --> 00:03:27,000 Dakle, sa samo adresu na početak niza, 84 00:03:27,000 --> 00:03:30,290 možemo pristupiti u cijelosti da, jer je sve ovo vrijeme, 85 00:03:30,290 --> 00:03:32,030 Niz je upravo char zvijezda. 86 00:03:32,030 --> 00:03:36,370 >> Tako da je sigurno u redu nastaviti koristiti CS50 knjižnica i to apstrakcija, 87 00:03:36,370 --> 00:03:38,440 da se tako izrazim, ali ćemo početi vidjeti točno 88 00:03:38,440 --> 00:03:41,230 Što se događa Ispod cijelog tog vremena. 89 00:03:41,230 --> 00:03:45,260 Tako da se može sjetiti ovaj primjer, također, iz prošlog vremena, usporedite 0, 90 00:03:45,260 --> 00:03:47,300 koji nije zapravo usporediti. 91 00:03:47,300 --> 00:03:49,070 No, počeli smo da se riješi ovo. 92 00:03:49,070 --> 00:03:52,020 >> No, kao što je možda pijanka, možda sam nekoga zanima 93 00:03:52,020 --> 00:03:54,261 u Pink Elephant danas, također izradio Chang? 94 00:03:54,261 --> 00:03:55,760 Kako o vama ispred? [Nečujan]. 95 00:03:55,760 --> 00:03:56,660 Dođi gore. 96 00:03:56,660 --> 00:03:58,740 >> A u međuvremenu, kako ste došli do, ajmo 97 00:03:58,740 --> 00:04:01,670 razmislite na trenutak što taj broj zapravo radi. 98 00:04:01,670 --> 00:04:04,917 To je proglašenje dvije varijable gore top, S i T, i zove getString. 99 00:04:04,917 --> 00:04:08,250 To nije vrlo user-friendly program, jer vam ne govori što da rade. 100 00:04:08,250 --> 00:04:10,541 Ali neka je samo pretpostaviti da smo s naglaskom na sočnom dijelu. 101 00:04:10,541 --> 00:04:14,470 A onda nam je činiti, ukoliko jednak jednaka t, to bi trebalo reći printf, 102 00:04:14,470 --> 00:04:16,170 ste upisali istu stvar. 103 00:04:16,170 --> 00:04:16,670 Pozdrav. 104 00:04:16,670 --> 00:04:17,050 Koje je tvoje ime? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Malan: Janelle, Lijepo vas je upoznati. 107 00:04:19,529 --> 00:04:21,800 Dakle, vaš izazov na Ruka za ovu slona 108 00:04:21,800 --> 00:04:25,230 je prvi privući nam sliku onoga što je bude zastupljena u prve dvije 109 00:04:25,230 --> 00:04:25,970 linije. 110 00:04:25,970 --> 00:04:28,139 Dakle, s i t može biti predstavljeni kako na ekranu? 111 00:04:28,139 --> 00:04:30,680 A možete jednostavno povući s prst na tom velikom ekranu. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Dakle, tu je dvije polovice na svaka strana te jednadžbe. 114 00:04:34,510 --> 00:04:37,760 Dakle, tu je i na lijevoj strani, a onda getString na desnoj strani. 115 00:04:37,760 --> 00:04:40,540 A tu je t na lijevoj strani, a zatim getString na desnoj strani. 116 00:04:40,540 --> 00:04:42,630 Pa kako bismo mogli početi crtež sliku koja 117 00:04:42,630 --> 00:04:46,340 predstavlja ono što se događa ovdje u memoriji, biste rekli? 118 00:04:46,340 --> 00:04:49,150 I neka mi vam objasniti što radite kao i ti ići. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: U redu. 120 00:04:49,820 --> 00:04:58,890 Pa, prvo, da bi se molba da se ulazni niz. 121 00:04:58,890 --> 00:05:00,439 I to bi store-- Oh, ispričavam se. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Malan: U redu. 123 00:05:01,230 --> 00:05:01,730 Dobro. 124 00:05:01,730 --> 00:05:03,330 I to se zove ono? 125 00:05:03,330 --> 00:05:03,950 Oh, u redu. 126 00:05:03,950 --> 00:05:04,450 Imajte ide. 127 00:05:04,450 --> 00:05:05,575 Nisam te htio prekidati. 128 00:05:05,575 --> 00:05:07,060 Janelle: Žao mi je. 129 00:05:07,060 --> 00:05:14,237 Dakle, to bi ugradio u adresa nije of-- sigurni. 130 00:05:14,237 --> 00:05:17,320 Ne mogu se točno sjetiti broja, ali vjerujem da je počevši s 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Malan: To je sve u redu, jer sam napravio brojeve gore, 132 00:05:18,420 --> 00:05:19,650 tako da nema pravi odgovor. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Polazeći od 0 luku. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Malan: U redu, tako da je element 0. 135 00:05:24,000 --> 00:05:24,765 Naravno. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: I onda, ako je kao što je samo dva letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Malan: U redu, natrag na vas. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Tako je element 0, a onda je element 1 ili 2 elementa. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Malan: A koji komad Slika crtaš upravo sada? 140 00:05:36,670 --> 00:05:37,690 Poziv na getString? 141 00:05:37,690 --> 00:05:38,830 Ili deklaracija s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: Deklaracija S, vjerujem. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, jer bi biti unesene u svakom [? područje. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Malan: Dobro. 145 00:05:46,510 --> 00:05:47,051 Točno. 146 00:05:47,051 --> 00:05:49,300 Iako je to učinkovito vraća niz, podsjetimo, 147 00:05:49,300 --> 00:05:53,300 kad se vratimo niz, možemo Indeks se u tom nizu, koristeći 01 i 2. 148 00:05:53,300 --> 00:05:56,180 Tehnički gledano, to su vjerojatno zastupa pojedine adrese, 149 00:05:56,180 --> 00:05:57,100 ali to je u redu. 150 00:05:57,100 --> 00:06:00,170 >> Dakle, pretpostavimo, ako ja mogu samo brzo proslijediti tamo gdje smo stali 151 00:06:00,170 --> 00:06:04,320 Posljednji put, ako je jedan od žice bio g b e, 152 00:06:04,320 --> 00:06:10,337 Obrnuta kosa crta 0, čime predstavlja Gabe-a ulaz, kako bi mogli zastupamo a sada? 153 00:06:10,337 --> 00:06:12,670 Ako je to sjećanje koje je vraćen od strane getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Biste li se zastupa luku? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Malan: Do luku? 157 00:06:18,750 --> 00:06:19,130 Pa, nema. 158 00:06:19,130 --> 00:06:21,171 Recimo, slikovito, neka mi samo ići naprijed 159 00:06:21,171 --> 00:06:25,710 i predlaže da se, ako je to e, to je povratna vrijednost getString. 160 00:06:25,710 --> 00:06:29,482 A što ste izvučeni to kao 0, 1, 2, koji je savršeno razumno, jer mi 161 00:06:29,482 --> 00:06:30,940 Možete indeks u nizu, kao takva. 162 00:06:30,940 --> 00:06:33,340 Ali, samo da bi bili u skladu s Posljednji put, neka mi ići naprijed 163 00:06:33,340 --> 00:06:37,310 i proizvoljno predlaže da ovaj je adresa 1, to je adresa 2, 164 00:06:37,310 --> 00:06:39,597 To je adresa 3, i tako dalje. 165 00:06:39,597 --> 00:06:41,430 I tako, samo da se super Jasno, što se događa 166 00:06:41,430 --> 00:06:44,580 ići u S kao rezultat toga Prva linija koda, biste rekli? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Adresa 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Malan: Točno. 169 00:06:46,420 --> 00:06:47,190 Dakle adresu 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 A u međuvremenu, neka mi ići naprijed i duplikat mnogo od onoga što ste učinili 172 00:06:51,230 --> 00:06:52,740 i dodati svoj vlastiti t ovdje. 173 00:06:52,740 --> 00:06:56,340 Da mi je tip u Gabea ponovno, drugi put, 174 00:06:56,340 --> 00:07:01,530 kad zatraži getString, gdje je, naravno, je Gabe ići? 175 00:07:01,530 --> 00:07:02,280 Pa, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Kao i ovdje? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Malan: Da. 179 00:07:06,850 --> 00:07:08,516 Janelle: Ili je to također u istim okvirima? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Malan: Dopustite mi predlažemo, da, točno, tako da se u tim dodatnim kutijama. 181 00:07:11,940 --> 00:07:15,230 No, ono što je ključno je to da se, čak i iako sam nacrtana to prilično blizu 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ovo 0x2-- je u stvarnosti, 183 00:07:18,650 --> 00:07:25,750 to sada moglo biti adresu 0x10, Na primjer, i 0x11 i 0x12, 184 00:07:25,750 --> 00:07:26,870 i tako dalje. 185 00:07:26,870 --> 00:07:29,955 I tako, ako je to slučaj, što će se završiti ovdje u t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Malan: Točno. 188 00:07:31,830 --> 00:07:33,180 Tako 0x10. 189 00:07:33,180 --> 00:07:34,570 I tako sada, posljednje pitanje. 190 00:07:34,570 --> 00:07:37,510 Vi ste, daleko, morao je raditi Najteže za slona do sada. 191 00:07:37,510 --> 00:07:42,650 Do sada, ako sam podići kod opet, kad radim, u skladu tri, 192 00:07:42,650 --> 00:07:47,630 ukoliko jednak jednaka t, ono što sam ja zapravo usporedbom da smo izvučeni ovdje? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: Dvije adrese? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Malan: Točno. 195 00:07:50,270 --> 00:07:53,350 Pa ja govorim je S jednak jednaka t? 196 00:07:53,350 --> 00:07:56,210 Drugim riječima, je jednaka 1 do 10 jednako? 197 00:07:56,210 --> 00:07:59,710 I naravno, Očigledan odgovor je sada, nema. 198 00:07:59,710 --> 00:08:02,920 I tako je ovaj program je u konačnici će ispisati ono što biste rekli? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: Biste li se, ste upisali istu stvar? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Malan: Dakle, ako s je 1, a T je 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Upisali ste različite stvari. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Malan: Točno. 204 00:08:13,570 --> 00:08:14,480 Upisali ste različite stvari. 205 00:08:14,480 --> 00:08:14,850 U redu. 206 00:08:14,850 --> 00:08:16,714 Dakle, pljesak, ako smo mogli, ovdje. 207 00:08:16,714 --> 00:08:17,214 [Pljesak] 208 00:08:17,214 --> 00:08:17,708 To je bilo bolno. 209 00:08:17,708 --> 00:08:18,208 Znam. 210 00:08:18,208 --> 00:08:19,684 Lijepo učinili. 211 00:08:19,684 --> 00:08:24,690 Dakle, sada ćemo vidjeti, ako ne možemo zafrkavati, osim što je bio popraviti. 212 00:08:24,690 --> 00:08:28,040 I naravno, kada smo fiksne ovo-- što sam sada ćemo predstavljati u green-- 213 00:08:28,040 --> 00:08:29,690 smo napravili nekoliko poboljšanja ovdje. 214 00:08:29,690 --> 00:08:32,409 Prvo, baš kao zdravog razuma ček, ja sam prvo provjere 215 00:08:32,409 --> 00:08:35,110 ukoliko jednak null i t jednak nuli. 216 00:08:35,110 --> 00:08:39,440 I samo da bude jasno, kad bi mogla s ili t biti nula u kodu kao što je ovaj? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kada bi mogao s ili t biti nula. 219 00:08:44,490 --> 00:08:44,990 Da? 220 00:08:44,990 --> 00:08:45,990 >> PUBLIKA: [nečujan]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Malan: Točno. 223 00:08:50,510 --> 00:08:52,840 Ako niz koji korisnik upisali u je predugačka 224 00:08:52,840 --> 00:08:56,140 da stane u memoriju, ili neki čudno kutak slučaj kao što je to, 225 00:08:56,140 --> 00:08:59,010 getString, kao što ćemo vidjeti, doslovno Danas, u svojoj dokumentaciji, 226 00:08:59,010 --> 00:09:02,330 kaže da će se vratiti kao null Posebna vrijednost Sentinel, 227 00:09:02,330 --> 00:09:05,417 ili samo neka vrsta poseban simbol to znači da je nešto pošlo po zlu. 228 00:09:05,417 --> 00:09:07,500 Dakle, želimo provjeriti da, jer ispada 229 00:09:07,500 --> 00:09:09,720 da je nulta je vrlo opasno vrijednost. 230 00:09:09,720 --> 00:09:14,250 >> Često, ako pokušate nešto učiniti s null uključuje function-- to prolazi 231 00:09:14,250 --> 00:09:17,470 kao ulaz, za instance-- tu funkciju možda vrlo će srušiti i, s njim, 232 00:09:17,470 --> 00:09:19,090 skinu cijeli program. 233 00:09:19,090 --> 00:09:22,570 Dakle, ova treća linija sada je samo zdrav razum ček, provjerama, ako hoćete. 234 00:09:22,570 --> 00:09:25,450 To je dobar naviku sada nam da se u svakom trenutku smo 235 00:09:25,450 --> 00:09:28,050 pokušati iskoristiti vrijednost koja moglo, potencijalno, biti nula. 236 00:09:28,050 --> 00:09:32,000 >> Sada, ovdje četvrtoj liniji, "Ako strcmp (s, t)," dobro, 237 00:09:32,000 --> 00:09:33,180 što je to govorite? 238 00:09:33,180 --> 00:09:36,750 Pa, rekao je da je to bio vrlo jezgrovito nazvana funkcija za gudački usporedbe. 239 00:09:36,750 --> 00:09:40,370 I njegova svrha u životu je da usporedite njegov prvi argument protiv njega, drugo, 240 00:09:40,370 --> 00:09:44,640 ali ne u smislu njihove adrese, kao što smo učinili nenamjerno trenutak 241 00:09:44,640 --> 00:09:48,270 Prije s crvenom kodom, ali a usporediti ta dva 242 00:09:48,270 --> 00:09:53,210 žice u ljudskoj intuitivno način uspoređujući to, protiv toga, 243 00:09:53,210 --> 00:09:56,690 protiv toga, protiv toga, i onda zaustavljanja ako i kada je jedan 244 00:09:56,690 --> 00:09:59,590 ili oboje mojih prstiju udari kosu crtu 0. 245 00:09:59,590 --> 00:10:04,530 Tako je netko prije nekoliko godina provedena strcmp implementirati za nas funkcionalnosti 246 00:10:04,530 --> 00:10:08,890 da smo se nadali bismo imati stečen po samo uspoređujući dvije jednostavne vrijednosti. 247 00:10:08,890 --> 00:10:14,929 >> Sad iskreno, ja bi crtež sve ove različite brojeve. 248 00:10:14,929 --> 00:10:17,470 No, stvarnost je, bio sam čineći to se cijelo vrijeme. 249 00:10:17,470 --> 00:10:19,580 I tako neka mi samo ići naprijed i piskarati ove out 250 00:10:19,580 --> 00:10:23,100 da bi točku koja, na kraju dana i kreće prema naprijed, 251 00:10:23,100 --> 00:10:30,160 nismo zapravo događa da je stalo ono što se odnosi stvari su zapravo 252 00:10:30,160 --> 00:10:30,790 u memoriji. 253 00:10:30,790 --> 00:10:34,320 Dakle, ja ne idem na njih skrenuti vrste brojeva toliko više, 254 00:10:34,320 --> 00:10:38,970 Ja sam samo apstraktno to daleko malo više prijateljski sa samo strelice. 255 00:10:38,970 --> 00:10:42,060 >> Drugim riječima, ukoliko je pointer, dobro, neka je samo to nacrtati, doslovno, 256 00:10:42,060 --> 00:10:45,430 kao pokazivač, strelica pokazuje sa sebe na nešto drugo, 257 00:10:45,430 --> 00:10:48,280 i ne previše brinuti više o minutia tih adresa 258 00:10:48,280 --> 00:10:49,910 koji je, opet, sam napravio svejedno. 259 00:10:49,910 --> 00:10:52,680 No, vidjet ćemo te adrese, Ponekad, kada pogrešaka kod. 260 00:10:52,680 --> 00:10:56,450 >> Sada je u međuvremenu, ovaj program ovdje popravci, naravno, 261 00:10:56,450 --> 00:10:58,720 taj problem se usporedbom te dvije žice. 262 00:10:58,720 --> 00:11:00,260 Ali mi naletio na još jedan problem. 263 00:11:00,260 --> 00:11:03,180 To je od kopije programirati posljednji put, 264 00:11:03,180 --> 00:11:06,880 pri čemu, bio sam pokušava kapitalizirati samo prvi znak u nizu. 265 00:11:06,880 --> 00:11:09,620 No, ono što je simptom vidjeli smo zadnji put kada 266 00:11:09,620 --> 00:11:14,150 korisnik upisao u vrijednosti, kao što su Gabe malim slovima, za S, 267 00:11:14,150 --> 00:11:19,310 onda smo dodjeljuje S u t, kao u trećoj liniji tamo, 268 00:11:19,310 --> 00:11:22,900 i onda sam pokušao kapitalizirati t nosač 0? 269 00:11:22,900 --> 00:11:25,950 Koji je učinak promjenom t nosač 0 ovdje? 270 00:11:25,950 --> 00:11:27,150 >> PUBLIKA: To promijenilo s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Malan: Da, Promijenio sam s, što je dobro. 272 00:11:29,360 --> 00:11:31,050 Zato što se doista događa? 273 00:11:31,050 --> 00:11:34,130 Pa, dopustite mi da vidim mogu očistiti se ove slike, kako slijedi. 274 00:11:34,130 --> 00:11:41,390 >> Ako i je, opet, riječ g, A, B, E, Obrnuta kosa crta, 0 i S 275 00:11:41,390 --> 00:11:44,084 nastavit ćemo crtež kao kutija ovdje, ali nema više adresa. 276 00:11:44,084 --> 00:11:45,250 Stanimo izmišljati stvari. 277 00:11:45,250 --> 00:11:47,510 Ajmo nacrtati pojednostaviti svijet. 278 00:11:47,510 --> 00:11:52,640 >> Kad sam proglasiti t sa gudački t, koji stvara taj komad memorije. 279 00:11:52,640 --> 00:11:55,850 Trg se događa da se 32 bita u većini računala. 280 00:11:55,850 --> 00:11:59,530 U stvari, ako ste ikada čuli Računalo ima 32-bitnu arhitekturu, 281 00:11:59,530 --> 00:12:03,000 stvarno fancy-govoriti, da je samo znači da se koristi 32-bitne adrese. 282 00:12:03,000 --> 00:12:05,370 I kao tehnički stranu, Ako ste ikada pitali 283 00:12:05,370 --> 00:12:09,630 Zato starija računala, ako stvarno pokušao juha ih s puno RAM-a, 284 00:12:09,630 --> 00:12:12,360 mogao je samo imati maksimalno od četiri gigabajta RAM-a, 285 00:12:12,360 --> 00:12:14,860 Pa to je zato što, doslovno, staro računalo moglo samo 286 00:12:14,860 --> 00:12:17,250 računati kao visok kao 4 milijarde, 4 milijarde bajtova, 287 00:12:17,250 --> 00:12:20,590 jer je to bio koristite 32-bitni Brojevi za adrese. 288 00:12:20,590 --> 00:12:23,260 >> No, u svakom slučaju, u ovom primjer, priča je puno jednostavnije. 289 00:12:23,260 --> 00:12:27,250 t je samo još jedan pointer, ili Stvarno char zvijezda, zvani niz. 290 00:12:27,250 --> 00:12:30,860 A kako ne želim ažurirati ovu sliku sada s tom drugom linija koda, 291 00:12:30,860 --> 00:12:31,950 nakon točke, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Kad sam napraviti niz t jednaka e-zarez, kako se promijeniti ovu sliku? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Da? 295 00:12:38,000 --> 00:12:38,916 >> PUBLIKA: [nečujan]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Malan: Da. 298 00:12:42,020 --> 00:12:42,600 Točno. 299 00:12:42,600 --> 00:12:45,620 Upravo sam stavio strijelu iz T box na istoj adresi, 300 00:12:45,620 --> 00:12:47,570 Isto prvo slovo u dao. 301 00:12:47,570 --> 00:12:50,850 Ili tehnički, ako je to momak je još uvijek na 0x1, 302 00:12:50,850 --> 00:12:53,052 to je kao da sam imala 0x1 ovdje i 0x1 ovdje. 303 00:12:53,052 --> 00:12:54,760 Ali opet, tko mari o adresama? 304 00:12:54,760 --> 00:12:56,345 To je samo ideja koja je sada važno. 305 00:12:56,345 --> 00:12:57,720 Dakle, to je ono što se događa ovdje. 306 00:12:57,720 --> 00:13:02,690 Pa naravno, ako to ne t nosač 0, što je niz zapis, 307 00:13:02,690 --> 00:13:05,650 od course-- i iskreno, to izgleda kao što postoji niz ovdje, 308 00:13:05,650 --> 00:13:07,340 ali sada je to čudno stvar. 309 00:13:07,340 --> 00:13:11,160 Znamo da je programski jezik, C, nudi vam tu mogućnost, 310 00:13:11,160 --> 00:13:14,650 pri čemu se, čak i kada je t pokazivač, ili s je pokazivač, 311 00:13:14,650 --> 00:13:18,050 još uvijek možete koristiti da se upoznate, ugodno uglata zagrada 312 00:13:18,050 --> 00:13:22,520 zapis otići na prvi element, i drugi element, ili bilo koji element 313 00:13:22,520 --> 00:13:26,130 da je kazaljka pokazuje da, jer, navodno, to 314 00:13:26,130 --> 00:13:29,410 je, kao što je u ovom slučaju pokazujući na nekom polju. 315 00:13:29,410 --> 00:13:30,340 >> Pa kako ćemo riješiti to? 316 00:13:30,340 --> 00:13:33,660 Iskreno, ovo je mjesto gdje je dobio malo neodoljiv na prvi pogled. 317 00:13:33,660 --> 00:13:35,340 No, ovdje je nova i poboljšana verzija. 318 00:13:35,340 --> 00:13:37,460 >> Dakle, prvo, ja sam uzimajući osloboditi od CS50 knjižnici, 319 00:13:37,460 --> 00:13:41,170 samo izložiti, da je doista char zvijezda, samo sinonim. 320 00:13:41,170 --> 00:13:43,540 I t je također char zvijezda. 321 00:13:43,540 --> 00:13:48,290 No, ono što se događa na desna strana te linije 322 00:13:48,290 --> 00:13:49,970 gdje je T dodijeljena je vrijednost? 323 00:13:49,970 --> 00:13:50,790 >> Što je malloc? 324 00:13:50,790 --> 00:13:51,630 Što to strlen? 325 00:13:51,630 --> 00:13:52,547 Što je sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Zašto, dovraga, to čini Linija izgledaju tako složeno? 327 00:13:54,380 --> 00:13:55,713 Što to radi na visokoj razini? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Što je to spremanje ut? 330 00:13:57,440 --> 00:13:58,646 Da? 331 00:13:58,646 --> 00:14:01,104 PUBLIKA: To je dodjelom Određena količina memorije. 332 00:14:01,104 --> 00:14:03,032 To je za pohranu, pretpostavljam, slova [nečujan]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Malan: Savršen. 334 00:14:04,032 --> 00:14:04,540 Savršeno. 335 00:14:04,540 --> 00:14:06,650 Prošlo dodjele određena količina memorije 336 00:14:06,650 --> 00:14:08,940 za pohranu, vjerojatno, budući slova. 337 00:14:08,940 --> 00:14:11,310 I posebno, malloc Stoga se vraća ono? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> PUBLIKA: Vraćanje [nečujan]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Malan: Točno. 341 00:14:15,850 --> 00:14:18,850 Vrativši adresu tog sjećanja, što je fancy način govoreći, 342 00:14:18,850 --> 00:14:21,640 vraća adresu Prvi bajt tog sjećanja. 343 00:14:21,640 --> 00:14:25,460 Teret je na mene da ne zaboravite koliko memorije zapravo sam 344 00:14:25,460 --> 00:14:27,140 dodijeljeno ili pitao za malloc. 345 00:14:27,140 --> 00:14:28,384 >> Sad koliko je to? 346 00:14:28,384 --> 00:14:30,550 Pa, iako postoji Puno zagradama ovdje, 347 00:14:30,550 --> 00:14:32,970 malloc traje samo jedan argument. 348 00:14:32,970 --> 00:14:37,250 I ja sam navodeći strlen od S, pa bi ja kao i mnogi bajtova kao što postoje u sekundi, 349 00:14:37,250 --> 00:14:37,800 ali dodati. 350 00:14:37,800 --> 00:14:38,300 Zašto? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Da? 353 00:14:39,530 --> 00:14:40,840 >> PUBLIKA: 0 Obrnuta kosa crta. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Malan: Točno. 355 00:14:41,840 --> 00:14:43,423 Moramo napraviti malo rutine. 356 00:14:43,423 --> 00:14:45,970 Pa zato što postoji Obrnuta kosa crta 0, što je bolje zapamtiti da. 357 00:14:45,970 --> 00:14:47,310 Inače, idemo stvoriti niz koji 358 00:14:47,310 --> 00:14:49,170 nema tu posebnu terminator. 359 00:14:49,170 --> 00:14:52,640 >> U međuvremenu, samo da se super analni, ja sizeof (char) imaju, 360 00:14:52,640 --> 00:14:55,730 Samo u slučaju da netko radi Moji Kod ne na CS50 aparata, 361 00:14:55,730 --> 00:14:58,220 ali možda drugo računalo ukupno kojoj znakova 362 00:14:58,220 --> 00:15:01,470 su jedan bajt, prema konvenciji, ali dva bajtova, ili nešto veće od toga. 363 00:15:01,470 --> 00:15:04,490 To je samo da se super, Super zaziru pogreške. 364 00:15:04,490 --> 00:15:06,940 Iako, u stvarnosti, to je najvjerojatnije će biti 1. 365 00:15:06,940 --> 00:15:11,490 >> Sada je, u međuvremenu, idem naprijed i kopirati string, t nosač ja jednako t nosač s. 366 00:15:11,490 --> 00:15:14,962 I ja ću odgoditi do prošlotjednog izvorni kod kako bi vidjeli što se događa. 367 00:15:14,962 --> 00:15:17,670 No, ključna takeaway, a Razlog zbog kojeg sam stavio kod sada u zelenom, 368 00:15:17,670 --> 00:15:22,520 je zbog toga vrlo zadnju liniju, T nosač 0 jednak toupper, 369 00:15:22,520 --> 00:15:25,230 ima učinak kapitaliziranje koji niz? 370 00:15:25,230 --> 00:15:26,960 T i / ili e? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Ta posljednja linija koda. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Samo t, jer ono što je dogodilo ovaj put, 375 00:15:35,560 --> 00:15:41,500 ako sam nešto poništi taj zadnji korak, što se dogodilo je, kad sam nazvati malloc, 376 00:15:41,500 --> 00:15:45,380 Ja u biti dobiti komad memorije koji je iste veličine kao i original, 377 00:15:45,380 --> 00:15:47,020 jer to je aritmetika jesam. 378 00:15:47,020 --> 00:15:50,920 Ja spremanje u t adresi tog komad memorije. 379 00:15:50,920 --> 00:15:53,370 Iako ovo izgleda lijepo i lijepa, lijepo i prazno, 380 00:15:53,370 --> 00:15:56,882 Stvarnost je tu je, što ćemo zadržati poziv, vrijednosti smeće ovdje. 381 00:15:56,882 --> 00:15:59,340 Taj komad memorije mogli vrlo dobro su korišteni prije, 382 00:15:59,340 --> 00:16:00,940 nekoliko sekundi, prije nekoliko minuta. 383 00:16:00,940 --> 00:16:04,410 Tako da apsolutno može biti brojevi ili slova tamo, samo slučajno. 384 00:16:04,410 --> 00:16:08,580 Ali oni ne vrijede, dok sam Osobno naseliti ovaj komad memorije 385 00:16:08,580 --> 00:16:12,510 sa stvarnim broj znakova, kao što sam učiniti da za petlje tamo. 386 00:16:12,510 --> 00:16:13,180 U redu? 387 00:16:13,180 --> 00:16:16,180 >> Tako sada, vrhunac ova tri primjera 388 00:16:16,180 --> 00:16:20,730 koji su naizgled slomljen posljednji put, to Zamijeni primjer, ova funkcija 389 00:16:20,730 --> 00:16:23,670 radio je u smislu da zamijenili A i B. 390 00:16:23,670 --> 00:16:25,620 No, to nije posao u kojem drugom smislu? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Da? 393 00:16:28,614 --> 00:16:29,612 >> PUBLIKA: [nečujan]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Malan: Točno. 396 00:16:36,700 --> 00:16:39,530 Da mi je pozvati ovu funkciju od another-- Na primjer, 397 00:16:39,530 --> 00:16:42,870 iz funkcije kao što su glavni, gdje Imam varijablu X i Y, kao što sam 398 00:16:42,870 --> 00:16:46,160 učinio prošli tjedan, isti broj, i ja proći u xiy 399 00:16:46,160 --> 00:16:49,860 za swap, a zatim pozvati Swap-- to, naravno, je točna verzija 400 00:16:49,860 --> 00:16:52,220 je ono što smo o tome da se vidjeti-- nije uspjelo. 401 00:16:52,220 --> 00:16:53,770 Dakle, ono što se popraviti? 402 00:16:53,770 --> 00:16:56,850 >> Pa, pa samo da bude jasno, neka mi ići naprijed 403 00:16:56,850 --> 00:17:05,450 i-- daj mi jednu sekundu ovdje, i vidjeti ako ja mogu vam pokazati posljednji, koji je 404 00:17:05,450 --> 00:17:12,464 će biti in-- da vidimo mogu li pronaći ovo stvarno fast-- redu, [nečujan]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, tu je. 407 00:17:19,240 --> 00:17:21,000 Dakle ignorirati naredbe sam samo tipkati. 408 00:17:21,000 --> 00:17:23,780 Želim da dohvatiti na Last minute primjer 409 00:17:23,780 --> 00:17:27,960 iz prošlog vremena, koji sada se zove swap. 410 00:17:27,960 --> 00:17:30,200 >> Dakle, nema Swap je mjesto gdje smo stali zadnji put, 411 00:17:30,200 --> 00:17:32,930 pri čemu, ja inicijalizira x 1, y na 2. 412 00:17:32,930 --> 00:17:35,840 I onda nazvati Swap, prolaze u 1. i 2.. 413 00:17:35,840 --> 00:17:37,930 A onda je ova funkcija radio je u nekom smislu, 414 00:17:37,930 --> 00:17:40,750 ali nije imao stalni utjecati na xiy. 415 00:17:40,750 --> 00:17:45,430 Dakle, pitanje je pri ruci, kako sada mi zapravo riješili taj problem? 416 00:17:45,430 --> 00:17:47,820 Što je rješenje pri ruci? 417 00:17:47,820 --> 00:17:53,150 >> Pa, u swap.c, koja je nova i danas, primijetiti nekoliko razlika. 418 00:17:53,150 --> 00:17:54,700 X i Y su isti. 419 00:17:54,700 --> 00:17:57,250 No, ono što je očito drugačije o liniji 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Što je novo tamo, ako se sjećate kako je to izgledalo malo prije? 422 00:18:01,715 --> 00:18:02,565 >> PUBLIKA: [nečujan]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Malan: Da. 424 00:18:03,440 --> 00:18:06,680 Tako su znakove za novi komad sintakse, ne samo u ovom programu, 425 00:18:06,680 --> 00:18:08,560 ali općenito u CS50. 426 00:18:08,560 --> 00:18:10,680 Do sada, ja ne mislim vidjeli smo primjere 427 00:18:10,680 --> 00:18:14,070 ili zapravo govorio o njima u bilo detalja, osim, možda, preventivno 428 00:18:14,070 --> 00:18:16,467 U sekciji, znak za struju ovako. 429 00:18:16,467 --> 00:18:19,300 Pa, ispada da je jedan znak za struju od posljednjih komada nove sintakse 430 00:18:19,300 --> 00:18:20,174 ćemo naučiti. 431 00:18:20,174 --> 00:18:23,500 Sve to znači da je adresu neke varijable. 432 00:18:23,500 --> 00:18:25,070 U kojoj nema adrese x živjeti? 433 00:18:25,070 --> 00:18:26,510 No, ono što ne adresa y živjeti? 434 00:18:26,510 --> 00:18:28,700 Jer, ako Temeljni problem prije 435 00:18:28,700 --> 00:18:32,970 je da su X i Y su se prošli kao kopija, ono što mi stvarno želite raditi 436 00:18:32,970 --> 00:18:38,780 je osigurati Swap s kao blago Karta koja vodi do mjesta gdje xiy zapravo 437 00:18:38,780 --> 00:18:41,910 su u RAM-u, tako da je Zamijeni može pratiti taj kartu 438 00:18:41,910 --> 00:18:47,760 i otići gdje god x ili y označava mjesto i promjenu stvarne vrijednosti 1 i 2 439 00:18:47,760 --> 00:18:48,270 postoji. 440 00:18:48,270 --> 00:18:50,710 >> Dakle Zamijeni treba nešto mijenjati. 441 00:18:50,710 --> 00:18:53,760 I na prvi pogled, to može Čini se malo sličan char zvijezde. 442 00:18:53,760 --> 00:18:54,850 I doista je. 443 00:18:54,850 --> 00:18:59,635 Tako je kazaljka na kakvu vrstu podataka, na temelju tog označenog dijela? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Tako da je int. 446 00:19:01,620 --> 00:19:04,880 >> Dakle, više nije int, to je adresa int. 447 00:19:04,880 --> 00:19:07,910 A na sličan način, b sada ide biti adresu int. 448 00:19:07,910 --> 00:19:12,470 Dakle, kada sam sada nazvati Swap od glavne, Neću dati Swap 1 i 2. 449 00:19:12,470 --> 00:19:15,540 Ja ću ga dati kao Ox-nešto i Ox-nešto, 450 00:19:15,540 --> 00:19:19,820 dvije adrese koje će dovesti Zamijeni svojim stvarnim mjestima 451 00:19:19,820 --> 00:19:21,310 u memoriji mog računala. 452 00:19:21,310 --> 00:19:25,580 >> Tako sada, moj preostalo provođenje treba promijeniti tad. 453 00:19:25,580 --> 00:19:28,650 Ono što je očito sada drugačije U ove tri linije koda? 454 00:19:28,650 --> 00:19:31,350 Tu ti prokleti zvijezde sve više mjesta, u redu? 455 00:19:31,350 --> 00:19:33,014 Dakle, ono što se ovdje događa? 456 00:19:33,014 --> 00:19:33,514 Da? 457 00:19:33,514 --> 00:19:35,055 >> PUBLIKA: To je očito [nečujan]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Malan: Točno. 460 00:19:37,990 --> 00:19:41,560 Dakle, u ovom context-- a to nije bilo Najbolji dizajn odluka, doduše, 461 00:19:41,560 --> 00:19:42,530 prije mnogo godina. 462 00:19:42,530 --> 00:19:45,110 U ovom kontekstu, u kojem samo trebate zvijezdu, 463 00:19:45,110 --> 00:19:48,240 a vi nemate tip podataka, kao int, odmah s lijeve strane, 464 00:19:48,240 --> 00:19:53,146 umjesto da imate znak jednakosti, jasno, U tom kontekstu, kad kažu zvijezde, 465 00:19:53,146 --> 00:19:56,980 to znači ići na adresu koja je u. 466 00:19:56,980 --> 00:19:58,870 Pratite kartu s blagom, da se tako izrazim. 467 00:19:58,870 --> 00:20:01,720 >> A u međuvremenu, u skladu 37, to znači istu stvar. 468 00:20:01,720 --> 00:20:05,460 Idi na adrese, i staviti ono tamo? 469 00:20:05,460 --> 00:20:09,520 Što god je na Mjesto koje b određuje. 470 00:20:09,520 --> 00:20:10,980 Drugim riječima, ići na b. 471 00:20:10,980 --> 00:20:12,130 Uzmite tu vrijednost. 472 00:20:12,130 --> 00:20:15,620 Idi na i, po jednakim potpisati, operater zadatak, 473 00:20:15,620 --> 00:20:17,010 stavi tu vrijednost postoji. 474 00:20:17,010 --> 00:20:19,272 >> Slično tome, int temp je samo int. 475 00:20:19,272 --> 00:20:20,730 Ništa se treba promijeniti o temp. 476 00:20:20,730 --> 00:20:24,810 To je samo rezervna stakla iz Annenberg neko mlijeko ili sok od naranče. 477 00:20:24,810 --> 00:20:27,630 Ali ja trebam reći, ići na b. 478 00:20:27,630 --> 00:20:31,449 Idi na tu destinaciju i stavite vrijednost na temp postoji. 479 00:20:31,449 --> 00:20:32,490 Dakle, ono što se događa tada? 480 00:20:32,490 --> 00:20:36,540 Kad sam se zapravo zvati Swap ovaj put, ako je ovaj prvi ladica ovdje predstavlja Main, 481 00:20:36,540 --> 00:20:42,270 ova druga ladica predstavlja Swap, kada Ja prođe Ampersand xi y ampersand 482 00:20:42,270 --> 00:20:47,150 od Glavni na swap, samo da bude jasno, što je to stog okvir prijemni? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Da? 485 00:20:49,200 --> 00:20:50,180 >> PUBLIKA: [nečujan]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Malan: Točno. 487 00:20:51,180 --> 00:20:53,129 Adresu X i adresu y. 488 00:20:53,129 --> 00:20:55,170 A možete misliti na njih poput poštanske adrese. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street i 35 Oxford Street, a vi 490 00:20:58,772 --> 00:21:01,230 želite premjestiti dvije zgrade da su na tim mjestima. 491 00:21:01,230 --> 00:21:04,680 >> To je neka vrsta smiješno ideje, ali to je sve što podrazumijevamo pod adresu. 492 00:21:04,680 --> 00:21:07,000 Gdje se u svijetu može da pronađete one dvije ints? 493 00:21:07,000 --> 00:21:09,470 Gdje u svijetu možete pronaći one dvije zgrade? 494 00:21:09,470 --> 00:21:15,170 Dakle, ako je konačno, nakon toliko vremena sam ići u današnjem izvornog koda i sastaviti 495 00:21:15,170 --> 00:21:22,110 Zamijeni i trčanje ./swap, konačno, za Prvi put mi zapravo vidimo da je 496 00:21:22,110 --> 00:21:25,330 moje vrijednosti su doista uspješno zamijenio. 497 00:21:25,330 --> 00:21:30,860 A sada, možemo čak potrajati NAPOMENA ovog u, recimo, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Dakle, pustite me u istu datoteku. 499 00:21:32,740 --> 00:21:35,010 Dopustite mi ići naprijed i pokrenuti GDB od ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 I sada, u zamjenu, ja ću otići naprijed i postaviti break u glavni izbornik. 502 00:21:40,547 --> 00:21:42,630 A sada ću otići naprijed i pokrenuti program. 503 00:21:42,630 --> 00:21:45,810 A sada vidimo moj broj zastao na toj liniji. 504 00:21:45,810 --> 00:21:48,330 >> Ako sam ići naprijed i ispis x, ono što sam trebao vidjeti ovdje? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 To je pitanje. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Opet reći? 509 00:21:51,530 --> 00:21:52,295 >> PUBLIKA: [nečujan]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Malan: Tako slučajnih brojeva, možda. 511 00:21:53,910 --> 00:21:56,010 Možda sam se posreći, i to je lijepo i jednostavno, kao što je 0. 512 00:21:56,010 --> 00:21:57,230 No, možda je to neki slučajni broj. 513 00:21:57,230 --> 00:21:58,090 U ovom slučaju, dobio sam sretan. 514 00:21:58,090 --> 00:21:59,030 To se događa samo da bude 0. 515 00:21:59,030 --> 00:22:00,780 Ali, to je doista sreća, jer ne dok sam 516 00:22:00,780 --> 00:22:06,280 upisati sljedeći, a zatim ispisati x ima da linija koda, linija 19, izvršen. 517 00:22:06,280 --> 00:22:10,942 >> U međuvremenu, ako upišete naprijed opet, i Sada ispisati y, idem vidjeti 2. 518 00:22:10,942 --> 00:22:13,900 Sada, ako sam upisati sljedeći, to će dobiti malo zbunjujuće, jer sada, 519 00:22:13,900 --> 00:22:17,250 printf će se pojaviti na zaslon, kao što je učinio. x je 1. 520 00:22:17,250 --> 00:22:18,606 >> Idemo to učiniti opet. 521 00:22:18,606 --> 00:22:20,480 A sada, evo gdje stvari se zanimljiva. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Prije nego što sam nazvati swap ili čak korak u nju, neka je uzme malo zaviriti. 524 00:22:26,580 --> 00:22:28,980 x je, opet, 1. 525 00:22:28,980 --> 00:22:33,240 Y je, naravno, brzo razum ček, 2, tako da nije teško bilo. 526 00:22:33,240 --> 00:22:35,740 No, što je znak za struju x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Odgovor, to je vrsta funky gleda. 529 00:22:39,350 --> 00:22:43,500 Ali int zvijezda u zagradi je samo BDP način da se kaže ovo je adresa. 530 00:22:43,500 --> 00:22:48,290 To nije int, da je kazaljka na Interesi, ili na drugi način poznat kao adresu. 531 00:22:48,290 --> 00:22:49,742 >> Što je to luda stvar? 532 00:22:49,742 --> 00:22:51,825 Nikada nismo vidjeli nešto dosta ni prije. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Dakle, ovo je adresa u moje računalo je Sjećanje na kojem x dogodi živjeti. 535 00:22:58,120 --> 00:22:59,040 To je Ox-nešto. 536 00:22:59,040 --> 00:23:01,290 A to je, iskreno, zašto Ja sam počeo crtati strijele, 537 00:23:01,290 --> 00:23:03,340 umjesto brojeva, jer tko stvarno brine 538 00:23:03,340 --> 00:23:06,890 da je vaš int je na određeni Adresa da je to veliko. 539 00:23:06,890 --> 00:23:12,160 Ali bffff0c4, to su sve doista heksadecimalni znamenki, 540 00:23:12,160 --> 00:23:13,720 koji su 0 do f. 541 00:23:13,720 --> 00:23:16,590 >> Dakle, nećemo boraviti previše dugo o tome što su te stvari. 542 00:23:16,590 --> 00:23:19,400 Ali, ako sam isprintati y, Naravno, vidim 2. 543 00:23:19,400 --> 00:23:22,440 No, znak za struju y, vidim ovu adresu. 544 00:23:22,440 --> 00:23:26,527 I obavijest, za znatiželjne, Kako udaljeni su X i Y? 545 00:23:26,527 --> 00:23:27,985 Možete ignorirati većinu adresu. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Četiri bajtova. 548 00:23:29,920 --> 00:23:33,510 I to je u skladu s našim ranije tvrde da koliko je velik int? 549 00:23:33,510 --> 00:23:34,130 Četiri bajtova. 550 00:23:34,130 --> 00:23:37,420 Dakle, izgleda da je sve ske lijepo, kao što ste mogli nadati, u sjećanju. 551 00:23:37,420 --> 00:23:40,010 >> Tako sada, neka je samo brzo naprijed do kraja ove priče. 552 00:23:40,010 --> 00:23:43,290 Idemo naprijed i upišite korak, zaroniti u swap funkciji. 553 00:23:43,290 --> 00:23:46,880 Sada primijetiti, ako sam tip, to je identičan adresu X. 554 00:23:46,880 --> 00:23:52,130 Ako sam tip B, to je identično na adresu y. 555 00:23:52,130 --> 00:23:57,020 Pa što bih trebao vidjeti ako ja recimo, idu na adresu u? 556 00:23:57,020 --> 00:23:58,120 Dakle ispisati zvijezda. 557 00:23:58,120 --> 00:24:00,130 Dakle zvijezda znači ići tamo, u tom kontekstu. 558 00:24:00,130 --> 00:24:02,730 Ampersand znači ono što je adresa. 559 00:24:02,730 --> 00:24:05,000 Dakle zvijezda sredstva 1. 560 00:24:05,000 --> 00:24:09,590 I ispis zvijezda b daje mi 2. 561 00:24:09,590 --> 00:24:15,750 >> I neka mi pretpostavljamo, za sada, da barem kod koje 562 00:24:15,750 --> 00:24:18,950 nastavlja izvršavati sada može biti obrazloženo kroz na taj način. 563 00:24:18,950 --> 00:24:21,150 No, mi ćemo ponovno ovu ideju prije dugo. 564 00:24:21,150 --> 00:24:23,850 Dakle, ova verzija Swap sada je točna i omogućuje 565 00:24:23,850 --> 00:24:26,650 nam da zamijene ovu posebnu vrstu podataka. 566 00:24:26,650 --> 00:24:29,120 >> Dakle, bilo kakva pitanja tada Swap? 567 00:24:29,120 --> 00:24:29,890 Na zvijezdu? 568 00:24:29,890 --> 00:24:30,690 Na adresu? 569 00:24:30,690 --> 00:24:33,270 I vidjet ćete, s Problem set 4, na neki način, 570 00:24:33,270 --> 00:24:37,310 ali je problem postaviti 5, definitivno, kako je to stvari koje su korisne i dobiti mnogo više 571 00:24:37,310 --> 00:24:39,584 ugodno s njima, kao rezultat. 572 00:24:39,584 --> 00:24:40,430 Bilo što? 573 00:24:40,430 --> 00:24:40,930 U redu. 574 00:24:40,930 --> 00:24:44,350 Dakle malloc je, opet, ova funkcija da je samo dodjeljuje memorije, memoriju 575 00:24:44,350 --> 00:24:45,330 Dodjela. 576 00:24:45,330 --> 00:24:47,024 A zašto je to korisno? 577 00:24:47,024 --> 00:24:48,940 Pa, sve ovo vrijeme, ste koristili malloc. 578 00:24:48,940 --> 00:24:52,230 Ako uzmete u obzir kako sada getString djela, po svoj prilici, to je 579 00:24:52,230 --> 00:24:56,140 molba nekoga za komad memorije, bilo kada korisnik upiše string 580 00:24:56,140 --> 00:24:59,040 u, jer mi sigurno ne znam, kao CS50 osoblja, 581 00:24:59,040 --> 00:25:02,710 koliko je velika ta žice koje ljudi će upisati moglo biti. 582 00:25:02,710 --> 00:25:07,910 >> Tako ćemo, po prvi put, početi oguliti natrag koliko su CS50 knjižnica djela, 583 00:25:07,910 --> 00:25:10,990 preko nekoliko primjera koji će nas odvesti tamo. 584 00:25:10,990 --> 00:25:15,300 Dakle, ako sam otvoriti gedit i otvoriti scanf 0, 585 00:25:15,300 --> 00:25:17,055 ćemo vidjeti sljedeći kod. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, dostupan na internetskim stranicama za Danas, ima relativno malo linija koda 588 00:25:23,530 --> 00:25:25,351 Ovdje, 14 do 20.. 589 00:25:25,351 --> 00:25:26,600 I da vidimo što radi. 590 00:25:26,600 --> 00:25:28,920 Ona izjavljuje int, pod nazivom x. 591 00:25:28,920 --> 00:25:30,850 Ona kaže nešto poput, broj molim te. 592 00:25:30,850 --> 00:25:33,940 A sada je, kaže, scanf% ja, & x. 593 00:25:33,940 --> 00:25:35,620 Dakle, postoji hrpa novih stvari tamo. 594 00:25:35,620 --> 00:25:38,420 >> No, scanf, možete nekako mislim da o kao suprotnost printf. 595 00:25:38,420 --> 00:25:40,090 printf, naravno, ispisuje na zaslon. 596 00:25:40,090 --> 00:25:44,410 scanf vrsta skeniranja od korisnika Tipkovnica je nešto što on ili ona je upisali. 597 00:25:44,410 --> 00:25:46,550 >> % Ja je baš kao i printf. 598 00:25:46,550 --> 00:25:49,410 To znači da očekujem korisniku da tip int. 599 00:25:49,410 --> 00:25:52,820 A sad, zašto misliš da možda se prolazi scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Ako je svrha u životu scanf je da se nešto od korisnika, 602 00:25:57,770 --> 00:26:02,480 ono što je smisao to prolazi, i x, sada? 603 00:26:02,480 --> 00:26:02,980 Da? 604 00:26:02,980 --> 00:26:03,896 >> PUBLIKA: [nečujan]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Malan: Točno. 607 00:26:06,540 --> 00:26:12,900 Što god sam, ljudski, upisati, moj ulaz će biti spašen na tom mjestu. 608 00:26:12,900 --> 00:26:17,660 To nije dovoljno, podsjetimo, samo prođe u X, jer smo već vidjeli, 609 00:26:17,660 --> 00:26:21,630 svaki put kad prođe samo sirovu varijablu, kao int, u nekoj drugoj funkciji, 610 00:26:21,630 --> 00:26:25,640 Naravno, to ne može promijeniti promjenjiva, ali ne trajno. 611 00:26:25,640 --> 00:26:27,360 To se ne može imati učinak na početak. 612 00:26:27,360 --> 00:26:29,420 To samo može promijeniti svoju lokalnu kopiju. 613 00:26:29,420 --> 00:26:32,560 Ali ako se, umjesto toga, ne znaš daj mi stvarni int, 614 00:26:32,560 --> 00:26:36,640 ali ti mi dati upute do da je int, ja sada, kao scanf, 615 00:26:36,640 --> 00:26:41,050 sigurno, ja mogu slijediti da adresu i staviti broj postoji 616 00:26:41,050 --> 00:26:43,280 tako da ćete imati pristup do njih kao dobro. 617 00:26:43,280 --> 00:26:45,120 >> Dakle, kada sam pokrenuti ovaj program, da vidimo. 618 00:26:45,120 --> 00:26:49,660 Napravite scanf 0 dot crtu, scanf 0. 619 00:26:49,660 --> 00:26:54,030 A ako sam sada upisati broj kao 50, hvala na 50. 620 00:26:54,030 --> 00:26:58,150 Ako ja sada upisati broj kao negativna 1, negativan 1. 621 00:26:58,150 --> 00:27:04,200 Sada upišite broj kao 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Zašto je moj program ignorirati me? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Pa, zato što je jednostavno, rekla sam što očekivati ​​samo int. 625 00:27:09,880 --> 00:27:10,380 U redu. 626 00:27:10,380 --> 00:27:11,630 Dakle, to je jedna verzija toga. 627 00:27:11,630 --> 00:27:16,600 Uzmimo stvari na višu razinu i Predlažem da to nije dobro. 628 00:27:16,600 --> 00:27:20,530 I ovdje leži vrlo jednostavan primjer kako bismo mogli početi pisati kod 629 00:27:20,530 --> 00:27:24,450 da drugi ljudi mogu iskoristiti ili kompromis radeći loše stvari. 630 00:27:24,450 --> 00:27:28,336 Dakle linije 16, tako slično u duhu kako bi prije, 631 00:27:28,336 --> 00:27:29,960 ali nisam proglašavanje int ovaj put. 632 00:27:29,960 --> 00:27:32,970 Ja sam proglašavanje char zvijezdu, zvani nizu. 633 00:27:32,970 --> 00:27:35,190 >> No, što to zapravo znači? 634 00:27:35,190 --> 00:27:38,790 Dakle, ako ja ne navesti address-- i Ja sam ga zovete samovoljno, tampon, 635 00:27:38,790 --> 00:27:43,370 ali ja bi mogao nazvati to je, da se simple-- i onda sam to učiniti, objasnite mi, 636 00:27:43,370 --> 00:27:48,630 ako bi mogao, na temelju prethodne logika, ono scanf radi u skladu 18, 637 00:27:48,630 --> 00:27:55,000 Ako pass% si tampon, koja je adresa? 638 00:27:55,000 --> 00:27:58,210 Što je scanf, ako se primjenjuju Točno ista logika kao verziji 0, 639 00:27:58,210 --> 00:28:00,640 će pokušati učiniti ovdje, kada korisnik upiše nešto u? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Da? 642 00:28:03,409 --> 00:28:04,407 >> PUBLIKA: [nečujan]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Malan: Točno. 645 00:28:08,890 --> 00:28:11,577 Scanf, po logici ranije, će poduzeti niz 646 00:28:11,577 --> 00:28:13,410 da je ljudsko upisali in-- to je sada niz, 647 00:28:13,410 --> 00:28:15,790 to nije broj, po svoj prilici, ako on ili ona cooperates-- 648 00:28:15,790 --> 00:28:19,310 i to će pokušati staviti niz u spomen na bilo kojoj adresi 649 00:28:19,310 --> 00:28:20,340 tampon određuje. 650 00:28:20,340 --> 00:28:23,870 I to je super, jer tampon je doista trebao biti adresa. 651 00:28:23,870 --> 00:28:30,470 >> Ali ja tvrdim ovaj program je lud u vrlo ozbiljan način, jer ono što je vrijednost 652 00:28:30,470 --> 00:28:31,330 buffer po defaultu? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Što sam inicijaliziranu u? 655 00:28:34,790 --> 00:28:35,770 Koji komad memorije? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Nisam, zar ne? 658 00:28:38,620 --> 00:28:42,265 >> Dakle, iako sam izdvojila char zvijezda koja se više ne zove e, 659 00:28:42,265 --> 00:28:48,030 on je umjesto toga se zove, pa buffer-- ajmo privući varijable ime 660 00:28:48,030 --> 00:28:53,380 sada kao buffer-- ako nisam zove getString ili malloc ovdje, 661 00:28:53,380 --> 00:28:56,030 to zapravo znači da tampon je samo neka smeća vrijednost. 662 00:28:56,030 --> 00:28:57,030 >> Sada, što to znači? 663 00:28:57,030 --> 00:29:00,220 To znači da sam rekla scanf očekivati ​​niz od korisnika. 664 00:29:00,220 --> 00:29:01,300 I znate što? 665 00:29:01,300 --> 00:29:03,883 Bez obzira na to što se ukazuje to-- i crtam upitnik, 666 00:29:03,883 --> 00:29:07,060 ali u stvarnosti, to će biti nešto poput Ox1, 2, 3, zar ne? 667 00:29:07,060 --> 00:29:10,730 To je neka lažna vrijednost koja je upravo se događa da se tamo od prije. 668 00:29:10,730 --> 00:29:13,440 Dakle, drugim riječima, to je kao da je samo tampon 669 00:29:13,440 --> 00:29:16,180 ukazujući na nešto u sjećanju. 670 00:29:16,180 --> 00:29:17,610 Nemam pojma što. 671 00:29:17,610 --> 00:29:24,130 >> Dakle, ako sam upisati u Gabe sada, to se događa pokušati staviti g-A-B-e / 0 postoji. 672 00:29:24,130 --> 00:29:25,530 No, tko zna što je to? 673 00:29:25,530 --> 00:29:27,480 I u prošlosti, bilo Vrijeme smo pokušali dotaknuti 674 00:29:27,480 --> 00:29:29,770 memorija koja ne pripada za nas, što se dogodilo? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Ili skoro svaki put. 677 00:29:32,870 --> 00:29:34,310 Segmentacija kriv, zar ne? 678 00:29:34,310 --> 00:29:37,829 >> Ova strelica, nemam pojma gdje je to za pokazivanje. to je samo neki slučajni vrijednost. 679 00:29:37,829 --> 00:29:40,370 I naravno, ako tumače Slučajni kao adresu, 680 00:29:40,370 --> 00:29:42,610 ćeš ići na neki slučajni destinacija. 681 00:29:42,610 --> 00:29:46,810 Dakle, Gabe možda doista nesreći moj program u ovom slučaju ovdje. 682 00:29:46,810 --> 00:29:50,600 >> Dakle, ono što možemo učiniti to je gotovo jednako loše? 683 00:29:50,600 --> 00:29:52,660 Razmotrite ovo treći i Konačni primjer scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ova verzija je bolji u kojem smislu? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Ako ste zadovoljni s Prethodna problema, to je bolje. 688 00:30:01,400 --> 00:30:02,250 Zašto? 689 00:30:02,250 --> 00:30:03,250 >> PUBLIKA: [nečujan]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Malan: Dobro. 692 00:30:07,110 --> 00:30:09,970 Dakle, ovaj slučaj liniji 16. Bolje je, u smislu 693 00:30:09,970 --> 00:30:12,030 da smo izričito dodjele neku uspomenu. 694 00:30:12,030 --> 00:30:14,190 Mi ne koristite malloc, koristimo tjedan 2 695 00:30:14,190 --> 00:30:16,060 pristup samo proglašenje niz. 696 00:30:16,060 --> 00:30:18,130 I što smo rekli prije toga niz je samo niz likova, 697 00:30:18,130 --> 00:30:19,690 pa to je potpuno legitimno. 698 00:30:19,690 --> 00:30:22,910 No, to je, naravno, što je što na umu, fiksne veličine, 16. 699 00:30:22,910 --> 00:30:25,440 >> Dakle, ovaj program je potpuno siguran, ako sam tip 700 00:30:25,440 --> 00:30:29,760 u žice jedan znak, dva znaka žice, 15 znakova. 701 00:30:29,760 --> 00:30:34,970 No, čim sam početi upisivati ​​16, 17, 18, 1000 niz znakova, 702 00:30:34,970 --> 00:30:37,390 Gdje je taj niz će završiti? 703 00:30:37,390 --> 00:30:39,570 Bit će to završiti dijelom ovdje. 704 00:30:39,570 --> 00:30:42,820 Ali onda tko zna što još je izvan granica 705 00:30:42,820 --> 00:30:44,270 u ovom nizu? 706 00:30:44,270 --> 00:30:48,015 >> To je kao da imam proglasio 16 polja ovdje. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Dakle, umjesto da izvuku sve 16, mi ćemo Samo pretvarati da sam nacrtana 16. 709 00:30:52,690 --> 00:30:56,540 Ali, ako sam onda pokušati pročitati niz To je mnogo više, kao i 50 znakova, 710 00:30:56,540 --> 00:31:01,270 Ja ću početi stavljajući a, b, c, d, X, Y, Z. 711 00:31:01,270 --> 00:31:04,916 A to je vjerojatno neki drugi segment memorije 712 00:31:04,916 --> 00:31:06,790 da, opet, može izazvati moj program za sudar, 713 00:31:06,790 --> 00:31:10,600 jer nisam tražio ništa više nego samo 16 bajtova. 714 00:31:10,600 --> 00:31:12,260 >> Dakle, koga briga? 715 00:31:12,260 --> 00:31:13,880 Pa, evo CS50 knjižnica. 716 00:31:13,880 --> 00:31:17,220 I većina to je samo kao i upute do vrha. 717 00:31:17,220 --> 00:31:21,670 CS50 knjižnica, sve ovo vrijeme, ima tu crtu u liniji 52. 718 00:31:21,670 --> 00:31:23,680 Vidjeli smo typedef, ili vidjet ćete typedef 719 00:31:23,680 --> 00:31:27,930 u pset 4, koji je upravo stvara sinonim pri čemu char zvijezda može biti više 720 00:31:27,930 --> 00:31:29,290 nazivanom nizu. 721 00:31:29,290 --> 00:31:31,540 Dakle, to je jedan od Nekoliko trening kotači 722 00:31:31,540 --> 00:31:34,120 smo upotrijebiti tajno ispod haube. 723 00:31:34,120 --> 00:31:36,490 >> U međuvremenu, ovdje je funkcija, getchar. 724 00:31:36,490 --> 00:31:38,190 Sada je očito, ne postoji tijelo na njega. 725 00:31:38,190 --> 00:31:40,273 A u stvari, ako se držim pomicanje, ja zapravo ne 726 00:31:40,273 --> 00:31:42,080 vidi sve implementacije od tih funkcija. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Kao provjeru uračunljivosti, zašto je to tako? 729 00:31:45,516 --> 00:31:46,795 >> PUBLIKA: [nečujan]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Malan: Da. 731 00:31:47,670 --> 00:31:48,950 Dakle, ovo je zaglavlje datoteke. 732 00:31:48,950 --> 00:31:52,520 I zaglavlje datoteke sadrže prototipova, plus neke druge stvari, čini se, 733 00:31:52,520 --> 00:31:53,780 kao typedefs. 734 00:31:53,780 --> 00:31:56,910 No, u CS50.c, koji smo Nikad vam se izravno, 735 00:31:56,910 --> 00:32:02,100 , ali je u CS50 aparata sve ovaj put, duboko u svojim mapama, 736 00:32:02,100 --> 00:32:04,990 primijetiti da postoji cijeli hrpa funkcija ovdje. 737 00:32:04,990 --> 00:32:06,720 >> U stvari, neka je pomaknite prema dolje. 738 00:32:06,720 --> 00:32:08,810 Idemo ignorirati većina njih, za sada. 739 00:32:08,810 --> 00:32:12,670 No, pomaknite se dolje do getInt i vidjeti kako getInt radi. 740 00:32:12,670 --> 00:32:13,890 Dakle, ovdje je getInt. 741 00:32:13,890 --> 00:32:17,727 A ako ste ikad doista stalo kako doći int radi, ovdje je njegova dokumentacija. 742 00:32:17,727 --> 00:32:19,560 I među stvarima što kaže je li vam govori 743 00:32:19,560 --> 00:32:21,340 ono što su rasponi vrijednosti može vratiti. 744 00:32:21,340 --> 00:32:24,400 To je u biti negativno 2 milijarde do pozitivnog 2000000000, dati ili uzeti. 745 00:32:24,400 --> 00:32:26,420 >> I to ispada, sve to Vrijeme, iako nikada nismo 746 00:32:26,420 --> 00:32:28,570 je li ga provjerili, ako nešto pođe po zlu, 747 00:32:28,570 --> 00:32:30,680 ispada da su svi ovaj put, getInt ima 748 00:32:30,680 --> 00:32:33,600 bio povratka posebna konstanta, a ne null, 749 00:32:33,600 --> 00:32:36,760 int_max nego što je Konvencija samo programer. 750 00:32:36,760 --> 00:32:38,846 To znači ovdje je posebna vrijednost. 751 00:32:38,846 --> 00:32:41,470 Pobrinite se da provjerite za to, samo u slučaju da nešto pođe po zlu. 752 00:32:41,470 --> 00:32:43,261 Ali nikada nismo smeta s tim da se danas, 753 00:32:43,261 --> 00:32:45,200 jer opet, to je značilo da se pojednostavi. 754 00:32:45,200 --> 00:32:46,950 >> No, kako se getInt se provodi? 755 00:32:46,950 --> 00:32:48,450 Pa, jedan, to traje nema argumente. 756 00:32:48,450 --> 00:32:49,390 Znamo da. 757 00:32:49,390 --> 00:32:50,820 To vraća int. 758 00:32:50,820 --> 00:32:51,950 Znamo da. 759 00:32:51,950 --> 00:32:54,460 Pa kako se to radi ispod haube? 760 00:32:54,460 --> 00:32:58,290 >> Tako da je očito beskonačan petlje, barem izgled jednog. 761 00:32:58,290 --> 00:33:00,290 Uočite da smo pomoću getString. 762 00:33:00,290 --> 00:33:04,000 Dakle, to je zanimljivo. getInt poziva naša funkcija, getString. 763 00:33:04,000 --> 00:33:05,645 I sad zašto bi to biti slučaj? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Zašto bih ja bio obrambeni ovdje u liniji 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Ono što bi se moglo dogoditi u skladu 164, samo da bude jasno? 768 00:33:15,639 --> 00:33:16,930 To je isti odgovor kao i prije. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Može biti samo iz memorije. 771 00:33:20,089 --> 00:33:23,130 Nešto pođe krivo s getString, Moramo biti u stanju podnijeti. 772 00:33:23,130 --> 00:33:27,070 A razlog zbog kojeg sam se ne vrati null je da, tehnički, null pointer. 773 00:33:27,070 --> 00:33:29,120 getInt mora vratiti int. 774 00:33:29,120 --> 00:33:31,060 Tako sam samovoljno odlučio, u biti, 775 00:33:31,060 --> 00:33:34,600 da je 2 milijarde, više ili manje, ide biti posebnu vrijednost koja nikada ne mogu 776 00:33:34,600 --> 00:33:35,970 zapravo dobili od korisnika. 777 00:33:35,970 --> 00:33:39,930 To je samo jedna vrijednost idem trošiti za zastupanje kod pogreške. 778 00:33:39,930 --> 00:33:41,540 >> Tako sada, stvari postaju malo fancy. 779 00:33:41,540 --> 00:33:44,670 I to nije sasvim ista funkcija kao i prije, ali to je vrlo slično. 780 00:33:44,670 --> 00:33:50,120 Dakle, primijetite, izjavljujem ovdje, u redu 172, i int n i char c. 781 00:33:50,120 --> 00:33:53,600 A onda sam koristiti ovaj funky liniju, sscanf, što ispada 782 00:33:53,600 --> 00:33:55,990 ne skenirati niz od tipkovnice. 783 00:33:55,990 --> 00:33:59,226 To stoji postojeći niz koji Korisnik već upisali u. 784 00:33:59,226 --> 00:34:02,100 Dakle, već sam pozvao getString, koji znači imam niz u memoriji. 785 00:34:02,100 --> 00:34:05,020 sscanf je ono što bih pozvati funkciju gramatičku analizu. 786 00:34:05,020 --> 00:34:07,760 Izgleda na žici sam upisali u, slovo po slovo, 787 00:34:07,760 --> 00:34:09,250 i radi nešto korisno. 788 00:34:09,250 --> 00:34:10,969 Niz koji je pohranjen u liniji. 789 00:34:10,969 --> 00:34:13,560 I znam da samo odlaskom back up ovdje i reći, oh, u redu, 790 00:34:13,560 --> 00:34:15,143 Nazvao sam ga i ovaj put, ali linija. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> I sada je to malo drugačije. 793 00:34:18,080 --> 00:34:22,480 No, to zapravo znači, iz razloga smo nešto će mahati naše ruke na danas, 794 00:34:22,480 --> 00:34:26,070 da smo provjeru na vidjeti ako korisnik ne upiše 795 00:34:26,070 --> 00:34:29,909 i int i možda još jedan znak. 796 00:34:29,909 --> 00:34:33,610 Ako korisnik upisao u int, to je će biti pohranjeni u N, jer sam 797 00:34:33,610 --> 00:34:36,739 prolazi to po adresi, Novi trik smo vidjeli danas. 798 00:34:36,739 --> 00:34:41,570 Ako korisnik također upisali u poput 123x, da je x 799 00:34:41,570 --> 00:34:45,060 će završiti Pismo u znak c. 800 00:34:45,060 --> 00:34:48,739 >> Sada ispada da sscanf će mi reći, inteligentno, 801 00:34:48,739 --> 00:34:54,750 koliko varijable je sscanf Uspješno moći ispuniti. 802 00:34:54,750 --> 00:34:58,770 Dakle, po toj logici, ako je funkcija Ja provedbi je getInt, 803 00:34:58,770 --> 00:35:00,900 ali da provjeravam, Potencijalno, za korisnika 804 00:35:00,900 --> 00:35:04,190 da su se upisali u int slijedi nešto drugo, 805 00:35:04,190 --> 00:35:08,580 ono što želim sscanf a povratna vrijednost doista biti? 806 00:35:08,580 --> 00:35:10,950 Ako je svrha da se Upravo int od korisnika? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Dakle, ako sscanf vraća 2, što to znači? 809 00:35:19,300 --> 00:35:21,660 Korisnik upisali u nešto kao, doslovno, 810 00:35:21,660 --> 00:35:24,770 123x, što je samo glupost. 811 00:35:24,770 --> 00:35:27,490 To je pogreška, a Želim da provjerite za to. 812 00:35:27,490 --> 00:35:32,960 >> Dakle, ako korisnik upiše to na, od strane Ova logika, ono što radi sscanf vratiti, 813 00:35:32,960 --> 00:35:33,740 bi ti rekao? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Dakle, to će se vratiti 2, jer je 123 će ići ovdje, 816 00:35:39,130 --> 00:35:41,580 i x će završiti ovdje. 817 00:35:41,580 --> 00:35:43,970 Ali ja ne želim da se x ispunjena. 818 00:35:43,970 --> 00:35:48,580 Želim sscanf uspjeti samo u punjenje u prvoj od varijabli. 819 00:35:48,580 --> 00:35:52,490 I to je razlog zašto sam želite sscanf za povratak 1. 820 00:35:52,490 --> 00:35:55,750 >> A ako je to malo preko glave u ovom trenutku, to je sasvim u redu. 821 00:35:55,750 --> 00:36:00,030 Shvatite da, da je jedan od Vrijednosti getInt i getString 822 00:36:00,030 --> 00:36:03,630 je da radimo ispitati kritički od Puno pogreške provjere kao što je ovaj, tako 823 00:36:03,630 --> 00:36:07,130 da, da, to je moguće prilično upisati ništa na tipkovnici, 824 00:36:07,130 --> 00:36:08,490 i mi ćemo ga uhvatiti. 825 00:36:08,490 --> 00:36:10,592 I zasigurno, osoblje, sigurno neće 826 00:36:10,592 --> 00:36:13,300 biti izvor bug u svoje Program, jer smo u obrani 827 00:36:13,300 --> 00:36:16,270 provjera za sve glupo stvari koje korisnik može učiniti, 828 00:36:16,270 --> 00:36:18,900 kao što je tipkanje niz, kada ti stvarno htjela int. 829 00:36:18,900 --> 00:36:21,350 Tako je za now-- ćemo doći natrag na ovo prije long-- 830 00:36:21,350 --> 00:36:23,710 ali sve ovo vrijeme, getString i getInt imaju 831 00:36:23,710 --> 00:36:29,950 bio ispod haube koristite ovu Osnovna ideja adrese memorije. 832 00:36:29,950 --> 00:36:32,580 >> Pa sad, idemo napraviti stvari Malo više user-friendly. 833 00:36:32,580 --> 00:36:38,740 Kao što vam je poznato, od Binky posljednjem put-- ako moj miš će cooperate-- tako 834 00:36:38,740 --> 00:36:42,560 smo imali ovog zakona, koji iskreno rečeno, prilično je besmisleno. 835 00:36:42,560 --> 00:36:45,330 Ovaj kod postiže ništa korisna, ali to je bio primjer 836 00:36:45,330 --> 00:36:48,330 da je profesor Parlante koristi kako bi se predstavljaju 837 00:36:48,330 --> 00:36:51,840 što se događa u Program uključuje memoriju. 838 00:36:51,840 --> 00:36:54,850 >> Tako ćemo prepričavati to Priča super kratko. 839 00:36:54,850 --> 00:36:58,720 Ove prve dvije linije, u Engleski, učiniti ono što biste rekli? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Samo u razumno ljudsko, ali malo tehničke uvjete, uzeti ubod. 842 00:37:05,430 --> 00:37:06,346 PUBLIKA: [nečujan]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Malan: OK, ti si uspostavi Adrese za vaše xiy varijable. 845 00:37:11,080 --> 00:37:15,520 Ne sasvim, jer X i Y nisu varijable u tradicionalnom smislu. 846 00:37:15,520 --> 00:37:18,054 X i Y su adrese ili će se pohraniti adrese. 847 00:37:18,054 --> 00:37:19,220 Dakle, pokušajmo to još jednom. 848 00:37:19,220 --> 00:37:21,010 Nije loš start, iako. 849 00:37:21,010 --> 00:37:21,510 Da? 850 00:37:21,510 --> 00:37:22,426 >> PUBLIKA: [nečujan]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Malan: Dobro. 853 00:37:24,840 --> 00:37:26,173 Mislim da je to malo čišći. 854 00:37:26,173 --> 00:37:28,630 Izjavljujući dva goniča, dva broja. 855 00:37:28,630 --> 00:37:30,150 I mi smo nazivajući ih X i Y. 856 00:37:30,150 --> 00:37:32,790 Ili ako smo izvući ovo kao na slici, opet, 857 00:37:32,790 --> 00:37:36,410 prisjetiti jednostavno da sve radimo s tom prvoj crti 858 00:37:36,410 --> 00:37:39,690 je crtež kutiju kao što je ovaj, s nekim smeća vrijednosti u njemu, 859 00:37:39,690 --> 00:37:41,920 i nazvavši ga X, a zatim još jedna kutija kao što je ovaj, 860 00:37:41,920 --> 00:37:43,880 s nekim smeća vrijednosti u njemu, nazivajući ga y. 861 00:37:43,880 --> 00:37:45,810 Mi smo proglasili dva upućuje da u konačnici 862 00:37:45,810 --> 00:37:47,860 će pohraniti adresu int. 863 00:37:47,860 --> 00:37:49,170 Dakle, to je sve što postoji. 864 00:37:49,170 --> 00:37:53,290 >> Dakle, kada Binky je to učinio, glina baš izgledao ovako. 865 00:37:53,290 --> 00:37:55,350 I Nick je samo vrsta zavrsio strelice, 866 00:37:55,350 --> 00:37:57,590 kao da oni ne upućuju nigdje posebno, jer oni su samo 867 00:37:57,590 --> 00:37:58,250 Vrijednosti smeće. 868 00:37:58,250 --> 00:38:01,670 Oni nisu izrijekom inicijalizira nigdje posebno. 869 00:38:01,670 --> 00:38:03,980 >> Sada sljedeća linija broj, podsjetimo, bio to. 870 00:38:03,980 --> 00:38:07,510 Dakle, u razumnoj mjeri razumljiv, ali nešto tehnički engleski, 871 00:38:07,510 --> 00:38:09,790 što je ovo linija koda radiš? 872 00:38:09,790 --> 00:38:10,391 Da? 873 00:38:10,391 --> 00:38:11,333 >> PUBLIKA: [nečujan]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Malan: Savršen. 876 00:38:13,950 --> 00:38:17,016 Prošlo raspoređivanju komad memorija koja je veličina int. 877 00:38:17,016 --> 00:38:18,140 I to je pola odgovora. 878 00:38:18,140 --> 00:38:20,056 Odgovorio si pravo polovica izraza. 879 00:38:20,056 --> 00:38:22,473 Ono što se događa na lijeva strana znaka jednakosti? 880 00:38:22,473 --> 00:38:22,972 Da? 881 00:38:22,972 --> 00:38:24,814 PUBLIKA: i dodjeljuje je na varijable x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Malan: i dodjeljuje je na varijable x. 883 00:38:27,690 --> 00:38:31,650 Dakle, da ponovim, desnim bočnim izdvaja dovoljno memorije za pohranu int. 884 00:38:31,650 --> 00:38:34,150 Ali malloc posebno vraća adresu 885 00:38:34,150 --> 00:38:37,270 tog komad memorije, što ste Samo predložio dobiva pohranjena u X. 886 00:38:37,270 --> 00:38:42,560 >> Dakle, ono što je Nick i zadnji put s Binky je on vukao tu pokazivač van, glina, 887 00:38:42,560 --> 00:38:46,820 sada ukazati na bijelom komad memorije koja je jednaka veličini int. 888 00:38:46,820 --> 00:38:49,360 I doista, to je značilo zastupati četiri bajta. 889 00:38:49,360 --> 00:38:55,310 >> Sada, pored linija koda to učinio, zvijezda x dobiva 42. 890 00:38:55,310 --> 00:38:58,530 Dakle, 42 je jednostavan na desna strana, smisao života. 891 00:38:58,530 --> 00:39:00,500 Lijevoj strani, zvijezda x znači što? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 I to bi moglo imati gone-- to je u redu. 894 00:39:03,280 --> 00:39:04,220 U redu. 895 00:39:04,220 --> 00:39:06,875 >> PUBLIKA: U osnovi, idite na [nečujan] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Malan: Dobro. 897 00:39:07,750 --> 00:39:08,760 PUBLIKA: [nečujan]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Malan: Točno. 899 00:39:09,760 --> 00:39:11,979 Lijevoj strani znači ići x. 900 00:39:11,979 --> 00:39:12,520 x je adresa. 901 00:39:12,520 --> 00:39:15,520 To je kao 33 Oxford Streetu, ili Ox1. 902 00:39:15,520 --> 00:39:18,690 A zvijezda x znači ići na to adresu i staviti ono tamo? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Dakle, doista, to je upravo ono što je Nick učinio. 905 00:39:21,290 --> 00:39:23,740 Počeo je s By, u biti, psihički 906 00:39:23,740 --> 00:39:26,270 pokazujući prstom na x, slijedeći strelice 907 00:39:26,270 --> 00:39:30,670 na bijeli okvir na desnoj ruci strana, te stavljajući broj 42 tamo. 908 00:39:30,670 --> 00:39:34,120 No tada su se stvari dobio malo opasno, zar ne? 909 00:39:34,120 --> 00:39:35,860 Binky je o tome da izgubi glavu. 910 00:39:35,860 --> 00:39:39,465 >> Star y iznosi 13, peh, što znači? 911 00:39:39,465 --> 00:39:43,620 Dakle zvjezdicom y sredstva idu na adresu u y. 912 00:39:43,620 --> 00:39:45,630 No, ono što je adresa u y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 U redu, to je smeće vrijednost, zar ne? 915 00:39:49,440 --> 00:39:50,800 Ja ga izvukao kao upitnikom. 916 00:39:50,800 --> 00:39:54,850 Nick ga je nacrtao kao sklupčana strelice. 917 00:39:54,850 --> 00:39:59,600 I čim se pokušati napraviti zvijezdu y, rekavši ići tamo, 918 00:39:59,600 --> 00:40:03,872 ali ne postoji legitimna adresa, to je neka lažna mjesto, 919 00:40:03,872 --> 00:40:05,080 Program će se srušiti. 920 00:40:05,080 --> 00:40:08,580 I Binky glava ide odletjeti ovdje, kao što je učinio. 921 00:40:08,580 --> 00:40:12,130 >> Dakle, na kraju, ovaj program bio samo stan od mana. 922 00:40:12,130 --> 00:40:13,540 To je bio lud programa. 923 00:40:13,540 --> 00:40:14,760 I to je trebalo popraviti. 924 00:40:14,760 --> 00:40:18,260 A jedini način, stvarno, kako to popraviti bi, primjerice, ovaj redak, 925 00:40:18,260 --> 00:40:21,010 koje nismo ni dobili, jer Program srušio prerano. 926 00:40:21,010 --> 00:40:26,170 No, ako smo to riješili, što Učinak ne radi y jednake x ima? 927 00:40:26,170 --> 00:40:30,010 Pa, to u suštini ukazuje na y bez obzira na vrijednost x je pokazujući na. 928 00:40:30,010 --> 00:40:32,430 >> Tako je u Nickov priču, ili Binky priča, oboje 929 00:40:32,430 --> 00:40:34,640 X i Y su pokazujući na bijeli komad memorije, 930 00:40:34,640 --> 00:40:38,300 tako da, na kraju, kad vas nemojte glumiti y jednak 13 opet, 931 00:40:38,300 --> 00:40:43,080 ćete završiti stavljanjem 13 u Odgovarajuće mjesto. 932 00:40:43,080 --> 00:40:47,640 Dakle, sve ove linije su savršeno legitimna, osim ove, 933 00:40:47,640 --> 00:40:51,730 kad se to dogodilo prije vas zapravo dodjeljuje y neku vrijednost. 934 00:40:51,730 --> 00:40:54,290 >> Sada srećom, ne znaš moraju razmišljati kroz sve 935 00:40:54,290 --> 00:40:56,560 od tih vrsta pitanja na svoju vlastitu. 936 00:40:56,560 --> 00:40:59,310 Dopustite mi ići naprijed i otvoriti prozor terminala ovdje 937 00:40:59,310 --> 00:41:03,050 i otvoriti, samo na trenutak, Super kratki program koji 938 00:41:03,050 --> 00:41:04,360 također je vrsta besmisleno. 939 00:41:04,360 --> 00:41:05,152 To je ružno. 940 00:41:05,152 --> 00:41:06,610 To ne postiže ništa korisno. 941 00:41:06,610 --> 00:41:10,180 No, to ne pokazuju probleme memorije, pa ćemo pogledati. 942 00:41:10,180 --> 00:41:11,830 >> Glavni, super jednostavna. 943 00:41:11,830 --> 00:41:14,830 To očito poziva funkciju, f, a zatim se vraća 0. 944 00:41:14,830 --> 00:41:16,310 To je vrsta teško nered ovo gore. 945 00:41:16,310 --> 00:41:18,540 Dakle, Glavni je prilično dobra, do sada. 946 00:41:18,540 --> 00:41:20,100 >> Dakle, f je problematično. 947 00:41:20,100 --> 00:41:22,120 I jednostavno ne staviti puno napor u to imenovanje 948 00:41:22,120 --> 00:41:23,990 Ovdje, kako zadržati fokus na kodu. 949 00:41:23,990 --> 00:41:25,740 F ima dvije linije. 950 00:41:25,740 --> 00:41:27,610 I da vidimo ono što se sada događa. 951 00:41:27,610 --> 00:41:29,840 Dakle, s jedne strane ovdje-- i dopustite mi da 952 00:41:29,840 --> 00:41:32,680 to u skladu s prethodnim example-- s jedne strane, 953 00:41:32,680 --> 00:41:35,830 Lijeva strana je radi ono što, na engleskom jeziku? 954 00:41:35,830 --> 00:41:36,493 To je-- 955 00:41:36,493 --> 00:41:37,701 PUBLIKA: Stvaranje pokazivač. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Malan: Stvaranje pokazivač na int i zove se x. 957 00:41:40,830 --> 00:41:43,789 Dakle, to je stvaranje jedne od tih kutija Stalno crtanje na zaslonu osjetljivom na dodir. 958 00:41:43,789 --> 00:41:45,913 A sada, na desnoj ruci- strani, malloc naravno 959 00:41:45,913 --> 00:41:47,420 izdvaja komad memorije. 960 00:41:47,420 --> 00:41:49,989 I samo da bude jasno, kako koliko memorije je to očito 961 00:41:49,989 --> 00:41:52,030 dodjele, ako ste upravo vrsta učiniti math ovdje? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Dakle, to je 40 bajtova. 964 00:41:54,040 --> 00:41:57,400 I znam da je samo zato što znam Interesi, na CS50 aparata, u najmanju ruku, 965 00:41:57,400 --> 00:41:58,060 četiri bajta. 966 00:41:58,060 --> 00:41:59,610 Dakle, 10 puta 4 je 40. 967 00:41:59,610 --> 00:42:04,924 Dakle, to je spremanje xu, adresa prvog od 40 ints da 968 00:42:04,924 --> 00:42:07,340 Osigurana su sredstva prostora natrag, na leđa, na leđa, na leđima. 969 00:42:07,340 --> 00:42:08,470 >> I to je ono što je ključno o malloc. 970 00:42:08,470 --> 00:42:11,261 To ne uzeti malo memorije ovdje, malo ovdje, malo ovdje. 971 00:42:11,261 --> 00:42:14,220 To vam daje jedan komad memorije, istodobnoj, od operativnog 972 00:42:14,220 --> 00:42:15,240 sustava. 973 00:42:15,240 --> 00:42:18,500 >> Sada što je to, x nosač 10 jednaka 0? 974 00:42:18,500 --> 00:42:19,470 Samovoljno linija koda. 975 00:42:19,470 --> 00:42:21,100 To ne postiže ništa korisno. 976 00:42:21,100 --> 00:42:26,128 No, zanimljivo je, jer x nosač 10--? 977 00:42:26,128 --> 00:42:26,628 Da? 978 00:42:26,628 --> 00:42:27,912 >> PUBLIKA: [nečujan]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Malan: x nosač 10 ne mora biti jednak nuli. 980 00:42:30,500 --> 00:42:35,070 Null detalj samo dolazi u igru sa žicama, na kraju niza. 981 00:42:35,070 --> 00:42:36,700 No, dobra misao. 982 00:42:36,700 --> 00:42:39,615 >> Koliko je veliko to polje, čak i iako sam izdvojila 40 bajtova? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 To je 0 do devet, zar ne? 985 00:42:43,690 --> 00:42:45,120 To je 10 ints, ukupno. 986 00:42:45,120 --> 00:42:48,790 40 bajtova, ali 10 ori-, indeksirane 0 do 0. 987 00:42:48,790 --> 00:42:50,930 >> Pa što je to x nosač 10? 988 00:42:50,930 --> 00:42:53,090 To je zapravo neka Nepoznata vrijednost smeća. 989 00:42:53,090 --> 00:42:54,780 To je memorija koja ne pripada meni. 990 00:42:54,780 --> 00:42:59,650 Ne bi trebalo da se dira bajt broj 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Idem malo predaleko. 992 00:43:01,420 --> 00:43:04,490 >> I doista, ako sam pokrenuti ovaj Program, to bi moglo vrlo dobro srušiti. 993 00:43:04,490 --> 00:43:05,790 Ali ponekad mi se posreći. 994 00:43:05,790 --> 00:43:07,706 I tako samo pokazati ovo-- i iskreno, 995 00:43:07,706 --> 00:43:11,000 nikad se ne zna prije vas Ne it-- Trčimo to. 996 00:43:11,000 --> 00:43:12,480 To zapravo nije pad. 997 00:43:12,480 --> 00:43:15,032 >> Ali, ako sam to, za promjenu primjer, biti poput 1000, 998 00:43:15,032 --> 00:43:16,740 da bi ovo stvarno namjerno, da vidimo 999 00:43:16,740 --> 00:43:18,710 Ako možemo dobiti ga na sudar ovaj put. 1000 00:43:18,710 --> 00:43:20,070 U redu, to nije srušiti. 1001 00:43:20,070 --> 00:43:22,600 Kako bi bilo 100.000? 1002 00:43:22,600 --> 00:43:25,000 Idemo ga preurediti, a sada ga ponoviti. 1003 00:43:25,000 --> 00:43:25,500 U redu. 1004 00:43:25,500 --> 00:43:25,960 Uf. 1005 00:43:25,960 --> 00:43:26,460 U redu. 1006 00:43:26,460 --> 00:43:29,090 Dakle, očito, opet, to segmenti memorije, da se tako izrazim, 1007 00:43:29,090 --> 00:43:32,660 su razmjerno veliki, tako da možemo doći opet i opet sretni. 1008 00:43:32,660 --> 00:43:36,510 Ali na kraju, nakon što dobijete smiješno i stvarno ići daleko na zaslonu, 1009 00:43:36,510 --> 00:43:39,120 dodirnete memorije koja stvarno, stvarno ne pripada vama. 1010 00:43:39,120 --> 00:43:40,870 >> Ali iskreno, to vrste kukaca idu 1011 00:43:40,870 --> 00:43:43,020 biti teže i teže shvatiti na svoju vlastitu. 1012 00:43:43,020 --> 00:43:47,880 No, srećom, kao programera, imamo alate koji omogućuju nam da to učiniti za nas. 1013 00:43:47,880 --> 00:43:50,140 Dakle, to je, možda, jedan od najružnijih programa, 1014 00:43:50,140 --> 00:43:52,060 čak i ružniji od GDB je izlaz. 1015 00:43:52,060 --> 00:43:55,670 Ali, to je uvijek ima liniju ili dvije koje su super korisne. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind je program koji pomaže ne ispravljanje program, sami po sebi, 1017 00:44:00,310 --> 00:44:03,500 ali naći povezanog s pamćenjem problemi, posebno. 1018 00:44:03,500 --> 00:44:07,590 To će automatski pokrenuti svoj kôd za što i tražiti najmanje dvije stvari. 1019 00:44:07,590 --> 00:44:10,680 Jedan, jeste li nešto učiniti slučajna kao dodir memorije 1020 00:44:10,680 --> 00:44:11,980 koji ne pripada vama? 1021 00:44:11,980 --> 00:44:13,590 To će vam pomoći da pronađete one slučajeve. 1022 00:44:13,590 --> 00:44:15,710 >> I drugo, to će nam pomoći nađete nešto što se zove 1023 00:44:15,710 --> 00:44:19,270 curenja memorije, što smo potpuno ignorirali, naivno, 1024 00:44:19,270 --> 00:44:21,380 već neko vrijeme i blaženo. 1025 00:44:21,380 --> 00:44:23,140 No, ispostavilo se, sve ovaj put, kad god je to 1026 00:44:23,140 --> 00:44:26,620 ste pozvani getString u tako da su mnogi od naših programa, 1027 00:44:26,620 --> 00:44:28,930 pitaš pogonski Sustav za memoriju, 1028 00:44:28,930 --> 00:44:32,070 ali imate bilo sjećanje ikada davanje 1029 00:44:32,070 --> 00:44:36,169 natrag, radi unalloc, ili besplatno, kako se zove. 1030 00:44:36,169 --> 00:44:37,960 Ne, zato što nikada nisam zatražio od vas da to učinite. 1031 00:44:37,960 --> 00:44:41,250 >> Ali sve ovo vrijeme, programi ste pisali u C 1032 00:44:41,250 --> 00:44:43,800 su curenje memorije, tražeći radom 1033 00:44:43,800 --> 00:44:46,190 Sustav za sve Memorija za gudače i sitnica, 1034 00:44:46,190 --> 00:44:47,870 ali nikada ga predaje natrag. 1035 00:44:47,870 --> 00:44:50,080 I sada je to malo od pojednostavljivanje, 1036 00:44:50,080 --> 00:44:53,550 ali ako ste ikada pokrenuti svoj Mac ili vaše računalo za neko vrijeme, otvaranje 1037 00:44:53,550 --> 00:44:55,790 puno programa, Možda zatvaranja programa, 1038 00:44:55,790 --> 00:44:57,795 i iako je tvoj Računalo nije srušio, 1039 00:44:57,795 --> 00:45:01,690 to je sve tako puno sporiji, kao da je stvarno 1040 00:45:01,690 --> 00:45:04,290 korištenjem puno memorije ili resursi, iako, 1041 00:45:04,290 --> 00:45:06,070 ako nisi ni dirati tipkovnicu, 1042 00:45:06,070 --> 00:45:10,430 koji bi mogao be--, ali ne bi mi uvijek biti da su programi radite 1043 00:45:10,430 --> 00:45:11,920 sami su curenje memorije. 1044 00:45:11,920 --> 00:45:15,645 I oni stalno postavljaju OS za više i više memorije, ali zaboravljajući o tome, 1045 00:45:15,645 --> 00:45:18,470 zapravo ne koriste, ali Stoga uzimajući memorije daleko 1046 00:45:18,470 --> 00:45:20,500 iz drugih programa koji bi ga žele. 1047 00:45:20,500 --> 00:45:23,940 Dakle, to je uobičajeno objašnjenje. 1048 00:45:23,940 --> 00:45:25,940 Sada je ovdje gdje je Valgrind Izlaz je u potpunosti 1049 00:45:25,940 --> 00:45:29,290 krvoločan onima manje i udobnije podjednako. 1050 00:45:29,290 --> 00:45:32,690 No, zanimljivo stvar je u pravu ovdje. 1051 00:45:32,690 --> 00:45:37,060 To mi govori nevažeći pisati o Veličina četiri događa u ovom programu, 1052 00:45:37,060 --> 00:45:40,640 Konkretno, na liniji 21. memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Ako idem na liniji 21, hm, ima uistinu je nevažeća pisati veličine četiri. 1054 00:45:45,450 --> 00:45:46,250 Zašto veličine četiri? 1055 00:45:46,250 --> 00:45:49,500 Pa, ovo number-- a mogao biti anything-- je Int. 1056 00:45:49,500 --> 00:45:50,450 Dakle, to je četiri bajta. 1057 00:45:50,450 --> 00:45:52,550 Tako sam stavljajući četiri bajta u kojoj oni ne pripadaju. 1058 00:45:52,550 --> 00:45:55,080 To je ono što Valgrind zapravo mi govori. 1059 00:45:55,080 --> 00:45:57,600 Štoviše, to će također reci mi, kao što ćemo vidjeti, 1060 00:45:57,600 --> 00:46:01,490 kao što to radi u budućem pset, ako i kada ste procurila memorije, koja je doista 1061 00:46:01,490 --> 00:46:05,300 Imam, jer sam nazvao malloc, ali nisam zapravo 1062 00:46:05,300 --> 00:46:08,010 zove, u ovom slučaju, besplatno, koje smo na kraju ćemo vidjeti 1063 00:46:08,010 --> 00:46:09,830 je suprotno od malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Pa sad, mislim, završni primjer. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Dakle, ovaj je malo više kompliciranih, ali to je možda 1068 00:46:16,690 --> 00:46:19,180 Najveći razlog za budite oprezni s memorijom, 1069 00:46:19,180 --> 00:46:24,490 i razlog da su mnogi programi i / ili web-poslužitelja, čak i do današnjeg dana, 1070 00:46:24,490 --> 00:46:28,200 preuzimaju negativci negdje na internetu, koji su na neki način 1071 00:46:28,200 --> 00:46:33,390 slanjem lažnih pakete na poslužitelj pokušava kompromitirati svoje račune, 1072 00:46:33,390 --> 00:46:36,420 ili uzeti vaše podatke, ili samo uglavnom preuzeti stroj. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, kao ime sugerira, sredstva 1074 00:46:38,910 --> 00:46:40,740 preplavljen ne int, ali tampon. 1075 00:46:40,740 --> 00:46:43,490 I tampon je samo fancy način se kaže da je hrpa memorije. 1076 00:46:43,490 --> 00:46:46,710 >> I doista, nazvao sam niz Prije tampon, umjesto s. 1077 00:46:46,710 --> 00:46:49,234 Jer ako je to tampon, kao u smislu YouTube, 1078 00:46:49,234 --> 00:46:52,400 ili svaki put kad gledate video, možda ste vidjeli riječ kašnjenje, 1079 00:46:52,400 --> 00:46:53,040 točka, točka, točka. 1080 00:46:53,040 --> 00:46:54,240 To je nevjerojatno neugodno. 1081 00:46:54,240 --> 00:46:55,990 A to samo znači da vaš video player 1082 00:46:55,990 --> 00:46:58,710 pokušava preuzeti puno bajtova, puno bajtova 1083 00:46:58,710 --> 00:47:00,170 iz videa s interneta. 1084 00:47:00,170 --> 00:47:02,920 Ali to je spor, pa je pokušava preuzeti hrpa njih 1085 00:47:02,920 --> 00:47:06,430 ispuniti tampon, spremnik, tako da je imate dovoljno bajtova da se može onda 1086 00:47:06,430 --> 00:47:09,174 vam pokazati video, bez zaustavljanja stalno. 1087 00:47:09,174 --> 00:47:11,340 No, ispostavilo se, možete imati tampon na ovo veliko. 1088 00:47:11,340 --> 00:47:15,710 Ali pokušati staviti ovoliko podataka u da, i vrlo loše stvari mogu dogoditi. 1089 00:47:15,710 --> 00:47:22,780 Tako na primjer, pogledajmo Ovo posljednje teaser za primjer. 1090 00:47:22,780 --> 00:47:24,720 Ovo je još jedan program za da je, na prvi pogled, 1091 00:47:24,720 --> 00:47:26,540 ne učiniti ništa super korisne. 1092 00:47:26,540 --> 00:47:29,590 To je dobio glavnu ulogu da nazove tu funkciju, f. 1093 00:47:29,590 --> 00:47:36,640 I to je funkcija, f, ovdje, ima char polje, pod nazivom C, veličine 12. 1094 00:47:36,640 --> 00:47:39,340 A onda je to pomoću Nova funkcija zove strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ispada da, uz ovaj jednostavan, jednostavna linija koda, samo dvije linije, 1097 00:47:45,190 --> 00:47:49,130 smo napravili moj cijeli program, i zbog toga, cijeli moj računalo, 1098 00:47:49,130 --> 00:47:54,000 i moj korisnički račun, te mi je teško voziti potencijalno ranjivi na bilo koga 1099 00:47:54,000 --> 00:47:58,170 tko zna, te je dovoljno dobar za pokretanje ovaj program s određenim naredbenog retka 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Drugim riječima, ako je to negativac stavlja unutar argvargv [1] upisivanjem 1102 00:48:03,400 --> 00:48:08,750 na tipkovnici vrlo posebno izrađenih string, ne abc, 123, ali u suštini, 1103 00:48:08,750 --> 00:48:15,180 binarni simboli koji predstavljaju izvršnu kod, program koji je on ili ona napisala, 1104 00:48:15,180 --> 00:48:19,190 s ovim jednostavan program, koji je Predstavnik tisuća programa 1105 00:48:19,190 --> 00:48:23,610 koji su na sličan način ranjivi, pretpostavljam, on ili ona u konačnici može izbrisati sve 1106 00:48:23,610 --> 00:48:26,680 datoteka na moj hard disk, dobiti treperi brz, tako da on ili ona može 1107 00:48:26,680 --> 00:48:30,170 upišite naredbi na vlastitu, e-mail sve datoteke u sebi. 1108 00:48:30,170 --> 00:48:34,660 Sve što mogu učiniti, on je ili ona može učiniti s ovim brojem. 1109 00:48:34,660 --> 00:48:36,575 >> Nećemo sasvim riješiti to još. 1110 00:48:36,575 --> 00:48:38,700 A u stvari, to će uključiti malo sliku 1111 00:48:38,700 --> 00:48:41,470 kao što je ovaj, koji uskoro ćemo doći razumjeti sve bolje. 1112 00:48:41,470 --> 00:48:44,480 No, za danas, idemo završiti što je, nadam se, nešto više 1113 00:48:44,480 --> 00:48:48,360 razumljivo XKCD šala, dok smo nastavili sljedeći put. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 U redu. 1116 00:48:51,600 --> 00:48:53,446 Vidimo se u srijedu. 1117 00:48:53,446 --> 00:48:54,754 >> [Muziciranja] 1118 00:48:54,754 --> 00:48:57,790 >> Govornik: A sada, duboko misli, po Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memorija je poput skakanja u hrpu zlatno lišće u nedjelju popodne. 1121 00:49:04,770 --> 00:49:09,000 Vjetar puše, bacanje svoje hair-- oh, nedostaje mi dani when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Smijeh] 1124 00:49:12,650 --> 00:49:13,750