1 00:00:00,000 --> 00:00:11,242 >> [MUSIC PLAYING] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN Rendben ez CS50 és ez a kezdete a hét öt. 3 00:00:16,630 --> 00:00:21,480 Így ma, alatta a ülőpárnák, nem talál semmit. 4 00:00:21,480 --> 00:00:24,790 De a fenti, meg kell találni ezek a kis jeléül elismerését 5 00:00:24,790 --> 00:00:26,970 az összes munka, amit tesz a Game of tizenöt. 6 00:00:26,970 --> 00:00:30,290 Egyszerűen távolítsa el a kis kör a alsó kezdeni játszik a 7 00:00:30,290 --> 00:00:31,680 többi osztály. 8 00:00:31,680 --> 00:00:38,930 >> Tehát emlékeztetnek arra, hogy, vagy tudja, hogy a probléma meg négy, amely kiment a hétvégén, 9 00:00:38,930 --> 00:00:40,340 magában írásban egy másik játék. 10 00:00:40,340 --> 00:00:43,740 De ezúttal az eljárás során egy tényleges grafikus felhasználói felület, nem 11 00:00:43,740 --> 00:00:46,310 szöveges felület, mint a Game of tizenöt volt. 12 00:00:46,310 --> 00:00:50,210 És a játék vár rád, ha már nem láttam ezt a következő, 13 00:00:50,210 --> 00:00:52,310 úgy néz ki, egy kis valamit, mint ez. 14 00:00:52,310 --> 00:00:55,170 Én megyek be a terminál ablak itt GDB. 15 00:00:55,170 --> 00:00:58,600 És én megyek előre, és futtassa a személyzet megoldás, amely elérheti 16 00:00:58,600 --> 00:01:01,010 futtatása után frissítést 50., mint rendesen. 17 00:01:01,010 --> 00:01:04,090 >> De én, hogy azt egy kis titkos mód, egy kis húsvéti tojás, 18 00:01:04,090 --> 00:01:08,480 úgynevezett Isten mód, a amivel Isten argv1. 19 00:01:08,480 --> 00:01:12,920 És azt kell, hogy kövesse a saját irányban fut a saját 20 00:01:12,920 --> 00:01:14,220 probléma meg könyvtárban. 21 00:01:14,220 --> 00:01:19,190 Tehát most látod, a teljes verzió a játék a kitörés. 22 00:01:19,190 --> 00:01:21,090 Valójában ez nem-hands üzemmódban. 23 00:01:21,090 --> 00:01:24,850 Tehát ez valójában - 24 00:01:24,850 --> 00:01:26,470 wowed bár lehet, hogy - 25 00:01:26,470 --> 00:01:30,850 elég triviális végrehajtani Isten mód Breakout ellentétben Game tizenötök 26 00:01:30,850 --> 00:01:33,590 amelyek közül néhány az lehet, hogy kezelni A hacker kiadás. 27 00:01:33,590 --> 00:01:37,890 >> A Breakout elegendő Istenben mód, hogy egyszerűen csinálni, amit, 28 00:01:37,890 --> 00:01:41,220 ösztönösen a lapát? 29 00:01:41,220 --> 00:01:45,630 Csak arra, hogy egyenlő a bármilyen vízszintes pozíció a labdát. 30 00:01:45,630 --> 00:01:49,220 És mindaddig, amíg ezt a lockstep a labda mozog ez a játék 31 00:01:49,220 --> 00:01:53,100 soha, soha, soha hagyja ki a labdát és akkor nyerni minden alkalommal. 32 00:01:53,100 --> 00:01:55,430 >> De ezen a héten a hacker kiadás van több, mint Isten mód. 33 00:01:55,430 --> 00:01:56,720 Van egy sor más lehetőséggel. 34 00:01:56,720 --> 00:01:58,140 Közülük lézerek. 35 00:01:58,140 --> 00:02:01,070 Tehát, hogy ha igazán türelmetlen lehet kezdeni lelövésével a tégla 36 00:02:01,070 --> 00:02:02,120 és még néhány más. 37 00:02:02,120 --> 00:02:04,560 És azoknak, akik szeretnék kalibrálását normál versus hacker 38 00:02:04,560 --> 00:02:08,750 kiadás, azt látom, hogy ezen a héten hacker kiadás szándékosan egy 39 00:02:08,750 --> 00:02:12,830 kicsit megvalósítható, mondjuk, mint Isten mód volt Game of Tizenöt. 40 00:02:12,830 --> 00:02:15,300 >> Tehát, ha keres egy szakaszon, és keres további móka 41 00:02:15,300 --> 00:02:18,400 funkciók még merülés, ha az érdeklődés. 42 00:02:18,400 --> 00:02:21,280 Most még gyakorlatilag, hadd rámutatni ki az egyik dolog is. 43 00:02:21,280 --> 00:02:24,780 GDB, amit néhányan nem lehet még megérintette személyesen, ami finom. 44 00:02:24,780 --> 00:02:28,530 De most tényleg az idő, hogy megszokja erre, és kényelmes az eszközzel 45 00:02:28,530 --> 00:02:31,510 mert ez teszi az életeteket sokkal könnyebb, igazán. 46 00:02:31,510 --> 00:02:34,900 >> Per Rob előadása GDB pár héttel ezelőtt, emlékszem 47 00:02:34,900 --> 00:02:36,810 hogy a GDB debugger. 48 00:02:36,810 --> 00:02:41,230 Ez egy eszköz, amely lehetővé teszi, hogy futtatni a programot, de futni, lépésről lépésre, a vonal 49 00:02:41,230 --> 00:02:45,680 sorra, így körülnézni, így látja a dolgokat történik, így 50 00:02:45,680 --> 00:02:47,310 hogy lehet kinyomtatni változók értékeit. 51 00:02:47,310 --> 00:02:50,580 Röviden, ez ad sokkal több teljesítménye, mint printDef nem. 52 00:02:50,580 --> 00:02:52,900 >> Most igaz, a felület elég misztikus. 53 00:02:52,900 --> 00:02:55,180 Fekete-fehér szöveges felület a legtöbb esetben. 54 00:02:55,180 --> 00:02:57,400 A parancsok kissé kemény emlékezni először. 55 00:02:57,400 --> 00:03:01,230 De annak ellenére, hogy lehet, hogy elviszi fele egy óra, egy óra, hogy tegye, hogy előre 56 00:03:01,230 --> 00:03:02,940 beruházás időt bele, hidd el. 57 00:03:02,940 --> 00:03:06,440 Természetesen a félév végén meg fog menteni Ön egy nagyságrenddel nagyobb 58 00:03:06,440 --> 00:03:07,600 idő, mint ezt. 59 00:03:07,600 --> 00:03:09,200 >> Így a hét elején merülés be 60 00:03:09,200 --> 00:03:13,200 , Mind a Breakout, tudja, hogy Megteheti ezt, amíg van 61 00:03:13,200 --> 00:03:18,230 a forgalmazási kódot, vagy a saját kódját folyamatban a Pst4 könyvtárban. 62 00:03:18,230 --> 00:03:21,680 Tudd, hogy futtatható gdb. / Kitörés. 63 00:03:21,680 --> 00:03:23,490 >> Ez fog nyitni egy ablak, mint ez. 64 00:03:23,490 --> 00:03:25,530 Hadd hozzak fel magamat Egy terminál ablak. 65 00:03:25,530 --> 00:03:27,770 És akkor mit fogok menni előre és nem, ez nem csak futtatni. 66 00:03:27,770 --> 00:03:30,690 Fogok először létre egy töréspontot emlékszem, amely lehetővé teszi, hogy szünet 67 00:03:30,690 --> 00:03:32,500 végrehajtás egy adott helyen. 68 00:03:32,500 --> 00:03:35,750 >> Csak, hogy a dolgok egyszerűen fogom megtörni a vonalon csak a gépelés 69 00:03:35,750 --> 00:03:37,000 az első számú. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Hadd valóban újra ablak megnyitásához mert egyre 72 00:03:43,250 --> 00:03:45,700 kicsit kicsi ott. 73 00:03:45,700 --> 00:03:53,270 Szóval, amit én most megyek, hogy nem itt van ha nyit a terminál ablakban. 74 00:03:53,270 --> 00:03:53,910 Gyere, itt is vagyunk. 75 00:03:53,910 --> 00:03:59,850 >> Tehát most, ha visszamegyek a Dropbox, Pst4 és fuss gdb. / breakout be, észre 76 00:03:59,850 --> 00:04:02,600 Fogok törni egy beállítása a töréspontot az egyesen. 77 00:04:02,600 --> 00:04:04,840 És most megyek előre, és írja futni. 78 00:04:04,840 --> 00:04:07,370 És ha mégis, észre sem sem történik. 79 00:04:07,370 --> 00:04:08,120 >> Nincs pop up. 80 00:04:08,120 --> 00:04:09,790 Nincs grafikus felhasználói felület még. 81 00:04:09,790 --> 00:04:13,340 De ez érthető, mert én vagyok szó szerint sorban egy a programban. 82 00:04:13,340 --> 00:04:17,110 És észre, hogy én már előre-, különösen most, hogy 62, mert minden 83 00:04:17,110 --> 00:04:20,600 a cucc a tetején ez a fájl dolgok, mint a megjegyzések és állandók és 84 00:04:20,600 --> 00:04:22,460 érdektelen dolog most. 85 00:04:22,460 --> 00:04:25,840 >> Szóval most én vagyok benne a legfontosabb, úgy tűnik, sorban 62. 86 00:04:25,840 --> 00:04:27,960 És ez még csak a forgalmazási kódot, visszahívás. 87 00:04:27,960 --> 00:04:33,810 Ha kinyitom ezt fel megy, hasonlóan, az én dobozba könyvtárat Pst4, 88 00:04:33,810 --> 00:04:35,450 a breakout.c. 89 00:04:35,450 --> 00:04:40,670 És ha majd lapozzunk lefelé, és lefelé, és lefelé, és hadd menjen előre, és kapcsolja be 90 00:04:40,670 --> 00:04:44,990 a sorszámok. 91 00:04:44,990 --> 00:04:50,300 >> Mit fogok látni, ha görgessen vonal 62, pontosan a vonal 92 00:04:50,300 --> 00:04:50,910 már megállt. 93 00:04:50,910 --> 00:04:53,720 Tehát ez a sor itt, 62, a ahol mindjárt lesz. 94 00:04:53,720 --> 00:04:57,470 Tehát most a GDB, ha megy előre, és írja be Most a következő, írja be fog 95 00:04:57,470 --> 00:04:58,450 végre, hogy a vonal. 96 00:04:58,450 --> 00:05:00,610 És íme, mi van a úgynevezett g ablak. 97 00:05:00,610 --> 00:05:02,800 Ha ismeri, amit egy GWindow az, hogy nem kell aggódni. 98 00:05:02,800 --> 00:05:05,740 A spec bemutatja, hogy azt, mint valamint számos walkthrough videók 99 00:05:05,740 --> 00:05:06,830 ágyazott spec. 100 00:05:06,830 --> 00:05:08,610 >> De most nézzük, hogy ez a kicsit érdekes. 101 00:05:08,610 --> 00:05:10,960 Hadd mozog ez az ablak fölé az oldalán egy kicsit. 102 00:05:10,960 --> 00:05:13,480 Engedjék meg, hogy az ablak egy kicsit nagyobb, így többet láthatunk. 103 00:05:13,480 --> 00:05:16,140 >> És most hadd menjek előre és csinálni újra. 104 00:05:16,140 --> 00:05:17,550 És vannak a téglák. 105 00:05:17,550 --> 00:05:20,490 Ha azt írja a következő újra most már látom a labdát. 106 00:05:20,490 --> 00:05:23,520 És ha azt írja a következő újra most már látom a lapát. 107 00:05:23,520 --> 00:05:26,690 >> És szerencsére ez gedit nem igazán együttműködő by megmutatta 108 00:05:26,690 --> 00:05:27,660 mindent, amit akarok. 109 00:05:27,660 --> 00:05:30,820 De most ha én csinálni újra, következő megint, én csak 110 00:05:30,820 --> 00:05:32,260 kijelentette néhány változó. 111 00:05:32,260 --> 00:05:34,750 És tud nyomtatni bármely ezek a srácok ki. 112 00:05:34,750 --> 00:05:37,170 Print tégla, nyomatok életét. 113 00:05:37,170 --> 00:05:39,910 >> És most, ha én is ezt Ezután észre, hogy én leszek 114 00:05:39,910 --> 00:05:40,870 belül, hogy a hurok. 115 00:05:40,870 --> 00:05:43,380 De a kód fog végrehajtani pontosan azt, amit elvárnak. 116 00:05:43,380 --> 00:05:45,810 Tehát amikor elütöttem ezt a funkciót, várjon A Click, meg fog tenni 117 00:05:45,810 --> 00:05:46,830 szó szerint ezt. 118 00:05:46,830 --> 00:05:48,870 Szóval úgy látszik, elvesztette az irányítást át a program. 119 00:05:48,870 --> 00:05:50,480 >> GDB nem ad nekem egy parancsot. 120 00:05:50,480 --> 00:05:51,500 De nem kell aggódni. 121 00:05:51,500 --> 00:05:53,720 Menj a játék, kattintson valahol. 122 00:05:53,720 --> 00:05:56,270 >> És íme, most folytatódik vonal 86. 123 00:05:56,270 --> 00:05:59,460 Tehát még egyszer, ez felbecsülhetetlen értékű, végső soron, A hibakeresés problémákat. 124 00:05:59,460 --> 00:06:03,050 Mert a szó szoros értelmében végig A kód, nyomtatott dolgokat, és sok, 125 00:06:03,050 --> 00:06:03,640 sokkal több. 126 00:06:03,640 --> 00:06:07,210 De most, az eszközök önmagukban kell neked elég messze. 127 00:06:07,210 --> 00:06:10,050 >> Tehát mi, persze, hogy egy pillantást A grafika most hirtelen. 128 00:06:10,050 --> 00:06:12,350 És most a világ lesz egy kis sokkal érdekesebb. 129 00:06:12,350 --> 00:06:15,680 És tudod, talán néhány a videók online, hogy ezeket 130 00:06:15,680 --> 00:06:18,280 rövidnadrág, hogy már nézni részeként a probléma készletek. 131 00:06:18,280 --> 00:06:20,460 >> És már lelőtték, szándékosan, fehér hátteret. 132 00:06:20,460 --> 00:06:23,380 És néhány közülük a tanítás Fellows rajz szöveget a 133 00:06:23,380 --> 00:06:25,490 képernyő, ami eltakarja oldalán őket. 134 00:06:25,490 --> 00:06:27,760 De persze, ez még nem minden, hogy az érdekes a valós világban. 135 00:06:27,760 --> 00:06:30,520 Ez csak egy előadóterem és egy nagy fehér képernyő és a hátteret. 136 00:06:30,520 --> 00:06:33,330 És a csodálatos produkciós csapat sort A tesz mindent meg szép 137 00:06:33,330 --> 00:06:36,620 után az a tény a vágás ki vagy egymásra bármi 138 00:06:36,620 --> 00:06:37,840 mi, vagy nem akar. 139 00:06:37,840 --> 00:06:41,560 >> Most csak azért, hogy ösztönözze ezen a héten, és tényleg, ahol lehet menni, végül, 140 00:06:41,560 --> 00:06:42,560 a számítástechnika. 141 00:06:42,560 --> 00:06:44,260 Nem csak azután probléma meg négy. 142 00:06:44,260 --> 00:06:48,240 De miután egy tanfolyam, vagy a teljes tananyag ez csodálatos, amit lehet 143 00:06:48,240 --> 00:06:51,090 nem ezekben a napokban tekintetében grafikus, különösen. 144 00:06:51,090 --> 00:06:53,440 >> Néhányan lehet, hogy látta ezt a folyik körül az interneten. 145 00:06:53,440 --> 00:06:56,240 De azt gondoltam, megmutatom, csak egy pár percet, egy pillantást, amit 146 00:06:56,240 --> 00:07:01,890 számítástechnika és milyen CGI, számítógépes grafika képes ezekben a napokban 147 00:07:01,890 --> 00:07:04,510 egy ismerős dalt és talán filmet. 148 00:07:04,510 --> 00:07:05,760 >> [ZENE - LANA DEL RAY, "Fiatal és szép] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Csak egy kicsit elképesztő, talán, hogy milyen 151 00:10:52,470 --> 00:10:52,857 mindenütt - 152 00:10:52,857 --> 00:10:57,040 >> [Taps] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Én csak le azt. 154 00:10:59,230 --> 00:11:02,920 De ez tényleg elképesztő, azt hiszem, csak hogy mindenütt szoftver és a kód, és 155 00:11:02,920 --> 00:11:04,230 eszközök, mint az valójában. 156 00:11:04,230 --> 00:11:07,685 Szóval ez egy kis ízelítőt az irányt ahol lehet menni. 157 00:11:07,685 --> 00:11:10,620 Ó, nincs több Appliance ma. 158 00:11:10,620 --> 00:11:14,640 Nos, ez valóban tragikus időzítés mivel a lényeg én csak megpróbáltam. 159 00:11:14,640 --> 00:11:18,670 >> Rendben, úgyhogy indítani Fusion újra. 160 00:11:18,670 --> 00:11:20,800 Emlékeztessen később. 161 00:11:20,800 --> 00:11:24,190 Rendben, és akkor már van egy e-mail, mint egy félre, ha nem kap a 162 00:11:24,190 --> 00:11:25,460 észre, mint ezt. 163 00:11:25,460 --> 00:11:29,940 Rendben, akkor emlékeztetni arra, hogy a múlt héten kezdtünk húzza vissza a 164 00:11:29,940 --> 00:11:31,380 későbbi nevén string. 165 00:11:31,380 --> 00:11:34,700 >> szöveg emlékeztet arra, adattípus, ami kijelentette, a CS50 könyvtárban. 166 00:11:34,700 --> 00:11:37,740 És ez része a képzési kerekek hogy most kezd felszállni. 167 00:11:37,740 --> 00:11:41,280 Ez egy hasznos fogalom korán. 168 00:11:41,280 --> 00:11:43,750 De most ez lesz, hogy minél több érdekes és erősebb a 169 00:11:43,750 --> 00:11:48,330 valóban látni, hogy a motorháztető alatt, egy string, amire, nem mondtunk? 170 00:11:48,330 --> 00:11:50,500 >> Igen, ez egy úgynevezett char *. 171 00:11:50,500 --> 00:11:53,860 És a * azt jelzi, hogy ott van valamilyen cím szó. 172 00:11:53,860 --> 00:11:58,690 És amikor azt mondod char * csak azt jelenti, a változó, amelynek adattípusa a 173 00:11:58,690 --> 00:11:59,290 mutató most. 174 00:11:59,290 --> 00:12:01,770 Az a tény, hogy ott van a csillag ott csak azt jelenti, hogy nyilvánító 175 00:12:01,770 --> 00:12:03,020 úgynevezett mutató. 176 00:12:03,020 --> 00:12:06,220 És mutató fog látszólag tárolja a címét, a 177 00:12:06,220 --> 00:12:07,810 Persze, a kar. 178 00:12:07,810 --> 00:12:08,960 >> Most miért ennek értelme? 179 00:12:08,960 --> 00:12:11,200 Nos, mi az a szöveg a motorháztető alatt? 180 00:12:11,200 --> 00:12:15,130 Nos, egy ideje már mondott hogy a húr a motorháztető alatt van 181 00:12:15,130 --> 00:12:18,460 csak h-e-l-l-o, például. 182 00:12:18,460 --> 00:12:21,585 >> De már beszéltünk erről, mint hogy lényegében egy tömb. 183 00:12:21,585 --> 00:12:25,410 És egy sor aztán meg egy kicsit több, mint ez, minden egyes ilyen 184 00:12:25,410 --> 00:12:26,460 vesz fel egy falatot. 185 00:12:26,460 --> 00:12:28,710 És akkor már azt mondta, hogy van valami különlegeset vissza, a 186 00:12:28,710 --> 00:12:31,270 backslash 0, vagy null terminátor. 187 00:12:31,270 --> 00:12:35,230 >> Tehát egész idő alatt, ez itt volt egy string. 188 00:12:35,230 --> 00:12:38,320 De tényleg, a húr valójában egy címet. 189 00:12:38,320 --> 00:12:43,210 És címét, mint látni fogjuk, gyakran előtaggal 0x megállapodás szerint. 190 00:12:43,210 --> 00:12:44,540 Mit 0x jelöli? 191 00:12:44,540 --> 00:12:45,970 Tudja valaki? 192 00:12:45,970 --> 00:12:47,320 >> Tehát ez csak azt jelenti, hexadecimális. 193 00:12:47,320 --> 00:12:52,360 Szóval lehet, hogy emlékszem, valóban, PST 1, azt hiszem, az egyik a warm-up 194 00:12:52,360 --> 00:12:55,740 kérdés valóban kérdezték hexadecimális mellett 195 00:12:55,740 --> 00:12:57,100 bináris és decimális. 196 00:12:57,100 --> 00:13:00,460 És a motiváció az, hogy hexadecimális van 16 197 00:13:00,460 --> 00:13:01,770 számjegy az Ön rendelkezésére. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ezt követi által a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> És ha számít minden fel, kapsz egy összesen 16. 200 00:13:10,430 --> 00:13:13,200 Tehát ez ellentétben áll decimális, ahol már 10 201 00:13:13,200 --> 00:13:14,690 számjegy, 0-kilenc. 202 00:13:14,690 --> 00:13:17,750 Ez ellentétben bináris ahol csak 0 és 1. 203 00:13:17,750 --> 00:13:21,450 >> De a végén a nap ha csak képviseli ugyanazt a számot, de a 204 00:13:21,450 --> 00:13:22,500 némileg másképp. 205 00:13:22,500 --> 00:13:25,840 És hexadecimális gyakori, mert, mint kiderül -, és majd meglátjuk a 206 00:13:25,840 --> 00:13:28,790 később a kurzus - akkor is, ha kap a webes programozás keretében 207 00:13:28,790 --> 00:13:32,100 HTML és színkódok, hexadecimális szép. 208 00:13:32,100 --> 00:13:36,390 Mivel minden szám, kiderül, képviseli négy bit tökéletesen. 209 00:13:36,390 --> 00:13:39,280 Tehát ez csak egyfajta vonalak szépen ahogy akkor végül látni. 210 00:13:39,280 --> 00:13:44,720 Tehát ez lehet Ox123 vagy valami ilyen volt, amely 123 cím 211 00:13:44,720 --> 00:13:47,050 valahol az én számítógép memóriájában. 212 00:13:47,050 --> 00:13:50,600 >> Persze, bizonyos problémák merülnek fel mert ez a mögöttes 213 00:13:50,600 --> 00:13:51,520 végrehajtását. 214 00:13:51,520 --> 00:13:55,930 És emlékszem, hogy vettem egy stab végrehajtó funkció, mint ez - 215 00:13:55,930 --> 00:14:00,260 összehasonlítani kötőjelet 0 pont c a múlt héten, hogy a még akkor is úgy nézett ki, mintha 216 00:14:00,260 --> 00:14:04,270 van, akkor egyszerűen nem összehasonlítani Két sztring helyesen. 217 00:14:04,270 --> 00:14:07,470 >> Már eldobott fő, és már dobott el a megjegyzéseket, csak koncentrálni, hogy 218 00:14:07,470 --> 00:14:08,970 a kódot, ami érdekes itt. 219 00:14:08,970 --> 00:14:10,660 És ez a piros, mert hibás. 220 00:14:10,660 --> 00:14:11,670 Milyen okból? 221 00:14:11,670 --> 00:14:15,890 >> Nos, a csúcson van, amikor kijelentette, egy string, mi folyik valójában 222 00:14:15,890 --> 00:14:17,260 a motorháztető alatt? 223 00:14:17,260 --> 00:14:19,530 Nos, hadd menjen át a képernyőn itt és rajzolni. 224 00:14:19,530 --> 00:14:23,230 Szóval kijelentette, ismét karakterlánc s getString. 225 00:14:23,230 --> 00:14:26,640 >> Szóval megyek előre, és most felhívni s, amit valójában. 226 00:14:26,640 --> 00:14:28,590 Ez lesz a tér itt. 227 00:14:28,590 --> 00:14:30,490 És fogok igényt , hogy 32 bites. 228 00:14:30,490 --> 00:14:32,890 Legalábbis általában, legalábbis a CS50 229 00:14:32,890 --> 00:14:34,520 készüléket sok számítógép. 230 00:14:34,520 --> 00:14:35,980 Fogom nevezni s. 231 00:14:35,980 --> 00:14:39,070 >> De most emlékeztetni arra, hogy nevű getString. 232 00:14:39,070 --> 00:14:41,430 Tehát getString visszatér, persze, egy string. 233 00:14:41,430 --> 00:14:45,790 Ha a felhasználó a h-e-l-l-o be a szöveg helló kap vissza. 234 00:14:45,790 --> 00:14:51,010 És string, ahogy csak azt mondta, véget ér valahol a számítógép memóriájában 235 00:14:51,010 --> 00:14:53,240 egy backslash 0 a végén. 236 00:14:53,240 --> 00:14:56,650 Én felhívni a mint a tömb - vagy összefüggő blokk karakterek - 237 00:14:56,650 --> 00:14:58,330 hogy valójában. 238 00:14:58,330 --> 00:15:01,790 >> És most, mit getString valóban visszatér? 239 00:15:01,790 --> 00:15:04,340 Mi getString már visszatér egész idő alatt? 240 00:15:04,340 --> 00:15:07,520 Nos, mondjuk, a hét korábbi, tér vissza a string. 241 00:15:07,520 --> 00:15:10,250 De technikailag, mit GetString vissza látszólag? 242 00:15:10,250 --> 00:15:11,610 >> Közönség: Egy cím. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: Egy cím. 244 00:15:12,600 --> 00:15:16,630 Konkrétan visszatér a címét az első falatot, bármi is legyen az. 245 00:15:16,630 --> 00:15:18,830 Én csak tartsa a egy, kettő, három mert kényelmes. 246 00:15:18,830 --> 00:15:21,380 >> Visszatér a címe az első karaktere. 247 00:15:21,380 --> 00:15:23,510 És mi azt mondtuk, hogy a múlt héten ez elegendő. 248 00:15:23,510 --> 00:15:26,710 Mert mindig kitalálni, hogy hol a végén a húr csak a 249 00:15:26,710 --> 00:15:30,150 iterációt, talán, egy a hurok vagy a while ciklus, vagy valami hasonló 250 00:15:30,150 --> 00:15:34,990 , hogy csak keres "backslash 0", speciális sentinel karaktert. 251 00:15:34,990 --> 00:15:37,220 >> És akkor tudjuk, hogy a húr történetesen hosszúságú - 252 00:15:37,220 --> 00:15:37,980 ebben az esetben - 253 00:15:37,980 --> 00:15:38,670 öt. 254 00:15:38,670 --> 00:15:43,800 Szóval technikailag mit csinál getString az visszatér Ox123 ebben az esetben. 255 00:15:43,800 --> 00:15:53,670 És technikailag akkor mi történik, hogy tárolunk, belül s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Végén a nap, bár ez a az új koncepció, mutatók, ők 257 00:15:56,460 --> 00:15:57,350 csak változókat. 258 00:15:57,350 --> 00:16:00,440 De megtörténhet, hogy tárolják bitek együttesen képviselnek egy címet. 259 00:16:00,440 --> 00:16:03,700 Szóval technikailag minden, amit kap tárolt s Ox123. 260 00:16:03,700 --> 00:16:04,680 >> De mi, emberek - 261 00:16:04,680 --> 00:16:06,020 beleértve a ma előre - 262 00:16:06,020 --> 00:16:09,290 tényleg nem fog érdekelni, jellemzően, mi a tényleges cím 263 00:16:09,290 --> 00:16:10,520 Néhány darab memória. 264 00:16:10,520 --> 00:16:14,040 Ez csak az alacsony szinten részletezett lehet intellektuálisan érdekes. 265 00:16:14,040 --> 00:16:15,440 Így fogom visszavonni ezt. 266 00:16:15,440 --> 00:16:19,810 És ahelyett, hogy több magas szintű, csak azt mondom hogy amikor beszélünk mutatók 267 00:16:19,810 --> 00:16:22,170 Megyek, hogy csak hogy több felhasználóbarát nyíl, hogy közvetíti a 268 00:16:22,170 --> 00:16:26,060 Ugyanez a gondolat és kivonatok el a adatok, hogy mi a tényleges 269 00:16:26,060 --> 00:16:27,700 szolgáló cím. 270 00:16:27,700 --> 00:16:33,290 >> Most, ha visszamegyünk a kódot, amit történt a múlt héten, ha van karakterlánc t 271 00:16:33,290 --> 00:16:34,510 egyenlő getString? 272 00:16:34,510 --> 00:16:38,630 Hát, ha megint, írja a Hello most fogok kapni 273 00:16:38,630 --> 00:16:40,460 egy darab memóriát. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l 0-o backslash. 275 00:16:44,820 --> 00:16:48,320 >> Hanem azért, mert hívtam getString másodszor - 276 00:16:48,320 --> 00:16:51,100 és tudom, hogy ez a nézi a forráskódja getString - még 277 00:16:51,100 --> 00:16:54,350 bár ez véletlen, hogy helló volt beírt kétszer getString nem 278 00:16:54,350 --> 00:16:55,890 megpróbálom optimalizálni , és okos. 279 00:16:55,890 --> 00:16:58,550 Ez csak megy, hogy egy másik darab memória a számítógép, amely a 280 00:16:58,550 --> 00:16:59,640 lesz egy másik címre. 281 00:16:59,640 --> 00:17:02,330 Nézzük önkényesen mondjuk 456. 282 00:17:02,330 --> 00:17:04,079 >> És akkor mi megy vissza? 283 00:17:04,079 --> 00:17:08,030 Meg fog visszatérni 456 és tárolja a t. 284 00:17:08,030 --> 00:17:12,010 Tehát mi is történik valójában, a bal oldali, hogy én még egy darab 285 00:17:12,010 --> 00:17:14,260 memória, 32 bites általában. 286 00:17:14,260 --> 00:17:16,720 És ott fog menni Ox456. 287 00:17:16,720 --> 00:17:20,140 De ismétlem, én nem érdeklődnek a következő adott számok többé. 288 00:17:20,140 --> 00:17:23,069 Én csak úgy elvontan rajzolni, mint a nyíl. 289 00:17:23,069 --> 00:17:25,202 >> Szóval ez most egy új magyarázat. 290 00:17:25,202 --> 00:17:28,735 De ez pontosan ugyanolyan gondolat, hogy ez történt egész idő alatt. 291 00:17:28,735 --> 00:17:33,150 És így, akkor az oka, hogy ez az első változata összehasonlítás hibás volt 292 00:17:33,150 --> 00:17:34,480 a múlt héten, hogy miért? 293 00:17:34,480 --> 00:17:38,000 Ha ezt, ha s értéke egyenlő t mi igazán 294 00:17:38,000 --> 00:17:40,550 a motorháztető alatt összehasonlítása? 295 00:17:40,550 --> 00:17:41,910 >> Te összehasonlítva a címeket. 296 00:17:41,910 --> 00:17:47,950 És csak ösztönösen, tisztán, Ox123 nem fog egyenlő Ox456. 297 00:17:47,950 --> 00:17:49,380 Ezek a számok, a bitek csak más. 298 00:17:49,380 --> 00:17:53,220 >> És így folyamatosan, a múlt héten azt mondta, beírt különböző dolog, még akkor is, ha a 299 00:17:53,220 --> 00:17:55,360 szavai szó szerint ugyanaz. 300 00:17:55,360 --> 00:17:58,770 Így erősít ez. 301 00:17:58,770 --> 00:18:00,120 A laikus szempontból, hogy mi volt a fix? 302 00:18:00,120 --> 00:18:02,110 >> Közönség: Használjon funkciót. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: a funkció. 304 00:18:02,870 --> 00:18:05,190 Vagy csillagok egyértelműen szó, de egy függvényt, amit? 305 00:18:05,190 --> 00:18:05,962 >> Közönség: összehasonlítása a szálakat. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: összehasonlítása a szálakat. 307 00:18:07,390 --> 00:18:11,030 Tehát az alapvető probléma az volt hogy én csak figyelembe a 308 00:18:11,030 --> 00:18:15,870 minőségű húrok által meghatározandó összehasonlítása a címüket. 309 00:18:15,870 --> 00:18:18,540 És természetesen ez csak buta már egyszer érti, mi folyik itt 310 00:18:18,540 --> 00:18:19,510 a motorháztető alatt. 311 00:18:19,510 --> 00:18:23,270 Hogy valóban összehasonlítani húrok, hogy ha ők azonos az is, hogy az emberi 312 00:18:23,270 --> 00:18:26,680 tartanám két karakterlánc egyenlő meg kell összehasonlítani őket karakter 313 00:18:26,680 --> 00:18:28,070 karaktert a karakter. 314 00:18:28,070 --> 00:18:30,020 >> Most tudtam volna ez nagyon unalmasan. 315 00:18:30,020 --> 00:18:32,240 De ismerős, mi egy for ciklus. 316 00:18:32,240 --> 00:18:36,050 És csak összehasonlítani s konzol i ellen t tartó i. 317 00:18:36,050 --> 00:18:39,590 s konzol i + 1 ellenében t tartó i plusz 1, és így tovább, belül 318 00:18:39,590 --> 00:18:40,580 valamiféle hurok. 319 00:18:40,580 --> 00:18:44,950 És ha minden helyszínen két karakter, amely különböznek, vagy ha tudom, hogy ó, s 320 00:18:44,950 --> 00:18:48,410 rövidebb vagy hosszabb, mint a t t Én rögtön azt mondják hamis, 321 00:18:48,410 --> 00:18:49,390 ők nem ugyanaz. 322 00:18:49,390 --> 00:18:55,370 >> De ha átjutni s és t, és mondja ugyanaz, ugyanaz, ugyanaz, ugyanaz, ugyanaz, vége 323 00:18:55,370 --> 00:18:58,520 mindkét szót, azt mondhatom, Igaz, hogy egyenlő. 324 00:18:58,520 --> 00:19:01,040 Nos, szerencsére, évekkel ezelőtt valaki azt írta, hogy kódot számunkra. 325 00:19:01,040 --> 00:19:03,790 >> És nevezték StrComp string összehasonlítani. 326 00:19:03,790 --> 00:19:11,900 És annak ellenére, hogy egy kis számláló intuitív, StrComp értéke 0, ha a 327 00:19:11,900 --> 00:19:14,520 két húrok, s és t jelentése azonos. 328 00:19:14,520 --> 00:19:18,090 De visszatér negatív értéket, ha s jöjjön elé t betűrendben vagy 329 00:19:18,090 --> 00:19:20,610 pozitív értéket, ha azt kell jönni után t ABC. 330 00:19:20,610 --> 00:19:24,030 >> Tehát, ha valaha is szeretne rendezni valamit, kiderül, hogy StrComp hasznos. 331 00:19:24,030 --> 00:19:26,660 Mert nem csak azt mondja igen vagy nem, azonos-e vagy sem. 332 00:19:26,660 --> 00:19:30,440 Ez ad egyfajta rendelés mint egy szótár erejét. 333 00:19:30,440 --> 00:19:33,770 Tehát StrComp, s vessző t értéke egyenlő 0 azt jelenti, hogy a 334 00:19:33,770 --> 00:19:35,200 húrok valóban egyenlő. 335 00:19:35,200 --> 00:19:38,680 Mert aki írta ezt a funkciót évvel ezelőtt feltehetően használt for ciklus 336 00:19:38,680 --> 00:19:42,840 vagy a while ciklus, vagy valami ilyesmi integrálni át a karakterek újra 337 00:19:42,840 --> 00:19:45,270 és újra és újra. 338 00:19:45,270 --> 00:19:47,300 >> De probléma merült fel két itt. 339 00:19:47,300 --> 00:19:48,750 Ez copy0.c. 340 00:19:48,750 --> 00:19:51,680 És a két piros mert hibás. 341 00:19:51,680 --> 00:19:52,800 És mit csinálunk itt? 342 00:19:52,800 --> 00:19:54,310 Nos, először is hívtam getString. 343 00:19:54,310 --> 00:19:56,255 És én tárolt a visszatérési értéket s. 344 00:19:56,255 --> 00:20:00,260 Szóval ez nagyjából ugyanaz, mint a ez a felső része a képnek. 345 00:20:00,260 --> 00:20:01,490 >> De mi lesz azután? 346 00:20:01,490 --> 00:20:04,980 Nos, hadd menjen előre, és megszabadulni egy csomó ezt. 347 00:20:04,980 --> 00:20:09,650 Majd hátra az időben, ahol csak van s, ami most megfelel 348 00:20:09,650 --> 00:20:10,940 vonalban ott. 349 00:20:10,940 --> 00:20:11,400 >> Megnézem. 350 00:20:11,400 --> 00:20:13,450 Ha s értéke egyenlő 0-ra. 351 00:20:13,450 --> 00:20:18,670 Most egy gyors Mellékesen jegyzem meg, ha a Lehet getString vissza 0-ra? 352 00:20:18,670 --> 00:20:19,580 Nincs elég memória. 353 00:20:19,580 --> 00:20:19,880 Nem igaz? 354 00:20:19,880 --> 00:20:22,310 >> Ez ritka, hogy ez fog történni, természetesen a számítógép, hogy a 355 00:20:22,310 --> 00:20:24,740 Van több száz mega vagy még giga RAM. 356 00:20:24,740 --> 00:20:27,080 De lehet, hogy elméletileg vissza 0, különösen, ha a 357 00:20:27,080 --> 00:20:28,080 felhasználó nem működik együtt. 358 00:20:28,080 --> 00:20:31,640 Van módon úgy tenni, mintha még nem bemenő semmit, és trükk 359 00:20:31,640 --> 00:20:34,100 GetString a visszatérő 0 hatékonyan. 360 00:20:34,100 --> 00:20:35,470 >> Ezért van, hogy ellenőrizze, hogy. 361 00:20:35,470 --> 00:20:39,430 Mert ha valakinek kezdtek kap, már, szegmentálás hibák - 362 00:20:39,430 --> 00:20:42,280 amely talán a forrás Néhány frusztráció - 363 00:20:42,280 --> 00:20:46,150 ezek szinte mindig csak az eredmény A memóriával kapcsolatos hibát. 364 00:20:46,150 --> 00:20:50,440 Valahogy elrontotta tekintetében a mutató, akkor is, ha nem vette észre 365 00:20:50,440 --> 00:20:51,530 volt a mutató. 366 00:20:51,530 --> 00:20:55,260 Szóval lehet, hogy hatására szegmentáció hibák már a heti egy használ 367 00:20:55,260 --> 00:21:02,100 olyasmi, mint egy for ciklus, vagy egy ideig loop és egy sor megy túl messzire 368 00:21:02,100 --> 00:21:05,900 korábbi határait néhány tömb Ön kijelentette, hogy két hét 369 00:21:05,900 --> 00:21:06,690 különös. 370 00:21:06,690 --> 00:21:09,220 >> Lehet, hogy ezt megtették, még a probléma az alábbi négy a Breakout. 371 00:21:09,220 --> 00:21:12,910 Annak ellenére, hogy valószínűleg még nem látott minden csillag a forgalmazási kódot 372 00:21:12,910 --> 00:21:17,410 Breakout, kiderül, hogy ezek GRect és GOval és más hasonló dolgok, 373 00:21:17,410 --> 00:21:19,650 ezek valójában mutatók a motorháztető alatt. 374 00:21:19,650 --> 00:21:23,430 >> De Stanford, mint mi, valami irha hogy részletesen legalábbis a könyvtárak 375 00:21:23,430 --> 00:21:26,540 célokra, ugyanúgy, mint mi string és char *. 376 00:21:26,540 --> 00:21:30,060 De GRect és GOval és az összes ilyen dolog, amit a srácok, vagy fogja használni 377 00:21:30,060 --> 00:21:32,630 ezen a héten végső soron memória címeket. 378 00:21:32,630 --> 00:21:33,650 Csak nem tudom, hogy. 379 00:21:33,650 --> 00:21:37,240 >> Tehát nem meglepő akkor, talán, hogy lehet, hogy utat át néhány 380 00:21:37,240 --> 00:21:38,580 szegmentációs hibák. 381 00:21:38,580 --> 00:21:41,290 De ami igazán érdekes itt, ha azt követően, hogy ellenőrizze, hogy 0 mi 382 00:21:41,290 --> 00:21:43,460 karakterlánc t kap s. 383 00:21:43,460 --> 00:21:44,690 Nos, hadd kijelentem t. 384 00:21:44,690 --> 00:21:47,730 Fogom felhívni, mint a tér, 32 bit, hívják t. 385 00:21:47,730 --> 00:21:49,740 És akkor fogok csinálni lesz s. 386 00:21:49,740 --> 00:21:51,130 >> Nos, mit jelent ez? 387 00:21:51,130 --> 00:21:53,280 Nos, ez egy kicsit nehéz azt gondolni, róla képzelni bölcs. 388 00:21:53,280 --> 00:21:55,025 De gondolkodjunk mi van az x? 389 00:21:55,025 --> 00:21:59,430 Mi szó szerint benne ez a változó? 390 00:21:59,430 --> 00:22:01,500 Az érték Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Tehát amikor azt mondom karakterlánc t kap s, hogy csak szó szerint azt jelenti, hogy a szám 392 00:22:05,815 --> 00:22:10,070 s-ben, mely Ox123 és tedd Ox123. 393 00:22:10,070 --> 00:22:13,740 Vagy képszerűen, ha valahogy elvont el, hogy a részlet azt a 394 00:22:13,740 --> 00:22:16,600 hatására szó szerint ezt ezt is. 395 00:22:16,600 --> 00:22:22,110 >> Tehát most, gondolom, vissza a múlt héten, amikor a haladtunk a kapitalista T. 396 00:22:22,110 --> 00:22:23,800 nem T konzol 0-ra. 397 00:22:23,800 --> 00:22:27,150 Nos, T tartó 0, annak ellenére, hogy a mutató, akkor kezelni, mintha 398 00:22:27,150 --> 00:22:29,220 ez egy sor, egy négyzet konzol jelölést. 399 00:22:29,220 --> 00:22:31,550 >> És hol van T konzol 0-ra? 400 00:22:31,550 --> 00:22:32,990 Nos, ez a h. 401 00:22:32,990 --> 00:22:36,800 És így, ha használja ezt a kódsort, két felső, ami az, hogy a C type.h 402 00:22:36,800 --> 00:22:38,460 header fájlt, ez az, ahol ez nyilvánította. 403 00:22:38,460 --> 00:22:44,410 Te ezt kihasználva H. De Persze, ez pontosan ugyanolyan h ez 404 00:22:44,410 --> 00:22:46,540 belül s, hogy úgy mondjam. 405 00:22:46,540 --> 00:22:51,930 És most már megváltozott, vagy aktiválásra az eredeti és a 406 00:22:51,930 --> 00:22:53,120 úgynevezett példányt. 407 00:22:53,120 --> 00:22:56,620 Mivel nem egy másolatot a módon, hogy egy ember szeretne, hogy legyen. 408 00:22:56,620 --> 00:22:59,710 >> Tehát mi volt a fix itt, in copy1.c múlt héten? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Funkciók, így ténylegesen másolni a húr. 411 00:23:05,580 --> 00:23:08,700 És alapvetően, mit kell tenni annak érdekében, hogy másolja a húr? 412 00:23:08,700 --> 00:23:12,070 >> Nos, ebben a zöld verziót itt vagyok fog tenni, hogy viszonylag alacsony. 413 00:23:12,070 --> 00:23:14,260 Vannak valójában függvények tudnak segíteni ebben. 414 00:23:14,260 --> 00:23:17,710 De a legalapvetőbb az egyik, és a leginkább ismerős, legalábbis, hamarosan 415 00:23:17,710 --> 00:23:19,600 ismerős számunkra a következő - 416 00:23:19,600 --> 00:23:21,910 így az egyik az első sorban A kód a zöld van. 417 00:23:21,910 --> 00:23:23,970 >> Csak átírtam s mint char *. 418 00:23:23,970 --> 00:23:25,250 Nincs funkcionális különbség van. 419 00:23:25,250 --> 00:23:28,790 Én csak eldobta a CS50 könyvtár és Hívom, hogy mi ez, egy char *. 420 00:23:28,790 --> 00:23:31,640 >> Most pont, pont, pont, mert voltak Néhány hiba ellenőrzése, hogy ez nem 421 00:23:31,640 --> 00:23:33,200 érdekes beszélni újra. 422 00:23:33,200 --> 00:23:34,710 Tehát most t nyilvánítják. 423 00:23:34,710 --> 00:23:35,780 Ez is egy char *. 424 00:23:35,780 --> 00:23:38,280 Szóval rajzoltam egy kis négyzet a képernyőn, mint korábban. 425 00:23:38,280 --> 00:23:41,870 >> De a jobb oldali, malloc, azt mondta a memória osztja. 426 00:23:41,870 --> 00:23:44,130 Így osztja néhány darab a memóriát. 427 00:23:44,130 --> 00:23:48,830 És hány bájt csinálni valójában szeretnék kiosztani, tűnik úgy? 428 00:23:48,830 --> 00:23:50,340 >> Nos, a húr hossza s. 429 00:23:50,340 --> 00:23:52,310 Tehát, ha ez helló ez lesz öt. 430 00:23:52,310 --> 00:23:53,950 Azt fogja mondani, h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Tehát öt bájt. 432 00:23:55,090 --> 00:23:57,960 >> De aztán plusz 1, miért 1? 433 00:23:57,960 --> 00:23:58,830 A 0 karakter. 434 00:23:58,830 --> 00:24:03,640 Ha nem hagy teret a srác véletlenül olyan helyzetet teremt 435 00:24:03,640 --> 00:24:05,600 ahol h a húr-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 És akkor a következő alkalommal az getString hívott, és azt írja be, például, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, a számítógép megy úgy gondolja, hogy s valójában 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-O-D-a-v-i-d, mert ott nincs szünet között ezeket a szavakat. 439 00:24:18,900 --> 00:24:19,810 >> Tehát szükségünk van, hogy a szünet. 440 00:24:19,810 --> 00:24:20,720 Tehát nem akarunk öt. 441 00:24:20,720 --> 00:24:22,100 Azt akarjuk, hat bájt. 442 00:24:22,100 --> 00:24:23,110 >> És bájt mondom. 443 00:24:23,110 --> 00:24:25,220 De ez tényleg ideje mérete char. 444 00:24:25,220 --> 00:24:28,040 Technikailag char szinte mindig egy byte. 445 00:24:28,040 --> 00:24:31,030 >> De csak azért, hogy a kód hordozható, hogy úgy mondjam, úgy, hogy működik 446 00:24:31,030 --> 00:24:33,750 különböző számítógépen is, ha esetleg némileg eltérő alatt a 447 00:24:33,750 --> 00:24:36,590 motorháztető, fogok általánosságban mondjuk mérete char, hogy a 448 00:24:36,590 --> 00:24:37,660 kódom mindig működik. 449 00:24:37,660 --> 00:24:40,610 És nem kell újrafordítani, hogy csak mert frissíteni a számítógépet, vagy használjon 450 00:24:40,610 --> 00:24:42,140 néhány más platform. 451 00:24:42,140 --> 00:24:45,300 >> Szóval megvan 6-szor akkora, mint a karakter, ami történik, hogy 1. 452 00:24:45,300 --> 00:24:47,440 Ez azt jelenti, malloc tudott adj hat bájt. 453 00:24:47,440 --> 00:24:49,140 Mi ez valójában csinál? 454 00:24:49,140 --> 00:24:52,810 Nos, hadd forgassa vissza az időben itt hogy hol tartunk a történetben. 455 00:24:52,810 --> 00:24:57,620 >> Tehát, ha én megyek vissza, már kijelentette, a char * nevű t. 456 00:24:57,620 --> 00:25:00,280 Már most hívott malloc hat bájt. 457 00:25:00,280 --> 00:25:06,400 És most fogom felhívni a hat bájt, mint a tömb korábban. 458 00:25:06,400 --> 00:25:10,570 De én tényleg nem tudom, mi ez ezen belül tömb. 459 00:25:10,570 --> 00:25:14,640 >> Ha memóriát kiderül, hogy nem lehet megbízni, hogy van valami 460 00:25:14,640 --> 00:25:15,810 ismert érték ott. 461 00:25:15,810 --> 00:25:18,400 Lehetett volna használni valami mással, egy másik funkciója, más 462 00:25:18,400 --> 00:25:19,630 kódsor, amit írt. 463 00:25:19,630 --> 00:25:22,870 Szóval akkor általában hívni ezeket a szemetet értékeket, és felhívja őket, talán úgy, mint 464 00:25:22,870 --> 00:25:26,170 kérdőjelek, csak azt jelzi, hogy Nem tudom, mi valójában ott van. 465 00:25:26,170 --> 00:25:30,390 És ez nem nagy ügy, amíg mi elég okos, hogy felülírja az 466 00:25:30,390 --> 00:25:34,550 szemetet értékeket számszerű és karakter, hogy mi érdekel. 467 00:25:34,550 --> 00:25:36,340 >> Tehát ebben az esetben mit fogok csinálni? 468 00:25:36,340 --> 00:25:38,670 Nos, a kódsor következő, már négy. 469 00:25:38,670 --> 00:25:41,350 int kapok 0, n kapja a húr hossza s. 470 00:25:41,350 --> 00:25:42,750 Tehát egy ismerős hurok. 471 00:25:42,750 --> 00:25:45,875 I kisebb vagy egyenlő, mint N, amely általában meghaladja. 472 00:25:45,875 --> 00:25:47,500 >> De ezúttal ez szándékos. 473 00:25:47,500 --> 00:25:51,890 I + +, aztán egyszerűen nem t tartó i lesz s. 474 00:25:51,890 --> 00:25:56,320 Mert a kép úgy néz ki, mint ez a Ebben a pillanatban, tárolt t az 475 00:25:56,320 --> 00:25:59,530 címét, hogy a véletlen darab memória amelyek értéke ismeretlen. 476 00:25:59,530 --> 00:26:03,030 De amint én t tartó 0, hogy hozza ide. 477 00:26:03,030 --> 00:26:07,430 >> És mi végül egyre húzott ott? 478 00:26:07,430 --> 00:26:08,740 Mi a végén üzembe h. 479 00:26:08,740 --> 00:26:11,170 Mert ez az, amit ez a s konzol 0-ra. 480 00:26:11,170 --> 00:26:14,300 Aztán ugyanezt e, és én, és én, és o. 481 00:26:14,300 --> 00:26:17,930 >> n, miért megyek fel a egyenlő az n? 482 00:26:17,930 --> 00:26:19,200 Mivel a 0 karaktert. 483 00:26:19,200 --> 00:26:23,580 Szóval, csak hogy tisztázzuk, akkor, ha tényleg törli legyen az bármi szemetet 484 00:26:23,580 --> 00:26:28,870 értékek majd ténylegesen felhívni az mit várok, hogy ez s konzol 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plusz ez záró új karaktert. 486 00:26:32,440 --> 00:26:36,080 >> És most, ha folytatódik a múlt dot, pont, pont ebben a megfelelő verzió 487 00:26:36,080 --> 00:26:41,930 és aktivált t tartó 0 lenne, a természetesen kihasználva csak ez 488 00:26:41,930 --> 00:26:47,050 srác itt, amely fogalmilag végső soron a cél. 489 00:26:47,050 --> 00:26:48,040 Szóval ez a mutató. 490 00:26:48,040 --> 00:26:51,430 >> És ha már használja őket hetek most a húrok összefüggésben. 491 00:26:51,430 --> 00:26:53,530 De a motorháztető alatt ők egy kicsit bonyolultabb. 492 00:26:53,530 --> 00:26:57,520 De ha úgy gondolja róluk a képi formában azt javaslom, hogy ők 493 00:26:57,520 --> 00:27:01,720 talán nem olyan ijesztő, mint azok talán először látszik első pillantásra, 494 00:27:01,720 --> 00:27:04,730 különösen az ilyen új szintaxis. 495 00:27:04,730 --> 00:27:07,290 Bármilyen kérdése a mutatók, vonósok, vagy a karakter? 496 00:27:07,290 --> 00:27:07,580 Igen? 497 00:27:07,580 --> 00:27:09,252 >> Közönség: Vissza tudsz menni A [nem hallható]? 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Persze. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Közönség: Hogy jön az utolsó vonal, akkor nem kell a * t vonal 501 00:27:19,525 --> 00:27:21,513 és a * s a sorban? 502 00:27:21,513 --> 00:27:23,004 Nem kell a hivatkozást az - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, egy nagyon jó kérdés. 504 00:27:24,640 --> 00:27:26,800 Miért nem tudok egy * t, és a * s? 505 00:27:26,800 --> 00:27:30,340 Mivel a rövid, a múlt héten, mint a mi csere funkció, azt mondtam, hogy amikor 506 00:27:30,340 --> 00:27:33,350 van egy mutató az eszköz, amit ott, mint mi 507 00:27:33,350 --> 00:27:36,590 fizikailag a színpadon, az volt, hogy valójában használja a csillag operátor. 508 00:27:36,590 --> 00:27:40,570 >> Kiderült, hogy ez a szögletes zárójeles jelölés mit fogunk hívni szintaktikai 509 00:27:40,570 --> 00:27:44,190 cukor, ami csak egy szexi módon mondván, hogy a rövidítéseket, 510 00:27:44,190 --> 00:27:45,950 pontosan mit leírja. 511 00:27:45,950 --> 00:27:49,385 De ez egy kicsit intuitív. 512 00:27:49,385 --> 00:27:53,510 És azzal a veszéllyel jár, hogy ez a látszólag még bonyolultabb, mint amilyennek lennie kellene, 513 00:27:53,510 --> 00:27:56,990 mi folyik itt a következő - 514 00:27:56,990 --> 00:28:01,450 Ha azt mondom, * t azt jelenti, hogy menjen A cím tárolt t. 515 00:28:01,450 --> 00:28:04,350 >> Tehát a szó szoros értelmében, ha t tárolja címét, hogy h 516 00:28:04,350 --> 00:28:07,300 kezdetben, * t azt jelenti, megy itt. 517 00:28:07,300 --> 00:28:10,730 Nos, mit t tartó 0 jelent? 518 00:28:10,730 --> 00:28:11,560 Pontosan ugyanolyan dolog. 519 00:28:11,560 --> 00:28:13,510 Csak egy kicsit több felhasználó barátságos írni. 520 00:28:13,510 --> 00:28:14,430 >> De nem történt még. 521 00:28:14,430 --> 00:28:17,800 Nem tudok csak mondani, * t * s lesz. 522 00:28:17,800 --> 00:28:19,440 Mert mit csináljak akkor? 523 00:28:19,440 --> 00:28:22,950 Én üzembe h, h, h, h, h az egész dolog. 524 00:28:22,950 --> 00:28:22,995 Nem igaz? 525 00:28:22,995 --> 00:28:26,020 >> Mivel a * t, hogy megy a címre t. 526 00:28:26,020 --> 00:28:27,580 De bent egy hurok. 527 00:28:27,580 --> 00:28:32,150 És milyen értéket vagyok megnő, Természetesen minden egyes ismétlés? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> De van egy lehetőség itt, ugye? 530 00:28:34,590 --> 00:28:37,870 Annak ellenére, hogy ez olyan, mint hogy egyre egy kicsit kifinomultabb 531 00:28:37,870 --> 00:28:40,730 mint a szögletes zárójeles jelölés már használják egy ideje - 532 00:28:40,730 --> 00:28:43,840 hadd visszavonás a h változás van - 533 00:28:43,840 --> 00:28:48,870 még akkor is, ha ez most már egy kicsit szakértő, az alapötlet, hogy * t 534 00:28:48,870 --> 00:28:53,630 itt azt jelenti, és a * t csak megy a címre t. 535 00:28:53,630 --> 00:28:54,990 >> De mi volt a cím t? 536 00:28:54,990 --> 00:28:56,850 A szám tartjuk használ? 537 00:28:56,850 --> 00:29:00,540 Mint Ox456, most hozd vissza csak a vita kedvéért. 538 00:29:00,540 --> 00:29:05,380 Nos, ha azt akarjuk, hogy az e-ben t string, én csak azt szeretném, hogy menjen, 539 00:29:05,380 --> 00:29:06,460 lényegében, 456. 540 00:29:06,460 --> 00:29:09,230 >> Vagy inkább 457. 541 00:29:09,230 --> 00:29:10,590 Csak kell hozzá egy. 542 00:29:10,590 --> 00:29:11,790 De én meg tudom csinálni, nem? 543 00:29:11,790 --> 00:29:14,680 Mivel t, bár tartok rajz most, mint a nyíl, ez csak egy 544 00:29:14,680 --> 00:29:16,570 szám, Ox456. 545 00:29:16,570 --> 00:29:21,400 És ha hozzá egyet, hogy vagy több Általában, ha hozzáteszem, hogy én, hogy én is 546 00:29:21,400 --> 00:29:24,350 valójában, hogy pontosan hol akarok. 547 00:29:24,350 --> 00:29:26,260 Tehát, ha én tényleg ezt - 548 00:29:26,260 --> 00:29:28,970 és ez az, ami most az úgynevezett pointer aritmetika - 549 00:29:28,970 --> 00:29:30,375 Én távolítsa el ezt a vonalat. 550 00:29:30,375 --> 00:29:33,550 Ami, őszintén szólva, azt hiszem, tisztább és egy kicsit több felhasználóbarát olvasni. 551 00:29:33,550 --> 00:29:35,970 De ez nem kevésbé igaz. 552 00:29:35,970 --> 00:29:38,570 >> Ez a vonal a kód most a pointer aritmetika. 553 00:29:38,570 --> 00:29:40,920 Ez azt mondja el, hogy a következő cím - 554 00:29:40,920 --> 00:29:44,670 függetlenül a kezdete t, mely t és i, amely kezdetben 555 00:29:44,670 --> 00:29:45,730 0, ami nagyszerű. 556 00:29:45,730 --> 00:29:49,280 Mert ez azt jelenti, az elején t plusz 1, plusz 2, plusz 3, és így tovább. 557 00:29:49,280 --> 00:29:51,030 És ugyanez foglalkozik s. 558 00:29:51,030 --> 00:29:52,750 >> Így szintaktikai cukor ezt. 559 00:29:52,750 --> 00:29:55,900 Hanem megértsétek, mi folyik valójában a motorháztető alatt, azt állítják, 560 00:29:55,900 --> 00:29:57,410 valóban hasznos és önmagában. 561 00:29:57,410 --> 00:30:00,620 Mert ez azt jelenti, most már nem sokkal több varázslat történik 562 00:30:00,620 --> 00:30:01,620 a motorháztető alatt. 563 00:30:01,620 --> 00:30:03,920 Ott nem lesz több rétegek, hogy mi is húzza vissza az Ön számára. 564 00:30:03,920 --> 00:30:04,810 Ez kb. 565 00:30:04,810 --> 00:30:06,410 És ez programozás. 566 00:30:06,410 --> 00:30:08,002 Nagyon jó kérdés. 567 00:30:08,002 --> 00:30:11,570 >> Rendben, ez az volt, hogy hibás programot utaltam korábban. 568 00:30:11,570 --> 00:30:12,650 csere hibás volt. 569 00:30:12,650 --> 00:30:14,070 Ha nem úgy tűnik, hogy működik. 570 00:30:14,070 --> 00:30:17,390 Emlékezzünk vissza, hogy ugyanúgy, mint a tej és A narancslé - amit elkezdtem 571 00:30:17,390 --> 00:30:18,660 ivás a mai demonstráció. 572 00:30:18,660 --> 00:30:22,220 Tehát ahogy a narancslé és a a tej, akkor még van, hogy egy 573 00:30:22,220 --> 00:30:26,200 ideiglenes változó, tmp, hogy tartsa a ideiglenesen, hogy mi lehet majd 574 00:30:26,200 --> 00:30:28,820 változtassa meg az értéket, majd frissítse b. 575 00:30:28,820 --> 00:30:32,870 >> De ezt a funkciót, akkor azt mondta, vagy a program, amelyben ez a funkció volt 576 00:30:32,870 --> 00:30:35,670 írott tévedett, és hibás, miért? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Igen? 579 00:30:39,090 --> 00:30:42,471 >> Közönség: [hangtalan]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Pontosan, ha a hívás csere - 581 00:30:44,940 --> 00:30:47,820 vagy általánosabban, ha hívás a legtöbb olyan funkciót - 582 00:30:47,820 --> 00:30:51,210 ha az érvek, hogy a funkció primitív, hogy úgy mondjam, ints és karakter 583 00:30:51,210 --> 00:30:56,740 és páros és úszik, a dolgok nem csillagok, akkor halad egy példányát 584 00:30:56,740 --> 00:30:57,540 az érvelés. 585 00:30:57,540 --> 00:31:01,580 Tehát, ha x és y: 1: 2, a megy , hogy 1 és b lesz 2.. 586 00:31:01,580 --> 00:31:05,250 De most más lesz darabokat bitek különböző darabokat 587 00:31:05,250 --> 00:31:07,540 memória, amelyeket adott esetben tárolás azonos értékeket. 588 00:31:07,540 --> 00:31:12,160 >> Tehát ez a kód szuper tökéletes A csere a és b. 589 00:31:12,160 --> 00:31:13,850 Ez nem jó csere - 590 00:31:13,850 --> 00:31:15,290 A múlt héten például - 591 00:31:15,290 --> 00:31:16,390 x és y. 592 00:31:16,390 --> 00:31:18,780 Mert megint ők a rossz hatálya alá. 593 00:31:18,780 --> 00:31:21,310 >> Nos, hogyan is megy a rögzítés ez? 594 00:31:21,310 --> 00:31:23,140 Meg kellett, hogy a funkció Egy kicsit csúnyább. 595 00:31:23,140 --> 00:31:25,250 De ismétlem, hogy mi Ez csak azt jelenti. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> És tényleg, hadd, a következetesség, változás egy dolog így azonos 598 00:31:31,500 --> 00:31:33,200 amit csináltál. 599 00:31:33,200 --> 00:31:35,690 Mint már említettem a múlt héten, ez nem számít, hol megy. 600 00:31:35,690 --> 00:31:38,120 Sőt, általában akkor tegye a csillag jelenik meg a változó neve. 601 00:31:38,120 --> 00:31:40,750 De azt hiszem, ez egy kicsit könnyebb hogy fontolja meg a * mellett 602 00:31:40,750 --> 00:31:44,910 adattípus értelmezni, hogy ez a mutató egy int ebben az esetben. 603 00:31:44,910 --> 00:31:46,270 >> Szóval, mit keresek én itt? 604 00:31:46,270 --> 00:31:49,590 Azt mondom, nem adnak nekem egy int majd egy másik int, 605 00:31:49,590 --> 00:31:50,810 hívja őket, a és b. 606 00:31:50,810 --> 00:31:52,460 Add meg a címet egy int. 607 00:31:52,460 --> 00:31:53,960 Add meg a címet egy másik int. 608 00:31:53,960 --> 00:31:56,330 Hívja ezeket a címeket a és b. 609 00:31:56,330 --> 00:32:00,860 >> És akkor a * jelölés le alatt, megy minden egyes ilyen címek 610 00:32:00,860 --> 00:32:05,290 szükség szerint sem kap vagy állítsa az értékét. 611 00:32:05,290 --> 00:32:07,400 De van egy kivétel. 612 00:32:07,400 --> 00:32:11,130 Miért nincs a * mellett tmp? 613 00:32:11,130 --> 00:32:15,070 Miért nem ezt, például? 614 00:32:15,070 --> 00:32:19,370 Olyan, mintha kéne menni az összes , és javítsa az egészet. 615 00:32:19,370 --> 00:32:19,752 Igen? 616 00:32:19,752 --> 00:32:21,002 >> Közönség: [hangtalan]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Még nincs bejelentve tmp egy string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Tehát ez kijelenti, ebben az esetben, a tmp, hogy a címét egy int. 621 00:32:34,950 --> 00:32:37,380 De ez nem elég, amit akarok, egy pár oka. 622 00:32:37,380 --> 00:32:38,616 >> Közönség: Nem akarod cserélni őket. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Pontosan, nem akarom, hogy a csere semmit tmp. tmp csak 624 00:32:41,800 --> 00:32:42,790 hét-egy dolog. 625 00:32:42,790 --> 00:32:45,150 Minden amit akarok egy változó tárolni néhány számot. 626 00:32:45,150 --> 00:32:47,330 Én nem is érdekel címek ebben a pillanatban. 627 00:32:47,330 --> 00:32:50,530 >> Csak kell 32 bites így tárolni egy int. 628 00:32:50,530 --> 00:32:56,690 És azt szeretnénk, hogy azokban a 32 bit bármit, ami nem egy, hogy úgy mondjam, de 629 00:32:56,690 --> 00:33:01,260 mi is egy, csak hogy pontosabb. 630 00:33:01,260 --> 00:33:06,420 Mert ha egy olyan cím, * a jelent menj oda, és kap az 1-es érték. 631 00:33:06,420 --> 00:33:10,560 Például a múlt heti példa vagy b esetében, hogy az értéke 2. 632 00:33:10,560 --> 00:33:11,750 >> Szóval, mi is folyik itt? 633 00:33:11,750 --> 00:33:15,070 Hadd hívjam a kép itt, amely csak ugratni mellett része a mai. 634 00:33:15,070 --> 00:33:18,580 De ez továbbra is megjelenik jó ideje. 635 00:33:18,580 --> 00:33:22,430 >> Ez, azt állítják, az, amit a számítógép memória néz ki, ha fut a 636 00:33:22,430 --> 00:33:24,060 program minden program. 637 00:33:24,060 --> 00:33:28,340 Ha fut a program, az egyik legfontosabb a számítógép RAM - így gondolom, 638 00:33:28,340 --> 00:33:33,530 a téglalap, igazán, mint a számítógép RAM memória, az összes 101 639 00:33:33,530 --> 00:33:36,920 milliárd bájt ebből, kétmilliárd bájt, minden két gigabájt belőle, 640 00:33:36,920 --> 00:33:39,910 bármilyen mennyiség van az, hadd dolgozzon, mint egy téglalap. 641 00:33:39,910 --> 00:33:43,260 És azt állítják, hogy ha fut a program mint a Microsoft Word vagy a Chrome 642 00:33:43,260 --> 00:33:49,220 vagy ilyesmi, azok a részek, Microsoft vagy a Google írta - 643 00:33:49,220 --> 00:33:50,910 azokban az esetekben, e programok - 644 00:33:50,910 --> 00:33:54,490 töltődnek be a számítógép memóriájában ahol is végre több 645 00:33:54,490 --> 00:33:57,520 gyorsan és táplálják be a CPU, amely az agy a számítógép. 646 00:33:57,520 --> 00:34:00,940 >> És TAM ők tárolják a nagyon tetején a program, hogy úgy mondjam. 647 00:34:00,940 --> 00:34:03,300 Más szóval, ha ez egy darab memória, ha duplán kattint a 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, a bitek jönnek le a merevlemezről. 649 00:34:05,740 --> 00:34:06,680 Kapnak betöltött RAM. 650 00:34:06,680 --> 00:34:10,330 És mi lök őket az egyik legfontosabb Ennek téglalap fogalmilag. 651 00:34:10,330 --> 00:34:13,010 >> Nos, a többi a memória használják a különböző dolgokat. 652 00:34:13,010 --> 00:34:16,460 A legtetején látod elindítani adatok és inicializálás adatokat. 653 00:34:16,460 --> 00:34:20,500 Ennek oka, hogy a legtöbb, a konstans vagy globális változók 654 00:34:20,500 --> 00:34:21,340 amelyek értékeket. 655 00:34:21,340 --> 00:34:22,980 De még azokon máskor. 656 00:34:22,980 --> 00:34:25,150 >> Akkor a halom, amely jövünk vissza. 657 00:34:25,150 --> 00:34:28,420 De az alsó része, ami különösen illenek most. 658 00:34:28,420 --> 00:34:30,210 Ez az úgynevezett stack. 659 00:34:30,210 --> 00:34:33,850 Így, mint a legtöbb olyan D hall itt campus, akkor azokat tálcák 660 00:34:33,850 --> 00:34:37,210 csak verem tetején egymásra, amely lehet ételt és miegymás. 661 00:34:37,210 --> 00:34:40,139 A verem egy számítógépes rendszerben nagyon hasonló. 662 00:34:40,139 --> 00:34:42,679 Kivéve míg a tálcát, ahogy használni Az étkező, persze, azt jelentette, 663 00:34:42,679 --> 00:34:45,710 folytatni a dolgokat, tálcák vagy a keretek - 664 00:34:45,710 --> 00:34:49,469 ahogy hívjuk őket - a számítógép memória gyűjtjük 665 00:34:49,469 --> 00:34:51,610 változókat és értékeket. 666 00:34:51,610 --> 00:34:53,929 >> Tehát valójában mi folyik a motorháztető alatt? 667 00:34:53,929 --> 00:34:55,820 Nos, hadd fordítsa A képernyő itt. 668 00:34:55,820 --> 00:34:58,370 És összpontosítsunk csak a alsó rész egy pillanatra. 669 00:34:58,370 --> 00:35:02,770 Ha ez az alsó része az én számítógép memóriája kiderül, amikor 670 00:35:02,770 --> 00:35:05,350 A funkciót fő - ami történik, őszintén szólva, 671 00:35:05,350 --> 00:35:06,950 automatikusan számomra - 672 00:35:06,950 --> 00:35:10,510 Kapok egy darab memória a alján a RAM úgy mondjam. 673 00:35:10,510 --> 00:35:13,390 És ez az, ahol Main lokális változók menni. 674 00:35:13,390 --> 00:35:16,770 Ez az, ahol argc és argv talán megy, és a változók 675 00:35:16,770 --> 00:35:18,170 kijelentik belül fő. 676 00:35:18,170 --> 00:35:20,260 A végén az alján az én számítógép RAM. 677 00:35:20,260 --> 00:35:25,040 >> Most tegyük fel, hogy a fő meghív egy függvényt mint a csere, mint tette a múlt héten? 678 00:35:25,040 --> 00:35:30,620 Nos, alapvetően hogy egy új tálca, a új keret, rá a darab memória. 679 00:35:30,620 --> 00:35:34,160 És fogom leírni ezt tartozó csere funkciót. 680 00:35:34,160 --> 00:35:35,770 >> Most mi van benne a csere? 681 00:35:35,770 --> 00:35:39,240 Nos, az elmúlt heti program az, amit most láttam egy részletet, 682 00:35:39,240 --> 00:35:46,590 belül csere a keret, illetve a csere tálca, amit változó? 683 00:35:46,590 --> 00:35:47,970 Nos, a és b. 684 00:35:47,970 --> 00:35:51,850 , Mert ezek voltak a helyi érveit, valamint egy harmadik, tmp. 685 00:35:51,850 --> 00:35:54,470 Szóval tényleg, nem tudtam felhívni a egy kicsit tisztábban. 686 00:35:54,470 --> 00:35:56,680 Hadd menjek előre, és vonja vissza a címkét. 687 00:35:56,680 --> 00:35:58,520 És hadd állítják, hogy tudod, mit? 688 00:35:58,520 --> 00:36:00,560 >> a valószínűleg lesz a vége itt. 689 00:36:00,560 --> 00:36:02,160 B lesz a vége itt. 690 00:36:02,160 --> 00:36:03,810 És tmp lesz a vége itt. 691 00:36:03,810 --> 00:36:05,160 Most, a rendelés esetleg egy kicsit más. 692 00:36:05,160 --> 00:36:06,840 De fogalmilag ez az ötlet. 693 00:36:06,840 --> 00:36:11,490 >> És csak együtt, ez az, ami hívjuk swap ügylet keretében, vagy 694 00:36:11,490 --> 00:36:12,136 ebédlőben tálcát. 695 00:36:12,136 --> 00:36:13,150 És ugyanez foglalkozik fő. 696 00:36:13,150 --> 00:36:14,040 De nem dolgozza át, hogy. 697 00:36:14,040 --> 00:36:17,810 De ez az, ahol argc és argv és minden a lokális változók, mint x és y 698 00:36:17,810 --> 00:36:18,940 lehet olyan is. 699 00:36:18,940 --> 00:36:22,170 >> Tehát most úgy mi történik valójában ha hívja csere. 700 00:36:22,170 --> 00:36:26,370 Amikor hívja csere, végrehajtás alatt álló kódot, mint a ezt, te halad, a 701 00:36:26,370 --> 00:36:30,670 hibás változat, a és b másolatban az x és y. 702 00:36:30,670 --> 00:36:34,300 Tehát, ha én most felhívni a a képernyőn - 703 00:36:34,300 --> 00:36:36,700 van, hogy javul a - 704 00:36:36,700 --> 00:36:40,850 így a történet, amit mesélt, hogy magamnak volt a hibás verziót, amikor 705 00:36:40,850 --> 00:36:46,130 hívásváltás halad szó és b egészek, mi történik valójában? 706 00:36:46,130 --> 00:36:48,250 >> Nos, mi történik valójában ez. 707 00:36:48,250 --> 00:36:52,850 Hadd menjek előre, és visszavonás csak tisztázni itt egy kis helyet. 708 00:36:52,850 --> 00:36:54,720 Tehát ez a számítógép memóriájában. 709 00:36:54,720 --> 00:36:57,510 >> Tehát, ha van, például - 710 00:36:57,510 --> 00:36:58,910 valójában csináljuk ezt így - 711 00:36:58,910 --> 00:37:02,690 ha azt állítják, hogy ez az x, tároló Az 1-es érték, mint a múlt héten. 712 00:37:02,690 --> 00:37:05,930 És ez y, az érték tárolására 2, mint a múlt héten. 713 00:37:05,930 --> 00:37:11,370 És ez fontos, amikor hívom csere, ezáltal magam hozzáférést és 714 00:37:11,370 --> 00:37:15,150 b és tmp, fogom állítani, hogy ez egy, és ez az 1. 715 00:37:15,150 --> 00:37:16,080 >> Ez b. 716 00:37:16,080 --> 00:37:17,010 Ez a 2 lehet. 717 00:37:17,010 --> 00:37:18,370 Ezt hívják tmp. 718 00:37:18,370 --> 00:37:23,360 >> És kezdetben, hogy van néhány szemét értéke amíg Igazából tárolja benne egy, 719 00:37:23,360 --> 00:37:24,450 amely 1. 720 00:37:24,450 --> 00:37:28,320 Aztán megy előre, és változás egy, hogy mit? 721 00:37:28,320 --> 00:37:29,720 B értékét. 722 00:37:29,720 --> 00:37:31,980 >> És így most már két itt. 723 00:37:31,980 --> 00:37:34,050 És akkor azt mondtuk b lesz tmp. 724 00:37:34,050 --> 00:37:37,670 Ismét, mint ahogy a józan ellenőrzi, a harmadik kódsor itt egyszerűen ez 725 00:37:37,670 --> 00:37:39,440 egy, b kap tmp. 726 00:37:39,440 --> 00:37:41,730 >> És végül, mit tegyek? 727 00:37:41,730 --> 00:37:46,800 Megyek előre, és változtassa meg b, hogy bármilyen tmp értéke van, ami 1. 728 00:37:46,800 --> 00:37:48,390 Én ne érintse tmp újra. 729 00:37:48,390 --> 00:37:54,100 >> De most, a probléma az, amint csere visszatér, mert nem adják 730 00:37:54,100 --> 00:37:57,540 vissza valamilyen érték, nincs visszatérés nyilatkozat kifejezetten benne. 731 00:37:57,540 --> 00:37:59,080 Mi történik valójában? 732 00:37:59,080 --> 00:38:03,480 Nos, lényegében mind a memória - 733 00:38:03,480 --> 00:38:07,410 OK, úgy tűnik, a radír szeret csak egy ujjal egy időben - 734 00:38:07,410 --> 00:38:08,180 éppen eltűnik. 735 00:38:08,180 --> 00:38:10,070 >> Most a valóságban ez nem megy sehová. 736 00:38:10,070 --> 00:38:11,810 De gondold azt, hogy Most, kérdőjelek. 737 00:38:11,810 --> 00:38:14,040 Mert ez már nem ténylegesen használatban. 738 00:38:14,040 --> 00:38:17,470 És semmi sem történik az értékek. 739 00:38:17,470 --> 00:38:21,920 >> Tehát abban az esetben, a zöld változata ezt a kódot, amit inkább az, hogy 740 00:38:21,920 --> 00:38:24,640 átment csere? 741 00:38:24,640 --> 00:38:25,770 Így foglalkozik. 742 00:38:25,770 --> 00:38:28,520 Így a címét, és x címének y. 743 00:38:28,520 --> 00:38:35,790 Tehát, ha újra elmondani ezt a történetet egy utolsó idő, és én valóban rajzolni csere újra, 744 00:38:35,790 --> 00:38:44,620 de a mutató, mivel ez egy, a hogy b, és mivel ez tmp, mi 745 00:38:44,620 --> 00:38:49,080 ténylegesen tárolt a jelen zöld változata kódomat, ahol én vagyok elhaladó 746 00:38:49,080 --> 00:38:52,110 a címeket? 747 00:38:52,110 --> 00:38:53,780 >> Ez lesz a mutatót x. 748 00:38:53,780 --> 00:38:54,890 Így tudtam rajzolni egy nyíl. 749 00:38:54,890 --> 00:38:57,310 De nézzük ugyanazt a tetszőleges Például, mint korábban. 750 00:38:57,310 --> 00:39:01,220 Tegyük fel, hogy ez a valami ilyesmit Ox123. 751 00:39:01,220 --> 00:39:04,970 És ez lesz Ox127 mert ez négy bájt el, mert ez egy 752 00:39:04,970 --> 00:39:07,370 int, így Ox127. 753 00:39:07,370 --> 00:39:09,080 >> És ismét, elviszem néhány szabadságjogok a számokkal. 754 00:39:09,080 --> 00:39:11,430 Ők sokkal kisebb, mint azt valóban, és más sorrendben. 755 00:39:11,430 --> 00:39:14,350 De ez, hogy a kép most más. 756 00:39:14,350 --> 00:39:19,060 >> De amikor ezt a zöld kódot és én int tmp kap * a. 757 00:39:19,060 --> 00:39:25,010 * A jelenti, hogy a következő, hogy a foglalkozik, hogy van egy, és megy is, 758 00:39:25,010 --> 00:39:26,190 amely 1. 759 00:39:26,190 --> 00:39:28,480 És ez az, amit majd tegye a tmp könyvtárba. 760 00:39:28,480 --> 00:39:32,480 Eközben a következő kódsor itt, a * b megkapja, mit jelent ez? 761 00:39:32,480 --> 00:39:36,910 >> Nos, * a, így megy itt lesz * b, ami azt jelenti, ott. 762 00:39:36,910 --> 00:39:39,310 És ez azt jelenti fel az értéket is. 763 00:39:39,310 --> 00:39:43,670 Végül az utolsó sort csak annyit mondott, * b megkapja tmp. 764 00:39:43,670 --> 00:39:48,900 >> Tehát azt mondja, b ott és írja felül az tmp, amely ebben az esetben megy 765 00:39:48,900 --> 00:39:51,520 hogy ismét 1. 766 00:39:51,520 --> 00:39:54,920 És ez az, amiért a zöld változata a kód működik, míg a piros 767 00:39:54,920 --> 00:39:56,010 verzió soha. 768 00:39:56,010 --> 00:39:59,020 Minden csak attól függ, hogy milyen a memória kezelése, és ahol ez 769 00:39:59,020 --> 00:40:02,580 valóban helyezni a számítógép RAM. 770 00:40:02,580 --> 00:40:07,270 És most, ez az egyik dolog, hogy a verem használják. 771 00:40:07,270 --> 00:40:09,225 >> Kérdések az elrendezés? 772 00:40:09,225 --> 00:40:10,380 A mutatók? 773 00:40:10,380 --> 00:40:11,630 Vagy csere? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Rendben, malloc, visszahívás, volt valami ilyesmi. 776 00:40:17,043 --> 00:40:18,260 Ez egy szuper egyszerű példát. 777 00:40:18,260 --> 00:40:20,550 És ez volt az egyik, hogy Muci bemutatott minket, bár elég 778 00:40:20,550 --> 00:40:21,870 gyorsan, a végén az osztály. 779 00:40:21,870 --> 00:40:24,480 A fenébe, ott megint. 780 00:40:24,480 --> 00:40:28,780 >> Így emlékeztetni arra, hogy ez volt a példa, hogy Muci be minket, bár 781 00:40:28,780 --> 00:40:30,360 kissé gyorsan végén osztályban. 782 00:40:30,360 --> 00:40:33,640 És itt használt malloc igazán a második alkalommal. 783 00:40:33,640 --> 00:40:37,330 Mivel az első alkalom, hogy használják, hogy létrehozásához elegendő RAM, osztott ki elegendő RAM 784 00:40:37,330 --> 00:40:38,340 tárolására a string. 785 00:40:38,340 --> 00:40:40,250 >> Ezúttal Muci megtartotta egyszerű. 786 00:40:40,250 --> 00:40:42,465 Tehát tárolni csak int, látszólag. 787 00:40:42,465 --> 00:40:43,510 És ez teljesen rendben van. 788 00:40:43,510 --> 00:40:46,560 Ez egy kicsit furcsa, őszintén szólva, a használja malloc kiosztani egy int. 789 00:40:46,560 --> 00:40:50,650 De a lényeg az volt, Nick claymation tényleg csak elmondani a történetet, hogy mi 790 00:40:50,650 --> 00:40:53,830 történik, vagy nem történik meg, ha Ön rosszul bánnak memória. 791 00:40:53,830 --> 00:40:56,520 >> Tehát ebben az esetben, ez a program volt egy pár dolgot. 792 00:40:56,520 --> 00:41:01,580 Az első esetben is, azt mondja a mutató az úgynevezett x egy int. 793 00:41:01,580 --> 00:41:04,480 Ezután kijelenti mutató hívott y egy int. 794 00:41:04,480 --> 00:41:06,150 Ezután üzletek x, mi? 795 00:41:06,150 --> 00:41:07,110 Valaki most. 796 00:41:07,110 --> 00:41:09,685 Milyen lesz tárolt x szerint A harmadik sorban a program? 797 00:41:09,685 --> 00:41:12,380 >> Közönség: [hangtalan]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Nos, nem egészen bájt, egy mondjuk. 799 00:41:14,130 --> 00:41:16,760 Pontosabban most. 800 00:41:16,760 --> 00:41:18,325 Milyen lesz tárolt x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Egy cím, azt hiszem, hallottam. 803 00:41:22,060 --> 00:41:23,570 >> Szóval mit malloc vissza? 804 00:41:23,570 --> 00:41:26,030 malloc viselkedési lefoglal egy darab memóriát. 805 00:41:26,030 --> 00:41:27,850 De hogyan érhetjük el azt? 806 00:41:27,850 --> 00:41:29,460 Visszatér, mi? 807 00:41:29,460 --> 00:41:32,000 A cím első byte A darab a memória. 808 00:41:32,000 --> 00:41:33,020 >> Nos, ez rendkívül egyszerű. 809 00:41:33,020 --> 00:41:35,380 Ez csak egy byte, ami azt jelenti, foglalkozni mi megy vissza a 810 00:41:35,380 --> 00:41:37,300 címét az egészet. 811 00:41:37,300 --> 00:41:42,070 Tehát tárolt x tehát a cím , hogy a darab a memória. 812 00:41:42,070 --> 00:41:43,400 Közben mi történik ezután? 813 00:41:43,400 --> 00:41:45,890 Tehát tulajdonképpen, menjünk előre, és felhívni a ki nagyon gyorsan. 814 00:41:45,890 --> 00:41:52,490 >> Tehát, ha megy át a képernyőn, és itt játszunk ki ezt int * x és int * y 815 00:41:52,490 --> 00:41:53,740 fog tenni, amit nekem? 816 00:41:53,740 --> 00:41:58,280 Azt állítják, hogy ez csak fog tenni valami ilyesmi, és hívja meg x és 817 00:41:58,280 --> 00:42:00,010 ez, és hívja meg y. 818 00:42:00,010 --> 00:42:03,110 Eközben a harmadik sor kód fog kiosztani méretének int, 819 00:42:03,110 --> 00:42:06,160 amely történetesen - sajnálom, ha azt mondanám, ilyet gondoltam egyet int - 820 00:42:06,160 --> 00:42:08,280 négy bájt a tipikus számítógép. 821 00:42:08,280 --> 00:42:09,720 Legalábbis a CS50 készülék. 822 00:42:09,720 --> 00:42:11,490 >> Tehát ez lesz kiosztani , ki tudja? 823 00:42:11,490 --> 00:42:12,800 Valahol itt. 824 00:42:12,800 --> 00:42:15,780 És ez tárolják néhány cím Ox, ki tudja? 825 00:42:15,780 --> 00:42:18,330 De mit fog kapni vissza az, hogy a cím. 826 00:42:18,330 --> 00:42:22,270 De majd hívni ezt képszerűen mint csak egy nyíl, mint ezt. 827 00:42:22,270 --> 00:42:25,430 >> Most a következő sorban * x 42 lesz. 828 00:42:25,430 --> 00:42:29,400 Mit jelent a * x jelenti a laikus szempontból? 829 00:42:29,400 --> 00:42:30,040 Csak ott. 830 00:42:30,040 --> 00:42:30,960 Megy, hogy a címre. 831 00:42:30,960 --> 00:42:35,900 Vagy más szóval, kövesse a nyílra, és tedd 42 oda. 832 00:42:35,900 --> 00:42:38,140 De aztán valami rossz történt a Muci, nem igaz? 833 00:42:38,140 --> 00:42:43,950 >> Emlékezzünk vissza, hogy öt vonal itt, * y lesz 13, sőt egy szerencsétlen szám, 834 00:42:43,950 --> 00:42:44,760 mit csinált nekünk? 835 00:42:44,760 --> 00:42:47,320 Nos, * y módon menni. 836 00:42:47,320 --> 00:42:50,460 Nos, ez nem kapott értéke még, ugye? 837 00:42:50,460 --> 00:42:54,090 A kód nem y, hogy inicializálni semmit. 838 00:42:54,090 --> 00:42:56,120 Volt x inicializálása egy címre. 839 00:42:56,120 --> 00:42:57,640 De y nyilvánították fel tetején. 840 00:42:57,640 --> 00:43:00,250 De aztán egy pontosvessző, nincs értéke ban ténylegesen benne. 841 00:43:00,250 --> 00:43:02,330 Így igaz, hívja ezt a egy szemetes értéket. 842 00:43:02,330 --> 00:43:03,430 Ki tudja, mi van ott? 843 00:43:03,430 --> 00:43:07,160 Ez a maradék bitek használtak néhány korábbi kódsort 844 00:43:07,160 --> 00:43:08,300 a programom. 845 00:43:08,300 --> 00:43:13,250 >> Tehát, ha azt mondom, ott, ez olyan, mint, Fogalmam sincs, ahol ez a nyíl 846 00:43:13,250 --> 00:43:14,490 fogja végezni. 847 00:43:14,490 --> 00:43:17,720 És ez, ha általában kap egy szegmentációs hiba. 848 00:43:17,720 --> 00:43:22,430 Ha véletlenül dereference, így a beszélni, vagy látogasson el a címet, hogy ez nem 849 00:43:22,430 --> 00:43:25,400 teljesen jogos cím rossz dolgok történnek. 850 00:43:25,400 --> 00:43:27,550 >> És pontosan ez történt gondolkodni Muci. 851 00:43:27,550 --> 00:43:31,060 Így emlékeztet arra, hogy a történet, hogy Nick mondja itt volt ugyanaz a gondolat, mint amit 852 00:43:31,060 --> 00:43:34,050 Már készült azzal az illúzióval, kréta a táblán is. 853 00:43:34,050 --> 00:43:35,960 X és Y nyilvánítják. 854 00:43:35,960 --> 00:43:39,690 >> Aztán kiosztott méretének egy int és tárolni, hogy az x. 855 00:43:39,690 --> 00:43:42,130 Ezután a következő sorban csináltunk * x. 856 00:43:42,130 --> 00:43:46,070 Ez volt Nick varázspálca A dereferencing. 857 00:43:46,070 --> 00:43:49,780 Hogy fel 42 a memóriában rámutatott x. 858 00:43:49,780 --> 00:43:51,600 >> De ez az, ahol a dolgok ment rettenetesen rossz. 859 00:43:51,600 --> 00:43:51,820 Nem igaz? 860 00:43:51,820 --> 00:43:53,550 Megpróbáltuk dereference y. 861 00:43:53,550 --> 00:43:55,620 De y volt néhány hamis érték, igaz? 862 00:43:55,620 --> 00:43:57,720 >> Ez a nyíl a bal alsó sarok, nem 863 00:43:57,720 --> 00:43:58,950 valójában mutat semmit. 864 00:43:58,950 --> 00:44:01,520 Elég csinál, amit volt itt a fórumon. 865 00:44:01,520 --> 00:44:05,900 Tehát rossz dolgok történnek, szegmentálás hiba, vagy Muci hiba, ebben az esetben. 866 00:44:05,900 --> 00:44:10,800 >> De ha majd rögzíteni, hogy ennek révén x kap y hogyan működik a történet változás? 867 00:44:10,800 --> 00:44:15,760 Nos, ha én x lesz y, ez gyakorlatilag ugyanaz, mint a mondás 868 00:44:15,760 --> 00:44:19,235 Bármi is ez, valami Ox- lesz ugyanaz itt, 869 00:44:19,235 --> 00:44:20,080 Ox-valamit. 870 00:44:20,080 --> 00:44:22,970 Vagy képszerűen fogjuk felhívni egy nyíl. 871 00:44:22,970 --> 00:44:25,530 >> Tehát itt a táblán Muci, a következő sor 872 00:44:25,530 --> 00:44:28,350 kód, * y azt ott. 873 00:44:28,350 --> 00:44:29,400 Hol van? 874 00:44:29,400 --> 00:44:30,820 Ez azt jelenti, mint itt. 875 00:44:30,820 --> 00:44:36,050 >> És amikor frissíteni, hogy kell 13 csak megy, és magában foglalja a 876 00:44:36,050 --> 00:44:39,470 13. írás itt. 877 00:44:39,470 --> 00:44:44,130 Így talán nem teljesen egyértelmű első pillantásra. 878 00:44:44,130 --> 00:44:47,740 De ahhoz, hogy újra bedugni, és ugyanazt a zsargon hogy Muci használta itt, így 879 00:44:47,740 --> 00:44:50,485 Az első két osztja a mutatók, x és y, de nem a pointees. 880 00:44:50,485 --> 00:44:54,750 És pointees nem általánosan használt kifejezés. 881 00:44:54,750 --> 00:44:56,120 De a mutató teljesen az. 882 00:44:56,120 --> 00:44:59,200 De mi is rámutatott A a Muci nómenklatúra. 883 00:44:59,200 --> 00:45:01,660 >> Ez a következő sorban, persze, oszt egy int pointee. 884 00:45:01,660 --> 00:45:04,840 Tehát egy darab memória - ahogy húztam át a a jobb oldalon -, és állítsa 885 00:45:04,840 --> 00:45:06,470 x egyenlő értelme. 886 00:45:06,470 --> 00:45:11,350 Ez dereferences x tárolni 42 a memória ez mutatva. 887 00:45:11,350 --> 00:45:13,380 És ez, természetesen, egy rossz dolog. 888 00:45:13,380 --> 00:45:15,600 Mivel y nem mutat A semmit. 889 00:45:15,600 --> 00:45:16,530 Ez rögzíti azt. 890 00:45:16,530 --> 00:45:18,240 Tehát ez még mindig hibás program. 891 00:45:18,240 --> 00:45:21,580 Csak azért, mert mi vagyunk fúj át a kódot sorról sorra, és azt mondja, hát igen, 892 00:45:21,580 --> 00:45:22,690 hagyja ott lezuhan. 893 00:45:22,690 --> 00:45:23,420 Ez egy rossz dolog. 894 00:45:23,420 --> 00:45:26,790 Valószínű, hogy a program csak úgy megszakítás összesen ebben a sorban. 895 00:45:26,790 --> 00:45:30,550 De ha úgy döntesz, hogy távolítsa el a lezuhant vonalat, és cserélje ki az utolsó két 896 00:45:30,550 --> 00:45:32,470 vonalak ott hozzá - 897 00:45:32,470 --> 00:45:35,310 a mutató feladat - y arra utalnak, hogy x pontként t. 898 00:45:35,310 --> 00:45:39,280 És akkor dereference y egy nagyon biztonságos módon. 899 00:45:39,280 --> 00:45:41,520 >> Szóval, ha ez hagy minket? 900 00:45:41,520 --> 00:45:45,350 Nos, kiderült, hogy a motorháztető alatt A CS50 könyvtár pointerek 901 00:45:45,350 --> 00:45:46,320 használják szerte. 902 00:45:46,320 --> 00:45:48,910 És akkor valóban elkezd héja vissza, hogy a réteg nemsokára. 903 00:45:48,910 --> 00:45:51,740 De kiderül is, egy kifejezés, néhányan lehet, hogy ismeri, 904 00:45:51,740 --> 00:45:54,580 különösen kényelmes, valójában, hogy egy nagyon népszerű 905 00:45:54,580 --> 00:45:56,390 honlapon, vagy a verem túlcsordulás, ezekben a napokban. 906 00:45:56,390 --> 00:45:58,720 >> De ez tényleg nagyon technikai értelemben. 907 00:45:58,720 --> 00:46:00,160 Azt már tudjuk, hogy mi a verem. 908 00:46:00,160 --> 00:46:02,550 Ez olyan, mint egy halom tálcák belsejében egy étkező. 909 00:46:02,550 --> 00:46:05,140 >> Vagy azon belül a számítógép memória egyébként annak a kereteket 910 00:46:05,140 --> 00:46:06,900 által használt funkcióit. 911 00:46:06,900 --> 00:46:10,760 Nos, kiderült, hogy azért, mert az, hogy nagyon egyszerű végrehajtása 912 00:46:10,760 --> 00:46:14,970 memória és a kereteket az úgynevezett verem, akkor valóban átveszi az irányítást 913 00:46:14,970 --> 00:46:17,050 a számítógépes rendszer viszonylag könnyen. 914 00:46:17,050 --> 00:46:22,180 Lehet feltörni a rendszert, ha az emberek mint mi, nem írtam a kódot 915 00:46:22,180 --> 00:46:23,300 különösen jól. 916 00:46:23,300 --> 00:46:26,670 >> Ha az emberek, mint mi használ darabokat memória vagy tömböket használnak - 917 00:46:26,670 --> 00:46:27,810 még gyakrabban - 918 00:46:27,810 --> 00:46:31,800 de néha elfelejti, hogy ellenőrizze a határait a tömb, mint ahogy azt 919 00:46:31,800 --> 00:46:38,470 hogy magát néha, és iterált túl messze túl a végén egy tömb. 920 00:46:38,470 --> 00:46:40,520 A legjobb esetben, a programban Lehet, hogy csak összeomlik. 921 00:46:40,520 --> 00:46:42,280 Szegmentációs hibát, kedves A kínos. 922 00:46:42,280 --> 00:46:45,480 Nem jó, de ez nem feltétlenül egy igen rossz dolog. 923 00:46:45,480 --> 00:46:49,480 >> De ha a program valójában a valós felhasználók számítógépein, ha fut 924 00:46:49,480 --> 00:46:53,070 a honlapon, hogy a tényleges random emberek az interneten az ütő, és lehetővé 925 00:46:53,070 --> 00:46:56,690 emberek indukál rossz dolgok a kód általában nem jó dolog, mert 926 00:46:56,690 --> 00:46:59,930 ez azt jelenti, a lehetőséget, hogy irányítást a számítógép. 927 00:46:59,930 --> 00:47:01,350 És ez fog keresni egy kicsit rejtélyes. 928 00:47:01,350 --> 00:47:04,570 De azt gondoltam, megijeszteni Ez utóbbi példa itt. 929 00:47:04,570 --> 00:47:05,650 >> Íme egy példa a kódot. 930 00:47:05,650 --> 00:47:07,370 És van egy jó Wikipedia cikket, hogy sétál 931 00:47:07,370 --> 00:47:08,530 ezt részletesebben. 932 00:47:08,530 --> 00:47:13,890 Van fő alján hívás foo, átadva argv 1. 933 00:47:13,890 --> 00:47:15,750 És ez még csak, így futtassa a programot, és adja át 934 00:47:15,750 --> 00:47:17,080 egy tetszőleges bemenet. 935 00:47:17,080 --> 00:47:20,180 >> És akkor ize bejelenteni felső A fogadáshoz string, vagy több 936 00:47:20,180 --> 00:47:21,700 pontosan, a char *. 937 00:47:21,700 --> 00:47:23,860 Ezután kijelenti, egy sor karakter. 938 00:47:23,860 --> 00:47:27,130 Nevezzük a puffer, általában A 12-es méretű. 939 00:47:27,130 --> 00:47:30,900 Így 12 karakter elfér benne , hogy a tömb neve c. 940 00:47:30,900 --> 00:47:33,510 >> És akkor használja ezt az új funkció, , ami új, de nem nehéz 941 00:47:33,510 --> 00:47:34,930 érthető, memória másolás. 942 00:47:34,930 --> 00:47:39,290 A másolat a memóriát, bár, ami A változó múlt n, amit a 943 00:47:39,290 --> 00:47:42,080 felhasználó beírt argv be az 1. c. 944 00:47:42,080 --> 00:47:43,090 Hány bájt? 945 00:47:43,090 --> 00:47:44,260 A string hossza bar. 946 00:47:44,260 --> 00:47:48,380 >> Más szóval, ha a felhasználó típusok h-e-l-l-o Adja meg a karakterlánc hosszát 947 00:47:48,380 --> 00:47:49,260 Hello öt. 948 00:47:49,260 --> 00:47:52,790 Tehát öt olyan byte fog kapni másolni a tömb nevezett C, ami 949 00:47:52,790 --> 00:47:54,110 az a 12-es méretű. 950 00:47:54,110 --> 00:47:58,710 De amit a felhasználó beír egy sokkal hosszabb szót, ami 13 karakter vagy 14 951 00:47:58,710 --> 00:48:01,250 karakterek vagy 100 karakter, vagy több? 952 00:48:01,250 --> 00:48:02,660 >> Hová fognak menni? 953 00:48:02,660 --> 00:48:06,090 Nos, hogy a keret, hogy a tálca Az ebédlőben stack, 954 00:48:06,090 --> 00:48:06,930 fognak menni. 955 00:48:06,930 --> 00:48:10,080 És ez csak fog kezdeni felülírja Más dolog, hogy ez már 956 00:48:10,080 --> 00:48:12,880 azon a stack, túláradó a köteget, hogy úgy mondjam. 957 00:48:12,880 --> 00:48:14,780 >> Tehát képszerűen, gondolom ezt így. 958 00:48:14,780 --> 00:48:17,970 Ez csak egy színes változata A képen már rajz. 959 00:48:17,970 --> 00:48:20,060 Az alsó, mondjuk, a legfontosabb. 960 00:48:20,060 --> 00:48:24,690 És a tetején, amit látsz jelenleg a keret, színkóddal most egy 961 00:48:24,690 --> 00:48:26,090 nevű függvényt ize. 962 00:48:26,090 --> 00:48:30,170 De ami itt még érdekesebb a ize, hogy itt van a keretben. 963 00:48:30,170 --> 00:48:32,860 Szóval ez készült, mint én nem, de a világoskék. 964 00:48:32,860 --> 00:48:35,220 És most ez az, ahol c tartó 0. megy. 965 00:48:35,220 --> 00:48:37,410 És ez az, ahol c konzol 11 lesz a végén. 966 00:48:37,410 --> 00:48:39,670 >> Más szóval, ez történik, hogy képviseli, mint egy négyzet. 967 00:48:39,670 --> 00:48:42,320 De ha csak folyamatosan plopping bytes le - vagy karakter - ők lesz a vége 968 00:48:42,320 --> 00:48:46,070 akár a 0 helyen egészen 11 mert 0 indexelt. 969 00:48:46,070 --> 00:48:49,170 >> De hol van a 13. karakter majd a végén? 970 00:48:49,170 --> 00:48:50,310 Hol van a 14? 971 00:48:50,310 --> 00:48:52,430 Hol van a 50. karakter majd a végén? 972 00:48:52,430 --> 00:48:54,070 >> Ez lesz, hogy folyamatosan megy le. 973 00:48:54,070 --> 00:48:57,350 Mert bár már felhívta a kép a verem felnövő, a 974 00:48:57,350 --> 00:48:59,920 címek, kiderül, megy kis címek, kis 975 00:48:59,920 --> 00:49:01,830 mutatók, a nagy címeket. 976 00:49:01,830 --> 00:49:03,540 Így csak megy fel és fel. 977 00:49:03,540 --> 00:49:05,660 >> Tehát, ha a felhasználó által hello, ez nagyszerű. 978 00:49:05,660 --> 00:49:08,650 Nem bug, nem probléma, mindenki biztonságban van. 979 00:49:08,650 --> 00:49:11,940 De ha a felhasználó beír mit fogunk hívás kontradiktórius kód képviselt 980 00:49:11,940 --> 00:49:16,040 általában mint a, támadás, támadás, támadás, támadás, mi történik? 981 00:49:16,040 --> 00:49:19,760 >> Nos, ha minden a bemeneti, hogy a felhasználó beírt nem csak egy baráti 982 00:49:19,760 --> 00:49:21,540 vagy támadó karakterlánc. 983 00:49:21,540 --> 00:49:24,050 Ez valójában egy karaktersor hogy ha össze azt, 984 00:49:24,050 --> 00:49:26,050 ez valójában kódot. 985 00:49:26,050 --> 00:49:29,570 Lehet, hogy kód, amely törli az összes fájlokat a merevlemezen, vagy küld spam 986 00:49:29,570 --> 00:49:30,810 vagy valami ilyesmi. 987 00:49:30,810 --> 00:49:35,110 Figyeljük meg, hogy mi a legfontosabb az, hogy ha a rossz fickó szerencsés, hogy 988 00:49:35,110 --> 00:49:37,830 felülírja a piros darab memória - 989 00:49:37,830 --> 00:49:41,080 amit nem felhívni a kép, de a Wikipedia kép itt található - 990 00:49:41,080 --> 00:49:42,890 az úgynevezett visszatérési címet. 991 00:49:42,890 --> 00:49:47,470 >> Amikor az élelmiszer visszatér, amikor csere visszatér, hogyan működik a számítógép tudja, hogy megy 992 00:49:47,470 --> 00:49:49,790 itt az ide? 993 00:49:49,790 --> 00:49:52,920 Vagy a tech szegmensben fölött, hogy nem is tudom, hogy menjen a csere 994 00:49:52,920 --> 00:49:54,870 kód - a 0 és 1-es alkotó csere - 995 00:49:54,870 --> 00:49:56,020 vissza a főoldalra? 996 00:49:56,020 --> 00:50:00,450 Van egy úgynevezett visszatérési cím tárolt ugyanazon verem keret, a 997 00:50:00,450 --> 00:50:02,140 ugyanaz cafeteria tálcát. 998 00:50:02,140 --> 00:50:06,080 >> Tehát, ha a rossz srác okos ahhoz, hogy fel támadó kódot, támadó kódot, támadás 999 00:50:06,080 --> 00:50:07,960 kódot, és kap elég szerencsés - 1000 00:50:07,960 --> 00:50:11,630 gyakran a tárgyalás és a hiba - a felülírja a vörös-mail címet, 1001 00:50:11,630 --> 00:50:14,360 A cím és az értesítés a csúcsra. 1002 00:50:14,360 --> 00:50:16,830 Figyelmeztetés 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Meg van írva hátra fel tetején ok akkor talán újra. 1004 00:50:20,650 --> 00:50:22,050 Ez az a szám. 1005 00:50:22,050 --> 00:50:25,790 >> Tehát, ha a rossz fickó szerencsés vagy elég okos ahhoz, hogy felülírja a piros 1006 00:50:25,790 --> 00:50:29,480 szalag memória a címét kódot, hogy ő is valahogy 1007 00:50:29,480 --> 00:50:34,980 fecskendeznek a számítógép, tudod akinek kód lesz vissza 1008 00:50:34,980 --> 00:50:38,260 amint foo történik végrehajtása? 1009 00:50:38,260 --> 00:50:39,440 >> A rosszfiú kódot. 1010 00:50:39,440 --> 00:50:43,610 Szóval ez a támadó kódot, AAA, megint, talán spam, lehet, hogy törölje az összes fájlt 1011 00:50:43,610 --> 00:50:44,500 a merevlemezen. 1012 00:50:44,500 --> 00:50:48,740 De ez az, amit igazán a verem túlcsordulás van, vagy egy puffertúlcsordulási vagy 1013 00:50:48,740 --> 00:50:51,060 puffer túlcsordulás támadás. 1014 00:50:51,060 --> 00:50:54,400 >> És ez hihetetlenül, hihetetlenül gyakori a mai napig programokkal írt 1015 00:50:54,400 --> 00:50:58,220 C, C + +, és még néhány más nyelveken. 1016 00:50:58,220 --> 00:51:02,275 Ezen ijesztő figyelmét, fogjuk végén egy vicc. 1017 00:51:02,275 --> 00:51:03,230 >> [Nevetés] 1018 00:51:03,230 --> 00:51:04,550 >> Viszlát szerdán. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 A következő CS50 - 1021 00:51:10,310 --> 00:51:15,920 Szóval minden a lemezen lámpák ma, de várj, zsírmentes tej, fél a telefon 1022 00:51:15,920 --> 00:51:17,850 könyv, a narancslé hogy ittam ma. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB-kábel, a kulcs. 1025 00:51:22,780 --> 00:51:24,800 >> [MUSIC PLAYING]