1 00:00:00,000 --> 00:00:11,242 >> [Glazba svira] 2 00:00:11,242 --> 00:00:16,630 >> David J. Malan: Dobro je to CS50 i to je početak tjedna pet. 3 00:00:16,630 --> 00:00:21,480 Tako danas, ispod vaših jastuka sjedala, nećete pronaći ništa. 4 00:00:21,480 --> 00:00:24,790 No prije, trebali naći ove, Malo znak zahvalnosti za 5 00:00:24,790 --> 00:00:26,970 sve o radu koji ste stavili u igri petnaestorice. 6 00:00:26,970 --> 00:00:30,290 Jednostavno uklonite mali krug na Dno početi igrati za 7 00:00:30,290 --> 00:00:31,680 Ostatak klase. 8 00:00:31,680 --> 00:00:38,930 >> Dakle podsjetiti da, ili znate taj problem postavili četiri, što iziđe ovaj vikend, 9 00:00:38,930 --> 00:00:40,340 uključuje pisanje još jednu igru. 10 00:00:40,340 --> 00:00:43,740 No, ovaj put se radi o korištenju Stvarni grafičko korisničko sučelje, a ne 11 00:00:43,740 --> 00:00:46,310 tekstualno sučelje kao što je Igra od petnaest je. 12 00:00:46,310 --> 00:00:50,210 A igra koja se nalazi ispred vas, Ako još niste vidjeli ovaj sljedeći, 13 00:00:50,210 --> 00:00:52,310 izgleda malo nešto ovako. 14 00:00:52,310 --> 00:00:55,170 Ja ću ići u moj terminala Prozor ovdje u GDB. 15 00:00:55,170 --> 00:00:58,600 I ja ću ići naprijed i pokrenuti Osoblje rješenje, kojima možete pristupiti 16 00:00:58,600 --> 00:01:01,010 nakon pokretanja ažuriranja 50, kao i obično. 17 00:01:01,010 --> 00:01:04,090 >> Ali ću ga staviti u malo Tajna mode, malo uskršnje jaje, 18 00:01:04,090 --> 00:01:08,480 tzv. Bog mode, prema stavljanjem Boga u argv1. 19 00:01:08,480 --> 00:01:12,920 I moram slijediti svoje vlastite smjernice, prikazuju ga u moj vlastiti 20 00:01:12,920 --> 00:01:14,220 Problem postavljena imenik. 21 00:01:14,220 --> 00:01:19,190 Tako sada možete vidjeti kompletnu verziju u igri za bijeg. 22 00:01:19,190 --> 00:01:21,090 U stvari, to je ne-ruke mode. 23 00:01:21,090 --> 00:01:24,850 Dakle, to je zapravo - 24 00:01:24,850 --> 00:01:26,470 zapanjeni iako bi moglo biti - 25 00:01:26,470 --> 00:01:30,850 prilično trivijalna za provedbu Boga način u Bijeg, za razliku od petnaestorice igre, 26 00:01:30,850 --> 00:01:33,590 što neki od vas možda su se osvrnuli za hakerske izdanju. 27 00:01:33,590 --> 00:01:37,890 >> U bijeg dovoljno u Boga Način jednostavno za napraviti što, 28 00:01:37,890 --> 00:01:41,220 intuitivno s lopaticama? 29 00:01:41,220 --> 00:01:45,630 Baš bi to bilo jednako horizontalni položaj je u loptu. 30 00:01:45,630 --> 00:01:49,220 I tako dugo dok ste to učinili u lockstep s lopta se kreće ova igra će 31 00:01:49,220 --> 00:01:53,100 Nikada, nikada, nikada propustiti loptu a vi ćete pobijediti svaki put. 32 00:01:53,100 --> 00:01:55,430 >> No, u ovotjednom izdanju hakerske tu je više nego samo Bog modu. 33 00:01:55,430 --> 00:01:56,720 Postoji niz drugih mogućnosti. 34 00:01:56,720 --> 00:01:58,140 Među njima, laseri. 35 00:01:58,140 --> 00:02:01,070 Tako da ako ste stvarno dobili ste nestrpljivi Možete početi obaranje cigle 36 00:02:01,070 --> 00:02:02,120 i nekoliko drugih. 37 00:02:02,120 --> 00:02:04,560 A za one koji bi željeli kalibriranje standarda u odnosu na hakerske 38 00:02:04,560 --> 00:02:08,750 izdanje, ja mogu vidjeti da je ovaj tjedan Haker izdanje je namjerno 39 00:02:08,750 --> 00:02:12,830 Malo više izvodljiv, kažu, od Boga Način je s igra od petnaest. 40 00:02:12,830 --> 00:02:15,300 >> Dakle, ako ste u potrazi za rastezanje i ste u potrazi za nekim dodatnim zabave 41 00:02:15,300 --> 00:02:18,400 značajke ne roniti u, ako interesa. 42 00:02:18,400 --> 00:02:21,280 Sada više praktički, neka mi naglasiti iz jedne stvari kao dobro. 43 00:02:21,280 --> 00:02:24,780 GDB, što neki od vas ne može imati još dotakla osobno, što je u redu. 44 00:02:24,780 --> 00:02:28,530 No, sada je stvarno vrijeme da se navikne za to i ugodno s ovim alatom 45 00:02:28,530 --> 00:02:31,510 jer to će učiniti svoje živote puno lakše, doista. 46 00:02:31,510 --> 00:02:34,900 >> Po Rob je predavanje o GDB par tjedana, prisjetimo 47 00:02:34,900 --> 00:02:36,810 GDB da je za ispravljanje. 48 00:02:36,810 --> 00:02:41,230 To je alat koji vam omogućuje da pokrenete svoj Program ali pokrenuti ga korak po korak, sukladno 49 00:02:41,230 --> 00:02:45,680 po redak, tako da možete džaku okolo, , tako da možete vidjeti stvari koje se dešavaju, pa 50 00:02:45,680 --> 00:02:47,310 koje možete isprintati Vrijednosti varijabli. 51 00:02:47,310 --> 00:02:50,580 Ukratko, to vam daje još mnogo toga Snaga od printDef radi. 52 00:02:50,580 --> 00:02:52,900 >> Sada, doduše, sučelje je prilično kompliciranih. 53 00:02:52,900 --> 00:02:55,180 Crno-bijeli tekstualna sučelja za najveći dio. 54 00:02:55,180 --> 00:02:57,400 Naredbe su nešto teška sjetiti na prvom mjestu. 55 00:02:57,400 --> 00:03:01,230 No, iako bi to moglo potrajati te pola sat, sat, staviti da unaprijed 56 00:03:01,230 --> 00:03:02,940 ulaganje vremena u nju, vjeruj mi. 57 00:03:02,940 --> 00:03:06,440 Dakako po semestru kraja ona će vas spasiti da red veličine više 58 00:03:06,440 --> 00:03:07,600 Vrijeme od toga. 59 00:03:07,600 --> 00:03:09,200 >> Dakle, početkom tjedna ronjenja u. 60 00:03:09,200 --> 00:03:13,200 I u smislu bijeg, znam da ste Možete to učiniti tako dugo dok imate 61 00:03:13,200 --> 00:03:18,230 Raspodjela broj ili svoj broj u tijeku u vašem Pst4 imeniku. 62 00:03:18,230 --> 00:03:21,680 Znajte da možete pokrenuti gdb. / Prebacivanje. 63 00:03:21,680 --> 00:03:23,490 >> To će otvoriti prozor kao što je ovaj. 64 00:03:23,490 --> 00:03:25,530 Dopustite mi osobno dati više od prozor terminala. 65 00:03:25,530 --> 00:03:27,770 I što onda ću ići naprijed i ne, to nije samo ga pokrenuti. 66 00:03:27,770 --> 00:03:30,690 Ja ću prvi postaviti break Podsjetimo, koji vam omogućuje da pauzirati 67 00:03:30,690 --> 00:03:32,500 izvršenje na određenom mjestu. 68 00:03:32,500 --> 00:03:35,750 >> Dovoljno je držati jednostavne stvari idem razbiti na liniji jedan samo upisivanjem 69 00:03:35,750 --> 00:03:37,000 broj jedan. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Dopustite mi zapravo ponovno otvoriti ovaj prozor jer to je sve 72 00:03:43,250 --> 00:03:45,700 Malo malo tamo. 73 00:03:45,700 --> 00:03:53,270 Dakle, ono što sam sada ću učiniti ovdje je ako sam otvoriti moj prozor terminala. 74 00:03:53,270 --> 00:03:53,910 Hajde, idemo tamo. 75 00:03:53,910 --> 00:03:59,850 >> Pa sad, ako se vratim u dropbox, Pst4 i pokrenuti gdb. / Bijeg ući, primijetit 76 00:03:59,850 --> 00:04:02,600 Ja ću razbiti jedan za postavljanje pauza točka na liniji jedan. 77 00:04:02,600 --> 00:04:04,840 A sada ću ići putovanja naprijed i pokrenuti. 78 00:04:04,840 --> 00:04:07,370 I kad sam to učiniti, primijetit ništa Čini se dogoditi. 79 00:04:07,370 --> 00:04:08,120 >> Nema pop-up. 80 00:04:08,120 --> 00:04:09,790 Nema grafički Korisničko sučelje još. 81 00:04:09,790 --> 00:04:13,340 Ali to je razumljivo jer sam doslovno na liniji jedan u mom programu. 82 00:04:13,340 --> 00:04:17,110 I primijetiti da sam brzo proslijeđena, posebno danas do 62, jer sve 83 00:04:17,110 --> 00:04:20,600 stvari na vrhu ove datoteke je stvari kao što su komentari i konstanti i 84 00:04:20,600 --> 00:04:22,460 nezanimljivo stvari za sada. 85 00:04:22,460 --> 00:04:25,840 >> Sada sam unutar glavnih, čini se, na liniji 62. 86 00:04:25,840 --> 00:04:27,960 A to je samo distribucija broj, opoziv. 87 00:04:27,960 --> 00:04:33,810 Ako sam otvoriti ovaj gore odlaskom, na sličan način, u moj direktorij drop box u Pst4, 88 00:04:33,810 --> 00:04:35,450 u breakout.c. 89 00:04:35,450 --> 00:04:40,670 A ako sam se pomaknite prema dolje i dolje i dolje, i neka mi ići naprijed i uključite 90 00:04:40,670 --> 00:04:44,990 moje brojeve linija. 91 00:04:44,990 --> 00:04:50,300 >> Ono što ćete vidjeti, ako sam se pomaknite prema dolje do linije 62, upravo linija koja 92 00:04:50,300 --> 00:04:50,910 smo zastali na. 93 00:04:50,910 --> 00:04:53,720 Tako ovaj redak ovdje, 62, je gdje smo o tome da bude. 94 00:04:53,720 --> 00:04:57,470 Tako sada u GDB, ako idem naprijed i upišite Sada sljedeći, unesite to će 95 00:04:57,470 --> 00:04:58,450 izvršiti tu liniju. 96 00:04:58,450 --> 00:05:00,610 I voila, imamo takozvana g prozor. 97 00:05:00,610 --> 00:05:02,800 Ako nisu upoznati s tim što GWindow je, ne brini. 98 00:05:02,800 --> 00:05:05,740 Spec. će vas uvesti u njega, kao te brojnim prohod videa 99 00:05:05,740 --> 00:05:06,830 ugrađen u spec.. 100 00:05:06,830 --> 00:05:08,610 >> No, sada ćemo to učiniti Malo više zanimljiv. 101 00:05:08,610 --> 00:05:10,960 Dopustite mi da se presele ovaj prozor tijekom na stranu malo. 102 00:05:10,960 --> 00:05:13,480 Dopustite mi napraviti prozor malo veća tako da ja mogu vidjeti više. 103 00:05:13,480 --> 00:05:16,140 >> I sad neka mi ići naprijed i učiniti ponovno. 104 00:05:16,140 --> 00:05:17,550 A tu su i moji opeke. 105 00:05:17,550 --> 00:05:20,490 Ako sam upisati sljedeći opet sad vidim loptu. 106 00:05:20,490 --> 00:05:23,520 I ako upišete iduće opet Sada vidim veslo. 107 00:05:23,520 --> 00:05:26,690 >> I srećom, to nije gedit Stvarno surađuje by me pokazujući 108 00:05:26,690 --> 00:05:27,660 sve što želim. 109 00:05:27,660 --> 00:05:30,820 Ali sada, ako sam učiniti opet, Sljedeći opet, ja sam samo 110 00:05:30,820 --> 00:05:32,260 proglašenje neke varijable. 111 00:05:32,260 --> 00:05:34,750 I ja mogu ispisati bilo jedno od ovih dečki iz. 112 00:05:34,750 --> 00:05:37,170 Ispis opeke, otisci života. 113 00:05:37,170 --> 00:05:39,910 >> A sada, ako sam i dalje raditi Sljedeći, primijetiti da ću se 114 00:05:39,910 --> 00:05:40,870 unutar tog kruga. 115 00:05:40,870 --> 00:05:43,380 No, broj će se izvršiti točno onako kako očekujem. 116 00:05:43,380 --> 00:05:45,810 Dakle, kad sam udario ovu funkciju, čekajte za Klik, to će učiniti 117 00:05:45,810 --> 00:05:46,830 doslovno to. 118 00:05:46,830 --> 00:05:48,870 Tako sam se činilo da su izgubili kontrolu preko programa. 119 00:05:48,870 --> 00:05:50,480 >> GDB nije mi daje jedan redak. 120 00:05:50,480 --> 00:05:51,500 No, ne brinite. 121 00:05:51,500 --> 00:05:53,720 Idi na mojoj igri, kliknite negdje. 122 00:05:53,720 --> 00:05:56,270 >> I voila, sada se nastavlja liniju 86. 123 00:05:56,270 --> 00:05:59,460 Pa opet, to je neprocjenjivo, u konačnici, za ispravljanje pogrešaka problema. 124 00:05:59,460 --> 00:06:03,050 Budući da doslovno možete korak kroz vaš broj, ispis i još mnogo stvari, 125 00:06:03,050 --> 00:06:03,640 mnogo, mnogo toga. 126 00:06:03,640 --> 00:06:07,210 Ali za sada, te alate sami Ukoliko ste dobili prilično daleko. 127 00:06:07,210 --> 00:06:10,050 >> Tako smo, naravno, uzimajući pogled na Grafika sada, sve je odjednom. 128 00:06:10,050 --> 00:06:12,350 I sada naš svijet dobiva malo zanimljivije. 129 00:06:12,350 --> 00:06:15,680 I znaš, možda, iz neke od video online da imamo tih 130 00:06:15,680 --> 00:06:18,280 hlačice koje ste gledajući kao dio problema setovima. 131 00:06:18,280 --> 00:06:20,460 >> I sam upucan, namjerno, na bijeloj pozadini. 132 00:06:20,460 --> 00:06:23,380 A neki od njih imaju nastavu Fellows crtanje neki tekst o 133 00:06:23,380 --> 00:06:25,490 Zaslon koji je obložio na strani od njih. 134 00:06:25,490 --> 00:06:27,760 Ali, naravno, to nije sve što je Zanimljivo u stvarnom svijetu. 135 00:06:27,760 --> 00:06:30,520 Ovo je samo predavaonici s Veliki bijeli zaslon i pozadina. 136 00:06:30,520 --> 00:06:33,330 I naša nevjerojatna produkcijski tim sortiranje mjesta čini sve izgledati lijepo 137 00:06:33,330 --> 00:06:36,620 nakon što je činjenica izrezivanjem iz Preklapanjem ili ništa 138 00:06:36,620 --> 00:06:37,840 činimo ili ne žele. 139 00:06:37,840 --> 00:06:41,560 >> Sada samo motivirati i ovaj tjedan Stvarno, gdje možete otići, u konačnici, 140 00:06:41,560 --> 00:06:42,560 u računalnoj znanosti. 141 00:06:42,560 --> 00:06:44,260 Ne samo nakon problema postavljena četiri. 142 00:06:44,260 --> 00:06:48,240 No, nakon što je drugi tečaj ili cijelog Nastavni plan i program Nevjerojatno je što možete 143 00:06:48,240 --> 00:06:51,090 napraviti ovih dana u smislu grafike posebno. 144 00:06:51,090 --> 00:06:53,440 >> Neki od vas možda su vidjeli ovo teče oko online. 145 00:06:53,440 --> 00:06:56,240 Ali sam mislio da ću vam pokazati, za samo nekoliko minuta, svjetlucanje što 146 00:06:56,240 --> 00:07:01,890 računalne tehnologije i što CGI, računalne grafike može učiniti ovih dana 147 00:07:01,890 --> 00:07:04,510 s poznatom pjesmom a možda film. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - LANA DEL RAY, "Mlad i lijep] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> ZVUČNI 1: To je samo malo Nevjerojatno, možda, koliko 151 00:10:52,470 --> 00:10:52,857 sveprisutna - 152 00:10:52,857 --> 00:10:57,040 >> [PLJESAK] 153 00:10:57,040 --> 00:10:59,230 >> ZVUČNI 1: Upravo sam ga skinuti. 154 00:10:59,230 --> 00:11:02,920 Ali to je stvarno nevjerojatno, mislim, samo Kako sveprisutna softver i broj i 155 00:11:02,920 --> 00:11:04,230 alate kao što to stvarno jesu. 156 00:11:04,230 --> 00:11:07,685 Dakle, to je okus smjeru u kojem možete ići. 157 00:11:07,685 --> 00:11:10,620 Oh, ne više Appliance danas. 158 00:11:10,620 --> 00:11:14,640 Pa, to je zapravo tragično vremena s obzirom na točku Samo sam pokušao napraviti. 159 00:11:14,640 --> 00:11:18,670 >> U redu, tako da ćemo pokrenuti Fusion opet. 160 00:11:18,670 --> 00:11:20,800 Podsjeti me kasnije. 161 00:11:20,800 --> 00:11:24,190 U redu, i trebali su dobili e kao na stranu ako je netko 162 00:11:24,190 --> 00:11:25,460 Primijetit kao što je to. 163 00:11:25,460 --> 00:11:29,940 U redu, tako da podsjećaju da je prošli tjedan smo počeli guliti natrag ovaj 164 00:11:29,940 --> 00:11:31,380 kasnije poznat kao string. 165 00:11:31,380 --> 00:11:34,700 >> string podsjeća na vrstu podataka koji je proglasio u CS50 knjižnici. 166 00:11:34,700 --> 00:11:37,740 I to je dio treninga kotača koji će sada početi da skinu. 167 00:11:37,740 --> 00:11:41,280 To je koristan koncept rano. 168 00:11:41,280 --> 00:11:43,750 No, sada će dobiti više Zanimljivo i snažnije 169 00:11:43,750 --> 00:11:48,330 zapravo vidjeti da se ispod haube, string je samo ono, nije mi rekao? 170 00:11:48,330 --> 00:11:50,500 >> Da, tako da je tzv char *. 171 00:11:50,500 --> 00:11:53,860 A * postoji označava da postoji nekakva adresu uključeni. 172 00:11:53,860 --> 00:11:58,690 I tako, kada kažeš char * samo znači varijabla čija je tip podataka 173 00:11:58,690 --> 00:11:59,290 Pokazivač sada. 174 00:11:59,290 --> 00:12:01,770 Činjenica da je star postoji samo znači da ste progla 175 00:12:01,770 --> 00:12:03,020 takozvane pointer. 176 00:12:03,020 --> 00:12:06,220 I to pokazivač će se očito pohraniti adresu, od 177 00:12:06,220 --> 00:12:07,810 Tečaj, char. 178 00:12:07,810 --> 00:12:08,960 >> Sad zašto se ovo smisla? 179 00:12:08,960 --> 00:12:11,200 Pa, ono što je string ispod haube? 180 00:12:11,200 --> 00:12:15,130 Pa, neko vrijeme smo bili rekavši da string ispod haube je 181 00:12:15,130 --> 00:12:18,460 Jednostavno h-e-l-l-o, na primjer. 182 00:12:18,460 --> 00:12:21,585 >> No, mi smo razgovarali o tome što da, u biti, polja. 183 00:12:21,585 --> 00:12:25,410 I onda bi niz izgleda malo više poput ovoga, a svaki od tih 184 00:12:25,410 --> 00:12:26,460 uzimam zalogaj. 185 00:12:26,460 --> 00:12:28,710 A onda smo je rekao da postoji nešto posebno ovdje, 186 00:12:28,710 --> 00:12:31,270 backslash 0 ili null terminator. 187 00:12:31,270 --> 00:12:35,230 >> Dakle, sve ovo vrijeme, ovo ovdje je string. 188 00:12:35,230 --> 00:12:38,320 Ali stvarno, struna zapravo adresa. 189 00:12:38,320 --> 00:12:43,210 I adrese, kao što ćemo vidjeti, često su prefiksom s 0x po konvenciji. 190 00:12:43,210 --> 00:12:44,540 Što 0x označavaju? 191 00:12:44,540 --> 00:12:45,970 Zna li netko? 192 00:12:45,970 --> 00:12:47,320 >> Dakle, to samo znači heksadecimalni. 193 00:12:47,320 --> 00:12:52,360 Pa možda podsjetiti, zapravo, iz PST 1, vjerujem, jedna od zagrijavanja 194 00:12:52,360 --> 00:12:55,740 pitanja zapravo pitao o heksadecimalni zapis osim 195 00:12:55,740 --> 00:12:57,100 binarni i decimalni. 196 00:12:57,100 --> 00:13:00,460 I ovdje je motivacija da s heksadecimalnom imate 16 197 00:13:00,460 --> 00:13:01,770 znamenaka na raspolaganju. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, nakon čega slijedi od a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> A ako računamo sve one do, ste dobili ukupno 16 godina. 200 00:13:10,430 --> 00:13:13,200 Dakle, to je u suprotnosti s decimala, gdje imamo 10 201 00:13:13,200 --> 00:13:14,690 znamenke, 0 do devet. 202 00:13:14,690 --> 00:13:17,750 To je u suprotnosti s binarnim gdje smo samo 0 i 1. 203 00:13:17,750 --> 00:13:21,450 >> Ali na kraju dana možete jednostavno predstavljaju iste brojeve, ali 204 00:13:21,450 --> 00:13:22,500 nešto drugačije. 205 00:13:22,500 --> 00:13:25,840 I hexadecimal je uobičajeno jer kao ispada - pa ćemo vidjeti 206 00:13:25,840 --> 00:13:28,790 kasnije u tijeku - čak i kada smo dobili na web programiranje u kontekstu 207 00:13:28,790 --> 00:13:32,100 HTML i kodove boja, hexadecimal je lijepo. 208 00:13:32,100 --> 00:13:36,390 Budući da svake znamenke, ispada, predstavlja četiri bita savršeno. 209 00:13:36,390 --> 00:13:39,280 Dakle, to je samo vrsta linija se lijepo kao što smo na kraju ćete vidjeti. 210 00:13:39,280 --> 00:13:44,720 Dakle, ovo bi moglo biti Ox123 ili nešto kao što je to, označava adresa 123 211 00:13:44,720 --> 00:13:47,050 negdje u mome memorije računala. 212 00:13:47,050 --> 00:13:50,600 >> Ali, naravno, neki se pojave problemi zbog toga temeljni 213 00:13:50,600 --> 00:13:51,520 Provedba. 214 00:13:51,520 --> 00:13:55,930 A sjećam da sam uzeo nož na provedbu funkcije kao što je ovaj - 215 00:13:55,930 --> 00:14:00,260 usporedite crtica 0 dot c prošlog tjedna, kako iako je izgledalo kao da je 216 00:14:00,260 --> 00:14:04,270 Dobro, to jednostavno nije usporedite dvije žice ispravno. 217 00:14:04,270 --> 00:14:07,470 >> Ja sam bacio glavna, a ja sam bačena daleko su komentari samo da se usredotočite na 218 00:14:07,470 --> 00:14:08,970 kod koji je od interesa ovdje. 219 00:14:08,970 --> 00:14:10,660 I to je u crveno jer je lud. 220 00:14:10,660 --> 00:14:11,670 Iz kojeg razloga? 221 00:14:11,670 --> 00:14:15,890 >> Pa, na vrhu tamo kad sam proglasio string, ono što se stvarno događa 222 00:14:15,890 --> 00:14:17,260 ispod haube? 223 00:14:17,260 --> 00:14:19,530 Pa, dopustite mi da ide preko zaslon ovdje i privući da. 224 00:14:19,530 --> 00:14:23,230 Tako sam izjavio, opet, niz s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Dakle, ja ću ići naprijed i sada skrenuti s za ono što zapravo jest. 226 00:14:26,640 --> 00:14:28,590 To će biti trg ovdje. 227 00:14:28,590 --> 00:14:30,490 I ja ću tvrditi da je to 32 bita. 228 00:14:30,490 --> 00:14:32,890 Barem to obično biva, barem na CS50 229 00:14:32,890 --> 00:14:34,520 aparata u puno računala. 230 00:14:34,520 --> 00:14:35,980 Ja ću ga nazvati e. 231 00:14:35,980 --> 00:14:39,070 >> Ali sada sjetiti da smo zove GetString. 232 00:14:39,070 --> 00:14:41,430 Dakle GetString se vraća, Naravno, niz. 233 00:14:41,430 --> 00:14:45,790 Ako korisnik upiše u h-e-l-l-o upišite string Hello dobiva vratio. 234 00:14:45,790 --> 00:14:51,010 I to string, kao što smo upravo rekao, završava negdje u memorije računala 235 00:14:51,010 --> 00:14:53,240 s obrnute kose 0 na kraju. 236 00:14:53,240 --> 00:14:56,650 Ja ću povući ovu kao niz - ili granični blok znakova - 237 00:14:56,650 --> 00:14:58,330 da je ona zapravo je. 238 00:14:58,330 --> 00:15:01,790 >> A sada, ono što je GetString zapravo vraćaju? 239 00:15:01,790 --> 00:15:04,340 Ono što je GetString vraćaju sve ovo vrijeme? 240 00:15:04,340 --> 00:15:07,520 Pa, recimo, u tjednima prije, vraća string. 241 00:15:07,520 --> 00:15:10,250 No, više tehnički, što se GetString povratak očito? 242 00:15:10,250 --> 00:15:11,610 >> PUBLIKA: adresa. 243 00:15:11,610 --> 00:15:12,600 >> ZVUČNI 1: adresa. 244 00:15:12,600 --> 00:15:16,630 Naime to vraća adresu Prvi zalogaj, što god da je. 245 00:15:16,630 --> 00:15:18,830 Ja samo držati koristeći jedan, dva, tri zato što je zgodan. 246 00:15:18,830 --> 00:15:21,380 >> To vraća adresu prvog znakova u nizu. 247 00:15:21,380 --> 00:15:23,510 I rekao je prošlog tjedna da je to je dovoljno. 248 00:15:23,510 --> 00:15:26,710 Jer uvijek možemo shvatiti gdje kraj niza samo 249 00:15:26,710 --> 00:15:30,150 Ponavljanje preko njega, možda, s za petlje ili while petlje ili nešto slično 250 00:15:30,150 --> 00:15:34,990 da, samo u potrazi za "obrnute kose 0", Posebna Sentinel znakova. 251 00:15:34,990 --> 00:15:37,220 >> I znamo da je string dogoditi da bude duljine - 252 00:15:37,220 --> 00:15:37,980 u ovom slučaju - 253 00:15:37,980 --> 00:15:38,670 pet. 254 00:15:38,670 --> 00:15:43,800 Dakle tehnički ono GetString radi se vraća Ox123 u ovom slučaju. 255 00:15:43,800 --> 00:15:53,670 A što se onda dogodi tehnički je da pohranjujemo, unutar s., Ox123. 256 00:15:53,670 --> 00:15:56,460 Na kraju dana, iako je to je novi koncept, pokazivače, oni su 257 00:15:56,460 --> 00:15:57,350 samo varijable. 258 00:15:57,350 --> 00:16:00,440 No, oni se dogoditi za pohranu bitova koji skupno predstavljaju adresu. 259 00:16:00,440 --> 00:16:03,700 Dakle tehnički sve što dobiva pohranjeni u S je Ox123. 260 00:16:03,700 --> 00:16:04,680 >> No, mi kao ljudi - 261 00:16:04,680 --> 00:16:06,020 uključujući i danas ide dalje - 262 00:16:06,020 --> 00:16:09,290 Stvarno se ne ide na skrb, u pravilu, što je stvarna adresa 263 00:16:09,290 --> 00:16:10,520 nekog komad memorije. 264 00:16:10,520 --> 00:16:14,040 To je samo na niskoj razini detalja na biti intelektualno zanimljiva. 265 00:16:14,040 --> 00:16:15,440 Tako ću poništiti. 266 00:16:15,440 --> 00:16:19,810 A umjesto toga, više visokoj razini, samo reci da kada govorimo o pokazivače 267 00:16:19,810 --> 00:16:22,170 Ja ću samo privući više razumljiv strelica koja prenosi 268 00:16:22,170 --> 00:16:26,060 Ista ideja i sažeci daleko pojedinosti o tome što je stvarni 269 00:16:26,060 --> 00:16:27,700 temeljni adresa. 270 00:16:27,700 --> 00:16:33,290 >> Sada, ako se vratimo u kodu, što dogodilo prošli tjedan, ako imamo string t 271 00:16:33,290 --> 00:16:34,510 jednako GetString? 272 00:16:34,510 --> 00:16:38,630 Pa, ako sam opet, tip u Pozdrav ovaj put ću doći 273 00:16:38,630 --> 00:16:40,460 jedan komad memorije. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Ali zato sam nazvao GetString drugi put - 276 00:16:48,320 --> 00:16:51,100 i znam to iz gleda izvorni kod za GetString - čak 277 00:16:51,100 --> 00:16:54,350 iako je slučajnost da je halo upisali u dva puta, GetString nije 278 00:16:54,350 --> 00:16:55,890 će pokušati optimizirati i biti pametan. 279 00:16:55,890 --> 00:16:58,550 To samo ide da biste dobili još jedan komad memorije od računala, što je 280 00:16:58,550 --> 00:16:59,640 će biti na drugoj adresi. 281 00:16:59,640 --> 00:17:02,330 Neka je samo reći 456 samovoljno. 282 00:17:02,330 --> 00:17:04,079 >> I što onda će to vratiti? 283 00:17:04,079 --> 00:17:08,030 To će vratiti 456 i pohraniti ga u t. 284 00:17:08,030 --> 00:17:12,010 Dakle, ono što se stvarno događa, na Lijeva strana je imam još jedan komad 285 00:17:12,010 --> 00:17:14,260 memorije, 32 bita obično. 286 00:17:14,260 --> 00:17:16,720 I tamo će ići Ox456. 287 00:17:16,720 --> 00:17:20,140 Ali opet, nisam zainteresiran za to određene brojeve više. 288 00:17:20,140 --> 00:17:23,069 Samo ću se apstraktno to nacrtati kao strijela. 289 00:17:23,069 --> 00:17:25,202 >> Dakle, ovo je sad novo objašnjenje. 290 00:17:25,202 --> 00:17:28,735 Ali to je isto točno ideja koja je se događalo sve ovo vrijeme. 291 00:17:28,735 --> 00:17:33,150 I tako onda razlog, da je ovaj prvi verzija usporediti bio lud 292 00:17:33,150 --> 00:17:34,480 prošli tjedan je razlog zašto? 293 00:17:34,480 --> 00:17:38,000 Kada to učinite, ako je jednaka jednaka t ono što su doista 294 00:17:38,000 --> 00:17:40,550 Ispod poklopca motora usporedbe? 295 00:17:40,550 --> 00:17:41,910 >> Vi ste uspoređujući adrese. 296 00:17:41,910 --> 00:17:47,950 I samo intuitivno, jasno, Ox123 ne ide na jednaku Ox456. 297 00:17:47,950 --> 00:17:49,380 Ti brojevi, one bita samo su drugačija. 298 00:17:49,380 --> 00:17:53,220 >> I tako stalno, prošli tjedan je izjavio upišete različite stvari, čak i ako 299 00:17:53,220 --> 00:17:55,360 Riječi su bile riječi do riječi isti. 300 00:17:55,360 --> 00:17:58,770 Tako smo popraviti. 301 00:17:58,770 --> 00:18:00,120 U laik uvjete, što je popraviti? 302 00:18:00,120 --> 00:18:02,110 >> PUBLIKA: Koristite funkciju. 303 00:18:02,110 --> 00:18:02,870 >> ZVUČNI 1: Koristite funkciju. 304 00:18:02,870 --> 00:18:05,190 Ili zvjezdica svakako su uključeni, ali koristiti funkciju učiniti što? 305 00:18:05,190 --> 00:18:05,962 >> PUBLIKA: Za usporedbu konce. 306 00:18:05,962 --> 00:18:07,390 >> ZVUČNI 1: Kako biste usporedili konce. 307 00:18:07,390 --> 00:18:11,030 Dakle, osnovni problem je ovdje bio da sam bio s obzirom 308 00:18:11,030 --> 00:18:15,870 Kvaliteta žice koje će definirati usporedba njihovih adresa. 309 00:18:15,870 --> 00:18:18,540 I očito da je glupo sad odjednom razumiješ što se događa 310 00:18:18,540 --> 00:18:19,510 ispod poklopca motora. 311 00:18:19,510 --> 00:18:23,270 Da doista usporediti žice da vidi je li oni su jednaki u načinu na koji ljudi 312 00:18:23,270 --> 00:18:26,680 će razmotriti dvije žice biti jednaki trebamo usporediti ih znak za 313 00:18:26,680 --> 00:18:28,070 znak za karaktera. 314 00:18:28,070 --> 00:18:30,020 >> Sada sam mogao učiniti ovaj vrlo dosadnog. 315 00:18:30,020 --> 00:18:32,240 No, familijarno, mi smo pomoću for petlje. 316 00:18:32,240 --> 00:18:36,050 I samo usporediti s. nosač ja protiv t bracket ja. 317 00:18:36,050 --> 00:18:39,590 Nosač je i plus 1 protiv t nosač i plus 1, i tako dalje, unutar 318 00:18:39,590 --> 00:18:40,580 neka vrsta petlje. 319 00:18:40,580 --> 00:18:44,950 I ako uočite da dva lika razlikuju, ili ako sam shvatiti da uuu, s. 320 00:18:44,950 --> 00:18:48,410 kraći od t ili dulje od t I odmah mogu reći lažna, 321 00:18:48,410 --> 00:18:49,390 oni nisu isti. 322 00:18:49,390 --> 00:18:55,370 >> Ali ako ja dobiti kroz S i T i reći Isto, isto, isto, isto, isto, kraj 323 00:18:55,370 --> 00:18:58,520 obje žice, mogu reći Istina, oni su jednaki. 324 00:18:58,520 --> 00:19:01,040 Pa, hvala bogu, godina netko pisao taj kod za nas. 325 00:19:01,040 --> 00:19:03,790 >> A oni su ga zvali StrComp za usporedbu string. 326 00:19:03,790 --> 00:19:11,900 I iako je to malo brojač intuitivno, StrComp vraća 0 ako su oni 327 00:19:11,900 --> 00:19:14,520 dvije žice, S i T su isti. 328 00:19:14,520 --> 00:19:18,090 No, ona se vraća negativnu vrijednost ako je trebao doći prije t po abecednom redu ili 329 00:19:18,090 --> 00:19:20,610 Pozitivna vrijednost ako bi trebao doći nakon t po abecedi. 330 00:19:20,610 --> 00:19:24,030 >> Dakle, ako ste ikada željeli riješiti nešto, ispada da StrComp je korisno. 331 00:19:24,030 --> 00:19:26,660 Jer to ne samo reći da ili ne, jednaka ili ne. 332 00:19:26,660 --> 00:19:30,440 To vam daje osjećaj naručivanja sviđa moć rječnik. 333 00:19:30,440 --> 00:19:33,770 Dakle StrComp, a zarez t jednaka jednako 0 znači da je 334 00:19:33,770 --> 00:19:35,200 žice su doista jednaki. 335 00:19:35,200 --> 00:19:38,680 Jer onaj tko je napisao ovu funkciju godina vjerojatno koristiti za petlju 336 00:19:38,680 --> 00:19:42,840 ili while petlje ili nešto slično integrirati preko likova ponovno 337 00:19:42,840 --> 00:19:45,270 i opet i opet. 338 00:19:45,270 --> 00:19:47,300 >> No, problem s dva je nastao ovdje. 339 00:19:47,300 --> 00:19:48,750 Ovo je copy0.c. 340 00:19:48,750 --> 00:19:51,680 I dvije u crvenom je jer je manjkav. 341 00:19:51,680 --> 00:19:52,800 A što mi radimo ovdje? 342 00:19:52,800 --> 00:19:54,310 Pa, prvo sam nazvao GetString. 343 00:19:54,310 --> 00:19:56,255 I sam pohranjeni povratnu vrijednost u s.. 344 00:19:56,255 --> 00:20:00,260 Dakle, to je uglavnom isti kao i ovaj gornji dio slike. 345 00:20:00,260 --> 00:20:01,490 >> No, ono što dolazi nakon toga? 346 00:20:01,490 --> 00:20:04,980 Pa, dopustite mi da ide naprijed i riješi od cijela hrpa toga. 347 00:20:04,980 --> 00:20:09,650 Mi ćemo natrag u vrijeme u kojem smo upravo imaju s, što je konzistentno s 348 00:20:09,650 --> 00:20:10,940 linije jedan gore. 349 00:20:10,940 --> 00:20:11,400 >> Ja provjeriti. 350 00:20:11,400 --> 00:20:13,450 Ako je jednaka jednaka je 0. 351 00:20:13,450 --> 00:20:18,670 Sada, brzo strani bilješku, kada je Možda GetString povratak 0? 352 00:20:18,670 --> 00:20:19,580 Nema dovoljno memorije. 353 00:20:19,580 --> 00:20:19,880 Točno? 354 00:20:19,880 --> 00:20:22,310 >> To je rijetkost da će se to dogoditi, Sigurno na računalu koje je 355 00:20:22,310 --> 00:20:24,740 dobio stotine ili megs čak gigs od RAM-a. 356 00:20:24,740 --> 00:20:27,080 No, to bi mogao, u teoriji, vratite 0, pogotovo ako 357 00:20:27,080 --> 00:20:28,080 korisnik ne surađuju. 358 00:20:28,080 --> 00:20:31,640 Ima načina da se pretvarati kao da niste uneseni ništa i trik 359 00:20:31,640 --> 00:20:34,100 GetString u povratku 0 učinkovito. 360 00:20:34,100 --> 00:20:35,470 >> Dakle, to će se provjeriti za to. 361 00:20:35,470 --> 00:20:39,430 Jer, ako je netko od vas počeo dobili, već, segmentacije mane - 362 00:20:39,430 --> 00:20:42,280 koji je vjerojatno bio izvor neke frustracije - 363 00:20:42,280 --> 00:20:46,150 one su gotovo uvijek rezultat memorije vezane pogreške. 364 00:20:46,150 --> 00:20:50,440 Nekako ste messed up s obzirom na pokazivač, čak i ako nisu shvatili 365 00:20:50,440 --> 00:20:51,530 Tu je pointer. 366 00:20:51,530 --> 00:20:55,260 Dakle, možda su izazvana segmentaciju greške što je prije tjedan dana jedan pomoću 367 00:20:55,260 --> 00:21:02,100 nešto kao za petlje ili neko vrijeme petlje i niz od strane ide predaleko 368 00:21:02,100 --> 00:21:05,900 Posljednjih granica neki niz koji proglasio da, u tjednu u dva 369 00:21:05,900 --> 00:21:06,690 Osobito. 370 00:21:06,690 --> 00:21:09,220 >> Možda ste to učinili ni u problemu postavite četiri s bijeg. 371 00:21:09,220 --> 00:21:12,910 Iako vjerojatno niste vidjeli sve zvijezde u distribucijsku koda za 372 00:21:12,910 --> 00:21:17,410 Bijeg, ispada da oni GRect i GOval i druge takve stvari, 373 00:21:17,410 --> 00:21:19,650 oni su zapravo upućuje ispod poklopca motora. 374 00:21:19,650 --> 00:21:23,430 >> No, Stanford, poput nas, vrsta kože da detaljno barem za knjižnice 375 00:21:23,430 --> 00:21:26,540 svrhe, baš kao i mi za gudački i char *. 376 00:21:26,540 --> 00:21:30,060 Ali GRect i GOval i svih onih stvari koje su ti dečki ili će se pomoću 377 00:21:30,060 --> 00:21:32,630 ovaj tjedan su u konačnici memorijske adrese. 378 00:21:32,630 --> 00:21:33,650 Vi jednostavno ne znate. 379 00:21:33,650 --> 00:21:37,240 >> Dakle, to je ne čudi onda, možda, da možda zapeti neke 380 00:21:37,240 --> 00:21:38,580 segmentacija greške. 381 00:21:38,580 --> 00:21:41,290 No, ono što je zanimljivo ovdje, Ako nakon što smo provjeriti za 0 radimo 382 00:21:41,290 --> 00:21:43,460 string t dobiva s.. 383 00:21:43,460 --> 00:21:44,690 Pa, dopustite mi da proglasi t. 384 00:21:44,690 --> 00:21:47,730 Ja ću ga izvući kao trga, 32 bita, zovu t. 385 00:21:47,730 --> 00:21:49,740 A onda ću to učiniti dobiva s.. 386 00:21:49,740 --> 00:21:51,130 >> Pa, što to znači? 387 00:21:51,130 --> 00:21:53,280 Pa, to je malo teško razmišljati o tome zamisliti mudar. 388 00:21:53,280 --> 00:21:55,025 Ali neka je razmišljati o što je unutra x? 389 00:21:55,025 --> 00:21:59,430 Što je doslovce unutar ove varijable? 390 00:21:59,430 --> 00:22:01,500 Vrijednost Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Dakle, kad kažem string t dobiva e, koja je upravo doslovno znači uzeti broj 392 00:22:05,815 --> 00:22:10,070 u sekundama, koje je Ox123 i staviti ga Ox123. 393 00:22:10,070 --> 00:22:13,740 Ili slikovito, ako ja vrsta apstraktne daleko od toga da ima detaljno 394 00:22:13,740 --> 00:22:16,600 Učinak doslovno radi to kao dobro. 395 00:22:16,600 --> 00:22:22,110 >> Pa sad, mislim natrag na prošlog tjedna kada je nastavili smo s kapitalističkom T. I. 396 00:22:22,110 --> 00:22:23,800 je T 0 nosača. 397 00:22:23,800 --> 00:22:27,150 Pa, T 0 nosača, iako je pointer, možete ga tretirati kao da je 398 00:22:27,150 --> 00:22:29,220 to polje, s kvadratičnim Nosač zapis. 399 00:22:29,220 --> 00:22:31,550 >> Dakle, gdje je T nosač 0? 400 00:22:31,550 --> 00:22:32,990 Pa, to je h. 401 00:22:32,990 --> 00:22:36,800 I tako kada koristimo tu liniju koda, dva gornja, što je u tom c type.h 402 00:22:36,800 --> 00:22:38,460 header file, to je gdje proglašena. 403 00:22:38,460 --> 00:22:44,410 Vi ste kapitaliziranje ovu H. No, od Naravno, to je isto točno h to je 404 00:22:44,410 --> 00:22:46,540 unutar e, da se tako izrazim. 405 00:22:46,540 --> 00:22:51,930 I tako sada ste promijenili ili kapitaliziraju se izvornik i 406 00:22:51,930 --> 00:22:53,120 takozvana kopija. 407 00:22:53,120 --> 00:22:56,620 Budući da nije za kopiranje Način na koji ljudi bi željeli da bude. 408 00:22:56,620 --> 00:22:59,710 >> Dakle, ono što je ovdje popraviti, u copy1.c prošlog tjedna? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkcije, tako da smo zapravo mogli kopirati string. 411 00:23:05,580 --> 00:23:08,700 I bitno, što trebamo učiniti kako bi kopirali string? 412 00:23:08,700 --> 00:23:12,070 >> Pa, u toj zelenoj verziji ovdje sam učiniti ga prilično niskoj razini. 413 00:23:12,070 --> 00:23:14,260 Tu su zapravo funkcionira oni bi mogli pomoći s ovim. 414 00:23:14,260 --> 00:23:17,710 No, većina osnovnih jedan, a najviše upoznati jedan, u najmanju ruku, će uskoro biti 415 00:23:17,710 --> 00:23:19,600 upoznati s nama, je sljedeći - 416 00:23:19,600 --> 00:23:21,910 tako da se u prvom retku koda u zelenom danas. 417 00:23:21,910 --> 00:23:23,970 >> Upravo sam ponovo napisao s kao char *. 418 00:23:23,970 --> 00:23:25,250 Nema funkcionalni Razlika postoji. 419 00:23:25,250 --> 00:23:28,790 Upravo sam bacio CS50 knjižnicu i Ja sam ga zovete što je to, char *. 420 00:23:28,790 --> 00:23:31,640 >> Sada točka, točka, točka, jer je bilo neka pogreška provjere da nije 421 00:23:31,640 --> 00:23:33,200 zanimljivo razgovarati o jednom. 422 00:23:33,200 --> 00:23:34,710 Dakle, sada je proglasio t. 423 00:23:34,710 --> 00:23:35,780 To je također znak *. 424 00:23:35,780 --> 00:23:38,280 Tako sam nacrtao mali trg na Zaslon kao prije. 425 00:23:38,280 --> 00:23:41,870 >> No, na desnoj strani, malloc, rekao mi je izdvojiti memorije. 426 00:23:41,870 --> 00:23:44,130 Dakle izdvojiti neki komad memorije. 427 00:23:44,130 --> 00:23:48,830 A koliko bajtova mi zapravo želite izdvojiti, to čini? 428 00:23:48,830 --> 00:23:50,340 >> Pa, string duljina s.. 429 00:23:50,340 --> 00:23:52,310 Dakle, ako je to je halo će biti pet. 430 00:23:52,310 --> 00:23:53,950 Mi ćemo reći h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Dakle, pet bajtova. 432 00:23:55,090 --> 00:23:57,960 >> Ali onda plus jedan, zašto 1? 433 00:23:57,960 --> 00:23:58,830 0 znakova. 434 00:23:58,830 --> 00:24:03,640 Ako mi ne ostavljaju prostor za ovim tipom smo možda slučajno stvoriti situaciju 435 00:24:03,640 --> 00:24:05,600 gdje je struna h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 I onda sljedeći put GetString je nazvao i sam upisati, primjerice, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, računalo će mislim da je zapravo 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d jer je nema pauze između tih riječi. 439 00:24:18,900 --> 00:24:19,810 >> Dakle, trebamo tu pauzu. 440 00:24:19,810 --> 00:24:20,720 Dakle, mi ne želimo pet. 441 00:24:20,720 --> 00:24:22,100 Želimo šest bajtova. 442 00:24:22,100 --> 00:24:23,110 >> I bajtova kažem. 443 00:24:23,110 --> 00:24:25,220 Ali to je doista vrijeme veličina Char. 444 00:24:25,220 --> 00:24:28,040 Tehnički znak je gotovo Uvijek jedan byte. 445 00:24:28,040 --> 00:24:31,030 >> No, samo da bi naš broj prenosiv, da tako kažemo, tako da se radi na 446 00:24:31,030 --> 00:24:33,750 različitih računala, čak i ako su na njega biti nešto drugačiji ispod 447 00:24:33,750 --> 00:24:36,590 napa, idem generički kažu veličina znak da 448 00:24:36,590 --> 00:24:37,660 moj broj uvijek rade. 449 00:24:37,660 --> 00:24:40,610 I nemam ga kompilirati samo jer sam nadograditi moje računalo ili koristite 450 00:24:40,610 --> 00:24:42,140 Neki različite platforme. 451 00:24:42,140 --> 00:24:45,300 >> Tako sam dobio 6 puta većeg char, koja bi trebala iznositi 1. 452 00:24:45,300 --> 00:24:47,440 Dakle, to znači da bi malloc daj mi šest bajtova. 453 00:24:47,440 --> 00:24:49,140 Što je to zapravo radi? 454 00:24:49,140 --> 00:24:52,810 Pa, neka mi vratiti u vrijeme ovdje gdje smo u toj priči. 455 00:24:52,810 --> 00:24:57,620 >> Dakle, ako sam se vratiti ovdje, ja sam proglasio char * t zove. 456 00:24:57,620 --> 00:25:00,280 Sada sam nazvao malloc za šest bajtova. 457 00:25:00,280 --> 00:25:06,400 A sada ću izvući tih šest bajtova baš kao i niz ranije. 458 00:25:06,400 --> 00:25:10,570 Ali ja zapravo ne znaju što je u ovom polju. 459 00:25:10,570 --> 00:25:14,640 >> Ako alocirati memoriju ispada da ne mogu vjerovati da postoji neki 460 00:25:14,640 --> 00:25:15,810 Poznato vrijednost postoji. 461 00:25:15,810 --> 00:25:18,400 Moglo se koriste nečim drugo, neka druga funkcija, neke druge 462 00:25:18,400 --> 00:25:19,630 linija koda koju je napisao. 463 00:25:19,630 --> 00:25:22,870 Dakle, mi općenito zvat ove smeće Vrijednosti i privući ih, možda, kako 464 00:25:22,870 --> 00:25:26,170 upitnika, samo pokazuje da smo ne znam što je zapravo tamo. 465 00:25:26,170 --> 00:25:30,390 I to nije velika stvar, tako dugo dok se su dovoljno pametni da prepisati onima 466 00:25:30,390 --> 00:25:34,550 Kante vrijednosti s brojevima ili znakovi da mi je stalo. 467 00:25:34,550 --> 00:25:36,340 >> Dakle, u ovom slučaju ono što ću učiniti? 468 00:25:36,340 --> 00:25:38,670 Pa, moja linija koda Sljedeći, imam četvero. 469 00:25:38,670 --> 00:25:41,350 int ja dobiti 0, n dobiva string duljina s.. 470 00:25:41,350 --> 00:25:42,750 Dakle, poznato za petlju. 471 00:25:42,750 --> 00:25:45,875 I je manji od ili jednak n, koji je obično iznad. 472 00:25:45,875 --> 00:25:47,500 >> No, ovaj put to je namjerno. 473 00:25:47,500 --> 00:25:51,890 Ja + +, a onda sam jednostavno napraviti t nosač ja dobiva s.. 474 00:25:51,890 --> 00:25:56,320 Budući da moja slika izgleda ovako, na taj trenutak, pohranjena je u t 475 00:25:56,320 --> 00:25:59,530 adresa tih slučajnih komad memorije čije vrijednosti su nepoznati. 476 00:25:59,530 --> 00:26:03,030 No, čim sam to t nosač 0 koji me poslao ovdje. 477 00:26:03,030 --> 00:26:07,430 >> A što završi uzimajući privučeni tamo? 478 00:26:07,430 --> 00:26:08,740 Mi završiti stavljanjem h. 479 00:26:08,740 --> 00:26:11,170 Jer to je ono što je na s nosača 0. 480 00:26:11,170 --> 00:26:14,300 A onda ista stvar za e, i l i l, i o. 481 00:26:14,300 --> 00:26:17,930 >> n, zašto sam ići gore kroz jednaka je n? 482 00:26:17,930 --> 00:26:19,200 Zbog 0 karaktera. 483 00:26:19,200 --> 00:26:23,580 Dakle, samo da bude jasno, a zatim, ako ja zapravo izbriše god to smeće 484 00:26:23,580 --> 00:26:28,870 vrijednosti, a onda zapravo privući u što očekujem, to je nosač 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus koji je prateći novi lik. 486 00:26:32,440 --> 00:26:36,080 >> I sad ako mi i dalje prošlosti točke, točka, točka u ovoj verziji ispravan 487 00:26:36,080 --> 00:26:41,930 a kapitalizirana t nosač 0 Bih, od Tečaj se kapitaliziraju samo ovaj 488 00:26:41,930 --> 00:26:47,050 momak ovdje, koji konceptualno, je u konačnici cilj. 489 00:26:47,050 --> 00:26:48,040 Pa to je sve pokazivač. 490 00:26:48,040 --> 00:26:51,430 >> A ti si bio koristeći ih za nekoliko tjedana Sada u kontekstu žice. 491 00:26:51,430 --> 00:26:53,530 No, ispod poklopca motora su malo složeniji. 492 00:26:53,530 --> 00:26:57,520 Ali ako mislite o njima u ovom slikovni oblik Predlažem da su oni 493 00:26:57,520 --> 00:27:01,720 Vjerojatno nije sve što je zastrašujuće što su oni Možda prvi činiti na prvi pogled, 494 00:27:01,720 --> 00:27:04,730 pogotovo s takvim novim sintakse. 495 00:27:04,730 --> 00:27:07,290 Bilo kakva pitanja na pokazivače, žice, ili znakova? 496 00:27:07,290 --> 00:27:07,580 Da? 497 00:27:07,580 --> 00:27:09,252 >> Publika: Može li se vratiti za [nečujno]? 498 00:27:09,252 --> 00:27:10,502 >> ZVUČNI 1: Svakako. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PUBLIKA: Pa kako dolaze u vaš posljednji linije, nemate liniju T * 501 00:27:19,525 --> 00:27:21,513 i * je u liniji? 502 00:27:21,513 --> 00:27:23,004 Ne možete imati referencu na - 503 00:27:23,004 --> 00:27:24,640 >> ZVUČNI 1: Ah, stvarno dobro pitanje. 504 00:27:24,640 --> 00:27:26,800 Zašto ne imam i * t * e? 505 00:27:26,800 --> 00:27:30,340 Zbog kratko, prošlog tjedna, kao u našem zamijeniti funkcije, ja nisam rekao da kada 506 00:27:30,340 --> 00:27:33,350 imaš pokazivač sredstva pomoću koji idete tamo, kao što smo učinili 507 00:27:33,350 --> 00:27:36,590 fizički na pozornici, bio je zapravo koristite operator zvijezda. 508 00:27:36,590 --> 00:27:40,570 >> Ispada da je ovaj trg-nosač Oznaka je ono što ćemo nazvati sintaktička 509 00:27:40,570 --> 00:27:44,190 šećera, što je samo seksi način rekavši da je stenografsku zapis za 510 00:27:44,190 --> 00:27:45,950 upravo ono što opisuje. 511 00:27:45,950 --> 00:27:49,385 Ali to je malo više intuitivno. 512 00:27:49,385 --> 00:27:53,510 I na rizik što to čini više komplicirana nego što treba biti, 513 00:27:53,510 --> 00:27:56,990 što se zapravo događa ovdje je sljedeće - 514 00:27:56,990 --> 00:28:01,450 Ako kažem * t to znači ići u Adresa pohranjeni u t. 515 00:28:01,450 --> 00:28:04,350 >> Dakle, doslovno, ako t je spremanje adresa tog h 516 00:28:04,350 --> 00:28:07,300 početku, * t znači ići tamo. 517 00:28:07,300 --> 00:28:10,730 Sada, što t nosač 0 znači? 518 00:28:10,730 --> 00:28:11,560 Sve točno stvar. 519 00:28:11,560 --> 00:28:13,510 To je samo malo više user friendly pisati. 520 00:28:13,510 --> 00:28:14,430 >> Ali nisam još gotov. 521 00:28:14,430 --> 00:28:17,800 Ne mogu samo reći * t * S dobiva. 522 00:28:17,800 --> 00:28:19,440 Zato što bih se onda radiš? 523 00:28:19,440 --> 00:28:22,950 Ja bih se stavljanjem h, h, h, h, h kroz cijelu stvar. 524 00:28:22,950 --> 00:28:22,995 Točno? 525 00:28:22,995 --> 00:28:26,020 >> Jer * t je otići na adresu u t. 526 00:28:26,020 --> 00:28:27,580 Ali, mi smo unutar petlje. 527 00:28:27,580 --> 00:28:32,150 A što sam ja povećavanjem vrijednosti, Naravno, na svakoj iteraciji? 528 00:28:32,150 --> 00:28:32,690 ja. 529 00:28:32,690 --> 00:28:34,590 >> No, tu je prilika ovdje, zar ne? 530 00:28:34,590 --> 00:28:37,870 Iako to se osjeća kao da je dobivanje malo sofisticiraniji 531 00:28:37,870 --> 00:28:40,730 od square-nosača zapisa upotrijebili smo za neko vrijeme - 532 00:28:40,730 --> 00:28:43,840 dopustite mi da poništi moje promjene h postoji - 533 00:28:43,840 --> 00:28:48,870 iako je sada uzimajući malo uzgajivač, osnovna ideja, ako * t 534 00:28:48,870 --> 00:28:53,630 znaci ovdje i * t je samo idite na adresu u t. 535 00:28:53,630 --> 00:28:54,990 >> No, ono što je adresa ut? 536 00:28:54,990 --> 00:28:56,850 Broj držimo koristite? 537 00:28:56,850 --> 00:29:00,540 Kao Ox456, neka to donijeti natrag samo zbog rasprave. 538 00:29:00,540 --> 00:29:05,380 Pa, ako želim dobiti na e se u t string, ja samo želim ići, 539 00:29:05,380 --> 00:29:06,460 u biti, 456. 540 00:29:06,460 --> 00:29:09,230 >> Odnosno, 457. 541 00:29:09,230 --> 00:29:10,590 Moram samo dodati jedan. 542 00:29:10,590 --> 00:29:11,790 No, ja to mogu, zar ne? 543 00:29:11,790 --> 00:29:14,680 Zbog t, iako držim crtež ona je sada kao strijela, to je samo 544 00:29:14,680 --> 00:29:16,570 broj, Ox456. 545 00:29:16,570 --> 00:29:21,400 A ako dodam da je jedan ili više Općenito, ako sam ja dodati da ja mogu 546 00:29:21,400 --> 00:29:24,350 zapravo dobiti točno gdje želim. 547 00:29:24,350 --> 00:29:26,260 Dakle, ako ja zapravo učiniti - 548 00:29:26,260 --> 00:29:28,970 i to je ono što se sada zove pointer aritmetika - 549 00:29:28,970 --> 00:29:30,375 Ja mogu ukloniti ovu liniju. 550 00:29:30,375 --> 00:29:33,550 Koji je, iskreno, mislim jasnije i Malo više user friendly za čitanje. 551 00:29:33,550 --> 00:29:35,970 No, to nije ništa manje točna. 552 00:29:35,970 --> 00:29:38,570 >> Ova linija koda sada koristi pointer aritmetiku. 553 00:29:38,570 --> 00:29:40,920 To govori otići adrese - 554 00:29:40,920 --> 00:29:44,670 što je početak t, koji je t plus i, koji je u početku 555 00:29:44,670 --> 00:29:45,730 je 0, što je velik. 556 00:29:45,730 --> 00:29:49,280 Jer to znači početak t plus 1, plus 2, plus 3, i tako dalje. 557 00:29:49,280 --> 00:29:51,030 A isto se bave s. 558 00:29:51,030 --> 00:29:52,750 >> Dakle sintaktička šećera za to. 559 00:29:52,750 --> 00:29:55,900 Ali razumijevanje onoga što se doista događa ispod poklopca motora, ja bih rekao, 560 00:29:55,900 --> 00:29:57,410 je zapravo korisna i sama od sebe. 561 00:29:57,410 --> 00:30:00,620 Jer to znači da sada ne postoji mnogo magiju događa 562 00:30:00,620 --> 00:30:01,620 ispod poklopca motora. 563 00:30:01,620 --> 00:30:03,920 Tu se ne ide da se još mnogo toga naslage, koje možemo guliti natrag za vas. 564 00:30:03,920 --> 00:30:04,810 Ovo je c. 565 00:30:04,810 --> 00:30:06,410 A to je programiranje. 566 00:30:06,410 --> 00:30:08,002 Stvarno dobro pitanje. 567 00:30:08,002 --> 00:30:11,570 >> U redu, tako da je ovo bio da je lud Program sam mislio na ranije. 568 00:30:11,570 --> 00:30:12,650 Swap je manjkav. 569 00:30:12,650 --> 00:30:14,070 Ako se činilo da rade. 570 00:30:14,070 --> 00:30:17,390 Sjetite se da baš kao s mlijekom i sok od naranče - koji sam započeo 571 00:30:17,390 --> 00:30:18,660 pio današnju demonstraciju. 572 00:30:18,660 --> 00:30:22,220 Dakle, baš kao i sa sokom od naranče i mlijeko, imali smo koristiti 573 00:30:22,220 --> 00:30:26,200 privremena varijabla, tmp, držati privremeno, tako da smo mogli onda 574 00:30:26,200 --> 00:30:28,820 promijeniti svoju vrijednost, a zatim ažurirati b. 575 00:30:28,820 --> 00:30:32,870 >> No, ova funkcija, rekli smo, ili ovaj Program u kojem je ova funkcija 576 00:30:32,870 --> 00:30:35,670 napisao je krivo i manjkav, zašto? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Da? 579 00:30:39,090 --> 00:30:42,471 >> PUBLIKA: [nečujno]. 580 00:30:42,471 --> 00:30:44,940 >> ZVUČNI 1: Točno, kada je nazovete zamjenu - 581 00:30:44,940 --> 00:30:47,820 ili općenitije, kada nazovite najviše bilo koju funkciju - 582 00:30:47,820 --> 00:30:51,210 ako su argumenti na toj funkciji su primitivne, da se tako izrazim, Ints i znakova 583 00:30:51,210 --> 00:30:56,740 i parovi i pluta, stvari bez zvjezdica, što prolaze kopijom 584 00:30:56,740 --> 00:30:57,540 argument. 585 00:30:57,540 --> 00:31:01,580 Dakle, ako je x 1 i y je 2, ide da je 1 i B će biti 2. 586 00:31:01,580 --> 00:31:05,250 No, oni će biti različite komade bitova, različitim komadima 587 00:31:05,250 --> 00:31:07,540 memorije koji se dogoditi da se skladištenje identične vrijednosti. 588 00:31:07,540 --> 00:31:12,160 >> Dakle, ovaj broj je super savršena kod zamjene A i B. 589 00:31:12,160 --> 00:31:13,850 To nije dobro, na zamjene - 590 00:31:13,850 --> 00:31:15,290 u prošlotjednom primjer - 591 00:31:15,290 --> 00:31:16,390 x i y. 592 00:31:16,390 --> 00:31:18,780 Jer opet, oni su u pogrešnom opsegu. 593 00:31:18,780 --> 00:31:21,310 >> Sada, kako smo to ide o utvrđivanju? 594 00:31:21,310 --> 00:31:23,140 Morali smo napraviti funkciju izgleda malo uglier. 595 00:31:23,140 --> 00:31:25,250 Ali opet, razmislite što to samo znači. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> I zapravo, neka mi, za dosljednost, promijeniti jednu stvar tako da je identičan 598 00:31:31,500 --> 00:31:33,200 ono što smo upravo učinili. 599 00:31:33,200 --> 00:31:35,690 Kao što sam spomenuo prošlog tjedna, to ne važno gdje to ide. 600 00:31:35,690 --> 00:31:38,120 Zapravo, obično bi stavili star uz ime varijable. 601 00:31:38,120 --> 00:31:40,750 No, mislim da će to biti malo lakše uzeti u obzir * uz 602 00:31:40,750 --> 00:31:44,910 tip podataka, kao što znači da je pokazivač kao int u ovom slučaju. 603 00:31:44,910 --> 00:31:46,270 >> Pa što ja radim ovdje? 604 00:31:46,270 --> 00:31:49,590 Ja govorim ne daju mi ​​int i još jednom int, 605 00:31:49,590 --> 00:31:50,810 nazivajući ih ib. 606 00:31:50,810 --> 00:31:52,460 Daj mi adresu int. 607 00:31:52,460 --> 00:31:53,960 Daj mi adresu drugog int. 608 00:31:53,960 --> 00:31:56,330 Poziv na one adrese A i B. 609 00:31:56,330 --> 00:32:00,860 >> A onda pomoću * zapis prema dolje u nastavku, ići na svaku od tih adresa 610 00:32:00,860 --> 00:32:05,290 koliko je potrebno da biste dobili bilo ili postavite vrijednost. 611 00:32:05,290 --> 00:32:07,400 No, postoji iznimka. 612 00:32:07,400 --> 00:32:11,130 Zašto ne imati * pored MPT? 613 00:32:11,130 --> 00:32:15,070 Zašto mi to učiniti, na primjer? 614 00:32:15,070 --> 00:32:19,370 To se osjeća kao da bi trebala ići sve van i ispraviti cijelu stvar. 615 00:32:19,370 --> 00:32:19,752 Da? 616 00:32:19,752 --> 00:32:21,002 >> PUBLIKA: [nečujno]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> ZVUČNI 1: Nisam proglasio tmp kao string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Dakle, to bi deklarirati, u ovom slučaju, tmp kako bi se adresa int. 621 00:32:34,950 --> 00:32:37,380 Ali to nije sasvim ono što želim, za nekoliko razloga. 622 00:32:37,380 --> 00:32:38,616 >> PUBLIKA: Vi ne želite da ih zamijene. 623 00:32:38,616 --> 00:32:41,800 >> ZVUČNI 1: Točno, ne želim se mijenjati ništa s MPT. tmp je samo 624 00:32:41,800 --> 00:32:42,790 Tjedan-jedna stvar. 625 00:32:42,790 --> 00:32:45,150 Sve što želim je promjenjiva spremiti neki broj. 626 00:32:45,150 --> 00:32:47,330 Ja uopće ne brinu o adresama u ovom trenutku. 627 00:32:47,330 --> 00:32:50,530 >> Trebam samo 32 bita ili pa za spremanje int. 628 00:32:50,530 --> 00:32:56,690 I želim staviti u tim 32 bita što nije u, da tako kažemo, ali 629 00:32:56,690 --> 00:33:01,260 što je u, samo da budemo precizniji. 630 00:33:01,260 --> 00:33:06,420 Jer ako je adresa, * znači otići tamo i dobiti vrijednost 1. 631 00:33:06,420 --> 00:33:10,560 Na primjer, u prošlotjednom primjer ili u slučaju B-a, dobiti vrijednost 2. 632 00:33:10,560 --> 00:33:11,750 >> Dakle, ono što se doista događa? 633 00:33:11,750 --> 00:33:15,070 Dopustite mi nacrtati ovdje koji će Samo zafrkavati, osim dijela danas. 634 00:33:15,070 --> 00:33:18,580 No, to će se nastaviti prikazivati za neko vrijeme. 635 00:33:18,580 --> 00:33:22,430 >> Ovaj, ja tvrdim, je ono što vaše računalo ' memorije izgleda kad naiđete 636 00:33:22,430 --> 00:33:24,060 Program, bilo koji program. 637 00:33:24,060 --> 00:33:28,340 Kada pokrenete program, na samom vrhu vašeg računala RAM-a - tako misle 638 00:33:28,340 --> 00:33:33,530 ovaj pravokutnik, doista, kao i vaši računala RAM-a ili memorije, sve 101 639 00:33:33,530 --> 00:33:36,920 milijardi bajtova njega, sve dvije milijarde bajtova, svim dva gigabajta njega, 640 00:33:36,920 --> 00:33:39,910 bez obzira na količinu imate je, neka je skrenuti ga kao pravokutnik. 641 00:33:39,910 --> 00:33:43,260 A ja tvrdim da kad pokrenete program kao što su Microsoft Word ili Chrome 642 00:33:43,260 --> 00:33:49,220 ili bilo što slično, da se bitovi Microsoft i Google koji je napisao - 643 00:33:49,220 --> 00:33:50,910 u slučaju tih programa - 644 00:33:50,910 --> 00:33:54,490 se učitava u memoriju Vašeg računala gdje se mogu izvršiti više 645 00:33:54,490 --> 00:33:57,520 brzo i hranio u CPU, koji se je mozak računala. 646 00:33:57,520 --> 00:34:00,940 >> I u TAM pohranjene su na samom Vrh svoj program, da se tako izrazim. 647 00:34:00,940 --> 00:34:03,300 Drugim riječima, ako je to komad memorije, kada je dva puta kliknuti na 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, komadići dolaze s tvrdog diska. 649 00:34:05,740 --> 00:34:06,680 Oni se učitava u RAM. 650 00:34:06,680 --> 00:34:10,330 A mi ćemo ih gurati prema gore, na samom vrhu ovog pravokutnika konceptualno. 651 00:34:10,330 --> 00:34:13,010 >> Pa, ostatak sjećanju je koristi za različite stvari. 652 00:34:13,010 --> 00:34:16,460 Na samom vrhu vidite inicijalizirati Podaci i uninitialize podatke. 653 00:34:16,460 --> 00:34:20,500 To ima veze, za najveći dio, s Konstante ili globalnih varijabli 654 00:34:20,500 --> 00:34:21,340 koji imaju vrijednosti. 655 00:34:21,340 --> 00:34:22,980 No, više o onima drugi put. 656 00:34:22,980 --> 00:34:25,150 >> Tada imate hrpu, koja vratit ćemo se. 657 00:34:25,150 --> 00:34:28,420 No, na dnu je dio koji je Posebno zameci upravo sada. 658 00:34:28,420 --> 00:34:30,210 To je tzv stog. 659 00:34:30,210 --> 00:34:33,850 Dakle, baš kao i na većini bilo dvorani D ovdje na kampus, imate one posude koje 660 00:34:33,850 --> 00:34:37,210 samo slagati jedan na drugi na kojem možete staviti hranu i sitnica. 661 00:34:37,210 --> 00:34:40,139 Stog u računalnom sustavu je vrlo slična. 662 00:34:40,139 --> 00:34:42,679 Osim dok je u ladicu, što mi koristimo u blagovaonica, dakako, podrazumijeva 663 00:34:42,679 --> 00:34:45,710 nositi stvari ladice ili su okviri - 664 00:34:45,710 --> 00:34:49,469 kako ćemo ih nazvati - u računalo ' memorija se koristi za držanje 665 00:34:49,469 --> 00:34:51,610 varijable i vrijednosti. 666 00:34:51,610 --> 00:34:53,929 >> Dakle, ono što se stvarno na ispod haube? 667 00:34:53,929 --> 00:34:55,820 Pa, neka mi prevrtanja na zaslonu ovdje. 668 00:34:55,820 --> 00:34:58,370 I neka se usredotočiti samo na donji dio za trenutak. 669 00:34:58,370 --> 00:35:02,770 Ako je to donji dio mojih memorije računala ispada kad sam 670 00:35:02,770 --> 00:35:05,350 zovemo glavna funkcija - što se događa, iskreno, 671 00:35:05,350 --> 00:35:06,950 automatski za mene - 672 00:35:06,950 --> 00:35:10,510 Ja dobiti komad memorije na Dno moje RAM se tako izrazim. 673 00:35:10,510 --> 00:35:13,390 I ovo je mjesto gdje je glavna lokalnim varijablama ići. 674 00:35:13,390 --> 00:35:16,770 To je mjesto gdje argc i argv možda ići, i bilo varijabli I 675 00:35:16,770 --> 00:35:18,170 izjavljujem unutar glavna. 676 00:35:18,170 --> 00:35:20,260 Oni završiti na dnu od mog računala RAM-a. 677 00:35:20,260 --> 00:35:25,040 >> Sada pretpostavimo da je glavna funkcija poziva kao zamjene, kao što je to učinio prošli tjedan? 678 00:35:25,040 --> 00:35:30,620 Pa, u biti smo stavili novu ladicu, Novi okvir, na moj komad memorije. 679 00:35:30,620 --> 00:35:34,160 I ja ću se opisuju kao pripadaju swap funkciji. 680 00:35:34,160 --> 00:35:35,770 >> Sada što je unutar swapa? 681 00:35:35,770 --> 00:35:39,240 Pa, na temelju prošlotjednog programa i jednom smo upravo vidjeli izvadak iz, 682 00:35:39,240 --> 00:35:46,590 unutar okvira zamjenom-a, ili na zamjeni-a ladica, su ono varijabli? 683 00:35:46,590 --> 00:35:47,970 Dobro, a i b. 684 00:35:47,970 --> 00:35:51,850 Jer, oni su njegovi lokalni argumenata, plus treći, tmp. 685 00:35:51,850 --> 00:35:54,470 Pa stvarno, mogao sam izvući ovu malo više čisto. 686 00:35:54,470 --> 00:35:56,680 Dopustite mi da ide naprijed i poništiti naljepnicu. 687 00:35:56,680 --> 00:35:58,520 I neka mi tvrde da znate što? 688 00:35:58,520 --> 00:36:00,560 >> Vjerojatno će završiti ovdje. 689 00:36:00,560 --> 00:36:02,160 B će završiti ovdje. 690 00:36:02,160 --> 00:36:03,810 I tmp će završiti ovdje. 691 00:36:03,810 --> 00:36:05,160 Sada, naručivanje might biti malo drugačija. 692 00:36:05,160 --> 00:36:06,840 No, koncepcijski je to ideja. 693 00:36:06,840 --> 00:36:11,490 >> I samo zajedno, to je ono što zvat ćemo Swap karoseriju, ili 694 00:36:11,490 --> 00:36:12,136 blagovaonica-dvoranu ladicu. 695 00:36:12,136 --> 00:36:13,150 A isto bave glavna. 696 00:36:13,150 --> 00:36:14,040 No, neću ponovno iscrtavanje to. 697 00:36:14,040 --> 00:36:17,810 No, to je mjesto gdje argc i argv i bilo njegovih lokalnih varijabli kao što su xiy 698 00:36:17,810 --> 00:36:18,940 neće biti na odmet. 699 00:36:18,940 --> 00:36:22,170 >> Pa sad razmislite što se doista događa kada pozvati zamjenu. 700 00:36:22,170 --> 00:36:26,370 Kada zovete zamjenu, izvršavanje koda kao to, da ste u prolazu, u 701 00:36:26,370 --> 00:36:30,670 kolicima verzija, a i b kao kopije xiy. 702 00:36:30,670 --> 00:36:34,300 Dakle, ako ja sada ne nacrtali ovo na zaslonu - 703 00:36:34,300 --> 00:36:36,700 dobio bi dobili bolje na to - 704 00:36:36,700 --> 00:36:40,850 tako da priča sam govorio sam sebi je u ovom lud verziji, kada smo 705 00:36:40,850 --> 00:36:46,130 zamjenjivati ​​sugovornika prolaze doslovno i B kao cijeli brojevi, što se zapravo događa? 706 00:36:46,130 --> 00:36:48,250 >> Pa, ono što se stvarno događa je to. 707 00:36:48,250 --> 00:36:52,850 Dopustite mi da ide naprijed i poništiti samo jasno da se neki prostor ovdje. 708 00:36:52,850 --> 00:36:54,720 Dakle, ovo je moj memorije računala. 709 00:36:54,720 --> 00:36:57,510 >> Dakle, ako imam, primjerice - 710 00:36:57,510 --> 00:36:58,910 zapravo ćemo učiniti na ovaj način - 711 00:36:58,910 --> 00:37:02,690 Ako ja tvrdim da je to x, skladištenje vrijednost 1 kao prošlog tjedna. 712 00:37:02,690 --> 00:37:05,930 A to je y, spremanje vrijednosti 2 baš kao i prošlog tjedna. 713 00:37:05,930 --> 00:37:11,370 I to je glavna, kad zovem zamjenu, dajući sebi pristup, a 714 00:37:11,370 --> 00:37:15,150 b i trimetoprim, ja ću tvrditi da ovo i to je 1. 715 00:37:15,150 --> 00:37:16,080 >> To je b. 716 00:37:16,080 --> 00:37:17,010 To je 2. 717 00:37:17,010 --> 00:37:18,370 To se zove tmp. 718 00:37:18,370 --> 00:37:23,360 >> I u početku, ona ima neku vrijednost smeće dok sam zapravo pohraniti u njemu, 719 00:37:23,360 --> 00:37:24,450 što je 1. 720 00:37:24,450 --> 00:37:28,320 Onda sam ići naprijed i promijeniti da se što? 721 00:37:28,320 --> 00:37:29,720 B vrijednost. 722 00:37:29,720 --> 00:37:31,980 >> I tako sada imam dvije ovdje. 723 00:37:31,980 --> 00:37:34,050 I onda mi je rekao b dobiva tmp. 724 00:37:34,050 --> 00:37:37,670 Opet, baš kao i razum ček, treći linija koda ovdje je jednostavno to 725 00:37:37,670 --> 00:37:39,440 jedan, b dobiva tmp. 726 00:37:39,440 --> 00:37:41,730 >> I tako na kraju, što da radim? 727 00:37:41,730 --> 00:37:46,800 I ići naprijed i promijeniti b se god vrijednost MPT je, što je 1. 728 00:37:46,800 --> 00:37:48,390 Ne dirajte tmp opet. 729 00:37:48,390 --> 00:37:54,100 >> Ali sada, problem je što je prije swapa vraća, jer to nije hendikep 730 00:37:54,100 --> 00:37:57,540 natrag neke vrijednosti, nema povratka Izjava izrijekom u njoj. 731 00:37:57,540 --> 00:37:59,080 Što se zapravo događa? 732 00:37:59,080 --> 00:38:03,480 Pa, u biti sve to memorije - 733 00:38:03,480 --> 00:38:07,410 OK, očito voli gumicu samo jedan prsta - 734 00:38:07,410 --> 00:38:08,180 jednostavno nestane. 735 00:38:08,180 --> 00:38:10,070 >> Sada je u stvarnosti to nije ide nigdje. 736 00:38:10,070 --> 00:38:11,810 Ali možete misliti na to sada kao upitnicima. 737 00:38:11,810 --> 00:38:14,040 Jer to više nije zapravo u uporabi. 738 00:38:14,040 --> 00:38:17,470 I ništa ne učini s tim vrijednostima. 739 00:38:17,470 --> 00:38:21,920 >> Dakle, u slučaju zelenoj verziji ovaj broj, što umjesto da se bude 740 00:38:21,920 --> 00:38:24,640 prešao u zamjenu? 741 00:38:24,640 --> 00:38:25,770 Dakle adrese. 742 00:38:25,770 --> 00:38:28,520 Dakle, adresa xi adresa y. 743 00:38:28,520 --> 00:38:35,790 Dakle, ako ćemo ponovno ovu priču ispričati jedan zadnji vrijeme, a ja sam zapravo privući zamjenu opet, 744 00:38:35,790 --> 00:38:44,620 ali s pokazivačima, to je to što b, a to se tmp, što je 745 00:38:44,620 --> 00:38:49,080 zapravo pohranjene u u ovu zelenu verzija mog koda gdje sam prolazeći 746 00:38:49,080 --> 00:38:52,110 u adrese? 747 00:38:52,110 --> 00:38:53,780 >> To će biti pokazivač x. 748 00:38:53,780 --> 00:38:54,890 Tako sam mogao izvući strijelu. 749 00:38:54,890 --> 00:38:57,310 Ali neka je koristiti isti proizvoljna Primjer kao i prije. 750 00:38:57,310 --> 00:39:01,220 Recimo da je to nešto poput Ox123. 751 00:39:01,220 --> 00:39:04,970 I to će biti zbog Ox127 to četiri bajta daleko, jer je to 752 00:39:04,970 --> 00:39:07,370 int, pa Ox127. 753 00:39:07,370 --> 00:39:09,080 >> I opet, ja sam uzimajući neke slobode s brojevima. 754 00:39:09,080 --> 00:39:11,430 Oni su puno manji nego što bi zapravo biti iu drugim redoslijedom. 755 00:39:11,430 --> 00:39:14,350 Ali to je kako je slika Sada je drugačije. 756 00:39:14,350 --> 00:39:19,060 >> Ali kad sam koristiti ovaj zeleni kod a ja ne int tmp dobili *. 757 00:39:19,060 --> 00:39:25,010 * Sredstvo koje treba učiniti sljedeće, uzeti adresa koja je u i ići na njega, 758 00:39:25,010 --> 00:39:26,190 što je 1. 759 00:39:26,190 --> 00:39:28,480 I to je ono što sam onda staviti u tmp. 760 00:39:28,480 --> 00:39:32,480 U međuvremenu, u sljedećem retku koda Ovdje, * dobiva B, što to znači? 761 00:39:32,480 --> 00:39:36,910 >> Pa, *, pa ići ovdje dobiva * b, što znači otići tamo. 762 00:39:36,910 --> 00:39:39,310 A to znači da mu je vrijednost na postoji. 763 00:39:39,310 --> 00:39:43,670 Konačno, posljednja linija koda jednostavno rekao * b dobiva tmp. 764 00:39:43,670 --> 00:39:48,900 >> Dakle, b, kaže otići tamo i to prebrisati tmp koji, u ovom slučaju, ide 765 00:39:48,900 --> 00:39:51,520 da se, opet, 1. 766 00:39:51,520 --> 00:39:54,920 I to je razlog zašto zeleni verzija Naš Kodeks djela, dok je crvena 767 00:39:54,920 --> 00:39:56,010 Verzija nikada nije učinio. 768 00:39:56,010 --> 00:39:59,020 To sve se svodi samo na to kako Memorija je uspio i gdje je 769 00:39:59,020 --> 00:40:02,580 zapravo stavlja u računala RAM-a. 770 00:40:02,580 --> 00:40:07,270 A za sada, to je jedna od stvari da stog se koristi za. 771 00:40:07,270 --> 00:40:09,225 >> Pitanja o izgledu? 772 00:40:09,225 --> 00:40:10,380 Na pokazivače? 773 00:40:10,380 --> 00:40:11,630 Ili na zamjeni? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> U redu, tako da malloc, podsjetimo, učinio ovako nešto. 776 00:40:17,043 --> 00:40:18,260 To je super jednostavan primjer. 777 00:40:18,260 --> 00:40:20,550 A to je onaj koji Binky upoznao nas, doduše prilično 778 00:40:20,550 --> 00:40:21,870 brzo, na kraju razreda. 779 00:40:21,870 --> 00:40:24,480 Dovraga, tamo idemo opet. 780 00:40:24,480 --> 00:40:28,780 >> Dakle prisjetiti da je to primjer koji Binky upoznao nas, doduše 781 00:40:28,780 --> 00:40:30,360 nešto brzo, na kraju razreda. 782 00:40:30,360 --> 00:40:33,640 I ovdje mi se jako malloc po drugi put. 783 00:40:33,640 --> 00:40:37,330 Budući da je prvi put smo ga koristiti za stvoriti dovoljno RAM-a, izdvojiti dovoljno RAM-a 784 00:40:37,330 --> 00:40:38,340 pohraniti string. 785 00:40:38,340 --> 00:40:40,250 >> Ovaj put Binky držati ga jednostavno. 786 00:40:40,250 --> 00:40:42,465 Dakle, to je samo za pohranu int, očito. 787 00:40:42,465 --> 00:40:43,510 I to je potpuno u redu. 788 00:40:43,510 --> 00:40:46,560 To je malo čudno, iskreno, da koristiti malloc izdvojiti jednu int. 789 00:40:46,560 --> 00:40:50,650 Ali točka Nickovom Claymation je zapravo samo ispričati priču o tome što 790 00:40:50,650 --> 00:40:53,830 dogodi ili ne dogodi kada da zlostavljaju memorije. 791 00:40:53,830 --> 00:40:56,520 >> Dakle, u ovom slučaju, ovaj program učinio nekoliko stvari. 792 00:40:56,520 --> 00:41:01,580 U prvom slučaju ovdje, što proglasi Pokazivač se zove x na int. 793 00:41:01,580 --> 00:41:04,480 To onda izjavljuje pokazivač zove y kao int. 794 00:41:04,480 --> 00:41:06,150 To onda pohranjuje u x., što? 795 00:41:06,150 --> 00:41:07,110 Netko drugi je sada. 796 00:41:07,110 --> 00:41:09,685 Ono što se pohranjuju u X prema Treći redak ovog programa? 797 00:41:09,685 --> 00:41:12,380 >> PUBLIKA: [nečujno]. 798 00:41:12,380 --> 00:41:14,130 >> ZVUČNI 1: Pa, ne baš bajtova, po reći. 799 00:41:14,130 --> 00:41:16,760 Točnije sada. 800 00:41:16,760 --> 00:41:18,325 Što dobiva pohranjena u X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Adresa, mislim da sam ga čuo. 803 00:41:22,060 --> 00:41:23,570 >> Pa što malloc povratak? 804 00:41:23,570 --> 00:41:26,030 malloc alocira bihevioralno komad memorije. 805 00:41:26,030 --> 00:41:27,850 Ali kako to vam dati pristup do njega? 806 00:41:27,850 --> 00:41:29,460 To što se vraća? 807 00:41:29,460 --> 00:41:32,000 Adresu prvog bajta s blokom memorije. 808 00:41:32,000 --> 00:41:33,020 >> Sada, ovo je super jednostavna. 809 00:41:33,020 --> 00:41:35,380 To je samo jedan bajt, što znači rješavanje mi smo dobivanje natrag 810 00:41:35,380 --> 00:41:37,300 adresa cijelu stvar. 811 00:41:37,300 --> 00:41:42,070 Tako pohranjeni u x. dakle, adresa tog komad memorije. 812 00:41:42,070 --> 00:41:43,400 U međuvremenu, ono što će se dogoditi sljedeće? 813 00:41:43,400 --> 00:41:45,890 Pa zapravo, idemo naprijed i izvlačenje iz ove jako brzo. 814 00:41:45,890 --> 00:41:52,490 >> Pa ako ćemo ići preko zaslona i ovdje igramo ovo int * x * y i int 815 00:41:52,490 --> 00:41:53,740 će učiniti ono što za mene? 816 00:41:53,740 --> 00:41:58,280 Tvrdim da je to samo će učiniti ovako nešto i to nazvati x, a 817 00:41:58,280 --> 00:42:00,010 to i zovu y. 818 00:42:00,010 --> 00:42:03,110 U međuvremenu, treća linija koda će izdvojiti veličinu int, 819 00:42:03,110 --> 00:42:06,160 koji se dogoditi da bude - Žao mi je ako sam rekao jedan prije nego što sam mislio jedan INT - 820 00:42:06,160 --> 00:42:08,280 četiri bajta o tipičnom računalu. 821 00:42:08,280 --> 00:42:09,720 Barem s CS50 aparata. 822 00:42:09,720 --> 00:42:11,490 >> Dakle, ovo će se izdvojiti da, tko zna? 823 00:42:11,490 --> 00:42:12,800 Negdje ovdje. 824 00:42:12,800 --> 00:42:15,780 A to je pohranjena na nekom Adresa vol, tko zna? 825 00:42:15,780 --> 00:42:18,330 No, ono što se događa da se vratio je da je adresa. 826 00:42:18,330 --> 00:42:22,270 No, mi ćemo izvući ovu slikovito samo kao strijela kao što je to. 827 00:42:22,270 --> 00:42:25,430 >> Sada u sljedećem retku * x dobiva 42. 828 00:42:25,430 --> 00:42:29,400 Što * x znači u laik uvjete? 829 00:42:29,400 --> 00:42:30,040 Dovoljno je otići tamo. 830 00:42:30,040 --> 00:42:30,960 Idi na toj adresi. 831 00:42:30,960 --> 00:42:35,900 Ili drugim riječima, slijedite Strelica i staviti 42 ima. 832 00:42:35,900 --> 00:42:38,140 No, tada se dogodilo nešto loše Binky se, zar ne? 833 00:42:38,140 --> 00:42:43,950 >> Podsjetimo da je linija pet ovdje, * y dobiva 13, doista nesretan broj, 834 00:42:43,950 --> 00:42:44,760 A što za nas? 835 00:42:44,760 --> 00:42:47,320 Pa, * y znači otići tamo. 836 00:42:47,320 --> 00:42:50,460 Pa, to nije dano Vrijednost ipak, zar ne? 837 00:42:50,460 --> 00:42:54,090 Kod nema y je postavljene na bilo što. 838 00:42:54,090 --> 00:42:56,120 Imali smo x inicijalizacije na adresu. 839 00:42:56,120 --> 00:42:57,640 No y proglašen do vrha. 840 00:42:57,640 --> 00:43:00,250 Ali onda zarez, nema vrijednosti je zapravo staviti u njega. 841 00:43:00,250 --> 00:43:02,330 Tako da je pošteno to nazivamo Vrijednost smeća. 842 00:43:02,330 --> 00:43:03,430 Tko zna što je tamo? 843 00:43:03,430 --> 00:43:07,160 To su ostaci bitova koji su korišteni neki prethodni redak koda u 844 00:43:07,160 --> 00:43:08,300 moj program. 845 00:43:08,300 --> 00:43:13,250 >> Dakle, ako ja kažem otići tamo, to je kao, Nemam pojma gdje je strelica 846 00:43:13,250 --> 00:43:14,490 će završiti. 847 00:43:14,490 --> 00:43:17,720 I to je kada obično dobili grešku segmentacije. 848 00:43:17,720 --> 00:43:22,430 Ako ste slučajno dereference, tako da se govore, ili otići na adresu koja nije 849 00:43:22,430 --> 00:43:25,400 zapravo legitimna adresa, loše stvari događaju. 850 00:43:25,400 --> 00:43:27,550 >> A to je upravo ono što se dogodilo razmišljati Binky. 851 00:43:27,550 --> 00:43:31,060 Dakle, da podsjetim da je priča da je Nick bio govorim ovdje je ista ideja, kao što 852 00:43:31,060 --> 00:43:34,050 Ja sam nacrtana s iluzijom kredom na ploči tamo. 853 00:43:34,050 --> 00:43:35,960 X i Y su objavljene. 854 00:43:35,960 --> 00:43:39,690 >> Onda smo dodijeljeno veličinu int i spremio je u x.. 855 00:43:39,690 --> 00:43:42,130 Onda sljedeći redak jesmo * x. 856 00:43:42,130 --> 00:43:46,070 Ovo je Nickova čarobni štapić od dereferencing. 857 00:43:46,070 --> 00:43:49,780 To mu 42 u memoriji istaknuo x. 858 00:43:49,780 --> 00:43:51,600 >> No, to je mjesto gdje stvari otišao užasno krivo. 859 00:43:51,600 --> 00:43:51,820 Točno? 860 00:43:51,820 --> 00:43:53,550 Pokušali smo dereference y. 861 00:43:53,550 --> 00:43:55,620 No y imao neke lažne vrijednosti, zar ne? 862 00:43:55,620 --> 00:43:57,720 >> To strelicu u donjem lijevom kutak, nije 863 00:43:57,720 --> 00:43:58,950 zapravo ukazuje na ništa. 864 00:43:58,950 --> 00:44:01,520 To je vrsta radiš ono što sam A ovdje na brodu. 865 00:44:01,520 --> 00:44:05,900 Tako se loše stvari događaju, segmentacije kvara ili Binky kriv, u ovom slučaju. 866 00:44:05,900 --> 00:44:10,800 >> Ali ako mi onda popraviti da radi x dobiva y Kako se priča promjenu? 867 00:44:10,800 --> 00:44:15,760 Pa, ako mi je činiti X dobiva y, to je učinkovito isto što i reći 868 00:44:15,760 --> 00:44:19,235 bez obzira na to, vol-nešto će biti isto ovdje, 869 00:44:19,235 --> 00:44:20,080 Ox-nešto. 870 00:44:20,080 --> 00:44:22,970 Ili slikovito ćemo izvući strijelu. 871 00:44:22,970 --> 00:44:25,530 >> Dakle, ovdje na brodu s Binky, sa sljedećim liniju 872 00:44:25,530 --> 00:44:28,350 broj, * y znači otići tamo. 873 00:44:28,350 --> 00:44:29,400 Gdje je tu? 874 00:44:29,400 --> 00:44:30,820 To znači da ovamo. 875 00:44:30,820 --> 00:44:36,050 >> A kad smo ažurirali da se 13 to samo ide i uključuje 876 00:44:36,050 --> 00:44:39,470 piše 13 ovdje. 877 00:44:39,470 --> 00:44:44,130 Pa možda i nije posve jednostavno na prvi pogled. 878 00:44:44,130 --> 00:44:47,740 Ali da ponovim i koristiti iste žargon da Binky je korištenjem ovdje, pa 879 00:44:47,740 --> 00:44:50,485 Prva dva izdvojiti naputke, x i y, ali ne i pointees. 880 00:44:50,485 --> 00:44:54,750 I pointees nije uglavnom koriste termin. 881 00:44:54,750 --> 00:44:56,120 No, apsolutno je pointer. 882 00:44:56,120 --> 00:44:59,200 Ali to je ono što se ukazao na Binky je u nomenklaturi. 883 00:44:59,200 --> 00:45:01,660 >> Ova nova linija, naravno, dodjeljuje int pointee. 884 00:45:01,660 --> 00:45:04,840 Dakle komad memorije - kao što sam nacrtao na na desna strana postoji - i skup 885 00:45:04,840 --> 00:45:06,470 x jednak ukazati na njega. 886 00:45:06,470 --> 00:45:11,350 Ovo dereferences x pohraniti 42 osobe memorije da je to pokazivao. 887 00:45:11,350 --> 00:45:13,380 I onda, naravno, bila je loša stvar. 888 00:45:13,380 --> 00:45:15,600 Zbog y nije pokazivao na još ništa. 889 00:45:15,600 --> 00:45:16,530 To ga popravlja. 890 00:45:16,530 --> 00:45:18,240 Dakle, ovo je još uvijek lud programa. 891 00:45:18,240 --> 00:45:21,580 Samo zato što smo puše kroz Kod redak po redak i govore, oh dobro, 892 00:45:21,580 --> 00:45:22,690 neka ga srušiti postoji. 893 00:45:22,690 --> 00:45:23,420 To je loša stvar. 894 00:45:23,420 --> 00:45:26,790 Tečajevi su program samo će pobaciti uopce na toj liniji. 895 00:45:26,790 --> 00:45:30,550 Ali, ako ste bili ukloniti srušio postroje i zamijeniti ga s posljednja dva 896 00:45:30,550 --> 00:45:32,470 redaka nalaze li zauzet - 897 00:45:32,470 --> 00:45:35,310 pomoću pokazivača zadatak - y ukazati na x kao točka t. 898 00:45:35,310 --> 00:45:39,280 I onda dereference y na vrlo siguran način. 899 00:45:39,280 --> 00:45:41,520 >> Dakle, gdje se ovaj nas napuste? 900 00:45:41,520 --> 00:45:45,350 Pa, ispada da se ispod haube u CS50 knjižnici, upućuje se 901 00:45:45,350 --> 00:45:46,320 koristiti tijekom. 902 00:45:46,320 --> 00:45:48,910 I mi zapravo ćete početi guliti natrag sloj koji ne zadugo. 903 00:45:48,910 --> 00:45:51,740 No, ispostavilo previše, izraz koji Neki od vas mogli biti upoznati s, 904 00:45:51,740 --> 00:45:54,580 osobito onih ugodnije, je zapravo onaj vrlo popularan 905 00:45:54,580 --> 00:45:56,390 web stranice, ili stog preljeva, ovih dana. 906 00:45:56,390 --> 00:45:58,720 >> No, to je zapravo vrlo tehničkih značenje. 907 00:45:58,720 --> 00:46:00,160 Mi sada znamo što je stog. 908 00:46:00,160 --> 00:46:02,550 To je kao hrpu ladica unutar jednog blagovaonici. 909 00:46:02,550 --> 00:46:05,140 >> Ili unutar vašeg računala Njegova memorija one okvire 910 00:46:05,140 --> 00:46:06,900 koji se koristi funkcija. 911 00:46:06,900 --> 00:46:10,760 Pa, ispostavilo se da je zbog toga vrlo jednostavna implementacija 912 00:46:10,760 --> 00:46:14,970 memorije i okviri na tzv stog, zapravo možete preuzeti kontrolu 913 00:46:14,970 --> 00:46:17,050 od računalnog sustava prilično jednostavno. 914 00:46:17,050 --> 00:46:22,180 Možete upasti u sustav ako su ljudi kao što nas nisu napisana naš kod 915 00:46:22,180 --> 00:46:23,300 osobito dobro. 916 00:46:23,300 --> 00:46:26,670 >> Ako ljudi poput nas koriste komade memorije ili korištenje polja - 917 00:46:26,670 --> 00:46:27,810 čak i češće - 918 00:46:27,810 --> 00:46:31,800 ali ponekad zaboravite da provjerite Granice naše polje kao možda 919 00:46:31,800 --> 00:46:38,470 moraju se ponekad i ponovljena smjer predaleko prošlosti kraja polja. 920 00:46:38,470 --> 00:46:40,520 U najboljem slučaju, vaš program Možda jednostavno srušiti. 921 00:46:40,520 --> 00:46:42,280 Segmentacija kriv, neka vrsta od neugodno. 922 00:46:42,280 --> 00:46:45,480 Nije lijepo, ali to nije nužno jako loša stvar. 923 00:46:45,480 --> 00:46:49,480 >> No, ako je vaš program je zapravo o stvarnom računalima korisnika, ako je to je trčanje 924 00:46:49,480 --> 00:46:53,070 na web stranici da je stvarni slučajni ljudi Na internetu su udaranje, ostavljajući 925 00:46:53,070 --> 00:46:56,690 ljudi izazivaju loše stvari na vašem koda općenito nije dobra stvar, jer 926 00:46:56,690 --> 00:46:59,930 to znači mogućnost da se kontrolu nad računalom. 927 00:46:59,930 --> 00:47:01,350 A to će izgledati malo zagonetan. 928 00:47:01,350 --> 00:47:04,570 Ali sam mislio da ću vas panika s ovaj posljednji primjer ovdje. 929 00:47:04,570 --> 00:47:05,650 >> Evo primjer koda. 930 00:47:05,650 --> 00:47:07,370 I tu je dobar Wikipedia članak koji šetnje kroz 931 00:47:07,370 --> 00:47:08,530 ovo podrobnije. 932 00:47:08,530 --> 00:47:13,890 Imam glavna na donjem raspisivanju Foo, prolazeći u argv od 1. 933 00:47:13,890 --> 00:47:15,750 A to je samo tako da možete pokrenuti program i proći 934 00:47:15,750 --> 00:47:17,080 proizvoljna ulaz. 935 00:47:17,080 --> 00:47:20,180 >> A onda Foo je proglašen do vrha kao prihvaćanje string, ili više 936 00:47:20,180 --> 00:47:21,700 Naime, char *. 937 00:47:21,700 --> 00:47:23,860 To onda izjavljuje niz znakova. 938 00:47:23,860 --> 00:47:27,130 Nazovite to tampon, općenitije, veličine 12. 939 00:47:27,130 --> 00:47:30,900 Dakle, 12 znakova može stati unutar te niz zove c. 940 00:47:30,900 --> 00:47:33,510 >> I onda koristi ovu novu funkciju, što je novo, ali nije teško 941 00:47:33,510 --> 00:47:34,930 razumijem, memorije primjerak. 942 00:47:34,930 --> 00:47:39,290 Ona kopira memoriju iz bara, koji je bio varijabla n prošlosti, bez obzira na 943 00:47:39,290 --> 00:47:42,080 korisnik upisao u argv 1 u c. 944 00:47:42,080 --> 00:47:43,090 Koliko bajta? 945 00:47:43,090 --> 00:47:44,260 String duljina traci. 946 00:47:44,260 --> 00:47:48,380 >> Dakle, drugim riječima, ako korisnik upiše u h-e-l-l-o enter, dužina niza 947 00:47:48,380 --> 00:47:49,260 Hello je pet. 948 00:47:49,260 --> 00:47:52,790 Dakle, pet od tih bajtova će dobiti kopirati u nizu pod nazivom c, koji 949 00:47:52,790 --> 00:47:54,110 je veličine 12. 950 00:47:54,110 --> 00:47:58,710 No, ono što korisnik upiše u mnogo dulje Riječ koja je 13 znakova ili 14 951 00:47:58,710 --> 00:48:01,250 znakova ili 100 znakova ili više? 952 00:48:01,250 --> 00:48:02,660 >> Gdje će oni ići? 953 00:48:02,660 --> 00:48:06,090 Pa, da okvir, da je ladica u dining-dvorana stog, 954 00:48:06,090 --> 00:48:06,930 oni će ići tamo. 955 00:48:06,930 --> 00:48:10,080 I to samo ide za početak prepisati druge stvari koje je već 956 00:48:10,080 --> 00:48:12,880 Na taj dimnjak, prelijeva stog, da se tako izrazim. 957 00:48:12,880 --> 00:48:14,780 >> Dakle slikovito, mislim da je to na ovaj način. 958 00:48:14,780 --> 00:48:17,970 Ovo je samo šareni verzija Slika smo crtanja. 959 00:48:17,970 --> 00:48:20,060 Na dnu, recimo, je glavna. 960 00:48:20,060 --> 00:48:24,690 I na vrhu, što ste vidjeli danas je okvir, boji se sada, za 961 00:48:24,690 --> 00:48:26,090 Funkcija se zove foo. 962 00:48:26,090 --> 00:48:30,170 No, ono što je zanimljivo ovdje o Foo je da ovdje je okvir. 963 00:48:30,170 --> 00:48:32,860 Dakle, to je nacrtana kao meni učinio, ali u svijetlo plavoj boji. 964 00:48:32,860 --> 00:48:35,220 A sada ovo je mjesto gdje c nosač 0 prolazi. 965 00:48:35,220 --> 00:48:37,410 I ovo je mjesto gdje c nosač 11 će završiti. 966 00:48:37,410 --> 00:48:39,670 >> Drugim riječima, to se događa biti predstavljeni kao trga. 967 00:48:39,670 --> 00:48:42,320 No, ako samo držati plopping bajtova dolje - ili znakovi - oni će završiti 968 00:48:42,320 --> 00:48:46,070 se na mjestu 0 skroz gore do 11. jer je 0 indeksirane. 969 00:48:46,070 --> 00:48:49,170 >> No, gdje je 13. znakova će završiti? 970 00:48:49,170 --> 00:48:50,310 Gdje je 14.? 971 00:48:50,310 --> 00:48:52,430 Gdje je lik 50. će završiti? 972 00:48:52,430 --> 00:48:54,070 >> To će zadržati ide prema dolje. 973 00:48:54,070 --> 00:48:57,350 Jer iako smo izvučeni Slika s hrpom odrastanja, 974 00:48:57,350 --> 00:48:59,920 adrese, ispostavilo se, idite na mala adrese, male 975 00:48:59,920 --> 00:49:01,830 pokazivače, do velikih adrese. 976 00:49:01,830 --> 00:49:03,540 Pa to samo čuva ide gore i gore. 977 00:49:03,540 --> 00:49:05,660 >> Dakle, ako korisnik upiše u Pozdrav, to je super. 978 00:49:05,660 --> 00:49:08,650 Ne bug, nema problema, svatko je siguran. 979 00:49:08,650 --> 00:49:11,940 Ali, ako korisnik upiše u ono što ćemo nazovite optužni kôd, predstavljeni 980 00:49:11,940 --> 00:49:16,040 generički su, napad, napad, napad, napad, što se može dogoditi? 981 00:49:16,040 --> 00:49:19,760 >> I, ako se sve ulaz da je korisnički upisali u nije samo neka prijateljska 982 00:49:19,760 --> 00:49:21,540 ili uvredljivog niz znakova. 983 00:49:21,540 --> 00:49:24,050 To je zapravo niz znakova da ako ga sastaviti, 984 00:49:24,050 --> 00:49:26,050 to je zapravo broj. 985 00:49:26,050 --> 00:49:29,570 Možda je kod koji briše sve datoteka na tvrdom disku ili za slanje spama 986 00:49:29,570 --> 00:49:30,810 ili nešto slično. 987 00:49:30,810 --> 00:49:35,110 Obavijest da je ono što je ključno je da ako je loš momak dobio dovoljno sretan da 988 00:49:35,110 --> 00:49:37,830 prepisati crveni komad memorije - 989 00:49:37,830 --> 00:49:41,080 što nisam izvući na moju sliku, ali Wikipedia ovu sliku ovdje ima - 990 00:49:41,080 --> 00:49:42,890 njegova tzv povratna adresa. 991 00:49:42,890 --> 00:49:47,470 >> Kada se hrana vraća, kada se vraća, swapom kako se računalo zna ići na 992 00:49:47,470 --> 00:49:49,790 do ovdje dolje? 993 00:49:49,790 --> 00:49:52,920 Ili u tech segmentu gore navedenog, kako to znam da ide iz swapa 994 00:49:52,920 --> 00:49:54,870 code - 0-ih i jedan je da sastavite zamjenu - 995 00:49:54,870 --> 00:49:56,020 Povratak na početak? 996 00:49:56,020 --> 00:50:00,450 Postoji takozvani povratak adresa pohranjen u toj istoj stog okvira, na 997 00:50:00,450 --> 00:50:02,140 Isto kafanske ladicu. 998 00:50:02,140 --> 00:50:06,080 >> Dakle, ako negativac je dovoljno pametan da stavi napad kod, napad kod, napad 999 00:50:06,080 --> 00:50:07,960 broj, i dobiti dovoljno sretan - 1000 00:50:07,960 --> 00:50:11,630 Često putem pokušaja i pogrešaka - na prepisati taj crveni povratnu adresu, 1001 00:50:11,630 --> 00:50:14,360 s adresom i obavijest samom vrhu. 1002 00:50:14,360 --> 00:50:16,830 Obavijest 0835C080. 1003 00:50:16,830 --> 00:50:20,650 To je napisan prema natrag do vrha za Razlozi bismo možda ćete ponovo. 1004 00:50:20,650 --> 00:50:22,050 To je taj broj. 1005 00:50:22,050 --> 00:50:25,790 >> Dakle, ako negativac dobiva dovoljno sretan ili je dovoljno pametan da prepisati red 1006 00:50:25,790 --> 00:50:29,480 strip memorije s adresom kod koji on ili ona ima neki način 1007 00:50:29,480 --> 00:50:34,980 ubrizgava u vašem računalu, pogodi čiji broj će se vratiti 1008 00:50:34,980 --> 00:50:38,260 čim Foo je učinio izvršavanju? 1009 00:50:38,260 --> 00:50:39,440 >> Negativac je broj. 1010 00:50:39,440 --> 00:50:43,610 Dakle, ovaj napad kod, AAA, opet, možda slanje spama, možda izbrisati sve datoteke 1011 00:50:43,610 --> 00:50:44,500 na tvrdom disku. 1012 00:50:44,500 --> 00:50:48,740 Ali to je ono što doista stack overflow je ili prelijevanja spremnika ili 1013 00:50:48,740 --> 00:50:51,060 Buffer overflow napad. 1014 00:50:51,060 --> 00:50:54,400 >> I to je nevjerojatno, nevjerojatno česta do danas s programa napisanih u 1015 00:50:54,400 --> 00:50:58,220 C, C + +, pa čak i nekim drugim jezicima. 1016 00:50:58,220 --> 00:51:02,275 Na toj strašnoj bilješku, mi ćemo završiti sa šalom. 1017 00:51:02,275 --> 00:51:03,230 >> [Smijeh] 1018 00:51:03,230 --> 00:51:04,550 >> Vidimo se u srijedu. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Na sljedećem CS50 - 1021 00:51:10,310 --> 00:51:15,920 Dakle, ja sam sve od danas, ali disk svjetiljke čekaj, nemasnog mlijeka, pola telefona 1022 00:51:15,920 --> 00:51:17,850 Knjiga, sok od naranče da sam popio danas. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB kabel, ključ. 1025 00:51:22,780 --> 00:51:24,800 >> [Glazba svira]