1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Zenelejátszás] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: Rendben. 4 00:00:12,640 --> 00:00:14,525 Ez CS50. 5 00:00:14,525 --> 00:00:16,009 És ez a hét elején 5. 6 00:00:16,009 --> 00:00:18,050 És lehet, hogy észrevette, néhány az anyag 7 00:00:18,050 --> 00:00:21,050 kezd egy kicsit komplex, a kis sűrűbb. 8 00:00:21,050 --> 00:00:24,560 >> És ez nagyon egyszerű, különösen, ha voltál a szokás egy ideig, 9 00:00:24,560 --> 00:00:28,600 hogy megpróbálja irkál le leginkább bármit teszünk, mondunk az osztályban. 10 00:00:28,600 --> 00:00:31,626 De észre, hogy ez talán nem az ideális pedagógiai megközelítés 11 00:00:31,626 --> 00:00:34,250 a tanulás az ilyen anyag és anyagi általában. 12 00:00:34,250 --> 00:00:37,250 És örülünk, hogy be, hogy CS50 saját Gheng 13 00:00:37,250 --> 00:00:39,780 Gong megkezdte a felkészülést a kanonikus sor jegyzetek 14 00:00:39,780 --> 00:00:42,100 a tanfolyam, a remény, amely szerint, egy, ezeket 15 00:00:42,100 --> 00:00:44,030 nem csak arra szolgálnak, mint egy referencia-és erőforrás 16 00:00:44,030 --> 00:00:47,410 felülvizsgálatára anyagi és megy vissza az anyagot, amely esetleg 17 00:00:47,410 --> 00:00:51,230 szökött meg az első körben, de azért is, hogy a feje is több 18 00:00:51,230 --> 00:00:53,740 felfelé, mint lefelé, amikor eljön az ideje, az előadás, 19 00:00:53,740 --> 00:00:56,960 így lehet, hogy vegyenek részt több elgondolkozva, mint 20 00:00:56,960 --> 00:00:59,170 szemben több Scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Ezzel azt mondta, amit talál A weboldal olyan dokumentumokat, mint ez. 22 00:01:02,510 --> 00:01:04,660 És értesítés, a bal felső sarokban, ott van nem csupán a tartalomjegyzék, 23 00:01:04,660 --> 00:01:06,920 hanem idő kódok azonnal ugrik meg 24 00:01:06,920 --> 00:01:09,077 a megfelelő rész a video on-line. 25 00:01:09,077 --> 00:01:11,410 És mi Chang itt tett van, lényegében, dokumentált 26 00:01:11,410 --> 00:01:13,340 ami ebben a különleges előadás. 27 00:01:13,340 --> 00:01:16,370 És sok előadások már online most ezzel URL. 28 00:01:16,370 --> 00:01:20,110 És mi továbbra is tegye a maradék Ezen a végén ezen a héten, 29 00:01:20,110 --> 00:01:22,380 így nem kihasználni, hogy az erőforrás. 30 00:01:22,380 --> 00:01:25,740 >> Tehát minden további nélkül, elkezdtük húzza vissza 31 00:01:25,740 --> 00:01:28,180 a réteg, amely már karakterlánc egy ideig. 32 00:01:28,180 --> 00:01:30,670 És mit mondunk a húr valójában a múlt héten? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Így char csillag. 35 00:01:32,900 --> 00:01:34,900 És char csillag, nos, mi nem is jelent valójában? 36 00:01:34,900 --> 00:01:37,150 Nos, ebben az időben, ha mi már hívogat a funkció, 37 00:01:37,150 --> 00:01:40,450 mint getString és tárolás az úgynevezett visszatérés 38 00:01:40,450 --> 00:01:42,910 értéke getString egy változó-- hívják 39 00:01:42,910 --> 00:01:47,721 s típus string-- voltunk írásban a sort, ott fent. 40 00:01:47,721 --> 00:01:49,970 És ez csak akkor, ha látom kézírás nagyított itt 41 00:01:49,970 --> 00:01:51,930 nem tudom, hogy milyen kegyetlen is ez. 42 00:01:51,930 --> 00:01:54,180 >> Azonban tegyük fel, hogy, a jobb oldali 43 00:01:54,180 --> 00:01:57,070 az, hogy ennek ellenére az ésszerű ábrázolása, hogy mi a 44 00:01:57,070 --> 00:01:58,880 folyik mindez idő getString. 45 00:01:58,880 --> 00:02:00,380 getString természetesen kap egy húr. 46 00:02:00,380 --> 00:02:01,691 De mit is jelent valójában? 47 00:02:01,691 --> 00:02:04,190 Ez azt jelenti, hogy lesz egy darab memóriát az operációs rendszer 48 00:02:04,190 --> 00:02:06,040 meghívásával funkció, az úgynevezett malloc. 49 00:02:06,040 --> 00:02:07,390 De erről bővebben később. 50 00:02:07,390 --> 00:02:09,139 És akkor feltölti hogy darab memória 51 00:02:09,139 --> 00:02:11,764 A levelek a felhasználó beírt, majd, természetesen, 52 00:02:11,764 --> 00:02:14,800 a null karakter, vagy backslash nulla a legvégén. 53 00:02:14,800 --> 00:02:18,280 >> Eközben a bal oldali ezt a történetet, minden ebben az időben, 54 00:02:18,280 --> 00:02:20,850 mi már nyilvánító változó, mint s. 55 00:02:20,850 --> 00:02:24,770 És hogy a változó, amit most indul hívás a mutató. 56 00:02:24,770 --> 00:02:29,190 Ez nem egy doboz belsejében, amely tesszük a húr, Daven, önmagában, 57 00:02:29,190 --> 00:02:32,550 hanem teszünk hogy a tér dobozt a bal oldalon, hogy pontosan mit? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Igen? 60 00:02:35,390 --> 00:02:37,118 >> Közönség: címe ahol ez található a memóriában. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Pontosan. 62 00:02:38,118 --> 00:02:40,690 A cím, ahol Daven található a memóriában. 63 00:02:40,690 --> 00:02:44,650 És nem ott, ahol az összes Daven található, önmagában, de konkrétan a cím 64 00:02:44,650 --> 00:02:45,150 mi? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Igen? 67 00:02:46,810 --> 00:02:47,460 >> Közönség: Az első karakter. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: Az első karakter a Daven, ami, ebben az esetben, 69 00:02:50,209 --> 00:02:53,820 Általam javasolt önkényesen és irreálisan 1 OX1, 70 00:02:53,820 --> 00:02:55,910 ami éppen azt jelenti, hogy hexadecimális szám 1. 71 00:02:55,910 --> 00:02:57,993 De ez valószínűleg hogy egy sokkal nagyobb szám 72 00:02:57,993 --> 00:03:01,260 hogy talán rajzolni a 0x előtag, 73 00:03:01,260 --> 00:03:02,806 ami hexadecimális karakter. 74 00:03:02,806 --> 00:03:05,930 És mivel nem kell tudni, hogy hol a többi karaktereiből Daven 75 00:03:05,930 --> 00:03:09,860 vannak, mert mi egyszerű tervezés döntés, amit sok évvel ezelőtt? 76 00:03:09,860 --> 00:03:10,548 Igen? 77 00:03:10,548 --> 00:03:11,651 >> Közönség: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Igen, pontosan. 79 00:03:12,900 --> 00:03:18,100 A backslash 0. lehetővé teszi, hogy, bár lineáris idő, hogy áthalad a húr, 80 00:03:18,100 --> 00:03:20,400 séta balról jobbra, egy for ciklus, vagy egy ideig 81 00:03:20,400 --> 00:03:22,608 hurok, vagy valami hasonló hogy, és meghatározza, ó, itt 82 00:03:22,608 --> 00:03:24,751 a vége az adott húr. 83 00:03:24,751 --> 00:03:27,000 Tehát csak az a cím, a kezdete egy húr, 84 00:03:27,000 --> 00:03:30,290 tudjuk elérni a teljes egészében , mert mind ez ideig, 85 00:03:30,290 --> 00:03:32,030 egy sor nemrég volt char csillag. 86 00:03:32,030 --> 00:03:36,370 >> Szóval biztosan jó, hogy továbbra is használja A CS50 könyvtár és ezt absztrakció, 87 00:03:36,370 --> 00:03:38,440 hogy úgy mondjam, de majd kezd, hogy pontosan 88 00:03:38,440 --> 00:03:41,230 mi folyik alatt az egész idő alatt. 89 00:03:41,230 --> 00:03:45,260 Szóval lehet felidézni ezt a példát, is, a múlt idő, hasonlítsa össze 0, 90 00:03:45,260 --> 00:03:47,300 amely valójában nem összehasonlítani. 91 00:03:47,300 --> 00:03:49,070 De elkezdtünk megoldani ezt. 92 00:03:49,070 --> 00:03:52,020 >> De mint talán egy üdítő, Lehet, hogy én érdekelhet valakit 93 00:03:52,020 --> 00:03:54,261 egy rózsaszín elefánt ma, szintén Chang? 94 00:03:54,261 --> 00:03:55,760 Mi lenne, ha előtte? [Nem hallható]. 95 00:03:55,760 --> 00:03:56,660 Gyere fel. 96 00:03:56,660 --> 00:03:58,740 >> És addig, ahogy jön, hadd 97 00:03:58,740 --> 00:04:01,670 úgy egy pillanatra, milyen ez a kód valójában csinál. 98 00:04:01,670 --> 00:04:04,917 Ez nyilvánította két változót fel top, s és t, és felszólította getString. 99 00:04:04,917 --> 00:04:08,250 Ez nem egy nagyon felhasználóbarát program, mert nem mondja meg, mit kell tennie. 100 00:04:08,250 --> 00:04:10,541 De nézzük csak feltételezni vagyunk összpontosítva a szaftos rész. 101 00:04:10,541 --> 00:04:14,470 És akkor mi, ha s egyenlő egyenlő t, meg kell mondani printf, 102 00:04:14,470 --> 00:04:16,170 beírt ugyanezt. 103 00:04:16,170 --> 00:04:16,670 Helló. 104 00:04:16,670 --> 00:04:17,050 Mi a neve? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, Örülök, hogy találkoztunk. 107 00:04:19,529 --> 00:04:21,800 Így a kihívás kézzel az elefánt 108 00:04:21,800 --> 00:04:25,230 hogy először készítsen nekünk egy képet, amit az képviselt az az első két 109 00:04:25,230 --> 00:04:25,970 vonalak. 110 00:04:25,970 --> 00:04:28,139 Tehát s és t lehet képviselte, hogy a képernyőn? 111 00:04:28,139 --> 00:04:30,680 És ha csak rajzolni a az ujját a nagy képernyőn. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Szóval van két fél, hogy mindkét oldalán az egyenlet. 114 00:04:34,510 --> 00:04:37,760 Szóval van ok a bal oldalon, és akkor getString a jobb oldalon. 115 00:04:37,760 --> 00:04:40,540 És akkor ott van t a bal oldalon, majd getString a jobb oldalon. 116 00:04:40,540 --> 00:04:42,630 Szóval, hogyan lehet, hogy elkezdjük rajz egy képet, amely 117 00:04:42,630 --> 00:04:46,340 képviseli, mi folyik itt Itt a memóriában, mit mondana? 118 00:04:46,340 --> 00:04:49,150 És hadd legyen magyarázza mit csinálsz, ahogy megy. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 Nos, először is, akkor kérni teszi, hogy a bemeneti karakterlánc. 121 00:04:58,890 --> 00:05:00,439 És ez store-- Ó, bocsánat. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Jó. 124 00:05:01,730 --> 00:05:03,330 És ez az úgynevezett mi? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Folytasd. 127 00:05:04,450 --> 00:05:05,575 Nem akartam félbeszakítani. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Sajnálom. 129 00:05:07,060 --> 00:05:14,237 Így lenne bemenet be A cím of-- nem biztos. 130 00:05:14,237 --> 00:05:17,320 Nem emlékszem pontosan, a szám, de azt hiszem, volt 0-tól indul. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: Rendben van, mert tettem a számok felfelé, 132 00:05:18,420 --> 00:05:19,650 így nincs helyes válasz. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Kezdve a 0. ív. 134 00:05:22,105 --> 00:05:24,000 >> David J. MALAN: OK, tehát elem 0-ra. 135 00:05:24,000 --> 00:05:24,765 Persze. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: És ha volt mint csak egy két letter-- 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, vissza hozzád. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE Szóval elem 0, és majd elem 1 vagy 2 elem. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: És melyik darab A kép rajzolsz most? 140 00:05:36,670 --> 00:05:37,690 A hívás getString? 141 00:05:37,690 --> 00:05:38,830 Vagy a nyilatkozat s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: A nyilatkozat s, azt hiszem. 143 00:05:42,890 --> 00:05:45,980 Ó, a getString, mert akkor kell bevinni minden [? terület. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Jó. 145 00:05:46,510 --> 00:05:47,051 Pontosan. 146 00:05:47,051 --> 00:05:49,300 Annak ellenére, hogy ezt hatékonyan vissza egy tömb, visszahívás, 147 00:05:49,300 --> 00:05:53,300 ha visszaértünk a húr, tudjuk index abba a húr a 01-es és 2. 148 00:05:53,300 --> 00:05:56,180 Technikailag, ezek valószínűleg képviseli az egyes címek, 149 00:05:56,180 --> 00:05:57,100 de ez rendben van. 150 00:05:57,100 --> 00:06:00,170 >> Tehát tegyük fel, ha tudok csak gyors továbbítják, ahol abbahagytuk 151 00:06:00,170 --> 00:06:04,320 utoljára, ha az egyik a húrok volt g ​​a b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, így ami Gabe bemenet, hogyan lehet, hogy az általunk képviselt s most? 153 00:06:10,337 --> 00:06:12,670 Ha ez a memória, ami visszakerült a getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: lenne képviseli egy ív? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: egy ív? 157 00:06:18,750 --> 00:06:19,130 Nos, nem. 158 00:06:19,130 --> 00:06:21,171 Mondjuk, képileg, hadd menjen előre 159 00:06:21,171 --> 00:06:25,710 és javasolja, hogy ha ez s, ez a visszatérési érték getString. 160 00:06:25,710 --> 00:06:29,482 És akkor már húzott ezt a 0, 1, 2, ami teljesen indokolt, hiszen 161 00:06:29,482 --> 00:06:30,940 képes index a húr, mint olyan. 162 00:06:30,940 --> 00:06:33,340 De csak azért, hogy összhangban legyen utoljára, hadd menjen előre 163 00:06:33,340 --> 00:06:37,310 és önkényesen javasolja, hogy ez a a cím 1., ez a cím a 2. 164 00:06:37,310 --> 00:06:39,597 ez Cím 3, és így tovább. 165 00:06:39,597 --> 00:06:41,430 És így, csak a szuper világos, hogy mi folyik itt 166 00:06:41,430 --> 00:06:44,580 menni s ennek eredményeként, hogy a első sorban a kód, mit mondana? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: 1. cím? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Pontosan. 169 00:06:46,420 --> 00:06:47,190 Így kezelni 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 És közben, hadd menjen előre, és kettős sok, amit tettél 172 00:06:51,230 --> 00:06:52,740 és adjunk a saját t itt. 173 00:06:52,740 --> 00:06:56,340 Ha én, hogy írja be Gabe ismét, másodszor, 174 00:06:56,340 --> 00:07:01,530 amikor megkérdezi a getString, ahol, persze, Gabe fog menni? 175 00:07:01,530 --> 00:07:02,280 Nos, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Mint itt? 178 00:07:05,975 --> 00:07:06,850 David J. MALAN: Igen. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Vagy az is ugyanabban a dobozok? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Hadd javasol, igen, pontosan, így ezek a további dobozok. 181 00:07:11,940 --> 00:07:15,230 De ami legfontosabb most az, hogy még bár már készült ilyen csinos közel 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ezt A 0x2-- a valóságban, 183 00:07:18,650 --> 00:07:25,750 ez most lehet, cím 0x10, például, és 0x11, és 0x12, 184 00:07:25,750 --> 00:07:26,870 és így tovább. 185 00:07:26,870 --> 00:07:29,955 És így, ha ez a helyzet, mi fog végül itt t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. MALAN: Pontosan. 188 00:07:31,830 --> 00:07:33,180 Így 0x10. 189 00:07:33,180 --> 00:07:34,570 És most, a végső kérdés. 190 00:07:34,570 --> 00:07:37,510 Ön, messze kellett dolgozni a legnehezebb egy elefánt eddig. 191 00:07:37,510 --> 00:07:42,650 Mára, ha húzza fel a kódot újra, amikor én, sorban három, 192 00:07:42,650 --> 00:07:47,630 ha s értéke egyenlő t, mi vagyok én valójában összehasonlítjuk, hogy már készült itt? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: A két címet? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Pontosan. 195 00:07:50,270 --> 00:07:53,350 Szóval azt mondom, s azonos azonos t? 196 00:07:53,350 --> 00:07:56,210 Más szavakkal, az 1 egyenlő egyenlő 10? 197 00:07:56,210 --> 00:07:59,710 És természetesen, a nyilvánvaló válasz most nem. 198 00:07:59,710 --> 00:08:02,920 És ez a program végül a nyomdába mit mondanál? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: lenne, beírt ugyanaz a dolog? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Tehát, ha s értéke 1 és 10 t? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: beírt különböző dolog. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Pontosan. 204 00:08:13,570 --> 00:08:14,480 Beírt különböző dolog. 205 00:08:14,480 --> 00:08:14,850 Rendben. 206 00:08:14,850 --> 00:08:16,714 Így a tapsot, ha tudnánk, itt. 207 00:08:16,714 --> 00:08:17,214 [Taps] 208 00:08:17,214 --> 00:08:17,708 Ez fájdalmas. 209 00:08:17,708 --> 00:08:18,208 Tudom. 210 00:08:18,208 --> 00:08:19,684 Szép munka. 211 00:08:19,684 --> 00:08:24,690 Tehát most lássuk, ha nem tudjuk kötekedik kívül mi a fix volt. 212 00:08:24,690 --> 00:08:28,040 És természetesen, ha fix Ez-- amelyet én most képviselt green-- 213 00:08:28,040 --> 00:08:29,690 tettünk egy pár fejlesztések itt. 214 00:08:29,690 --> 00:08:32,409 Először is, mint ahogy a józan ész nézd, én vagyok az első ellenőrzés 215 00:08:32,409 --> 00:08:35,110 ha s értéke nulla és t értéke null. 216 00:08:35,110 --> 00:08:39,440 És csak hogy tisztázzuk, ha esetleg s vagy t semmis a kód, mint ez? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Amikor lehet, s vagy t lehet null. 219 00:08:44,490 --> 00:08:44,990 Igen? 220 00:08:44,990 --> 00:08:45,990 >> KÖZÖNSÉG: [nem hallható]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Pontosan. 223 00:08:50,510 --> 00:08:52,840 Ha a húr, hogy a felhasználó beírt ez így túl hosszú 224 00:08:52,840 --> 00:08:56,140 hogy illeszkedjen a memóriába, vagy valamilyen furcsa sarok hasonló esetben, hogy a 225 00:08:56,140 --> 00:08:59,010 getString, mint látni fogjuk, a szó szoros értelmében Ma, a dokumentáció, 226 00:08:59,010 --> 00:09:02,330 azt mondja, hogy vissza fog térni NULL speciális őrszem érték, 227 00:09:02,330 --> 00:09:05,417 vagy csak egyfajta speciális szimbólum azt jelenti, hogy valami baj. 228 00:09:05,417 --> 00:09:07,500 Ezért szeretnénk, hogy ellenőrizze a hogy azért, mert kiderül 229 00:09:07,500 --> 00:09:09,720 hogy null egy nagyon veszélyes értéket. 230 00:09:09,720 --> 00:09:14,250 >> Gyakran előfordul, hogy ha megpróbál tenni valamit a null járó function-- halad 231 00:09:14,250 --> 00:09:17,470 a bemenet, az instance-- ezt a funkciót Lehet nagyon összeomlik, és ezzel együtt, 232 00:09:17,470 --> 00:09:19,090 vegye le az egész programot. 233 00:09:19,090 --> 00:09:22,570 Szóval ez a harmadik sorban most csak a józan eszét ellenőrizze, hibaellenőrzés, ha úgy tetszik. 234 00:09:22,570 --> 00:09:25,450 Ez egy jó szokás most számunkra, hogy a bármikor is 235 00:09:25,450 --> 00:09:28,050 próbáld meg használni egy értéket, amely lehet, esetleg, lehet null. 236 00:09:28,050 --> 00:09:32,000 >> Most, a negyedik sorban itt, "Ha strcmp (s, t):" Nos, 237 00:09:32,000 --> 00:09:33,180 mi ez a szó? 238 00:09:33,180 --> 00:09:36,750 Nos, azt mondta, ez egy nagyon tömören nevű függvény karakterlánc összehasonlítás. 239 00:09:36,750 --> 00:09:40,370 És a célja az életben, hogy összehasonlítsa Az első érv ellene második, 240 00:09:40,370 --> 00:09:44,640 nem pedig a saját címét, mint mi akaratlanul egy pillanatra 241 00:09:44,640 --> 00:09:48,270 ezelőtt a vörös kód, de inkább összehasonlítani a két 242 00:09:48,270 --> 00:09:53,210 húrok az emberileg intuitív módon összevetni, ellen, 243 00:09:53,210 --> 00:09:56,690 ellen, ez ellen, és majd megállás, ha és amikor az egyik 244 00:09:56,690 --> 00:09:59,590 vagy mindkét ujjaim üt egy backslash 0. 245 00:09:59,590 --> 00:10:04,530 Tehát valaki évvel ezelőtt végrehajtott strcmp végrehajtása nekünk a funkcionalitás 246 00:10:04,530 --> 00:10:08,890 hogy azt reméltük, mi ütött volna mindössze összehasonlítjuk a két egyszerű értékeket. 247 00:10:08,890 --> 00:10:14,929 >> Most őszintén, én is rajz mindezen különböző számokat. 248 00:10:14,929 --> 00:10:17,470 De a valóság az, hogy én már hogy ezeket az egész idő alatt. 249 00:10:17,470 --> 00:10:19,580 És hadd menjen előre és irkál ki ezeket 250 00:10:19,580 --> 00:10:23,100 , hogy egy pontot, hogy a végén A nap és halad előre, 251 00:10:23,100 --> 00:10:30,160 mi nem igazán fog törődni mit szól a dolgok valójában 252 00:10:30,160 --> 00:10:30,790 a memóriában. 253 00:10:30,790 --> 00:10:34,320 Így nem fogok felhívni ezeket féle számok annyira már, 254 00:10:34,320 --> 00:10:38,970 Én csak egy elvont ezt el a kicsit több barát csak nyilak. 255 00:10:38,970 --> 00:10:42,060 >> Más szavakkal, ha s értéke egy mutató, Nos, nézzük csak felhívni rá, a szó szoros értelmében, 256 00:10:42,060 --> 00:10:45,430 mint a mutató, a mutató nyíl magából valami mást, 257 00:10:45,430 --> 00:10:48,280 és ne aggódj túl sokat többet a minutia ezen címek 258 00:10:48,280 --> 00:10:49,910 ami megint tettem fel egyébként. 259 00:10:49,910 --> 00:10:52,680 De látni fogjuk azokat a címeket, Néha, amikor hibakeresés kód. 260 00:10:52,680 --> 00:10:56,450 >> Most közben, ez a program itt javítások, persze, 261 00:10:56,450 --> 00:10:58,720 ezt a problémát összehasonlításával a két húrok. 262 00:10:58,720 --> 00:11:00,260 De összefutottunk egy másik probléma. 263 00:11:00,260 --> 00:11:03,180 Ez volt a másolat programozza utoljára, 264 00:11:03,180 --> 00:11:06,880 amelynek, próbáltam kihasználni csak az első karakter egy húr. 265 00:11:06,880 --> 00:11:09,620 De mi volt a tünet láttuk utoljára, amikor 266 00:11:09,620 --> 00:11:14,150 a felhasználó beírt egy értéket, mint Gabe kisbetűvel, az s, 267 00:11:14,150 --> 00:11:19,310 akkor hozzá s a t, mint a harmadik sorban van, 268 00:11:19,310 --> 00:11:22,900 aztán megpróbáltam hasznosítani t tartó 0-ra? 269 00:11:22,900 --> 00:11:25,950 Mi volt a hatása változó t tartó 0. itt? 270 00:11:25,950 --> 00:11:27,150 >> Közönség: Megváltoztatta s. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Igen, Megváltoztattam s is. 272 00:11:29,360 --> 00:11:31,050 Mert mi folyik itt? 273 00:11:31,050 --> 00:11:34,130 Nos, lássuk, ha tudom tiszta ezt a képet fel, az alábbiak szerint. 274 00:11:34,130 --> 00:11:41,390 >> Ha s, ismét, a szó g, a, b, e, fordított perjel, 0, s és 275 00:11:41,390 --> 00:11:44,084 mi továbbra rajzot doboz itt, de nem több címet. 276 00:11:44,084 --> 00:11:45,250 Álljunk teszi a dolgokat. 277 00:11:45,250 --> 00:11:47,510 Nézzük csak felhívni a kép egyszerűsítése a világ. 278 00:11:47,510 --> 00:11:52,640 >> Mikor Kijelentem t zsinórral t, amely létrehozza az darab memória. 279 00:11:52,640 --> 00:11:55,850 Tér történetesen 32 bit legtöbb számítógép. 280 00:11:55,850 --> 00:11:59,530 Sőt, ha valaha is hallottam, hogy egy számítógép, amelyek 32 bites architektúra, 281 00:11:59,530 --> 00:12:03,000 igazán fancy-beszél, hogy csak azt jelenti, hogy használ 32 bites címek. 282 00:12:03,000 --> 00:12:05,370 És a technikai félre, Ha valaha is kíváncsi 283 00:12:05,370 --> 00:12:09,630 miért régebbi számítógépeken, ha valóban megpróbálta leves őket a sok RAM, 284 00:12:09,630 --> 00:12:12,360 csak a maximális négy gigabájt RAM-mal, 285 00:12:12,360 --> 00:12:14,860 Hát ez azért van, mert a szó szoros értelmében, a régi számítógép is csak 286 00:12:14,860 --> 00:12:17,250 számítanak olyan magas, mint 4 milliárd, 4 milliárd bájt, 287 00:12:17,250 --> 00:12:20,590 mert a 32-bites számok címét. 288 00:12:20,590 --> 00:12:23,260 >> De minden esetben, az e Például a történet sokkal egyszerűbb. 289 00:12:23,260 --> 00:12:27,250 t is csak egy mutató, vagy tényleg egy char csillag, aka húr. 290 00:12:27,250 --> 00:12:30,860 És hogyan szeretné frissíteni ezt a képet Most, hogy a második sorban a kód, 291 00:12:30,860 --> 00:12:31,950 után a pont, pont, pont? 292 00:12:31,950 --> 00:12:35,845 Amikor én húr t értéke s pontosvessző, hogyan ezt a képet megváltoztatni? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Igen? 295 00:12:38,000 --> 00:12:38,916 >> KÖZÖNSÉG: [nem hallható]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. MALAN: Igen. 298 00:12:42,020 --> 00:12:42,600 Pontosan. 299 00:12:42,600 --> 00:12:45,620 Most tettem egy nyilat a t doboz ugyanarra a címre, 300 00:12:45,620 --> 00:12:47,570 az első betűje az adott. 301 00:12:47,570 --> 00:12:50,850 Vagy technikailag, ha ez a fickó még mindig a 0x1, 302 00:12:50,850 --> 00:12:53,052 olyan, mintha én is 0x1 itt és 0x1 itt. 303 00:12:53,052 --> 00:12:54,760 De a lényeg, kit érdekel a címek? 304 00:12:54,760 --> 00:12:56,345 Csak a gondolat, hogy most már számít. 305 00:12:56,345 --> 00:12:57,720 Szóval, ez az, ami itt történik. 306 00:12:57,720 --> 00:13:02,690 Szóval persze, ha nem t tartó 0, amely tömb jelölés, 307 00:13:02,690 --> 00:13:05,650 A course-- és őszintén szólva, úgy néz ki, mint van egy sor ide, 308 00:13:05,650 --> 00:13:07,340 de most itt van ez a furcsa dolog. 309 00:13:07,340 --> 00:13:11,160 Tudd, hogy a programozási nyelv, C, kínál ez a szolgáltatás, 310 00:13:11,160 --> 00:13:14,650 miáltal, akkor is, ha t jelentése egy mutatót, s vagy egy mutató, 311 00:13:14,650 --> 00:13:18,050 akkor is használni, hogy a megszokott, kényelmes szögletes zárójel 312 00:13:18,050 --> 00:13:22,520 jelölés menni az első elem, vagy a második elem, vagy bármely elemét 313 00:13:22,520 --> 00:13:26,130 hogy ez a mutató mutat hogy mivel feltehetően az 314 00:13:26,130 --> 00:13:29,410 van, mint a jelen esetben, mutatott néhány sor. 315 00:13:29,410 --> 00:13:30,340 >> Szóval hogyan lehet orvosolni? 316 00:13:30,340 --> 00:13:33,660 Őszintén szólva, ez az, ahol van egy kicsit nyomasztó első pillantásra. 317 00:13:33,660 --> 00:13:35,340 De itt van egy új és továbbfejlesztett változata. 318 00:13:35,340 --> 00:13:37,460 >> Tehát először, kapok megszabadulni a CS50 könyvtár, 319 00:13:37,460 --> 00:13:41,170 csak azért, hogy ki, hogy s valóban a char csillag, csak egy szinonima. 320 00:13:41,170 --> 00:13:43,540 És t is char csillag. 321 00:13:43,540 --> 00:13:48,290 De mi folyik a jobb oldalán, hogy a vonal 322 00:13:48,290 --> 00:13:49,970 ahol t van rendelve egy érték? 323 00:13:49,970 --> 00:13:50,790 >> Mi az a malloc? 324 00:13:50,790 --> 00:13:51,630 Mi ez strlen? 325 00:13:51,630 --> 00:13:52,547 Mi az a sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Mi a fenéért nem ezt vonal néz annyira bonyolult? 327 00:13:54,380 --> 00:13:55,713 Mit keres egy magas szinten? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Mi is a tároló t? 330 00:13:57,440 --> 00:13:58,646 Igen? 331 00:13:58,646 --> 00:14:01,104 Közönség: Ez elosztása a bizonyos mennyiségű memóriát. 332 00:14:01,104 --> 00:14:03,032 Ez tárolni, azt hiszem, levelek [nem hallható]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Tökéletes. 334 00:14:04,032 --> 00:14:04,540 Tökéletes. 335 00:14:04,540 --> 00:14:06,650 Ez elosztása egy bizonyos memória méretének 336 00:14:06,650 --> 00:14:08,940 tárolására, feltehetően jövő leveleket. 337 00:14:08,940 --> 00:14:11,310 És különösen a malloc Ezért vissza mi? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Közönség: Visszatérve a [nem hallható]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Pontosan. 341 00:14:15,850 --> 00:14:18,850 Visszatérve a címét, hogy a memória, amely divatos módja mondván, 342 00:14:18,850 --> 00:14:21,640 vissza a címét első byte-ja, hogy az emlékezet. 343 00:14:21,640 --> 00:14:25,460 A bizonyítás terhe is, hogy emlékezzek mennyi memória Igazából 344 00:14:25,460 --> 00:14:27,140 kiosztott vagy kért malloc számára. 345 00:14:27,140 --> 00:14:28,384 >> Most mennyi az? 346 00:14:28,384 --> 00:14:30,550 Nos, annak ellenére, hogy ott van sok zárójel itt, 347 00:14:30,550 --> 00:14:32,970 malloc mindössze egyetlen érv. 348 00:14:32,970 --> 00:14:37,250 És én meghatározva strlen s, így adja nekem annyi bájt, mint ahány az s, 349 00:14:37,250 --> 00:14:37,800 de hozzá egy. 350 00:14:37,800 --> 00:14:38,300 Miért? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Igen? 353 00:14:39,530 --> 00:14:40,840 >> Közönség: A backslash 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Pontosan. 355 00:14:41,840 --> 00:14:43,423 Van, hogy egy kis takarítás. 356 00:14:43,423 --> 00:14:45,970 Tehát azért, mert van egy backslash 0, akkor jobb lenne elfelejteni. 357 00:14:45,970 --> 00:14:47,310 Ellenkező esetben, megyünk hogy hozzon létre egy string, amely 358 00:14:47,310 --> 00:14:49,170 nem rendelkezik a különleges terminátor. 359 00:14:49,170 --> 00:14:52,640 >> Közben, csak a szuper anális, van sizeof (char) 360 00:14:52,640 --> 00:14:55,730 csak abban az esetben, ha valaki fut a kód nem a CS50 készülék, 361 00:14:55,730 --> 00:14:58,220 de talán egy másik számítógépen összesen ahol karakter 362 00:14:58,220 --> 00:15:01,470 van egy byte, megállapodás szerint, de két byte, vagy valami nagyobb. 363 00:15:01,470 --> 00:15:04,490 Csak, hogy szuper, szuper idegenkedik a hibákat. 364 00:15:04,490 --> 00:15:06,940 Annak ellenére, hogy a valóságban, ez valószínűleg lesz 1. 365 00:15:06,940 --> 00:15:11,490 >> Most, közben, megyek előre, és másolja át a húr, t tartó i értéke t tartó s. 366 00:15:11,490 --> 00:15:14,962 És én elhalasztja a múlt heti forráskód, hogy mi folyik itt. 367 00:15:14,962 --> 00:15:17,670 De a legfontosabb elvihető, és a Ezért tettem a kódot már zöld, 368 00:15:17,670 --> 00:15:22,520 az az oka, hogy az utolsó sor, t tartó 0értéke toupper, 369 00:15:22,520 --> 00:15:25,230 az a hatása, kapitalizálódó amely húr? 370 00:15:25,230 --> 00:15:26,960 t és / vagy az S? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Az utolsó sor kódot. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Csak T, azért, mert mi történt ebben az időben, 375 00:15:35,560 --> 00:15:41,500 ha kissé visszavonni az utolsó lépés, mi történt akkor, amikor hívom malloc, 376 00:15:41,500 --> 00:15:45,380 Én alapvetően kap egy darab memória hogy az azonos méretű, mint az eredeti, 377 00:15:45,380 --> 00:15:47,020 mert ez az aritmetikai tettem. 378 00:15:47,020 --> 00:15:50,920 Én tárolás t a cím Az, hogy a darab a memória. 379 00:15:50,920 --> 00:15:53,370 Annak ellenére, hogy ez jól néz ki és szép, szép és tiszta, 380 00:15:53,370 --> 00:15:56,882 A valóság az, hogy van, mit fogunk folyamatosan hív, szemét értékek itt. 381 00:15:56,882 --> 00:15:59,340 Hogy darab memória talán igen jól használták korábban, 382 00:15:59,340 --> 00:16:00,940 Néhány másodperc, néhány perccel ezelőtt. 383 00:16:00,940 --> 00:16:04,410 Így nem lehetett teljesen, hogy számok vagy betűk vannak, csak véletlenül. 384 00:16:04,410 --> 00:16:08,580 De nem érvényes, amíg nem magamat népességnövekedés ez darab memória 385 00:16:08,580 --> 00:16:12,510 a tényleges karakter, mint én tenni, hogy a hurok ott. 386 00:16:12,510 --> 00:16:13,180 Minden rendben? 387 00:16:13,180 --> 00:16:16,180 >> Így most, a csúcspontja ez a három példa 388 00:16:16,180 --> 00:16:20,730 amelyeket látszólag törött utoljára, ez Swap példa, ez a funkció 389 00:16:20,730 --> 00:16:23,670 dolgozott abban az értelemben, hogy cserélték és b. 390 00:16:23,670 --> 00:16:25,620 De ez nem működik, mi más értelme? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Igen? 393 00:16:28,614 --> 00:16:29,612 >> KÖZÖNSÉG: [nem hallható]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Pontosan. 396 00:16:36,700 --> 00:16:39,530 Ha én ezt a funkciót a másik-- például, 397 00:16:39,530 --> 00:16:42,870 Egy funkció, mint a fő, ahol Nekem van egy változó, x és y, ahogy én 398 00:16:42,870 --> 00:16:46,160 volt a múlt héten, ugyanazt a kódot, és én át az x és y 399 00:16:46,160 --> 00:16:49,860 a Swap, majd hívja Swap-- ezt, persze, ez a helyes verzió 400 00:16:49,860 --> 00:16:52,220 az, amit mindjárt csak-- nem működött. 401 00:16:52,220 --> 00:16:53,770 Tehát mi a fix? 402 00:16:53,770 --> 00:16:56,850 >> Nos, így csak a biztonság tiszta, hadd menjen előre 403 00:16:56,850 --> 00:17:05,450 és-- adj egy második ide, és nézze meg ha meg tudom mutatni, hogy az utolsó, ami 404 00:17:05,450 --> 00:17:12,464 lesz in-- lássuk, ha találok ez igazi fast-- OK, [nem hallható]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, ez van. 407 00:17:19,240 --> 00:17:21,000 Így figyelmen kívül hagyja a parancsot Csak gépelés. 408 00:17:21,000 --> 00:17:23,780 Azt akarom, hogy letölteni Az utolsó pillanatban egy példa 409 00:17:23,780 --> 00:17:27,960 a múlt idő, ami most hívott nem Swap. 410 00:17:27,960 --> 00:17:30,200 >> Tehát nem Swap ahol abbahagytuk legutóbb, 411 00:17:30,200 --> 00:17:32,930 amelynek én inicializált x 1 és y 2. 412 00:17:32,930 --> 00:17:35,840 Aztán hívásváltás, átadva az 1. és 2.. 413 00:17:35,840 --> 00:17:37,930 És akkor ez a funkció dolgozott bizonyos értelemben, 414 00:17:37,930 --> 00:17:40,750 de nem volt állandó hatása az x és y. 415 00:17:40,750 --> 00:17:45,430 Tehát a kérdés kéznél van, hogyan most tudjuk valójában oldja meg a problémát? 416 00:17:45,430 --> 00:17:47,820 Mi a megoldás kéznél? 417 00:17:47,820 --> 00:17:53,150 >> Nos, swap.c, ami új ma, észre egy pár különbség. 418 00:17:53,150 --> 00:17:54,700 x és y jelentése azonos. 419 00:17:54,700 --> 00:17:57,250 De mi is pontosan más a vonal 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Mi újság van, ha emlékszel úgy nézett ki, mint egy perce? 422 00:18:01,715 --> 00:18:02,565 >> KÖZÖNSÉG: [nem hallható]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Igen. 424 00:18:03,440 --> 00:18:06,680 Tehát a jellel is jelölhetünk egy új darab A szintaxis nem csak ebben a programban, 425 00:18:06,680 --> 00:18:08,560 de általában véve is a CS50. 426 00:18:08,560 --> 00:18:10,680 A mai napig, nem hiszem, láttunk olyan példákat 427 00:18:10,680 --> 00:18:14,070 vagy tényleg beszélt róluk minden részlet, kivéve talán, megelőző jellegű 428 00:18:14,070 --> 00:18:16,467 szakasz, egy jel, mint ez. 429 00:18:16,467 --> 00:18:19,300 Nos, kiderült, hogy jel egy az utolsó darab új szintaxis 430 00:18:19,300 --> 00:18:20,174 fogunk tanulni. 431 00:18:20,174 --> 00:18:23,500 Minden azt jelenti, a címe néhány változó. 432 00:18:23,500 --> 00:18:25,070 A mi cím jelent x él? 433 00:18:25,070 --> 00:18:26,510 De mit jelent cím y él? 434 00:18:26,510 --> 00:18:28,700 Mert ha a alapvető probléma előtt 435 00:18:28,700 --> 00:18:32,970 az volt, hogy x és y éreztetik másolatban, amit igazán akarok 436 00:18:32,970 --> 00:18:38,780 A nyújtanak Swap és mint egy kincs térkép, amely vezet, ahol x és y a ténylegesen 437 00:18:38,780 --> 00:18:41,910 vannak a RAM-ban, hogy a Swap követheti azt a térképet 438 00:18:41,910 --> 00:18:47,760 és menj bárhova x vagy y jelzi a helyet és módosítsa a tényleges értékek az 1. és 2. 439 00:18:47,760 --> 00:18:48,270 ott. 440 00:18:48,270 --> 00:18:50,710 >> Tehát Swap változtatni kell kicsit is. 441 00:18:50,710 --> 00:18:53,760 És első pillantásra, ez lehet úgy tűnik, egy kicsit hasonlít a char csillag. 442 00:18:53,760 --> 00:18:54,850 És valóban az is. 443 00:18:54,850 --> 00:18:59,635 Tehát egy olyan mutató, hogy milyen típusú adatot, ennek alapján a kiemelt rész? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Szóval ez egy int. 446 00:19:01,620 --> 00:19:04,880 >> Így már nem int, ez a címe egy int. 447 00:19:04,880 --> 00:19:07,910 És hasonlóképpen, b most megy hogy a cím egy int. 448 00:19:07,910 --> 00:19:12,470 Tehát, amikor én már hívásváltás a Main, Nem fogok adni Swap 1. és 2.. 449 00:19:12,470 --> 00:19:15,540 Fogom adni, mint a Ox-valamit, és Ox-valamit, 450 00:19:15,540 --> 00:19:19,820 két címet fog vezetni Swap a tényleges helyek 451 00:19:19,820 --> 00:19:21,310 az én számítógép memóriájában. 452 00:19:21,310 --> 00:19:25,580 >> Így most, a fennmaradó végrehajtás meg kell változtatni a srác. 453 00:19:25,580 --> 00:19:28,650 Mi ez nyilvánvalóan más most E három sornyi kódot? 454 00:19:28,650 --> 00:19:31,350 Vannak ezek a rohadt csillag minden át a helyét, minden rendben? 455 00:19:31,350 --> 00:19:33,014 Szóval, mi folyik itt? 456 00:19:33,014 --> 00:19:33,514 Igen? 457 00:19:33,514 --> 00:19:35,055 >> Közönség: Ez nyilvánvalóan [nem hallható]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Pontosan. 460 00:19:37,990 --> 00:19:41,560 Tehát ebben context-- és ez nem volt a legjobb tervezési döntés, igaz, 461 00:19:41,560 --> 00:19:42,530 évvel ezelőtt. 462 00:19:42,530 --> 00:19:45,110 Ebben az összefüggésben, amikor a csak van egy csillag, 463 00:19:45,110 --> 00:19:48,240 és nincs olyan adattípus, mint int, azonnal balra, 464 00:19:48,240 --> 00:19:53,146 helyette van egy egyenlőségjelet, világosan, ebben az összefüggésben, amikor azt mondod csillag, 465 00:19:53,146 --> 00:19:56,980 azt jelenti, hogy megy a cím, ez egy. 466 00:19:56,980 --> 00:19:58,870 Kövesse a kincses térképet, hogy úgy mondjam. 467 00:19:58,870 --> 00:20:01,720 >> És közben, sorban 37, azt jelenti, hogy ugyanaz a dolog. 468 00:20:01,720 --> 00:20:05,460 Menj a cím egy, és tedd, hogy mi van? 469 00:20:05,460 --> 00:20:09,520 Bármi is van a hely, amely b meghatározza. 470 00:20:09,520 --> 00:20:10,980 Más szóval, megy a b. 471 00:20:10,980 --> 00:20:12,130 Kap ez az érték. 472 00:20:12,130 --> 00:20:15,620 Ugrás egy, és egy az egyenlő alá, az értékadó operátor, 473 00:20:15,620 --> 00:20:17,010 tedd érték oda. 474 00:20:17,010 --> 00:20:19,272 >> Hasonlóképpen, int temp csak egy int. 475 00:20:19,272 --> 00:20:20,730 Nincs szükség változtatni a temp. 476 00:20:20,730 --> 00:20:24,810 Ez csak egy tartalék üveg Annenberg egyes tej vagy narancslé. 477 00:20:24,810 --> 00:20:27,630 De nem kell, hogy mondjam, menjen a b. 478 00:20:27,630 --> 00:20:31,449 Megy, hogy a cél és tegye az érték temp ott. 479 00:20:31,449 --> 00:20:32,490 Szóval, mi történik akkor? 480 00:20:32,490 --> 00:20:36,540 Amikor tényleg hívásváltás ebben az időben, ha a Az első tálca itt jelent Main, 481 00:20:36,540 --> 00:20:42,270 ez a második tálca jelent Swap, amikor Én át jel x és y jel 482 00:20:42,270 --> 00:20:47,150 A Fő a Swap, csak hogy tisztázzuk, mi ez a stack frame befogadó? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Igen? 485 00:20:49,200 --> 00:20:50,180 >> KÖZÖNSÉG: [nem hallható]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Pontosan. 487 00:20:51,180 --> 00:20:53,129 A cím az x és az y címét. 488 00:20:53,129 --> 00:20:55,170 És azt lehet gondolni ezeket mint a postai címek. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street és a 35 Oxford Street, és 490 00:20:58,772 --> 00:21:01,230 szeretné, hogy a két épület amelyek ezeken a helyeken. 491 00:21:01,230 --> 00:21:04,680 >> Ez egyfajta nevetséges ötlet, de ez minden, amit értünk címet. 492 00:21:04,680 --> 00:21:07,000 Ahol a világon megtalálni a két ints? 493 00:21:07,000 --> 00:21:09,470 Ahol a világon van található a két épület? 494 00:21:09,470 --> 00:21:15,170 Tehát, ha végül, ennyi idő után én megy a mai forráskódját, és fordítsuk 495 00:21:15,170 --> 00:21:22,110 Swap és fuss ./swap, végül a először időnk valóban látni, hogy a 496 00:21:22,110 --> 00:21:25,330 Saját értékek valóban cserélték sikeresen. 497 00:21:25,330 --> 00:21:30,860 És most, mi is, hogy Jegyezze fel ezt a, mondjuk, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Hadd menjek be ugyanazt a fájlt. 499 00:21:32,740 --> 00:21:35,010 Hadd menjek előre, és fuss gdb a ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 És most, a Swap, én megyek előre, és állítsa be a töréspontot Main. 502 00:21:40,547 --> 00:21:42,630 És most én megyek előre, és futtassa a programot. 503 00:21:42,630 --> 00:21:45,810 És most látom a kód megállt a vonal. 504 00:21:45,810 --> 00:21:48,330 >> Ha megyek előre és a nyomtatási x, mit látok itt? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Ez egy kérdés. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Mondd még egyszer? 509 00:21:51,530 --> 00:21:52,295 >> KÖZÖNSÉG: [nem hallható]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: So véletlen számok, talán. 511 00:21:53,910 --> 00:21:56,010 Talán szerencséd lesz, és ez szép és egyszerű, mint a 0-ra. 512 00:21:56,010 --> 00:21:57,230 De lehet, hogy valami véletlen számot. 513 00:21:57,230 --> 00:21:58,090 Ebben az esetben, szerencsém volt. 514 00:21:58,090 --> 00:21:59,030 Ez csak előfordul, hogy az értéke 0. 515 00:21:59,030 --> 00:22:00,780 De ez tényleg szerencse, mert nem, amíg én 516 00:22:00,780 --> 00:22:06,280 típus mellett, majd nyomtatott x van az a kódsor, a 19, kivégezték. 517 00:22:06,280 --> 00:22:10,942 >> Közben, ha jól írja a következő megint, és Most nyomtassa ki y, megyek a 2. 518 00:22:10,942 --> 00:22:13,900 Ha most írja a következő, ez lesz a kap egy kicsit zavaró, mert most, 519 00:22:13,900 --> 00:22:17,250 a printf fog megjelenni a képernyőn, ahogy azt tette. x 1 lehet. 520 00:22:17,250 --> 00:22:18,606 >> Csináljuk újra. 521 00:22:18,606 --> 00:22:20,480 És most, itt, ahol dolgok érdekessé válni. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Mielőtt hívásváltás vagy akár lépés bele, vessünk egy röpke pillantást. 524 00:22:26,580 --> 00:22:28,980 x értéke, ismét 1. 525 00:22:28,980 --> 00:22:33,240 Y jelentése, természetesen, gyors józanság ellenőrizze, 2, így nem nehéz ott. 526 00:22:33,240 --> 00:22:35,740 De mi a jel x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Válasz, ez a fajta funky keres. 529 00:22:39,350 --> 00:22:43,500 De az int csillag zárójelben csak GDP szóval ez egy cím. 530 00:22:43,500 --> 00:22:48,290 Ez nem egy int, hogy a mutató egy int, vagy más néven egy címet. 531 00:22:48,290 --> 00:22:49,742 >> Mi ez az őrült dolog? 532 00:22:49,742 --> 00:22:51,825 Még sosem látott valamit nagyon tetszett, hogy mielőtt. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Tehát ez a cím az én számítógép emléke ahol x történik élni. 535 00:22:58,120 --> 00:22:59,040 Ez Ox-valami. 536 00:22:59,040 --> 00:23:01,290 És ez, őszintén szólva, miért Elkezdtem rajz nyilak, 537 00:23:01,290 --> 00:23:03,340 számok helyett, mert aki igazán érdekel 538 00:23:03,340 --> 00:23:06,890 hogy az int van egy bizonyos cím, hogy ez olyan nagy. 539 00:23:06,890 --> 00:23:12,160 De bffff0c4, ezek mind valóban hexadecimális számjegy, 540 00:23:12,160 --> 00:23:13,720 amely 0 és f. 541 00:23:13,720 --> 00:23:16,590 >> Így nem fogunk lakni is hosszú, amit ezek a dolgok. 542 00:23:16,590 --> 00:23:19,400 De ha kinyomtatni y, persze, lásd 2. 543 00:23:19,400 --> 00:23:22,440 De jel y, látom ezt a címet. 544 00:23:22,440 --> 00:23:26,527 , És vegyük észre, hogy a kíváncsi, milyen messze van az x és y? 545 00:23:26,527 --> 00:23:27,985 Akkor figyelmen kívül hagyja a legtöbb cím. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Négy bájt. 548 00:23:29,920 --> 00:23:33,510 És ez összhangban van a korábban azt állítják, hogy mekkora egy int? 549 00:23:33,510 --> 00:23:34,130 Négy bájt. 550 00:23:34,130 --> 00:23:37,420 Tehát úgy néz ki, minden rendben sorakozó szépen, ahogy lehet, remélem, a memóriában. 551 00:23:37,420 --> 00:23:40,010 >> Tehát most, most csak gyorsan előre A végén ez a történet. 552 00:23:40,010 --> 00:23:43,290 Menjünk előre, és írja be lépés, hogy belevetik magukat a Swap funkciót. 553 00:23:43,290 --> 00:23:46,880 Figyeljük, ha írja, hogy megegyezik az x címét. 554 00:23:46,880 --> 00:23:52,130 Ha a B típusú, ez azonos címére y. 555 00:23:52,130 --> 00:23:57,020 Szóval, mit kell látni, ha azt mondják, menj a cím a? 556 00:23:57,020 --> 00:23:58,120 Így nyomtatni csillag. 557 00:23:58,120 --> 00:24:00,130 Tehát csillag azt jelenti, hogy ott, ebben az összefüggésben. 558 00:24:00,130 --> 00:24:02,730 Jel azt jelenti, mi a címe. 559 00:24:02,730 --> 00:24:05,000 Tehát csillag eszköz 1. 560 00:24:05,000 --> 00:24:09,590 És print csillag b ad nekem 2. 561 00:24:09,590 --> 00:24:15,750 >> És hadd feltételezik, ebben a pillanatban, hogy legalább a kódot, hogy a 562 00:24:15,750 --> 00:24:18,950 halad, hogy végre most már lehet indokolt át ilyen módon. 563 00:24:18,950 --> 00:24:21,150 De majd újra ezt az ötletet hamarosan. 564 00:24:21,150 --> 00:24:23,850 Tehát ez a verzió Swap most már a helyes, és lehetővé teszi 565 00:24:23,850 --> 00:24:26,650 bennünket, hogy a csere az adott típusú adatokat. 566 00:24:26,650 --> 00:24:29,120 >> Tehát bármilyen kérdése van, akkor a csere? 567 00:24:29,120 --> 00:24:29,890 A csillag? 568 00:24:29,890 --> 00:24:30,690 A címe? 569 00:24:30,690 --> 00:24:33,270 És meglátod, a probléma készlet 4, fajta, 570 00:24:33,270 --> 00:24:37,310 de probléma set 5, biztosan, hogy ezek a dolgok hasznosak, és hogy sokkal több 571 00:24:37,310 --> 00:24:39,584 kényelmes velük, ennek eredményeként. 572 00:24:39,584 --> 00:24:40,430 Egyáltalán valamit? 573 00:24:40,430 --> 00:24:40,930 Rendben. 574 00:24:40,930 --> 00:24:44,350 Tehát malloc, ismét ez a funkció hogy csak memóriát, a memória 575 00:24:44,350 --> 00:24:45,330 elosztása. 576 00:24:45,330 --> 00:24:47,024 És miért van ez hasznos? 577 00:24:47,024 --> 00:24:48,940 Nos, ebben az időben, Ön már használja malloc. 578 00:24:48,940 --> 00:24:52,230 Ha Ön szerint most, hogy getString munkák, feltehetően, ez 579 00:24:52,230 --> 00:24:56,140 azt kérdezi valaki egy darab memória, bármikor a felhasználó beír egy húr 580 00:24:56,140 --> 00:24:59,040 az, mert biztosan nem tudja, mivel CS50 személyzet, 581 00:24:59,040 --> 00:25:02,710 milyen nagy azok vonósok, hogy az emberek lesz típusú lehet. 582 00:25:02,710 --> 00:25:07,910 >> Szóval, az első alkalommal, elkezd húzza vissza, hogy a CS50 könyvtár működik, 583 00:25:07,910 --> 00:25:10,990 útján egy pár példát amely elvezet minket oda. 584 00:25:10,990 --> 00:25:15,300 Tehát, ha én nyit gedit és nyissa meg a scanf 0, 585 00:25:15,300 --> 00:25:17,055 fogunk látni a következő kódot. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, elérhető a honlapon Ma már viszonylag kevés sornyi kód 588 00:25:23,530 --> 00:25:25,351 itt 14-től 20-. 589 00:25:25,351 --> 00:25:26,600 És nézzük meg, mit csinál. 590 00:25:26,600 --> 00:25:28,920 Kijelenti, int, az úgynevezett x. 591 00:25:28,920 --> 00:25:30,850 Azt mondja valami ilyesmi, szám kérem. 592 00:25:30,850 --> 00:25:33,940 És most azt mondja, scanf% i, és x. 593 00:25:33,940 --> 00:25:35,620 Tehát van egy csomó új dolgot is. 594 00:25:35,620 --> 00:25:38,420 >> De scanf, akkor milyen gondol a mint az ellentéte printf. 595 00:25:38,420 --> 00:25:40,090 printf természetesen nyomatok a képernyőre. 596 00:25:40,090 --> 00:25:44,410 scanf fajta ellenőrzi a felhasználó billentyűzet valami ő már gépelt. 597 00:25:44,410 --> 00:25:46,550 >> % I olyan, mint printf. 598 00:25:46,550 --> 00:25:49,410 Ez azt jelenti, várják a felhasználó adja meg az int. 599 00:25:49,410 --> 00:25:52,820 És most, miért gondolod, hogy Lehet, hogy halad scanf-x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Ha a cél az életben scanf az, hogy valamit a felhasználó, 602 00:25:57,770 --> 00:26:02,480 mit jelent a halad, és x, most? 603 00:26:02,480 --> 00:26:02,980 Igen? 604 00:26:02,980 --> 00:26:03,896 >> KÖZÖNSÉG: [nem hallható]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Pontosan. 607 00:26:06,540 --> 00:26:12,900 Bármit, az ember, írja be, a bemenet meg fog menteni az adott helyen. 608 00:26:12,900 --> 00:26:17,660 Ez nem elég, emlékszem, hogy csak át az x, mert láttuk már, 609 00:26:17,660 --> 00:26:21,630 minden alkalommal, amikor át csak a nyers változó, mint egy int, hogy valami más funkciót, 610 00:26:21,630 --> 00:26:25,640 Persze, hogy lehet változtatni, hogy változó, de nem véglegesen. 611 00:26:25,640 --> 00:26:27,360 Ez nincs hatással a Main. 612 00:26:27,360 --> 00:26:29,420 Ez csak akkor változtathatja meg a saját példányát. 613 00:26:29,420 --> 00:26:32,560 De ha ahelyett, te nem add nekem a tényleges int, 614 00:26:32,560 --> 00:26:36,640 de te adj irányban, hogy hogy int, most, hogy scanf, 615 00:26:36,640 --> 00:26:41,050 biztosan tudom követni, hogy kezelésére és hozzádni egy számot oda 616 00:26:41,050 --> 00:26:43,280 így férhetnek hozzá is. 617 00:26:43,280 --> 00:26:45,120 >> Tehát, amikor elindul a program, lássuk. 618 00:26:45,120 --> 00:26:49,660 Tedd scanf 0 pont perjel, scanf 0. 619 00:26:49,660 --> 00:26:54,030 És ha én most írjon be egy számot mint 50, köszönhetően a 50. 620 00:26:54,030 --> 00:26:58,150 Ha most írjon be egy számot, mint a 1 negatív, a negatív 1. 621 00:26:58,150 --> 00:27:04,200 Most írjon be egy számot, mint a 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Miért nem sikerült a program figyelmen kívül hagyni engem? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Nos, azért, mert egyszerűen azt mondtam akkor számíthat egy int csak. 625 00:27:09,880 --> 00:27:10,380 Rendben. 626 00:27:10,380 --> 00:27:11,630 Tehát ez az egyik változata ez. 627 00:27:11,630 --> 00:27:16,600 Nézzük a dolgokat egy fokkal, és javasolja, hogy ez nem jó. 628 00:27:16,600 --> 00:27:20,530 És itt van egy nagyon egyszerű példa hogy hogyan tudunk kezdeni kód írása 629 00:27:20,530 --> 00:27:24,450 hogy más emberek tudják használni vagy kompromisszumot csinál rossz dolgokat. 630 00:27:24,450 --> 00:27:28,336 Tehát vonal 16, így hasonló a szellem előtt, 631 00:27:28,336 --> 00:27:29,960 de én nem nyilvánította int ezúttal. 632 00:27:29,960 --> 00:27:32,970 Én nyilvánította char csillag, aka húr. 633 00:27:32,970 --> 00:27:35,190 >> De mit is jelent valójában? 634 00:27:35,190 --> 00:27:38,790 Tehát, ha nem ad meg address-- és Hívom, hogy önkényesen, puffer, 635 00:27:38,790 --> 00:27:43,370 de nem tudtam nevezni s, hogy simple-- és akkor én ezt, magyarázza meg nekem, 636 00:27:43,370 --> 00:27:48,630 ha lehet, amely az előző logika, mi a scanf csinál sor 18. 637 00:27:48,630 --> 00:27:55,000 ha át% s és puffer, amely egy cím? 638 00:27:55,000 --> 00:27:58,210 Mi az a scanf, ha alkalmazza a pontosan ugyanaz a logika, mint 0-s verzió, 639 00:27:58,210 --> 00:28:00,640 majd próbálja meg itt, ha a felhasználó beírja valamit? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Igen? 642 00:28:03,409 --> 00:28:04,407 >> KÖZÖNSÉG: [nem hallható]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Pontosan. 645 00:28:08,890 --> 00:28:11,577 Scanf, a logika korábban, fog tartani a húr 646 00:28:11,577 --> 00:28:13,410 hogy az emberi gépelt in-- ez most egy string, 647 00:28:13,410 --> 00:28:15,790 ez nem több, feltehetően, ha ő cooperates-- 648 00:28:15,790 --> 00:28:19,310 és ez meg fog próbálni, hogy az húr a memóriában bármilyen címen 649 00:28:19,310 --> 00:28:20,340 puffer határozza meg. 650 00:28:20,340 --> 00:28:23,870 És ez jó, mert puffer valóban azt jelentette, hogy egy címet. 651 00:28:23,870 --> 00:28:30,470 >> De azt állítják, ez a program hibás a nagyon komoly módon, mert mi az érték 652 00:28:30,470 --> 00:28:31,330 puffer alapértelmezés szerint? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Mit inicializált bele? 655 00:28:34,790 --> 00:28:35,770 Mi darab memória? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Én nem, nem igaz? 658 00:28:38,620 --> 00:28:42,265 >> Tehát annak ellenére, hogy én már kiosztott a char csillag ez már nem hívják s, 659 00:28:42,265 --> 00:28:48,030 ez inkább hívják, buffer-- így Rajzoljunk a változó nevét 660 00:28:48,030 --> 00:28:53,380 Most, buffer-- ha én nem hívott getString vagy malloc itt, 661 00:28:53,380 --> 00:28:56,030 hogy ténylegesen azt jelenti, hogy puffer csak néhány szemét érték. 662 00:28:56,030 --> 00:28:57,030 >> Most, ez mit jelent? 663 00:28:57,030 --> 00:29:00,220 Ez azt jelenti, hogy én mondtam scanf várnak a húr a felhasználó. 664 00:29:00,220 --> 00:29:01,300 És tudod mit? 665 00:29:01,300 --> 00:29:03,883 Akármi is ez a dolog mutat hogy-- és rajzolok kérdőjel, 666 00:29:03,883 --> 00:29:07,060 de a valóságban, ez lesz valami ilyesmit OX1, 2, 3, igaz? 667 00:29:07,060 --> 00:29:10,730 Ez valami hamis érték, hogy csak előfordul, hogy ott korábban. 668 00:29:10,730 --> 00:29:13,440 Tehát másképpen fogalmazva, ez mintha puffer csak 669 00:29:13,440 --> 00:29:16,180 rámutatva, hogy valami a memóriában. 670 00:29:16,180 --> 00:29:17,610 Fogalmam sincs, mit. 671 00:29:17,610 --> 00:29:24,130 >> Tehát, ha én írja Gabe most ez lesz hogy megpróbálja, hogy g-a-b-e / 0-hoz. 672 00:29:24,130 --> 00:29:25,530 De ki tudja, mi az? 673 00:29:25,530 --> 00:29:27,480 És a múltban, bármilyen alkalom, hogy megpróbálta megérinteni 674 00:29:27,480 --> 00:29:29,770 memória, amely nem tartozik nekünk, mi történt? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 , Vagy majdnem minden alkalommal. 677 00:29:32,870 --> 00:29:34,310 Szegmentációs hiba, ugye? 678 00:29:34,310 --> 00:29:37,829 >> Ez a nyíl, fogalmam sincs, hol van mutató. ez csak egy véletlen érték. 679 00:29:37,829 --> 00:29:40,370 És persze, ha értelmezni Egy véletlen értéket, mint egy cím, 680 00:29:40,370 --> 00:29:42,610 fogsz menni néhány véletlenszerű helyre. 681 00:29:42,610 --> 00:29:46,810 Szóval Gabe talán valóban összeomlás a program ebben az esetben itt. 682 00:29:46,810 --> 00:29:50,600 >> Szóval, mit tehetünk, hogy ez majdnem olyan rossz? 683 00:29:50,600 --> 00:29:52,660 Tekintsük ezt a harmadik és utolsó példa a scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ez a verzió jobb, milyen értelemben? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Ha kényelmes a korábbi probléma, ez jobb. 688 00:30:01,400 --> 00:30:02,250 Miért? 689 00:30:02,250 --> 00:30:03,250 >> KÖZÖNSÉG: [nem hallható]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Jó. 692 00:30:07,110 --> 00:30:09,970 Tehát ebben az esetben a 16. sorban jobb, abban az értelemben, 693 00:30:09,970 --> 00:30:12,030 hogy mi kifejezetten kiosztása memóriát. 694 00:30:12,030 --> 00:30:14,190 Mi nem a malloc, mi az a 2. hét 695 00:30:14,190 --> 00:30:16,060 megközelítése csak nyilvánító tömb. 696 00:30:16,060 --> 00:30:18,130 És már mondtam, hogy a húr csak egy sor karaktert, 697 00:30:18,130 --> 00:30:19,690 így ez teljesen jogos. 698 00:30:19,690 --> 00:30:22,910 De, természetesen, mint vegye figyelembe, rögzített méretű, 16. 699 00:30:22,910 --> 00:30:25,440 >> Tehát ez a program teljesen biztonságos, ha azt írja 700 00:30:25,440 --> 00:30:29,760 egy karakterláncot, két karakter vonósok, 15 karakterláncokat. 701 00:30:29,760 --> 00:30:34,970 De amint elkezdek gépelni 16, 17, 18, 1000 karaktersorozatok, 702 00:30:34,970 --> 00:30:37,390 Hol van az a húr lesz a vége? 703 00:30:37,390 --> 00:30:39,570 Ez lesz a végén részben itt. 704 00:30:39,570 --> 00:30:42,820 De akkor ki tudja, mi még túl van a határain 705 00:30:42,820 --> 00:30:44,270 E különleges tömb? 706 00:30:44,270 --> 00:30:48,015 >> Olyan, mintha én már kijelentette, 16 doboz itt. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Tehát ahelyett, hogy dolgozzon ki mind a 16, akkor csak úgy tenni, mintha én rajzoltam 16. 709 00:30:52,690 --> 00:30:56,540 De ha majd próbálja olvasni a húr ez sokkal hosszabb, mint 50 karakter, 710 00:30:56,540 --> 00:31:01,270 Fogom kezdeni üzembe a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 És ez feltehetően más memória szegmens 712 00:31:04,916 --> 00:31:06,790 hogy ismét okozhat a program összeomlik, 713 00:31:06,790 --> 00:31:10,600 mert én nem kértem semmi több, mint 16 bájt. 714 00:31:10,600 --> 00:31:12,260 >> Szóval, kit érdekel? 715 00:31:12,260 --> 00:31:13,880 Nos, itt a CS50 könyvtár. 716 00:31:13,880 --> 00:31:17,220 És a legtöbb ez csak mint utasítás up tetején. 717 00:31:17,220 --> 00:31:21,670 A CS50 könyvtár, ebben az időben, volt ebben a sorban a 52. sor. 718 00:31:21,670 --> 00:31:23,680 Láttuk typedef, vagy látni fogja typedef 719 00:31:23,680 --> 00:31:27,930 A Pset 4, amely csak létrehoz egy szinonima amelynek char csillag lehet több 720 00:31:27,930 --> 00:31:29,290 egyszerűen csak, mint húr. 721 00:31:29,290 --> 00:31:31,540 Tehát ez az egyik kevés képzés kerekek 722 00:31:31,540 --> 00:31:34,120 általunk használt titokban a motorháztető alatt. 723 00:31:34,120 --> 00:31:36,490 >> Közben itt a funkció getchar. 724 00:31:36,490 --> 00:31:38,190 Most úgy tűnik, nincs test hozzá. 725 00:31:38,190 --> 00:31:40,273 És valóban, ha folyamatosan görgetés, én valójában nem 726 00:31:40,273 --> 00:31:42,080 lát megvalósítások ezeket a funkciókat. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Mint józanság ellenőrzés, miért van ez? 729 00:31:45,516 --> 00:31:46,795 >> KÖZÖNSÉG: [nem hallható]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Igen. 731 00:31:47,670 --> 00:31:48,950 Tehát ez a header file. 732 00:31:48,950 --> 00:31:52,520 És header fájlok tartalmazzák prototípusok, valamint néhány más dolog, úgy tűnik, 733 00:31:52,520 --> 00:31:53,780 mint typedefs. 734 00:31:53,780 --> 00:31:56,910 De CS50.c, amit már soha nem adott meg nyíltan, 735 00:31:56,910 --> 00:32:02,100 de már a CS50 készülék minden Ebben az időben, mélyen annak mappák 736 00:32:02,100 --> 00:32:04,990 észre, hogy van egy egész csomó funkciók itt. 737 00:32:04,990 --> 00:32:06,720 >> Sőt, most lapozzunk lefelé. 738 00:32:06,720 --> 00:32:08,810 Nézzük figyelmen kívül hagyja a legtöbb, most. 739 00:32:08,810 --> 00:32:12,670 De lépjünk le a getInt és hogyan getInt működik. 740 00:32:12,670 --> 00:32:13,890 Tehát itt van getInt. 741 00:32:13,890 --> 00:32:17,727 És ha valaha is igazán érdekelte, hogy hogyan kap int dolgozik, itt van a dokumentáció. 742 00:32:17,727 --> 00:32:19,560 És azok között a dolgok azt mondja, az azt mondja, 743 00:32:19,560 --> 00:32:21,340 mi az értéktartományok tud visszatérni. 744 00:32:21,340 --> 00:32:24,400 Ez lényegében negatív 2 milliárd pozitív 2 milliárd ide vagy oda. 745 00:32:24,400 --> 00:32:26,420 >> És kiderül, mindez idő, annak ellenére, hogy még soha nem 746 00:32:26,420 --> 00:32:28,570 már akkor ellenőrizze azt, ha valami balul sül el, 747 00:32:28,570 --> 00:32:30,680 kiderül, hogy az összes ebben az időben, van getInt 748 00:32:30,680 --> 00:32:33,600 óta visszatérő különleges állandó, nem null, 749 00:32:33,600 --> 00:32:36,760 INT_MAX hanem, ami Csak egy programozó egyezmény. 750 00:32:36,760 --> 00:32:38,846 Ez azt jelenti, itt van egy speciális érték. 751 00:32:38,846 --> 00:32:41,470 Győződjön meg róla, hogy ellenőrizze ezt, csak ha valami balul sül el. 752 00:32:41,470 --> 00:32:43,261 De soha nem zavarta és hogy a mai napig, 753 00:32:43,261 --> 00:32:45,200 mert megint, ez célja, hogy egyszerűsítse. 754 00:32:45,200 --> 00:32:46,950 >> De hogyan getInt kap végre? 755 00:32:46,950 --> 00:32:48,450 Nos, az egyik, hogy úgy nem érvek. 756 00:32:48,450 --> 00:32:49,390 Tudjuk, hogy. 757 00:32:49,390 --> 00:32:50,820 Ad vissza int. 758 00:32:50,820 --> 00:32:51,950 Tudjuk, hogy. 759 00:32:51,950 --> 00:32:54,460 Szóval, hogyan működik ez a motorháztető alatt? 760 00:32:54,460 --> 00:32:58,290 >> Szóval van látszólag végtelen hurok, legalább egy a megjelenése. 761 00:32:58,290 --> 00:33:00,290 Figyeljük meg, hogy mi a getString. 762 00:33:00,290 --> 00:33:04,000 Szóval ez érdekes. getInt kéri a saját funkciója, getString. 763 00:33:04,000 --> 00:33:05,645 És most miért is ez a helyzet? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Miért, hogy védekező Itt sorban 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Mi történhet a vonal 164, csak hogy tiszta? 768 00:33:15,639 --> 00:33:16,930 Ez ugyanaz a válasz, mint korábban. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Talán csak a memória. 771 00:33:20,089 --> 00:33:23,130 Valami hiba getString, megvan, hogy képes legyen kezelni. 772 00:33:23,130 --> 00:33:27,070 És az ok, amiért nem tér vissza null van hogy technikailag, null egy mutató. 773 00:33:27,070 --> 00:33:29,120 getInt vissza kell térnie egy int. 774 00:33:29,120 --> 00:33:31,060 Szóval önkényesen úgy döntött, lényegében, 775 00:33:31,060 --> 00:33:34,600 hogy 2 milliárd ide vagy oda, nem megy hogy egy speciális érték, amit soha nem 776 00:33:34,600 --> 00:33:35,970 valójában kap a felhasználó. 777 00:33:35,970 --> 00:33:39,930 Ez csak az egyik érték megyek a hulladék képviseli hibakódot. 778 00:33:39,930 --> 00:33:41,540 >> Így most, a dolgok egy kicsit divatos. 779 00:33:41,540 --> 00:33:44,670 És ez nem egészen ugyanazt a funkciót mint korábban, de nagyon hasonló. 780 00:33:44,670 --> 00:33:50,120 Szóval észre, kijelentem itt, összhangban 172, mind az int n, és a char c. 781 00:33:50,120 --> 00:33:53,600 És akkor én ezt a funky vonalat, sscanf, ami kiderül 782 00:33:53,600 --> 00:33:55,990 nem vizsgálja a húr a billentyűzetről. 783 00:33:55,990 --> 00:33:59,226 Ez áll egy meglévő karakterlánc, A felhasználó már beírt. 784 00:33:59,226 --> 00:34:02,100 Szóval már hívott getString, amely azt jelenti, hogy van egy sor a memóriában. 785 00:34:02,100 --> 00:34:05,020 sscanf, amit jobb lenne, ha hívja elemzési funkció. 786 00:34:05,020 --> 00:34:07,760 Úgy néz ki, a húr én már beírt, karakterenként, 787 00:34:07,760 --> 00:34:09,250 , és nem valami hasznos. 788 00:34:09,250 --> 00:34:10,969 Hogy a húr van tárolva a sorban. 789 00:34:10,969 --> 00:34:13,560 És tudom, hogy csak megy mentést itt, és azt mondja, jaj, OK, 790 00:34:13,560 --> 00:34:15,143 Hívtam, hogy nem s ebben az időben, de a vonal. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> És most ez egy kicsit más. 793 00:34:18,080 --> 00:34:22,480 De ez gyakorlatilag azt jelenti, az okok akkor némileg hullám kezünket a mai, 794 00:34:22,480 --> 00:34:26,070 hogy mi ellenőrizzük, hogy a felhasználó beírt 795 00:34:26,070 --> 00:34:29,909 és int és talán egy másik karaktert. 796 00:34:29,909 --> 00:34:33,610 Ha a felhasználó beírt egy int, hogy fogják tárolni n, mert én vagyok 797 00:34:33,610 --> 00:34:36,739 halad ez a cím, a új trükk láttunk ma. 798 00:34:36,739 --> 00:34:41,570 Ha a felhasználó is beírt A mint 123x, hogy x 799 00:34:41,570 --> 00:34:45,060 lesz a végén a levél a c karaktert. 800 00:34:45,060 --> 00:34:48,739 >> Most kiderül, hogy sscanf megmondja nekem, intelligens, 801 00:34:48,739 --> 00:34:54,750 hány változók sscanf sikeresen képes betölteni. 802 00:34:54,750 --> 00:34:58,770 Tehát ez a logika, ha a funkció Én végrehajtása van getInt, 803 00:34:58,770 --> 00:35:00,900 de én nézem, potenciálisan, a felhasználó 804 00:35:00,900 --> 00:35:04,190 hogy beírt egy int majd valami más, 805 00:35:04,190 --> 00:35:08,580 mit akarok sscanf a visszatérési érték igazán lenni? 806 00:35:08,580 --> 00:35:10,950 Ha a cél az, hogy csak egy int a felhasználó? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Tehát, ha sscanf visszatér 2, ez mit jelent? 809 00:35:19,300 --> 00:35:21,660 A felhasználó beírt valami ilyesmit, a szó szoros értelmében, 810 00:35:21,660 --> 00:35:24,770 123x, ami csak ostobaság. 811 00:35:24,770 --> 00:35:27,490 Ez egy hiba állapot, és Azt akarom, hogy ellenőrizze, hogy a. 812 00:35:27,490 --> 00:35:32,960 >> Tehát, ha a felhasználó beírja ezt, a Ezt a logikát követve, mit sscanf vissza, 813 00:35:32,960 --> 00:35:33,740 mit mondana? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Tehát megy vissza 2, mert 123 fog menni itt, 816 00:35:39,130 --> 00:35:41,580 és az x lesz a vége fel itt. 817 00:35:41,580 --> 00:35:43,970 De én nem akarom, hogy a x kap tölteni. 818 00:35:43,970 --> 00:35:48,580 Azt akarom, hogy sscanf csak sikeres kitöltése az első a maga változó. 819 00:35:48,580 --> 00:35:52,490 És ez az, amiért szeretné sscanf vissza 1. 820 00:35:52,490 --> 00:35:55,750 >> És ha ez egy kicsit a fej felett a pillanatban, hogy ez teljesen rendben van. 821 00:35:55,750 --> 00:36:00,030 Észre azonban, hogy az egyik értékei getInt és getString 822 00:36:00,030 --> 00:36:03,630 az, hogy csinálunk egy fene Sok hibaellenőrzés, mint ez így 823 00:36:03,630 --> 00:36:07,130 , hogy a mai napig, akkor elég sok írjon semmit a billentyűzeten, 824 00:36:07,130 --> 00:36:08,490 és mi elkapni. 825 00:36:08,490 --> 00:36:10,592 És természetesen, a személyzet, biztosan nem 826 00:36:10,592 --> 00:36:13,300 forrása lehet a hiba a programot, mert vagyunk védekezésben 827 00:36:13,300 --> 00:36:16,270 ellenőrzése minden a hülye dolog, hogy a felhasználó tehet, 828 00:36:16,270 --> 00:36:18,900 mint a gépelés a húr, amikor igazán akart int. 829 00:36:18,900 --> 00:36:21,350 Így now-- jövünk vissza mielőtt long-- 830 00:36:21,350 --> 00:36:23,710 de ebben az időben, getString és getInt van 831 00:36:23,710 --> 00:36:29,950 volt a motorháztető alatt ezzel alapvető gondolata címét memória. 832 00:36:29,950 --> 00:36:32,580 >> Tehát most, tegyük a dolgokat kicsit felhasználóbarát. 833 00:36:32,580 --> 00:36:38,740 Mint bizonyára emlékeznek rá, a Muci utolsó time-- ha a egér cooperate-- így 834 00:36:38,740 --> 00:36:42,560 volt ezt a kódot, amely őszintén szólva, meglehetősen értelmetlen. 835 00:36:42,560 --> 00:36:45,330 Ez a kód ér semmit hasznos, de ez volt a példa 836 00:36:45,330 --> 00:36:48,330 professzor Parlante használni annak érdekében, hogy képviselje 837 00:36:48,330 --> 00:36:51,840 mi folyik a program, amelybe a memória. 838 00:36:51,840 --> 00:36:54,850 >> Szóval elmesélni ezt történet szuper röviden. 839 00:36:54,850 --> 00:36:58,720 Az első két sor, a Angol, amit, mit mondana? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Csak ésszerűen emberi, de kissé technikai feltételek, hogy a stab. 842 00:37:05,430 --> 00:37:06,346 KÖZÖNSÉG: [nem hallható]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, te létrehozásáról címeket a x és y változókat. 845 00:37:11,080 --> 00:37:15,520 Nem egészen, mert az x és y értéke nem változó a hagyományos értelemben. 846 00:37:15,520 --> 00:37:18,054 x és y értéke címek vagy tárolja cím. 847 00:37:18,054 --> 00:37:19,220 Így próbáljuk meg még egyszer. 848 00:37:19,220 --> 00:37:21,010 Nem rossz kezdet, bár. 849 00:37:21,010 --> 00:37:21,510 Igen? 850 00:37:21,510 --> 00:37:22,426 >> KÖZÖNSÉG: [nem hallható]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Jó. 853 00:37:24,840 --> 00:37:26,173 Azt hiszem, ez egy kicsit tisztább. 854 00:37:26,173 --> 00:37:28,630 Deklarálása két mutató, két egész szám. 855 00:37:28,630 --> 00:37:30,150 És mi hívja őket x és y. 856 00:37:30,150 --> 00:37:32,790 Vagy ha volt, hogy dolgozzon ez a kép, újra, 857 00:37:32,790 --> 00:37:36,410 emlékszem egészen egyszerűen az, hogy az összes csinálunk az az első sor 858 00:37:36,410 --> 00:37:39,690 A rajz egy doboz, mint ez, néhány szemét érték benne, 859 00:37:39,690 --> 00:37:41,920 és amelyben ez az X, majd a egy dobozt, mint ez, 860 00:37:41,920 --> 00:37:43,880 némi szemét érték benne, amelyben az y. 861 00:37:43,880 --> 00:37:45,810 Már bejelentett két mutatók, hogy végül 862 00:37:45,810 --> 00:37:47,860 tárolja a címét egy int. 863 00:37:47,860 --> 00:37:49,170 Szóval ez mind ott van. 864 00:37:49,170 --> 00:37:53,290 >> Tehát amikor Muci tette ezt, az agyag éppen így nézett ki. 865 00:37:53,290 --> 00:37:55,350 És Nick csak ilyen bebugyolálva a nyilakat, 866 00:37:55,350 --> 00:37:57,590 mintha ők nem mutat sehova különösen, mert ők csak a 867 00:37:57,590 --> 00:37:58,250 szemetet értékeket. 868 00:37:58,250 --> 00:38:01,670 Ők kifejezetten nem inicializált bárhol, különösen. 869 00:38:01,670 --> 00:38:03,980 >> Most a következő sor kód, emlékszem, volt ez. 870 00:38:03,980 --> 00:38:07,510 Így meglehetősen felhasználóbarát, de némileg műszaki angol, 871 00:38:07,510 --> 00:38:09,790 mi ezt a kódsort csinál? 872 00:38:09,790 --> 00:38:10,391 Igen? 873 00:38:10,391 --> 00:38:11,333 >> KÖZÖNSÉG: [nem hallható]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. MALAN: Tökéletes. 876 00:38:13,950 --> 00:38:17,016 Ez elosztása a darab a memória, ami akkora, mint egy int. 877 00:38:17,016 --> 00:38:18,140 És ez a fele a válasz. 878 00:38:18,140 --> 00:38:20,056 A válasz a helyes fele a kifejezés. 879 00:38:20,056 --> 00:38:22,473 Mi történik a bal oldali az egyenlőségjel? 880 00:38:22,473 --> 00:38:22,972 Igen? 881 00:38:22,972 --> 00:38:24,814 Közönség: és hozzárendeli azt, hogy a változó x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: és hozzárendeli azt, hogy a változó x. 883 00:38:27,690 --> 00:38:31,650 Tehát bedugni, jobboldalán lefoglalt elegendő memóriát egy int. 884 00:38:31,650 --> 00:38:34,150 De malloc kifejezetten vissza a cím 885 00:38:34,150 --> 00:38:37,270 Az, hogy a darab a memória, ami neked van csak javasolt lesz tárolva x. 886 00:38:37,270 --> 00:38:42,560 >> Szóval mit Nick múltkor a Muci is ő húzta az mutató ki, az agyag, 887 00:38:42,560 --> 00:38:46,820 hogy pont most a fehér darab memória , amely egyenlő a mérete egy int. 888 00:38:46,820 --> 00:38:49,360 És valóban, ez azt jelentette, tartalmazza a négy bájt. 889 00:38:49,360 --> 00:38:55,310 >> Most, a következő kódsor tette ezt, csillag x kap 42. 890 00:38:55,310 --> 00:38:58,530 Így 42 egyszerű a jobb oldalán, az élet értelmét. 891 00:38:58,530 --> 00:39:00,500 Bal oldali, csillag x mit jelent? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Ez is lehet, hogy gone-- rendben van. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Közönség: Alapvetően, megy a [nem hallható] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Jó. 897 00:39:07,750 --> 00:39:08,760 KÖZÖNSÉG: [nem hallható]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Pontosan. 899 00:39:09,760 --> 00:39:11,979 Bal oldali jelenti menni x. 900 00:39:11,979 --> 00:39:12,520 x cím. 901 00:39:12,520 --> 00:39:15,520 Ez olyan, mint 33 Oxford Street, vagy OX1. 902 00:39:15,520 --> 00:39:18,690 És csillag x azt jelenti, megy, hogy a foglalkozik, és tedd, hogy mi van? 903 00:39:18,690 --> 00:39:19,520 42.. 904 00:39:19,520 --> 00:39:21,290 >> Tehát valóban, pontosan ezt Nick tette. 905 00:39:21,290 --> 00:39:23,740 Úgy kezdődött az, lényegében, szellemileg 906 00:39:23,740 --> 00:39:26,270 rámutatva az ujját x, követve a nyíl 907 00:39:26,270 --> 00:39:30,670 A fehér dobozt a jobb oldali oldalon, és üzembe a szám 42 van. 908 00:39:30,670 --> 00:39:34,120 De aztán a dolgok a kicsit veszélyes, igaz? 909 00:39:34,120 --> 00:39:35,860 Muci hamarosan elveszíti a fejét. 910 00:39:35,860 --> 00:39:39,465 >> Csillag y értéke 13, balszerencse, mit jelent? 911 00:39:39,465 --> 00:39:43,620 Tehát csillag y eszköz megy a címre y. 912 00:39:43,620 --> 00:39:45,630 De mi is a cím y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Rendben, ez szemét érték, nem? 915 00:39:49,440 --> 00:39:50,800 Rajzoltam, mint egy kérdőjel. 916 00:39:50,800 --> 00:39:54,850 Nick kihúzta a összegömbölyödve nyíl. 917 00:39:54,850 --> 00:39:59,600 És amint megpróbál do csillag y, mondván: ott, 918 00:39:59,600 --> 00:40:03,872 de nincs törvényes cím, ez valami hamis hely, 919 00:40:03,872 --> 00:40:05,080 A program le fog zuhanni. 920 00:40:05,080 --> 00:40:08,580 És Muci feje megy hogy elrepül itt, ahogy azt tette. 921 00:40:08,580 --> 00:40:12,130 >> Így a végén, ez a program csak lapos ki hiba. 922 00:40:12,130 --> 00:40:13,540 Ez egy hibás programot. 923 00:40:13,540 --> 00:40:14,760 És azt kellett rögzíteni. 924 00:40:14,760 --> 00:40:18,260 És az egyetlen módja, tényleg, hogy rögzítse lenne, például, ezt a sort, 925 00:40:18,260 --> 00:40:21,010 amit nem is kap, mert A program lefagyott túl hamar. 926 00:40:21,010 --> 00:40:26,170 De ha volt, hogy erősít ez, amit hatás nem csinál y egyenlő x van? 927 00:40:26,170 --> 00:40:30,010 Nos, ez lényegében mutat Y bármi x érték mutat. 928 00:40:30,010 --> 00:40:32,430 >> Tehát Nick történetét, vagy Muci történetét, mind a 929 00:40:32,430 --> 00:40:34,640 x és y is mutatva a fehér darab memória, 930 00:40:34,640 --> 00:40:38,300 úgy, hogy végül, ha Nem csillag y értéke 13 újra, 931 00:40:38,300 --> 00:40:43,080 a végén üzembe 13. a megfelelő helyre. 932 00:40:43,080 --> 00:40:47,640 Ezért az összes ilyen vonal tökéletesen jogos, kivéve ezt, 933 00:40:47,640 --> 00:40:51,730 amikor ez történt, mielőtt valójában kijelölt y valamilyen érték. 934 00:40:51,730 --> 00:40:54,290 >> Most szerencsére, akkor nem kell érvelni az összes 935 00:40:54,290 --> 00:40:56,560 Az ilyen jellegű kérdéseket a saját. 936 00:40:56,560 --> 00:40:59,310 Hadd menjek előre, és nyissa meg egy terminál ablak itt 937 00:40:59,310 --> 00:41:03,050 és nyissa fel, csak egy pillanatra, egy szuper rövid program 938 00:41:03,050 --> 00:41:04,360 szintén egyfajta értelmetlen. 939 00:41:04,360 --> 00:41:05,152 Ez csúnya. 940 00:41:05,152 --> 00:41:06,610 Nem éri el semmi hasznosat. 941 00:41:06,610 --> 00:41:10,180 De ez nem bizonyítják kérdések memória, így vessünk egy pillantást. 942 00:41:10,180 --> 00:41:11,830 >> Main, szuper egyszerű. 943 00:41:11,830 --> 00:41:14,830 Ez látszólag meghív egy függvényt, f, majd visszatér 0-ra. 944 00:41:14,830 --> 00:41:16,310 Ez elég nehéz, hogy rendetlenség ezt fel. 945 00:41:16,310 --> 00:41:18,540 Tehát fő elég jó, eddig. 946 00:41:18,540 --> 00:41:20,100 >> Tehát f problematikus. 947 00:41:20,100 --> 00:41:22,120 És nem tesz sokat erőfeszítést elnevezte 948 00:41:22,120 --> 00:41:23,990 itt, hogy tartsa a hangsúly a kódot. 949 00:41:23,990 --> 00:41:25,740 f két sort. 950 00:41:25,740 --> 00:41:27,610 És nézzük meg, mi is most folyik. 951 00:41:27,610 --> 00:41:29,840 Tehát egyrészt itt-- és engedjék meg, hogy 952 00:41:29,840 --> 00:41:32,680 ez összhangban van az előző example-- egyrészt, 953 00:41:32,680 --> 00:41:35,830 a bal oldali mit csinál, angolul? 954 00:41:35,830 --> 00:41:36,493 Ez- 955 00:41:36,493 --> 00:41:37,701 Közönség: létrehozása mutató. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Creating a mutató egy int és felszólította, hogy x. 957 00:41:40,830 --> 00:41:43,789 Szóval ez létre egy olyan doboz Folyton rajz az érintőképernyőn. 958 00:41:43,789 --> 00:41:45,913 És most, a jobb oldali oldalon, malloc, persze, 959 00:41:45,913 --> 00:41:47,420 A kiosztása egy darab memória. 960 00:41:47,420 --> 00:41:49,989 És csak hogy tisztázzuk, hogyan mennyi memória van nyilvánvalóan 961 00:41:49,989 --> 00:41:52,030 elosztása, ha csak a fajta nem a matek itt? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Tehát ez a 40 bájt. 964 00:41:54,040 --> 00:41:57,400 És tudom, hogy csak azért, mert tudom, hogy egy int, a CS50 készülék, legalábbis, 965 00:41:57,400 --> 00:41:58,060 négy bájt. 966 00:41:58,060 --> 00:41:59,610 Tehát 10-szer 4 40. 967 00:41:59,610 --> 00:42:04,924 Szóval ez tárolja egy x, a cím Az első a 40 ints hogy 968 00:42:04,924 --> 00:42:07,340 nem különített tér vissza, vissza, vissza, a vissza. 969 00:42:07,340 --> 00:42:08,470 >> És ez az, ami kulcs a malloc. 970 00:42:08,470 --> 00:42:11,261 Ez nem egy kis memória itt, egy kicsit itt, egy kicsit itt. 971 00:42:11,261 --> 00:42:14,220 Ez ad egy darab memória, összefüggően, a működési 972 00:42:14,220 --> 00:42:15,240 rendszer. 973 00:42:15,240 --> 00:42:18,500 >> Most mi a helyzet ezzel, x konzol 10 értéke 0-ra? 974 00:42:18,500 --> 00:42:19,470 Önkényes kódsort. 975 00:42:19,470 --> 00:42:21,100 Nem éri el semmi hasznosat. 976 00:42:21,100 --> 00:42:26,128 De ez érdekes, mert x konzol 10--? 977 00:42:26,128 --> 00:42:26,628 Igen? 978 00:42:26,628 --> 00:42:27,912 >> KÖZÖNSÉG: [nem hallható]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x konzol 10 nem kell null. 980 00:42:30,500 --> 00:42:35,070 A null részlet csak akkor jön szóba a vonósok, a végén a húr. 981 00:42:35,070 --> 00:42:36,700 De egy jó gondolat. 982 00:42:36,700 --> 00:42:39,615 >> Mekkora ez a tömb, még bár már elkülönített 40 bájt? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Ez 0 és kilenc, igaz? 985 00:42:43,690 --> 00:42:45,120 Ez 10 ints, összesen. 986 00:42:45,120 --> 00:42:48,790 40 bájt, de 10 ints, indexelve 0-tól 0-ra. 987 00:42:48,790 --> 00:42:50,930 >> Tehát mi az, hogy x konzol 10? 988 00:42:50,930 --> 00:42:53,090 Ez tulajdonképpen egy kis ismeretlen szemét érték. 989 00:42:53,090 --> 00:42:54,780 Ez a memória, ami nem az enyém. 990 00:42:54,780 --> 00:42:59,650 Én nem megható, hogy a byte szám 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Megyek kicsit túl messzire. 992 00:43:01,420 --> 00:43:04,490 >> És valóban, ha én vezetem ezt a programot, lehet, hogy nagyon jól lezuhan. 993 00:43:04,490 --> 00:43:05,790 De néha, szerencsénk lesz. 994 00:43:05,790 --> 00:43:07,706 És csak azért, hogy bizonyítani Ez-- és őszintén szólva, 995 00:43:07,706 --> 00:43:11,000 soha nem lehet tudni, mielőtt ne it-- fussunk ezt. 996 00:43:11,000 --> 00:43:12,480 Ez valójában nem lezuhan. 997 00:43:12,480 --> 00:43:15,032 >> De ha ezen változtatni, a Például, hogy legyen, mint a 1000, 998 00:43:15,032 --> 00:43:16,740 hogy ez valóban szándékos, lássuk 999 00:43:16,740 --> 00:43:18,710 Ha tudnánk, hogy összeomlik az időben. 1000 00:43:18,710 --> 00:43:20,070 OK, nem lezuhan. 1001 00:43:20,070 --> 00:43:22,600 Hogyan 100000? 1002 00:43:22,600 --> 00:43:25,000 Nézzük remake, és most futtassa újra azt. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Pfuj. 1005 00:43:25,960 --> 00:43:26,460 Rendben. 1006 00:43:26,460 --> 00:43:29,090 Tehát úgy tűnik, ismét, ezek szegmensei memória, hogy úgy mondjam, 1007 00:43:29,090 --> 00:43:32,660 ésszerűen nagy, így mi is szerencséd lesz újra és újra. 1008 00:43:32,660 --> 00:43:36,510 De végül, ha egyszer kap nevetséges és tényleg messze ki a képernyőn, 1009 00:43:36,510 --> 00:43:39,120 megérinti memória, ami igazán, tényleg nem a tiéd. 1010 00:43:39,120 --> 00:43:40,870 >> De őszintén szólva, ezek a típusú hibák mennek 1011 00:43:40,870 --> 00:43:43,020 hogy nehezebb és nehezebb , hogy kitaláljuk, a saját. 1012 00:43:43,020 --> 00:43:47,880 De szerencsére, ahogy a programozók, mi eszközök, amelyek lehetővé teszik, hogy ezt nekünk. 1013 00:43:47,880 --> 00:43:50,140 Szóval ez talán egy A legrondább programok 1014 00:43:50,140 --> 00:43:52,060 még rondább, mint a gdb kimenetét. 1015 00:43:52,060 --> 00:43:55,670 De mindig van egy vonal, vagy két, amelyek szuper hasznos. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind egy olyan program, amely segít Ön nem debug program önmagában 1017 00:44:00,310 --> 00:44:03,500 de megtalálja a memóriával kapcsolatos problémák, konkrétan. 1018 00:44:03,500 --> 00:44:07,590 Ez automatikusan futtatni a kódot Ön és keresse meg a legalább két dolgot. 1019 00:44:07,590 --> 00:44:10,680 Egy, tettél valamit véletlen, mint a Touch memória 1020 00:44:10,680 --> 00:44:11,980 hogy nem a tiéd? 1021 00:44:11,980 --> 00:44:13,590 Ez segít megtalálni azokat az eseteket. 1022 00:44:13,590 --> 00:44:15,710 >> És két, az segít Találtál valamit hívott 1023 00:44:15,710 --> 00:44:19,270 memóriavesztés, ami van teljesen figyelmen kívül hagyják, naivan, 1024 00:44:19,270 --> 00:44:21,380 egy ideje, és szerencsére. 1025 00:44:21,380 --> 00:44:23,140 De kiderült, minden Ebben az időben, amikor 1026 00:44:23,140 --> 00:44:26,620 már hívott getString a oly sok program, 1027 00:44:26,620 --> 00:44:28,930 kérsz a működési rendszer memória, 1028 00:44:28,930 --> 00:44:32,070 de van valami emlék A valaha így ez 1029 00:44:32,070 --> 00:44:36,169 vissza, ezzel UNALLOC, vagy szabad, ahogy hívják. 1030 00:44:36,169 --> 00:44:37,960 Nem, mert még sosem kérte, hogy erre. 1031 00:44:37,960 --> 00:44:41,250 >> De egész idő alatt, a programok Ön már írt C 1032 00:44:41,250 --> 00:44:43,800 már szivárog a memória, kérve a működési 1033 00:44:43,800 --> 00:44:46,190 rendszer egyre több memória vonósok és miegymás, 1034 00:44:46,190 --> 00:44:47,870 de soha nem adják vissza. 1035 00:44:47,870 --> 00:44:50,080 És most ez egy kicsit A leegyszerűsítés, 1036 00:44:50,080 --> 00:44:53,550 de ha valaha is fut a Mac vagy a számítógép jó ideje, nyitás 1037 00:44:53,550 --> 00:44:55,790 rengeteg program, talán a programok zárása 1038 00:44:55,790 --> 00:44:57,795 és annak ellenére, hogy a számítógép nem lezuhant, 1039 00:44:57,795 --> 00:45:01,690 ez egyre annyira lassabb, mintha ez tényleg 1040 00:45:01,690 --> 00:45:04,290 segítségével sok memóriát vagy források, jóllehet, 1041 00:45:04,290 --> 00:45:06,070 ha nem is érjen a billentyűzethez, 1042 00:45:06,070 --> 00:45:10,430 amelyek be-- de nem always-- tudott az, hogy a programok futsz 1043 00:45:10,430 --> 00:45:11,920 magukat memóriavesztés. 1044 00:45:11,920 --> 00:45:15,645 És folyamatosan azt kérdezi, az operációs rendszer egyre több memóriát, de megfeledkezve róla, 1045 00:45:15,645 --> 00:45:18,470 valójában nem használja, de ezért vesz memória el 1046 00:45:18,470 --> 00:45:20,500 Más programok is megteheti. 1047 00:45:20,500 --> 00:45:23,940 Szóval ez egy gyakori magyarázat. 1048 00:45:23,940 --> 00:45:25,940 Most itt van, ahol Valgrind a kimenet teljesen 1049 00:45:25,940 --> 00:45:29,290 kegyetlen, hogy a kevésbé és kényelmesebb egyaránt. 1050 00:45:29,290 --> 00:45:32,690 De az érdekes cucc jobb itt. 1051 00:45:32,690 --> 00:45:37,060 Ez azt mondja nekem egy érvénytelen írása méret négy történik ebben a programban, 1052 00:45:37,060 --> 00:45:40,640 különösen a 21-es vonal a memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Ha elmegyek a 21. sort, hm, ott valóban Érvénytelen írási mérete négy. 1054 00:45:45,450 --> 00:45:46,250 Miért méret négy? 1055 00:45:46,250 --> 00:45:49,500 Nos, ez number-- és lehet bármit egy int. 1056 00:45:49,500 --> 00:45:50,450 Szóval négy bájt. 1057 00:45:50,450 --> 00:45:52,550 Szóval üzembe négy bájt , ahol nem tartoznak. 1058 00:45:52,550 --> 00:45:55,080 Ez az, amit Valgrind valójában mondani. 1059 00:45:55,080 --> 00:45:57,600 Sőt, azt is mondd meg, mint látni fogjuk, 1060 00:45:57,600 --> 00:46:01,490 ahogy fut ez a jövőben Pset, és ha igen, ha már kiszivárgott memória, amely valóban 1061 00:46:01,490 --> 00:46:05,300 Én, mert én hívtam malloc, de valójában nem 1062 00:46:05,300 --> 00:46:08,010 nevezett, ebben az esetben, a szabad, amely majd végül látni 1063 00:46:08,010 --> 00:46:09,830 az ellentéte malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Tehát most, azt hiszem, egy utolsó példa. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Szóval ez egy kicsit misztikus, de talán 1068 00:46:16,690 --> 00:46:19,180 a legnagyobb oka, hogy legyen óvatos a memória, 1069 00:46:19,180 --> 00:46:24,490 és az oka, hogy sok program és / vagy web szerver, mind a mai napig, 1070 00:46:24,490 --> 00:46:28,200 átveszi a rossz fiúk valahol az interneten, akik valahogy 1071 00:46:28,200 --> 00:46:33,390 küld hamis csomagokat a kiszolgáló próbál kompromisszumot a számlák, 1072 00:46:33,390 --> 00:46:36,420 vagy hogy az adatokat, vagy csak általában több mint egy gép. 1073 00:46:36,420 --> 00:46:38,910 Puffer túlcsordulás, mint a neve is sugallja, eszközök 1074 00:46:38,910 --> 00:46:40,740 tele nem int, hanem a puffer. 1075 00:46:40,740 --> 00:46:43,490 És a puffer csak egy divatos mondván, hogy ez egy rakás memória. 1076 00:46:43,490 --> 00:46:46,710 >> És valóban, hívtam egy húr puffer előtt, ahelyett, hogy s. 1077 00:46:46,710 --> 00:46:49,234 Mert ha ez a puffer, mint a YouTube értelemben 1078 00:46:49,234 --> 00:46:52,400 vagy minden alkalommal, amikor nézed a videót, lehet, hogy láttam a szó puffer, 1079 00:46:52,400 --> 00:46:53,040 pont, pont, pont. 1080 00:46:53,040 --> 00:46:54,240 Hihetetlenül idegesítő. 1081 00:46:54,240 --> 00:46:55,990 És ez csak azt jelenti, , hogy a videó lejátszó 1082 00:46:55,990 --> 00:46:58,710 próbál letölteni sok bájt, sok bájt 1083 00:46:58,710 --> 00:47:00,170 egy videó az interneten. 1084 00:47:00,170 --> 00:47:02,920 De ez lassú, így próbál letölteni egy csomó közülük 1085 00:47:02,920 --> 00:47:06,430 hogy töltse ki a puffert, egy tartály, úgy, hogy van-e elég bytes, hogy aztán 1086 00:47:06,430 --> 00:47:09,174 megmutatja a videót, szünet nélkül folyamatosan. 1087 00:47:09,174 --> 00:47:11,340 De kiderült, akkor egy puffer ekkora. 1088 00:47:11,340 --> 00:47:15,710 De próbálja meg ezt a sok adat , és nagyon rossz dolgok történnek. 1089 00:47:15,710 --> 00:47:22,780 Így például, nézzük meg ez utolsó teaser egy példa. 1090 00:47:22,780 --> 00:47:24,720 Ez egy másik program hogy első pillantásra, 1091 00:47:24,720 --> 00:47:26,540 nem csinál semmit szuper hasznos. 1092 00:47:26,540 --> 00:47:29,590 Van rajta egy Fő funkció hogy kéri ezt a funkciót, f. 1093 00:47:29,590 --> 00:47:36,640 , És a funkció, f, itt, van a char tömb, az úgynevezett C-12-es betűmérettel. 1094 00:47:36,640 --> 00:47:39,340 És akkor ez ezzel új funkció az úgynevezett strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Kiderül, hogy ezzel az egyszerű, egyszerű kódsor, csak két sort, 1097 00:47:45,190 --> 00:47:49,130 tettünk az egész programot, és ezért, az egész számítógép, 1098 00:47:49,130 --> 00:47:54,000 és az én felhasználói fiókot, és az én kemény meghajtó potenciálisan veszélyeztetett senkinek 1099 00:47:54,000 --> 00:47:58,170 aki tudja, és elég jó futni ez a program egy bizonyos parancssori 1100 00:47:58,170 --> 00:47:58,900 érv. 1101 00:47:58,900 --> 00:48:03,400 Más szóval, ha ez a rossz fiú helyezi belsejében argvargv [1] paranccsal 1102 00:48:03,400 --> 00:48:08,750 A billentyűzet nagyon különlegesen kialakított húr, nem abc, 123, de lényegében, 1103 00:48:08,750 --> 00:48:15,180 bináris jelek képviselő futtatható kód, egy programot, hogy ő írta, 1104 00:48:15,180 --> 00:48:19,190 ezzel az egyszerű programmal, amely képviselője több ezer programok 1105 00:48:19,190 --> 00:48:23,610 hogy hasonlóan érzékeny, mondhatnám, ő is végül törli az összes 1106 00:48:23,610 --> 00:48:26,680 A fájlokat a merevlemezre, hogy egy villogó prompt, hogy ő is 1107 00:48:26,680 --> 00:48:30,170 parancsokat a saját, e-mailben az összes fájlt magamnak. 1108 00:48:30,170 --> 00:48:34,660 Bármi, amit tehetek, hogy vagy ő lehet csinálni ezt a kódot. 1109 00:48:34,660 --> 00:48:36,575 >> Nem fogjuk teljesen megoldani ezt még. 1110 00:48:36,575 --> 00:48:38,700 És valóban, ez lesz a bevonni egy kis kép 1111 00:48:38,700 --> 00:48:41,470 mint ez, amit hamarosan jön megérteni annál jobb. 1112 00:48:41,470 --> 00:48:44,480 De a mai, hadd véget mi van, remélhetőleg, egy kissé 1113 00:48:44,480 --> 00:48:48,360 érthető XKCD vicc, amíg újra legközelebb. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Rendben. 1116 00:48:51,600 --> 00:48:53,446 Találkozunk szerdán. 1117 00:48:53,446 --> 00:48:54,754 >> [Zenelejátszás] 1118 00:48:54,754 --> 00:48:57,790 >> Előadó: És most, mély gondolatok, a Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memória olyan, mint beugrott egy halom arany levelek a vasárnap délután. 1121 00:49:04,770 --> 00:49:09,000 Szél fúj, dobálta a hair-- ó, hiányzik a nap when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Nevetés] 1124 00:49:12,650 --> 00:49:13,750