1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Muusika mängimine] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. Humala: Olgu. 4 00:00:12,640 --> 00:00:14,525 See on CS50. 5 00:00:14,525 --> 00:00:16,009 Ja see on algus 5. nädalal. 6 00:00:16,009 --> 00:00:18,050 Ja nagu te võib-olla märganud, mõned materjali 7 00:00:18,050 --> 00:00:21,050 muutub veidi rohkem keeruline, vähe tihedam. 8 00:00:21,050 --> 00:00:24,560 >> Ja see on väga lihtne, eriti kui olete olnud kombeks juba mõnda aega, 9 00:00:24,560 --> 00:00:28,600 et ta püüab kritseldus alla kõige kõik, mida me teeme, me ütleme klassis. 10 00:00:28,600 --> 00:00:31,626 Aga mõistma, et ei ole võib-olla ideaalne pedagoogiline lähenemine 11 00:00:31,626 --> 00:00:34,250 õppimisele sellist materjali, ja materjali üldisemalt. 12 00:00:34,250 --> 00:00:37,250 Ja nii on meil hea meel teatada, et CS50 enda Gheng 13 00:00:37,250 --> 00:00:39,780 Gong on hakanud valmistama kanooniline kogum märkmed 14 00:00:39,780 --> 00:00:42,100 jaoks muidugi lootuses mis on see üks neid 15 00:00:42,100 --> 00:00:44,030 kasutata mitte üksnes viide ja ressursside 16 00:00:44,030 --> 00:00:47,410 läbivaatamise materjal ja läheb tagasi läbi materjali, mis võib olla 17 00:00:47,410 --> 00:00:51,230 põgenes sa esimest korda ümber, kuid ka nii, et teie juhid saavad olla 18 00:00:51,230 --> 00:00:53,740 üles kui alla, kui see on aeg õpetada, 19 00:00:53,740 --> 00:00:56,960 nii et võite alustada rohkem mõtlikult, nagu 20 00:00:56,960 --> 00:00:59,170 mitte rohkem scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Olles seda öelnud, mida võite leida Kodulehel on selliste dokumentide nagu see. 22 00:01:02,510 --> 00:01:04,660 Ja teate, üleval vasakul, seal mitte ainult sisukorra, 23 00:01:04,660 --> 00:01:06,920 vaid ka aja koodid kohe hüpata sind 24 00:01:06,920 --> 00:01:09,077 sobiva osa aastal video online. 25 00:01:09,077 --> 00:01:11,410 Ja mis Chang siin teinud on sisuliselt dokumenteeritud 26 00:01:11,410 --> 00:01:13,340 juhtus see eriti loeng. 27 00:01:13,340 --> 00:01:16,370 Ja paljud loengud on juba praegu online selle URL. 28 00:01:16,370 --> 00:01:20,110 Ja me jätkame postitada ülejäänu nende poolt käesoleva nädala lõpuks, 29 00:01:20,110 --> 00:01:22,380 nii et ärge ära, et ressurss. 30 00:01:22,380 --> 00:01:25,740 >> Nii et ilma pikema jututa, hakkasime koorida tagasi 31 00:01:25,740 --> 00:01:28,180 kihti, mis on olnud string mõnda aega. 32 00:01:28,180 --> 00:01:30,670 Ja mida me ütleme, string tegelikult on eelmisel nädalal? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Nii char star. 35 00:01:32,900 --> 00:01:34,900 Ja char star, noh, mis Kas see tegelikult tähendab? 36 00:01:34,900 --> 00:01:37,150 Noh, kõik see aeg, kui me oleme nõudnud funktsioon, 37 00:01:37,150 --> 00:01:40,450 nagu getString ja ladustamine nn tulu 38 00:01:40,450 --> 00:01:42,910 väärtus getString sisse variable-- seda nimetatakse 39 00:01:42,910 --> 00:01:47,721 s tüüp string-- oleme olnud kirjalikult koodirida seal eespool. 40 00:01:47,721 --> 00:01:49,970 Ja see on ainult siis, kui ma näen oma käekiri suurendatud siin 41 00:01:49,970 --> 00:01:51,930 ma aru, kui julmad on. 42 00:01:51,930 --> 00:01:54,180 >> Kuid oletame, et paremal servas 43 00:01:54,180 --> 00:01:57,070 on sellegipoolest mõistlik kirjeldus selle kohta, mida on 44 00:01:57,070 --> 00:01:58,880 kestnud see kõik aega getString. 45 00:01:58,880 --> 00:02:00,380 getString muidugi saab string. 46 00:02:00,380 --> 00:02:01,691 Aga mida see tegelikult tähendab? 47 00:02:01,691 --> 00:02:04,190 See tähendab, et ta saab patakas mälu, operatsioonisüsteem 48 00:02:04,190 --> 00:02:06,040 helistades funktsioon, nimetatakse malloc. 49 00:02:06,040 --> 00:02:07,390 Aga rohkem sellest hiljem. 50 00:02:07,390 --> 00:02:09,139 Ja siis populates et patakas mälu 51 00:02:09,139 --> 00:02:11,764 tähtedega kasutaja trükitud, millele järgneb loomulikult 52 00:02:11,764 --> 00:02:14,800 null iseloomu või längkriipsu null päris lõpus. 53 00:02:14,800 --> 00:02:18,280 >> Vahepeal vasakul küljel see lugu, kõik see aeg, 54 00:02:18,280 --> 00:02:20,850 me oleme kuulutab muutuja, nagu s. 55 00:02:20,850 --> 00:02:24,770 Ja see muutuja on see, mida nüüd hakkab kutsudes pointer. 56 00:02:24,770 --> 00:02:29,190 See ei ole kasti, mille sees paneme string, Daven iseenesest 57 00:02:29,190 --> 00:02:32,550 vaid me paneme selle ruutu vasakul asuvasse kasti mida täpselt? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Jah? 60 00:02:35,390 --> 00:02:37,118 >> Sihtrühm: aadress kus see asub mälus. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. Humala: Täpselt. 62 00:02:38,118 --> 00:02:40,690 Aadress, kus Daven asub mälu. 63 00:02:40,690 --> 00:02:44,650 Ja mitte siis, kui kõik Daven asub, per se, vaid just aadress 64 00:02:44,650 --> 00:02:45,150 mida? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Jah? 67 00:02:46,810 --> 00:02:47,460 >> Sihtrühm: Esimene märk. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. Humala: esimene märk aastal Daven, mis käesoleval juhul 69 00:02:50,209 --> 00:02:53,820 Pakkusin oli omavoliliselt ja ebareaalselt 1 OX1, 70 00:02:53,820 --> 00:02:55,910 mis tähendab lihtsalt kuueteistkümnendsüsteemis number 1. 71 00:02:55,910 --> 00:02:57,993 Aga see on ilmselt läheb olla palju suurem arv 72 00:02:57,993 --> 00:03:01,260 et me võiksime teha koos 0x eesliitena, 73 00:03:01,260 --> 00:03:02,806 esindavad kuueteistkümnendsüsteemi iseloomu. 74 00:03:02,806 --> 00:03:05,930 Ja kuna me ei pea teadma, kus ülejäänud tegelased Daven 75 00:03:05,930 --> 00:03:09,860 on, sest mida lihtsa konstruktsiooniga otsus, mis tehti mitu aastat tagasi? 76 00:03:09,860 --> 00:03:10,548 Jah? 77 00:03:10,548 --> 00:03:11,651 >> Sihtrühm: Kurakaldkriips 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. Humala: Jah, täpselt nii. 79 00:03:12,900 --> 00:03:18,100 Kenoviiva 0 saab, ehkki lineaarset aega, et läbida string, 80 00:03:18,100 --> 00:03:20,400 kõndida vasakult paremale, koos loop, või kui 81 00:03:20,400 --> 00:03:22,608 loop, või midagi sellist et, ja määrata, oh, siin 82 00:03:22,608 --> 00:03:24,751 on lõpuks selle konkreetse stringi. 83 00:03:24,751 --> 00:03:27,000 Nii lihtsalt aadress alguses string, 84 00:03:27,000 --> 00:03:30,290 suudame kogu , sest kõik see samas 85 00:03:30,290 --> 00:03:32,030 string on just char star. 86 00:03:32,030 --> 00:03:36,370 >> Nii et see on kindlasti trahvi kasutamist jätkata CS50 raamatukogu ja selle võtmiseks, 87 00:03:36,370 --> 00:03:38,440 nii rääkida, kuid me algab täpselt näha 88 00:03:38,440 --> 00:03:41,230 mis on kestnud all kogu aeg. 89 00:03:41,230 --> 00:03:45,260 Nii et te mäletate seda näiteks Ka viimast korda, võrrelda 0, 90 00:03:45,260 --> 00:03:47,300 mis tegelikult ei võrrelda. 91 00:03:47,300 --> 00:03:49,070 Aga hakkasime seda lahendada. 92 00:03:49,070 --> 00:03:52,020 >> Aga kui ehk täiendkoolitus, võib I huvita kedagi 93 00:03:52,020 --> 00:03:54,261 roosa elevant täna Samuti valmistatakse Chang? 94 00:03:54,261 --> 00:03:55,760 Kuidas sul ees? [Kuuldamatu]. 95 00:03:55,760 --> 00:03:56,660 Tule. 96 00:03:56,660 --> 00:03:58,740 >> Ja vahepeal kui sa tulla, lähme 97 00:03:58,740 --> 00:04:01,670 kaaluda hetkeks, mida see kood oli tegelikult teevad. 98 00:04:01,670 --> 00:04:04,917 See kuulutab kahe muutuja üles top, s ja t, ja kutsudes getString. 99 00:04:04,917 --> 00:04:08,250 See ei ole väga kasutajasõbralik programm, sest see ei ütle teile, mida teha. 100 00:04:08,250 --> 00:04:10,541 Aga oletame, et me oleme keskendudes mahlane osa. 101 00:04:10,541 --> 00:04:14,470 Ja siis me teeme, kui s võrdub võrdub t, see peaks ütlema printf, 102 00:04:14,470 --> 00:04:16,170 tipitud sama asi. 103 00:04:16,170 --> 00:04:16,670 Tere. 104 00:04:16,670 --> 00:04:17,050 Mis su nimi on? 105 00:04:17,050 --> 00:04:17,779 >> Janelle: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. Humala: Janelle, Meeldiv tutvuda. 107 00:04:19,529 --> 00:04:21,800 Nii et teie väljakutse käsi selle elevandi 108 00:04:21,800 --> 00:04:25,230 on kõigepealt teha meile pildi sellest, mis on olla esindatud kahe esimese 109 00:04:25,230 --> 00:04:25,970 read. 110 00:04:25,970 --> 00:04:28,139 Nii s ja t olla esindatud kuidas ekraanil? 111 00:04:28,139 --> 00:04:30,680 Ja sa võid teha seda sõrme selle kinolinale. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Nii et seal on kaks poolt, et Mõlemal pool sellest võrrandist. 114 00:04:34,510 --> 00:04:37,760 Nii et seal on s vasakul ja siis getString paremal. 115 00:04:37,760 --> 00:04:40,540 Ja siis on t vasakul, ja siis getString paremal. 116 00:04:40,540 --> 00:04:42,630 Niisiis, kuidas võiks hakkame joonistan selle 117 00:04:42,630 --> 00:04:46,340 esindab, mis toimub siin mälu, mis te ütlete? 118 00:04:46,340 --> 00:04:49,150 Ja lubage mul teile seletada mida sa teed, kui sa lähed. 119 00:04:49,150 --> 00:04:49,820 >> Janelle: OK. 120 00:04:49,820 --> 00:04:58,890 Noh, esiteks, oleks küsida teil saada sisend string. 121 00:04:58,890 --> 00:05:00,439 Ja see oleks store-- oh, sorry. 122 00:05:00,439 --> 00:05:01,230 DAVID J. Humala: OK. 123 00:05:01,230 --> 00:05:01,730 Väga hea. 124 00:05:01,730 --> 00:05:03,330 Ja seda nimetatakse, mis? 125 00:05:03,330 --> 00:05:03,950 Oh, OK. 126 00:05:03,950 --> 00:05:04,450 Lase edasi. 127 00:05:04,450 --> 00:05:05,575 Ma ei tahtnud segada. 128 00:05:05,575 --> 00:05:07,060 Janelle: Vabandust. 129 00:05:07,060 --> 00:05:14,237 Seega oleks sisend see aadress of-- ei ole kindel. 130 00:05:14,237 --> 00:05:17,320 Ma ei saa täpselt mäleta number, aga ma usun, et see oli alustades 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. Humala: See on kõik õige, sest ma tegin numbrid üles 132 00:05:18,420 --> 00:05:19,650 seega ei ole õige vastus. 133 00:05:19,650 --> 00:05:22,105 >> Janelle: Alustades 0 kaar. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. Humala: OK, nii element 0. 135 00:05:24,000 --> 00:05:24,765 Muidugi. 136 00:05:24,765 --> 00:05:28,295 >> Janelle: Ja siis, kui oli nagu lihtsalt kahe letter-- 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. Humala: OK, tagasi. 138 00:05:30,496 --> 00:05:33,629 >> Janelle: Nii element 0, ja siis element 1 või element 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. Humala: Ja mis tükk picture sa joonistad kohe? 140 00:05:36,670 --> 00:05:37,690 Kõne getString? 141 00:05:37,690 --> 00:05:38,830 Või deklaratsiooni s? 142 00:05:38,830 --> 00:05:42,890 >> Janelle: deklaratsioon s, ma usun. 143 00:05:42,890 --> 00:05:45,980 Oh, getString, sest see põhjustaks saab sisestada igasse [? piirkonnas. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. Humala: Hea. 145 00:05:46,510 --> 00:05:47,051 Täpselt. 146 00:05:47,051 --> 00:05:49,300 Isegi kui see tegelikult tagastab massiivi, tagasikutsumine, 147 00:05:49,300 --> 00:05:53,300 kui me tagasi string, saame indeksi sellesse string kasutades 01 ja 2. 148 00:05:53,300 --> 00:05:56,180 Tehniliselt on need ilmselt esindatud üksikute aadressid, 149 00:05:56,180 --> 00:05:57,100 aga see on hea. 150 00:05:57,100 --> 00:06:00,170 >> Olgu, oletame, kui ma ei saa lihtsalt kiire edastab kus pooleli jäime 151 00:06:00,170 --> 00:06:04,320 Viimane kord, kui üks keelpillidele g b e, 152 00:06:04,320 --> 00:06:10,337 längkriipsu 0, seega esindavad Gabe sisend, kuidas võiks me esindame s nüüd? 153 00:06:10,337 --> 00:06:12,670 Kui see on mälu, mis on tagastatud getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> Janelle: Kas oleks esindab kaar? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. Humala: kaarega? 157 00:06:18,750 --> 00:06:19,130 Noh, ei. 158 00:06:19,130 --> 00:06:21,171 Ütleme lihtsalt, piltlikult, Lubage mul minna 159 00:06:21,171 --> 00:06:25,710 ning teeb ettepaneku, et kui see on s, see on tagastatav väärtus getString. 160 00:06:25,710 --> 00:06:29,482 Ja olete juhtinud seda kui 0, 1, 2, mis on täiesti mõistlik, sest me 161 00:06:29,482 --> 00:06:30,940 saavad indeks arvesse string, kui sellist. 162 00:06:30,940 --> 00:06:33,340 Aga et see oleks kooskõlas Viimane kord, lubage mul minna 163 00:06:33,340 --> 00:06:37,310 ja omavoliliselt ettepanek, et käesolev on aadress 1, on see aadress 2 164 00:06:37,310 --> 00:06:39,597 see on aadress 3, ja nii edasi. 165 00:06:39,597 --> 00:06:41,430 Ja nii, lihtsalt super selge, mis toimub 166 00:06:41,430 --> 00:06:44,580 minna sid tulemusena, et esimene rida koodi, mis sa arvad? 167 00:06:44,580 --> 00:06:45,420 >> Janelle: Aadress 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. Humala: Täpselt. 169 00:06:46,420 --> 00:06:47,190 Nii et lahendada 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Ja vahepeal, lubage mul minna ja dubleerida palju sellest, mida sa oled teinud 172 00:06:51,230 --> 00:06:52,740 ja lisada oma t siin. 173 00:06:52,740 --> 00:06:56,340 Kui ma kirjuta Gabe jälle teist korda 174 00:06:56,340 --> 00:07:01,530 kui neile getString, kus, Loomulikult on Gabe lähe? 175 00:07:01,530 --> 00:07:02,280 Noh, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> Janelle: Nagu siin? 178 00:07:05,975 --> 00:07:06,850 DAVID J. Humala: Jah. 179 00:07:06,850 --> 00:07:08,516 Janelle: Või see on ka sama kasti? 180 00:07:08,516 --> 00:07:11,940 DAVID J. Humala: Las ma ettepaneku, jah, täpselt, nii et need täiendavad kastide. 181 00:07:11,940 --> 00:07:15,230 Aga mis peamine on see, et isegi kuigi ma olen koostanud neid üsna lähedal 182 00:07:15,230 --> 00:07:18,650 koos-- 0x1, seda on 0x2-- tegelikkuses 183 00:07:18,650 --> 00:07:25,750 see nüüd võib olla aadress 0x10, Näiteks ja 0x11 ja 0x12, 184 00:07:25,750 --> 00:07:26,870 ja nii edasi. 185 00:07:26,870 --> 00:07:29,955 Ja nii, kui see on nii, mis läheb lõpuks siin t? 186 00:07:29,955 --> 00:07:30,830 >> Janelle: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. Humala: Täpselt. 188 00:07:31,830 --> 00:07:33,180 Nii 0x10. 189 00:07:33,180 --> 00:07:34,570 Ja nüüd, viimane küsimus. 190 00:07:34,570 --> 00:07:37,510 Olete kaugelt pidid töötama raskeim elevant siiani. 191 00:07:37,510 --> 00:07:42,650 Tänaseks, kui ma tõmba kood uuesti, kui ma seda teen, vastavalt kolm, 192 00:07:42,650 --> 00:07:47,630 kui s võrdub võrdub t, mida ma olen tegelikult võrreldes seda oleme tõmmata? 193 00:07:47,630 --> 00:07:49,271 >> Janelle: kaks aadressi? 194 00:07:49,271 --> 00:07:50,270 DAVID J. Humala: Täpselt. 195 00:07:50,270 --> 00:07:53,350 Nii et ma ütlen on s võrdne võrdne t? 196 00:07:53,350 --> 00:07:56,210 Teisisõnu on 1 võrdne võrdne 10? 197 00:07:56,210 --> 00:07:59,710 Ja muidugi Selge vastus on praegu, ei. 198 00:07:59,710 --> 00:08:02,920 Ja nii on see programm on lõppkokkuvõttes trükkimineku mida, sa ütleksid? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> Janelle: kas see oleks, tipitud sama asi? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. Humala: Nii et kui s on 1 ja t on 10? 202 00:08:11,446 --> 00:08:13,320 >> Janelle: Sa kirjutasid erinevaid asju. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. Humala: Täpselt. 204 00:08:13,570 --> 00:08:14,480 Tipitud erinevaid asju. 205 00:08:14,480 --> 00:08:14,850 Olgu. 206 00:08:14,850 --> 00:08:16,714 Nii et aplaus, Kui me võiksime siin. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 See oli valus. 209 00:08:17,708 --> 00:08:18,208 Ma tean. 210 00:08:18,208 --> 00:08:19,684 Ilusti tehtud. 211 00:08:19,684 --> 00:08:24,690 Nüüd vaatame, kui me ei saa tease peale mida fix oli. 212 00:08:24,690 --> 00:08:28,040 Ja muidugi, kui me fikseeritud see-- mis ma nüüd esindan Green-- 213 00:08:28,040 --> 00:08:29,690 tegime paar lisaseadmeid siin. 214 00:08:29,690 --> 00:08:32,409 Esiteks, nagu meelerahu vaadake, ma olen esimene kontrollimine 215 00:08:32,409 --> 00:08:35,110 kui s võrdub null ja t võrdub null. 216 00:08:35,110 --> 00:08:39,440 Ja lihtsalt olla selge, kui võiks s või t on null koodi nagu see on? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kui võib s või t on null. 219 00:08:44,490 --> 00:08:44,990 Jah? 220 00:08:44,990 --> 00:08:45,990 >> Sihtrühm: [kuuldamatu]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. Humala: Täpselt. 223 00:08:50,510 --> 00:08:52,840 Kui string, et kasutaja tipitud on liiga pikk 224 00:08:52,840 --> 00:08:56,140 sobituda mälu või mõned imelik nurgas juhul niimoodi, 225 00:08:56,140 --> 00:08:59,010 getString, nagu me näeme, sõna otseses mõttes täna oma dokumendid, 226 00:08:59,010 --> 00:09:02,330 ütleb, et ta naaseb null nagu eriline valvur väärtus, 227 00:09:02,330 --> 00:09:05,417 või lihtsalt omamoodi eriline sümbol see tähendab, et midagi läks valesti. 228 00:09:05,417 --> 00:09:07,500 Nii et me tahame kontrollida et, sest selgub, 229 00:09:07,500 --> 00:09:09,720 et null on väga ohtlik väärtust. 230 00:09:09,720 --> 00:09:14,250 >> Sageli, kui sa püüad teha midagi null kaasates funktsioon-- kulgeb see 231 00:09:14,250 --> 00:09:17,470 sisendiks jaoks instance-- et funktsioon võib väga krahhi ja koos sellega 232 00:09:17,470 --> 00:09:19,090 võtta ette kogu oma programmi. 233 00:09:19,090 --> 00:09:22,570 Nii et see kolmas rida on praegu lihtsalt meelerahu kontrollida, vigade kontrolli, kui soovite. 234 00:09:22,570 --> 00:09:25,450 See on hea harjumus nüüd meil sattuda igal ajal me 235 00:09:25,450 --> 00:09:28,050 proovida kasutada väärtust, mis võiks potentsiaalselt olla null. 236 00:09:28,050 --> 00:09:32,000 >> Nüüd, neljandas reas siin "Kui strcmp (s, t)," hästi, 237 00:09:32,000 --> 00:09:33,180 mis see viidates? 238 00:09:33,180 --> 00:09:36,750 Noh, me ütlesime, et see oli väga lühidalt nimega funktsiooni sõnede. 239 00:09:36,750 --> 00:09:40,370 Ja tema eesmärk elus on võrrelda tema esimene argument selle vastu teine, 240 00:09:40,370 --> 00:09:44,640 kuid mitte poolest aadressid nagu tegime tahtmatult hetk 241 00:09:44,640 --> 00:09:48,270 tagasi punase koodi, kuid pigem võrrelda nende kahe 242 00:09:48,270 --> 00:09:53,210 stringid inimlikult arusaadav kuidas võrrelda seda vastu, 243 00:09:53,210 --> 00:09:56,690 selle vastu, selle vastu, ja siis peatada juhul kui üks 244 00:09:56,690 --> 00:09:59,590 või mõlemad sõrmi tabab längkriipsu 0. 245 00:09:59,590 --> 00:10:04,530 Nii et keegi aastat tagasi ellu strcmp rakendada meile funktsionaalsus 246 00:10:04,530 --> 00:10:08,890 et me lootsime me oleks saanud lihtsalt võrrelda kahte lihtsat väärtused. 247 00:10:08,890 --> 00:10:14,929 >> Nüüd ausalt öeldes, ma hoida joonistus kõik need mitmesuguseid numbreid. 248 00:10:14,929 --> 00:10:17,470 Aga reaalsus on see, ma olen muutes need üles kogu aeg. 249 00:10:17,470 --> 00:10:19,580 Ja las ma lihtsalt minna ja kirjuta need välja 250 00:10:19,580 --> 00:10:23,100 muuta punkti, et aasta lõpus päeval ja liigub edasi, 251 00:10:23,100 --> 00:10:30,160 me tõesti ei kavatse hooli mis käsitleb asjad on tegelikult 252 00:10:30,160 --> 00:10:30,790 mällu. 253 00:10:30,790 --> 00:10:34,320 Nii et ma ei kavatse teha neid liiki numbrid, et palju enam, 254 00:10:34,320 --> 00:10:38,970 Ma olen lihtsalt abstraktne see ära vähe sõbralikum lihtsalt nooled. 255 00:10:38,970 --> 00:10:42,060 >> Teisisõnu, kui s on osuti noh, olgem lihtsalt joonistada, sõna otseses mõttes, 256 00:10:42,060 --> 00:10:45,430 noolena, nool enesest midagi muud, 257 00:10:45,430 --> 00:10:48,280 ja ei muretse liiga palju lähemalt eritunnuste need aadressid 258 00:10:48,280 --> 00:10:49,910 mis jällegi tegin ikkagi. 259 00:10:49,910 --> 00:10:52,680 Aga me näeme neid aadresse, mõnikord, kui silumine koodi. 260 00:10:52,680 --> 00:10:56,450 >> Nüüd vahepeal see programm siin fikseerib, muidugi, 261 00:10:56,450 --> 00:10:58,720 et probleemi võrdlemisel need kaks stringi. 262 00:10:58,720 --> 00:11:00,260 Aga me sattusime veel üks probleem. 263 00:11:00,260 --> 00:11:03,180 See oli koopia programmeerida viimane kord, 264 00:11:03,180 --> 00:11:06,880 kusjuures, ma üritasin ära lihtsalt esimene märk string. 265 00:11:06,880 --> 00:11:09,620 Aga mis oli selle sümptomiks nägime viimast korda, kui 266 00:11:09,620 --> 00:11:14,150 kasutaja tipitud väärtus, nagu Gabe väiketähtedega, S, 267 00:11:14,150 --> 00:11:19,310 siis määrati s arvesse t, nagu kolmandale reale seal 268 00:11:19,310 --> 00:11:22,900 ja siis ma proovisin ära t sulg 0? 269 00:11:22,900 --> 00:11:25,950 Milline oli mõju muutes t sulg 0 here? 270 00:11:25,950 --> 00:11:27,150 >> Sihtrühm: See muutis s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. Humala: Jah, Muutsin s, samuti. 272 00:11:29,360 --> 00:11:31,050 Sest mis tegelikult toimub? 273 00:11:31,050 --> 00:11:34,130 Noh, las ma vaatan, kas ma suudan puhastada kuni seda pilti, järgmiselt. 274 00:11:34,130 --> 00:11:41,390 >> Kui s on jällegi sõna g, a, b, e, längkriipsu, 0 ja s 275 00:11:41,390 --> 00:11:44,084 jätkame joonistus karbis siin, kuid mitte rohkem aadresse. 276 00:11:44,084 --> 00:11:45,250 Olgem lõpetama asju. 277 00:11:45,250 --> 00:11:47,510 Lihtsalt joonista pilt lihtsustada maailma. 278 00:11:47,510 --> 00:11:52,640 >> Kui ma kuulutada t nööriga t, mis tekitab, et patakas mälu. 279 00:11:52,640 --> 00:11:55,850 Square juhtub olema 32 bittide enamik arvuteid. 280 00:11:55,850 --> 00:11:59,530 Tegelikult, kui sa oled kunagi kuulnud arvuti, millel 32-bitise arhitektuuri 281 00:11:59,530 --> 00:12:03,000 tõesti fancy-räägivad, et lihtsalt tähendab, et ta kasutab 32-bit aadressid. 282 00:12:03,000 --> 00:12:05,370 Ja kui tehnilist kõrvale, kui sa oled kunagi mõelnud, 283 00:12:05,370 --> 00:12:09,630 miks vanemad arvutid, kui sa tegelikult proovisin supp neid palju RAM, 284 00:12:09,630 --> 00:12:12,360 võiks ainult olla maksimaalselt neli gigabaiti operatiivmälu, 285 00:12:12,360 --> 00:12:14,860 hästi, et sellepärast, sõna otseses mõttes, vana arvuti võib ainult 286 00:12:14,860 --> 00:12:17,250 loendada 4 miljardit eurot, 4 miljardit baiti, 287 00:12:17,250 --> 00:12:20,590 sest see oli kasutades 32-bitise numbrid aadressid. 288 00:12:20,590 --> 00:12:23,260 >> Kuid igal juhul on käesolevas Näiteks lugu on palju lihtsam. 289 00:12:23,260 --> 00:12:27,250 t on lihtsalt üks pointer, või tegelikult char star, aka string. 290 00:12:27,250 --> 00:12:30,860 Ja kui ma tahan uuendada seda pilti nüüd, et teine ​​rida koodi, 291 00:12:30,860 --> 00:12:31,950 pärast dot, dot, dot? 292 00:12:31,950 --> 00:12:35,845 Kui ma teen string t võrdub t semikooloniga kuidas seda pilti muuta? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Jah? 295 00:12:38,000 --> 00:12:38,916 >> Sihtrühm: [kuuldamatu]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. Humala: Jah. 298 00:12:42,020 --> 00:12:42,600 Täpselt. 299 00:12:42,600 --> 00:12:45,620 Ma lihtsalt panna nool t kasti sama aadress, 300 00:12:45,620 --> 00:12:47,570 Samal esimene kiri andis. 301 00:12:47,570 --> 00:12:50,850 Või tehniliselt, kui see mees oli ikka 0x1, 302 00:12:50,850 --> 00:12:53,052 see on nii, nagu mul oli 0x1 siin ja 0x1 siin. 303 00:12:53,052 --> 00:12:54,760 Aga jälle, kes hoolib umbes aadressid? 304 00:12:54,760 --> 00:12:56,345 See on lihtsalt mõte, et nüüd on oluline. 305 00:12:56,345 --> 00:12:57,720 Nii et see on see, mis siin toimub. 306 00:12:57,720 --> 00:13:02,690 Nii et loomulikult, kui sa t sulg 0, mis on massiiv indeks, 307 00:13:02,690 --> 00:13:05,650 muidugi-- ja ausalt, tundub nagu seal massiivi siia, 308 00:13:05,650 --> 00:13:07,340 kuid nüüd on see imelik asi. 309 00:13:07,340 --> 00:13:11,160 Tea, et programmeerimise keel, C, pakub seda funktsiooni, 310 00:13:11,160 --> 00:13:14,650 kusjuures, isegi kui t on pointer, või s on osuti, 311 00:13:14,650 --> 00:13:18,050 saate endiselt kasutada, et tuttav, mugav nurksulg 312 00:13:18,050 --> 00:13:22,520 märge, et minna esimest osa, või teine ​​element või mõni element 313 00:13:22,520 --> 00:13:26,130 et selle osuti osutab et kuna eeldatavalt see 314 00:13:26,130 --> 00:13:29,410 on, nagu antud juhul, osutavad mõned massiivi. 315 00:13:29,410 --> 00:13:30,340 >> Niisiis, kuidas me seda parandada? 316 00:13:30,340 --> 00:13:33,660 Ausalt, see on koht, kus ta sai vähe valdav esimesel pilgul. 317 00:13:33,660 --> 00:13:35,340 Aga siin on uus ja parandatud versioon. 318 00:13:35,340 --> 00:13:37,460 >> Nii et esimene, ma saan lahti CS50 raamatukogu 319 00:13:37,460 --> 00:13:41,170 lihtsalt paljastada, et S on tõepoolest char star, vaid sünonüüm. 320 00:13:41,170 --> 00:13:43,540 Ja t on ka char star. 321 00:13:43,540 --> 00:13:48,290 Aga mis toimub aasta paremal pool seda joont 322 00:13:48,290 --> 00:13:49,970 kus t on määratud väärtus? 323 00:13:49,970 --> 00:13:50,790 >> Mis on malloc? 324 00:13:50,790 --> 00:13:51,630 Mis see strlen? 325 00:13:51,630 --> 00:13:52,547 Mis on sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Miks kurat seda teeb line vaadata nii keeruline? 327 00:13:54,380 --> 00:13:55,713 Mida see teeb kõrgel tasemel? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Mida see salvestamine t? 330 00:13:57,440 --> 00:13:58,646 Jah? 331 00:13:58,646 --> 00:14:01,104 Sihtrühm: See eraldamise teatud mälumahtu. 332 00:14:01,104 --> 00:14:03,032 See on salvestada, ma arvan, kirjad [kuuldamatu]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. Humala: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 See eraldades teatud mälumahtu 336 00:14:06,650 --> 00:14:08,940 talletada, arvatavasti tulevikus tähed. 337 00:14:08,940 --> 00:14:11,310 Ja eriti, malloc Seetõttu tagastamise? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Sihtrühm: Tulles [kuuldamatu]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. Humala: Täpselt. 341 00:14:15,850 --> 00:14:18,850 Tulles aadress, et mälu mis on fancy viis öelda, 342 00:14:18,850 --> 00:14:21,640 tagastab aadress Esimene bait, et mälu. 343 00:14:21,640 --> 00:14:25,460 Kohustuseks on mind meeles kui palju mälu ma tegelikult 344 00:14:25,460 --> 00:14:27,140 eraldatud või küsis malloc eest. 345 00:14:27,140 --> 00:14:28,384 >> Nüüd, kui palju see on? 346 00:14:28,384 --> 00:14:30,550 Noh, isegi kui seal on palju sulgudes siin 347 00:14:30,550 --> 00:14:32,970 malloc võtab vaid ühe argumendi. 348 00:14:32,970 --> 00:14:37,250 Ja ma täpsustades strlen s, et anda mulle nii palju baite kui on s, 349 00:14:37,250 --> 00:14:37,800 kuid lisage esimene kommentaar. 350 00:14:37,800 --> 00:14:38,300 Miks? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Jah? 353 00:14:39,530 --> 00:14:40,840 >> Sihtrühm: Kenoviiva 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. Humala: Täpselt. 355 00:14:41,840 --> 00:14:43,423 Me peame tegema veidi majapidamine. 356 00:14:43,423 --> 00:14:45,970 Nii, sest seal on längkriipsu 0, siis on parem meeles pidada. 357 00:14:45,970 --> 00:14:47,310 Vastasel juhul me ei kavatse luua string et 358 00:14:47,310 --> 00:14:49,170 ei ole see eriline terminaator. 359 00:14:49,170 --> 00:14:52,640 >> Vahepeal lihtsalt super anal, mul sizeof (char) 360 00:14:52,640 --> 00:14:55,730 igaks juhuks keegi jookseb minu kood on CS50 seade, 361 00:14:55,730 --> 00:14:58,220 aga võib-olla mõne teise arvutiga kokku, kus tähemärki 362 00:14:58,220 --> 00:15:01,470 on üks bait, kokkuleppeliselt, kuid kaks baiti, või midagi suuremat kui see. 363 00:15:01,470 --> 00:15:04,490 See on lihtsalt super, super tõrksad vigu. 364 00:15:04,490 --> 00:15:06,940 Kuigi tegelikult on see kõige tõenäolisemalt saab olema 1. 365 00:15:06,940 --> 00:15:11,490 >> Nüüd, vahepeal ma minna ja kopeerida string, t sulg i võrdub t sulg s. 366 00:15:11,490 --> 00:15:14,962 Ja ma alistuma eelmisel nädalal lähtekoodi näha, mis toimub. 367 00:15:14,962 --> 00:15:17,670 Aga peamine Buffee ja Põhjus, miks ma panna koodi nüüd roheline 368 00:15:17,670 --> 00:15:22,520 sellepärast, et kõige viimane rida, t sulg 0 võrdub toupper, 369 00:15:22,520 --> 00:15:25,230 tagajärg on ära mis string? 370 00:15:25,230 --> 00:15:26,960 t ja / või t? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 See viimane rida koodi. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Just t, sest see, mis on juhtus seekord 375 00:15:35,560 --> 00:15:41,500 kui ma veidi tagasi võtta, et viimane samm, mis juhtus, kui ma kutsun malloc, 376 00:15:41,500 --> 00:15:45,380 Ma põhimõtteliselt saan patakas mälu mis on sama suur kui originaal, 377 00:15:45,380 --> 00:15:47,020 sest see on aritmeetiline tegin. 378 00:15:47,020 --> 00:15:50,920 Ma salvestamine t aadress Selle patakas mälu. 379 00:15:50,920 --> 00:15:53,370 Kuigi see tundub kena ja ilus, kena ja tühi, 380 00:15:53,370 --> 00:15:56,882 reaalsus on olemas, mida jagame hoiab helistades, prügi väärtused siin. 381 00:15:56,882 --> 00:15:59,340 See patakas mälu võiks väga samuti on kasutatud enne, 382 00:15:59,340 --> 00:16:00,940 paar sekundit, paar minutit tagasi. 383 00:16:00,940 --> 00:16:04,410 Nii et võib täiesti olla numbrid või tähed seal, lihtsalt juhus. 384 00:16:04,410 --> 00:16:08,580 Aga nad ei ole kehtiv, kuni ma ise asustada see patakas mälu 385 00:16:08,580 --> 00:16:12,510 tegelike tähemärki, nagu ma teha, et vimka. 386 00:16:12,510 --> 00:16:13,180 Olgu? 387 00:16:13,180 --> 00:16:16,180 >> Nüüd, kliimaksi need kolm näidet 388 00:16:16,180 --> 00:16:20,730 mis näiliselt purustatud viimane kord, Selle Vaheta näiteks seda funktsiooni 389 00:16:20,730 --> 00:16:23,670 töötas selles mõttes, et vahetasid ja b. 390 00:16:23,670 --> 00:16:25,620 Aga see ei tööta, mida muud mõtet? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Jah? 393 00:16:28,614 --> 00:16:29,612 >> Sihtrühm: [kuuldamatu]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. Humala: Täpselt. 396 00:16:36,700 --> 00:16:39,530 Kui ma nimetan seda funktsiooni alates järgmise-- näiteks 397 00:16:39,530 --> 00:16:42,870 alates funktsioon nagu peamine, kus Mul on muutuja x ja y, nagu ma 398 00:16:42,870 --> 00:16:46,160 tegi eelmisel nädalal sama kood ja ma läbima x ja y 399 00:16:46,160 --> 00:16:49,860 Vaheta ja seejärel helistada Swap-- see, Muidugi on õige versioon 400 00:16:49,860 --> 00:16:52,220 on see, mida me parasjagu vaadake-- see ei tööta. 401 00:16:52,220 --> 00:16:53,770 Mis on fix? 402 00:16:53,770 --> 00:16:56,850 >> Noh, nii lihtsalt olla selge, lubage mul minna 403 00:16:56,850 --> 00:17:05,450 ja-- anna mulle üks sekund siia ja vaata kui ma näitan sulle viimane, mis 404 00:17:05,450 --> 00:17:12,464 on sisse-- vaatame, kas ma ei leia Selle tegelik fast-- OK, [kuuldamatu]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, seal ta on. 407 00:17:19,240 --> 00:17:21,000 Nii ignoreerida käske ma kirjutades. 408 00:17:21,000 --> 00:17:23,780 Ma tahan, et see alla laadida aadressil viimase hetke näide 409 00:17:23,780 --> 00:17:27,960 alates viimane kord, mis on nüüdsest ei Vaheta. 410 00:17:27,960 --> 00:17:30,200 >> Nii ei Swap on koht, kus jätsime maha viimase aja 411 00:17:30,200 --> 00:17:32,930 kusjuures, ma vormindatud x 1 ja y 2. 412 00:17:32,930 --> 00:17:35,840 Ma siis helistan Vaheta, möödaminnes 1 ja 2. 413 00:17:35,840 --> 00:17:37,930 Ja siis see funktsioon töötanud mõnes mõttes, 414 00:17:37,930 --> 00:17:40,750 kuid see ei olnud püsiv tagajärjeks on x ja y. 415 00:17:40,750 --> 00:17:45,430 Seega on küsimus käepärast on, kuidas nüüd kas me tegelikult seda probleemi lahendada? 416 00:17:45,430 --> 00:17:47,820 Mis on lahendus käepärast? 417 00:17:47,820 --> 00:17:53,150 >> Noh, swap.c, mis on uus täna märgata paari erinevusi. 418 00:17:53,150 --> 00:17:54,700 x ja y on sama. 419 00:17:54,700 --> 00:17:57,250 Aga mis on selgelt erinevad umbes liin 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Mida uut on, kui sa mäletad mida ta nägi välja nagu hetk tagasi? 422 00:18:01,715 --> 00:18:02,565 >> Sihtrühm: [kuuldamatu]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. Humala: Jah. 424 00:18:03,440 --> 00:18:06,680 Nii ampersandid on uus tükk süntaksi mitte ainult selle programmi, 425 00:18:06,680 --> 00:18:08,560 vaid ka üldisemalt CS50. 426 00:18:08,560 --> 00:18:10,680 Praeguseks ma ei usu, oleme näinud näiteid 427 00:18:10,680 --> 00:18:14,070 või tegelikult rääkisid need mingil detail, välja arvatud võib-olla, preemptively 428 00:18:14,070 --> 00:18:16,467 jaos, ampersand niimoodi. 429 00:18:16,467 --> 00:18:19,300 Noh, selgub ampersand on üks viimase tükki uue süntaksi 430 00:18:19,300 --> 00:18:20,174 me ei kavatse õppida. 431 00:18:20,174 --> 00:18:23,500 Kõik see tähendab, aadress mõned muutuja. 432 00:18:23,500 --> 00:18:25,070 Millisel aadressil see x elada? 433 00:18:25,070 --> 00:18:26,510 Aga mis aadress see y elada? 434 00:18:26,510 --> 00:18:28,700 Sest kui Põhiprobleemiks enne 435 00:18:28,700 --> 00:18:32,970 oli see, et x ja y on möödutakse koopiad, mida me tõesti tahame teha 436 00:18:32,970 --> 00:18:38,780 on pakkuda Swap koos nagu aare Kaart, mis viib kus x ja y on tegelikult 437 00:18:38,780 --> 00:18:41,910 on RAM, nii et Swap on võimalik jälgida, et kaart 438 00:18:41,910 --> 00:18:47,760 ja minna sinna, kus x ja y tähistab kohapeal ja muuta tegelikke väärtusi 1 ja 2 439 00:18:47,760 --> 00:18:48,270 seal. 440 00:18:48,270 --> 00:18:50,710 >> Nii Swap peab muutuma veidi liiga. 441 00:18:50,710 --> 00:18:53,760 Ja esmapilgul võib see tunduda natuke sarnane char star. 442 00:18:53,760 --> 00:18:54,850 Ja seda ta tõepoolest on. 443 00:18:54,850 --> 00:18:59,635 Nii on viit, mis tüüpi andmeid, põhinevad esile osa? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Nii et see on int. 446 00:19:01,620 --> 00:19:04,880 >> Nii et ei ole enam keskmine, see aadress int. 447 00:19:04,880 --> 00:19:07,910 Ja samamoodi, b on nüüd olevat aadressi int. 448 00:19:07,910 --> 00:19:12,470 Nii et kui ma nüüd helistada Swap Main, Ma ei kavatse anda Swap 1 ja 2. 449 00:19:12,470 --> 00:19:15,540 Ma annan ta nagu Ox-midagi ja Ox-midagi, 450 00:19:15,540 --> 00:19:19,820 kaks aadressi, mis viib Vaheta oma tegelikke asukohti 451 00:19:19,820 --> 00:19:21,310 minu arvuti mällu. 452 00:19:21,310 --> 00:19:25,580 >> Nii et nüüd, mu ülejäänud rakendamine on vaja muuta tad. 453 00:19:25,580 --> 00:19:28,650 Mis on ilmselt erinev nüüd Nende kolm rida koodi? 454 00:19:28,650 --> 00:19:31,350 Seal on need kuradi kõik tähed üle koht, eks ole? 455 00:19:31,350 --> 00:19:33,014 Mis siis toimub? 456 00:19:33,014 --> 00:19:33,514 Jah? 457 00:19:33,514 --> 00:19:35,055 >> Sihtrühm: See on ilmselt [kuuldamatu]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. Humala: Täpselt. 460 00:19:37,990 --> 00:19:41,560 Nii selles context-- ja see ei olnud Parim disain otsus tõsi, 461 00:19:41,560 --> 00:19:42,530 aastat tagasi. 462 00:19:42,530 --> 00:19:45,110 Selles kontekstis, kus sa lihtsalt pead star, 463 00:19:45,110 --> 00:19:48,240 ja sa ei pea andmete tüüp, nagu int, kohe vasakule, 464 00:19:48,240 --> 00:19:53,146 selle asemel pead võrdusmärk, selgelt, Selles kontekstis, kui te ütlete, star, 465 00:19:53,146 --> 00:19:56,980 see tähendab, et minna aadress, mis on in. 466 00:19:56,980 --> 00:19:58,870 Jälgi aare kaart, nii rääkida. 467 00:19:58,870 --> 00:20:01,720 >> Ja vahepeal kooskõlas 37, see tähendab, et sama asi. 468 00:20:01,720 --> 00:20:05,460 Mine aadress ja panna mida seal? 469 00:20:05,460 --> 00:20:09,520 Mis iganes on asukohta, b täpsustatud. 470 00:20:09,520 --> 00:20:10,980 Teisisõnu, minge b. 471 00:20:10,980 --> 00:20:12,130 Võta see raha. 472 00:20:12,130 --> 00:20:15,620 Mine ja kohta, mis võrdub kirjutama, omistamisoperaatorile, 473 00:20:15,620 --> 00:20:17,010 panna, et raha seal. 474 00:20:17,010 --> 00:20:19,272 >> Samamoodi int temp on lihtsalt int. 475 00:20:19,272 --> 00:20:20,730 Midagi peab muutuma umbes temp. 476 00:20:20,730 --> 00:20:24,810 See on lihtsalt vaba klaasi Annenberg mõned piima või apelsinimahla. 477 00:20:24,810 --> 00:20:27,630 Aga ma ei pea ütlema, minge b. 478 00:20:27,630 --> 00:20:31,449 Mine selle sihtkoha ja pane väärtus temp seal. 479 00:20:31,449 --> 00:20:32,490 Niisiis, mis toimub siis? 480 00:20:32,490 --> 00:20:36,540 Kui ma tegelikult helistada Vahetusega seekord kui see esimene plaat siin on Main, 481 00:20:36,540 --> 00:20:42,270 Teise salve on vahetatavad, kui Annan ampersand x ja ampersand y 482 00:20:42,270 --> 00:20:47,150 Main Vaheta, lihtsalt olla kindel, mis see on freimi vastuvõtva? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Jah? 485 00:20:49,200 --> 00:20:50,180 >> Sihtrühm: [kuuldamatu]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. Humala: Täpselt. 487 00:20:51,180 --> 00:20:53,129 Aadress x ja aadress y. 488 00:20:53,129 --> 00:20:55,170 Ja sa ei mõtle neid nagu postiaadressid. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street ja 35 Oxford Street ja te 490 00:20:58,772 --> 00:21:01,230 soovite teisaldada kaks hoonet mis on nendes kohtades. 491 00:21:01,230 --> 00:21:04,680 >> See on omamoodi naeruväärne idee, kuid see on kõik, mida me mõtleme aadress. 492 00:21:04,680 --> 00:21:07,000 Kui maailmas ei leiad need kaks ints? 493 00:21:07,000 --> 00:21:09,470 Kui maailmas sa saad leida need kaks hoonet? 494 00:21:09,470 --> 00:21:15,170 Nii et kui lõpuks, pärast kogu seda aega ma lähevad tänapäeva lähtekood ja kompileerida 495 00:21:15,170 --> 00:21:22,110 Vaheta ja run ./swap lõpetuseks Esimest korda me tegelikult näeme, et 496 00:21:22,110 --> 00:21:25,330 minu väärtused on tõepoolest välja vahetasid edukalt. 497 00:21:25,330 --> 00:21:30,860 Ja nüüd on meil ka võtta teadmiseks see, ütleme, GDB. 498 00:21:30,860 --> 00:21:32,740 >> Nii et lubage mul minna samasse faili. 499 00:21:32,740 --> 00:21:35,010 Lubage mul minna ja joosta GDB kohta ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Ja nüüd Vaheta, ma lähen edasi ja määrata murdepunkti Main. 502 00:21:40,547 --> 00:21:42,630 Ja nüüd ma lähen käia ja käivitage programm. 503 00:21:42,630 --> 00:21:45,810 Ja nüüd me näeme oma koodi peatatud sel line. 504 00:21:45,810 --> 00:21:48,330 >> Kui ma minna ja print x, mida ma peaksin siin näha? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 See on küsimus. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Ütle uuesti? 509 00:21:51,530 --> 00:21:52,295 >> Sihtrühm: [kuuldamatu]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. Humala: Nii juhuslikke numbreid, võibolla. 511 00:21:53,910 --> 00:21:56,010 Võib-olla ma saan õnnelik, ja see on kena ja lihtne, nagu 0. 512 00:21:56,010 --> 00:21:57,230 Aga võib-olla see on mingi suvaline number. 513 00:21:57,230 --> 00:21:58,090 Sel juhul, mul vedas. 514 00:21:58,090 --> 00:21:59,030 See lihtsalt juhtub olema 0. 515 00:21:59,030 --> 00:22:00,780 Aga see on tõesti õnn, sest mitte enne, kui ma 516 00:22:00,780 --> 00:22:06,280 kirjuta järgmine ja siis print x on, et koodirida, joon 19, hukatud. 517 00:22:06,280 --> 00:22:10,942 >> Vahepeal, kui ma kirjuta järgmine kord, ja nüüd välja printida y, ma lähen, et näha 2. 518 00:22:10,942 --> 00:22:13,900 Nüüd, kui ma järgmisena, see läheb natuke segane, sest nüüd, 519 00:22:13,900 --> 00:22:17,250 printf läheb ilmuvad ekraan, nagu ta seda tegi. x on 1. 520 00:22:17,250 --> 00:22:18,606 >> Teeme seda uuesti. 521 00:22:18,606 --> 00:22:20,480 Ja nüüd, siin on koht, kus asjad huvitavad. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Enne kui ma kutsun Vaheta või isegi samm sinna, võtame veidi piiluda. 524 00:22:26,580 --> 00:22:28,980 x on jällegi 1. 525 00:22:28,980 --> 00:22:33,240 Y on loomulikult kiire sanity kontrollige, 2, seega ei ole raske seal. 526 00:22:33,240 --> 00:22:35,740 Aga milline on ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Vastus, see on selline funky otsin. 529 00:22:39,350 --> 00:22:43,500 Aga int star sulgudes on lihtsalt GDP viis öelda, et see on aadress. 530 00:22:43,500 --> 00:22:48,290 See ei ole int, see pointer int, või muidu tuntud aadress. 531 00:22:48,290 --> 00:22:49,742 >> Mis see on hull asi? 532 00:22:49,742 --> 00:22:51,825 Me ei ole kunagi näinud midagi päris nii enne. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Nii et see on aadress, minu arvuti mälu, kus x juhtub elama. 535 00:22:58,120 --> 00:22:59,040 See Ox-midagi. 536 00:22:59,040 --> 00:23:01,290 Ja see on, ausalt öeldes, miks Olen hakanud joonistus nooled 537 00:23:01,290 --> 00:23:03,340 numbrite asemel, sest kes tõesti hoolib 538 00:23:03,340 --> 00:23:06,890 et teie int on eriti aadress, mis on nii suur. 539 00:23:06,890 --> 00:23:12,160 Aga bffff0c4, need on kõik tõepoolest kuueteistkümnendarvudega, 540 00:23:12,160 --> 00:23:13,720 mis on 0 kuni f. 541 00:23:13,720 --> 00:23:16,590 >> Nii et me ei hakka liiga pikk mis asjad need on. 542 00:23:16,590 --> 00:23:19,400 Aga kui ma välja printida y, muidugi, ma näen 2. 543 00:23:19,400 --> 00:23:22,440 Aga ampersand y, ma näen seda aadressi. 544 00:23:22,440 --> 00:23:26,527 Ja teate, uudishimulik, kuidas kaugel on x ja y? 545 00:23:26,527 --> 00:23:27,985 Võite ignoreerida enamik aadress. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Neli baiti. 548 00:23:29,920 --> 00:23:33,510 Ja see on kooskõlas meie varem väita, et kui suur on int? 549 00:23:33,510 --> 00:23:34,130 Neli baiti. 550 00:23:34,130 --> 00:23:37,420 Seega tundub, et kõik on vooder üles kenasti, kui võiks loota, mälestuseks. 551 00:23:37,420 --> 00:23:40,010 >> Nii et nüüd, lähme lihtsalt kiiresti edasi et lõpuks see lugu. 552 00:23:40,010 --> 00:23:43,290 Lähme edasi ja kirjuta samm, sukelduda Swap funktsiooni. 553 00:23:43,290 --> 00:23:46,880 Nüüd teate, kui ma tüüpi, see on identne aadress x. 554 00:23:46,880 --> 00:23:52,130 Kui ma B-tüüpi, see on identne aadressile y. 555 00:23:52,130 --> 00:23:57,020 Mida peaks ma näen, kui ma ütleme, minna aadressile? 556 00:23:57,020 --> 00:23:58,120 Nii printida star. 557 00:23:58,120 --> 00:24:00,130 Nii täht tähendab minna, selles kontekstis. 558 00:24:00,130 --> 00:24:02,730 Ampersand tähendab mis aadress. 559 00:24:02,730 --> 00:24:05,000 Nii täht tähendab 1. 560 00:24:05,000 --> 00:24:09,590 Ja print star b annab mulle 2. 561 00:24:09,590 --> 00:24:15,750 >> Ja las ma eeldada, et praegu et vähemalt kood, mis 562 00:24:15,750 --> 00:24:18,950 lähtub täita nüüd saab põhjendatud läbi niimoodi. 563 00:24:18,950 --> 00:24:21,150 Aga me vaadata seda mõtet enne pikk. 564 00:24:21,150 --> 00:24:23,850 Nii et see versioon Swap Nüüd on õige ja võimaldab 565 00:24:23,850 --> 00:24:26,650 meid, et vahetada selle konkreetse andmetüübi. 566 00:24:26,650 --> 00:24:29,120 >> Nii tekib küsimusi siis Swap? 567 00:24:29,120 --> 00:24:29,890 On star? 568 00:24:29,890 --> 00:24:30,690 On aadress? 569 00:24:30,690 --> 00:24:33,270 Ja te näete, koos probleem komplekt 4, omamoodi, 570 00:24:33,270 --> 00:24:37,310 kuid probleem seatud 5, kindlasti, kuidas need asjad on kasulik ja saada palju rohkem 571 00:24:37,310 --> 00:24:39,584 meeldiv, nagu neile tulemuse. 572 00:24:39,584 --> 00:24:40,430 Üldse midagi? 573 00:24:40,430 --> 00:24:40,930 Olgu. 574 00:24:40,930 --> 00:24:44,350 Nii malloc on jällegi see funktsioon et lihtsalt eraldab mälu, mälu 575 00:24:44,350 --> 00:24:45,330 eraldamisel. 576 00:24:45,330 --> 00:24:47,024 Ja miks on see kasulik? 577 00:24:47,024 --> 00:24:48,940 Noh, kõik see aeg, olete kasutanud malloc. 578 00:24:48,940 --> 00:24:52,230 Kui arvate nüüd, kuidas getString teosed, arvatavasti on see 579 00:24:52,230 --> 00:24:56,140 küsinud keegi patakas mälu, igal kasutajal tüüpi string 580 00:24:56,140 --> 00:24:59,040 aastal, sest me kindlasti ei tea, kui CS50 personal 581 00:24:59,040 --> 00:25:02,710 kui suur need stringid, et inimesed lähed Võib-olla. 582 00:25:02,710 --> 00:25:07,910 >> Nii et olgem esimest korda hakata Tõmmake kuidas CS50 raamatukogu tööd, 583 00:25:07,910 --> 00:25:10,990 teel paar näidet mis viib meid sinna. 584 00:25:10,990 --> 00:25:15,300 Nii et kui ma avada gedit ja avada scanf 0, 585 00:25:15,300 --> 00:25:17,055 me näeme järgmine kood. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, mis on kättesaadav veebilehel täna, on suhteliselt vähe rida koodi 588 00:25:23,530 --> 00:25:25,351 siin, 14 kuni 20. 589 00:25:25,351 --> 00:25:26,600 Ja vaatame, mis ta teeb. 590 00:25:26,600 --> 00:25:28,920 See kinnitab, int, mida nimetatakse x. 591 00:25:28,920 --> 00:25:30,850 See ütleb midagi, number palun. 592 00:25:30,850 --> 00:25:33,940 Ja nüüd ta ütleb, scanf% i, ja x. 593 00:25:33,940 --> 00:25:35,620 Nii et seal on hunnik uusi asju seal. 594 00:25:35,620 --> 00:25:38,420 >> Aga scanf, saate objekti arvan AS vastupidine printf. 595 00:25:38,420 --> 00:25:40,090 printf muidugi trükib ekraanile. 596 00:25:40,090 --> 00:25:44,410 scanf omamoodi skaneerib alates kasutaja klaviatuur midagi ta on trükitud. 597 00:25:44,410 --> 00:25:46,550 >> % I on nagu printf. 598 00:25:46,550 --> 00:25:49,410 See tähendab, oodata kasutaja sisestada int. 599 00:25:49,410 --> 00:25:52,820 Ja nüüd, miks sa arvad, et ma võiks kulgeb scanf ja x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Kui eesmärk on elu scanf on midagi saada kasutaja, 602 00:25:57,770 --> 00:26:02,480 Mis tähendus on kulgeb see, & x, nüüd? 603 00:26:02,480 --> 00:26:02,980 Jah? 604 00:26:02,980 --> 00:26:03,896 >> Sihtrühm: [kuuldamatu]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. Humala: Täpselt. 607 00:26:06,540 --> 00:26:12,900 Mida ma ka, inimese, kirjuta, minu panus läheb salvestatakse selles kohas. 608 00:26:12,900 --> 00:26:17,660 See ei ole piisav, mäletan, et lihtsalt läbima x, sest me oleme näinud juba, 609 00:26:17,660 --> 00:26:21,630 iga kord, kui te liigu lihtsalt toores muutuja, nagu int, mõne muu funktsiooni, 610 00:26:21,630 --> 00:26:25,640 Muidugi, see võib muuta, et varieeruv, kuid mitte jäädavalt. 611 00:26:25,640 --> 00:26:27,360 See ei saa olla mõju Main. 612 00:26:27,360 --> 00:26:29,420 See võib muuta ainult oma kohaliku koopia. 613 00:26:29,420 --> 00:26:32,560 Aga kui selle asemel, sa ei pea mulle tegelik keskmine, 614 00:26:32,560 --> 00:26:36,640 aga sa annad mulle suunad et int, ma nüüd, olles scanf, 615 00:26:36,640 --> 00:26:41,050 kindlasti, võin järeldada, et lahendada ja pane number seal 616 00:26:41,050 --> 00:26:43,280 nii et teil on juurdepääs ka seda. 617 00:26:43,280 --> 00:26:45,120 >> Nii et kui ma saan selle programmi, vaatame. 618 00:26:45,120 --> 00:26:49,660 Tee scanf 0 dot kaldkriips, Scanf 0. 619 00:26:49,660 --> 00:26:54,030 Ja kui ma nüüd kirjuta number nagu 50, aitäh 50. 620 00:26:54,030 --> 00:26:58,150 Kui ma nüüd kirjuta number nagu miinus 1, negatiivse 1. 621 00:26:58,150 --> 00:27:04,200 Nüüd kirjuta number nagu 1.5, hm. 622 00:27:04,200 --> 00:27:06,030 Miks minu programm ignoreerib mind? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Noh, sest lihtsalt, ma ütlesin ta oodata int ainult. 625 00:27:09,880 --> 00:27:10,380 Olgu. 626 00:27:10,380 --> 00:27:11,630 Nii et see on üks versioon sellest. 627 00:27:11,630 --> 00:27:16,600 Võtame asju pügala ja ettepaneku, et see ei ole hea. 628 00:27:16,600 --> 00:27:20,530 Ja siin on väga lihtne näide kuidas saame alustada kirjalikult koodi 629 00:27:20,530 --> 00:27:24,450 et teised inimesed saavad kasutada või kompromisse tehes halbu asju. 630 00:27:24,450 --> 00:27:28,336 Nii rida 16, nii sarnased vaimus, et enne, 631 00:27:28,336 --> 00:27:29,960 aga ma ei tuvastanud int seekord. 632 00:27:29,960 --> 00:27:32,970 Ma kuulutatakse see char star, aka string. 633 00:27:32,970 --> 00:27:35,190 >> Aga mida see tegelikult tähendab? 634 00:27:35,190 --> 00:27:38,790 Nii et kui ma ei täpsusta address-- ja Ma kutsun seda omavoliliselt, puhver, 635 00:27:38,790 --> 00:27:43,370 aga ma ei saanud seda nimetada s, et simple-- ja siis ma seda teen, mulle selgitada, 636 00:27:43,370 --> 00:27:48,630 kui saaksid, põhinevad eelmise loogika, mida scanf teed joon 18, 637 00:27:48,630 --> 00:27:55,000 kui pass% s ja puhver, mis on mõeldud? 638 00:27:55,000 --> 00:27:58,210 Mis on scanf, kui soovite täpselt sama loogika nagu versioon 0, 639 00:27:58,210 --> 00:28:00,640 üritan siin teha, kui kasutaja tipib midagi? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Jah? 642 00:28:03,409 --> 00:28:04,407 >> Sihtrühm: [kuuldamatu]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. Humala: Täpselt. 645 00:28:08,890 --> 00:28:11,577 Scanf, loogika varem kavatseb võtta string 646 00:28:11,577 --> 00:28:13,410 et inimese trükitud Kusagil, see on nüüd string, 647 00:28:13,410 --> 00:28:15,790 see ei ole number, arvatavasti, kui ta cooperates-- 648 00:28:15,790 --> 00:28:19,310 ja see läheb püüdma panna, et stringi mälu olenemata aadress 649 00:28:19,310 --> 00:28:20,340 puhver täpsustatakse. 650 00:28:20,340 --> 00:28:23,870 Ja see on tore, sest puhver tõepoolest mõeldud aadress. 651 00:28:23,870 --> 00:28:30,470 >> Kuid ma väidavad, et see programm on lollakas väga tõsiselt, sest milline väärtus on 652 00:28:30,470 --> 00:28:31,330 puhver vaikimisi? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Mida ma vormindatud võtta? 655 00:28:34,790 --> 00:28:35,770 Mis patakas mälu? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Ma ei ole, eks? 658 00:28:38,620 --> 00:28:42,265 >> Nii et kuigi ma olen eraldatud char täht, mis on enam nn s, 659 00:28:42,265 --> 00:28:48,030 see on selle asemel kutsutakse, buffer-- nii Joonistame muutuja nimi 660 00:28:48,030 --> 00:28:53,380 nüüd buffer-- kui ma ei ole nimetatakse getString või malloc siin 661 00:28:53,380 --> 00:28:56,030 mis tähendab tegelikult seda, et puhver on vaid mõned prügi väärtus. 662 00:28:56,030 --> 00:28:57,030 >> Nüüd mida see tähendab? 663 00:28:57,030 --> 00:29:00,220 See tähendab, et ma olen rääkinud scanf oodata string kasutaja. 664 00:29:00,220 --> 00:29:01,300 Ja tead mis? 665 00:29:01,300 --> 00:29:03,883 Mis iganes see asi on suunatud to-- ja Juhin küsimärk 666 00:29:03,883 --> 00:29:07,060 kuid tegelikkuses see saab olema midagi OX1, 2, 3, õigus? 667 00:29:07,060 --> 00:29:10,730 See on mingi võlts raha, et lihtsalt juhtub olema seal enne. 668 00:29:10,730 --> 00:29:13,440 Nii teisisõnu, see on justkui puhver on lihtsalt 669 00:29:13,440 --> 00:29:16,180 osutades midagi mälestuseks. 670 00:29:16,180 --> 00:29:17,610 Ma ei tea, mida. 671 00:29:17,610 --> 00:29:24,130 >> Nii et kui ma kirjuta Gabe nüüd, see läheb proovida panna g-a-b-e / 0 seal. 672 00:29:24,130 --> 00:29:25,530 Aga kes teab, mis see on? 673 00:29:25,530 --> 00:29:27,480 Ja minevikus tahes ajal oleme proovinud puudutada 674 00:29:27,480 --> 00:29:29,770 mälu, mis ei kuulu meid, mis on juhtunud? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Või peaaegu iga kord. 677 00:29:32,870 --> 00:29:34,310 Segmenteerimine süü, eks? 678 00:29:34,310 --> 00:29:37,829 >> See nool, ma ei tea, kus see on juhtides. see on lihtsalt mingi suvaline väärtus. 679 00:29:37,829 --> 00:29:40,370 Ja muidugi, kui sa tõlgendama juhuslik väärtus, aadress, 680 00:29:40,370 --> 00:29:42,610 sa lähed minema Mõned juhuslikud kohtades. 681 00:29:42,610 --> 00:29:46,810 Nii Gabe võib tõepoolest crash minu programm selles asjas. 682 00:29:46,810 --> 00:29:50,600 >> Niisiis, mida me saame teha, et see on peaaegu sama halb? 683 00:29:50,600 --> 00:29:52,660 Mõelge sellele kolmandale ja viimane näide scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 See versioon on parem siis mis mõttes? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Kui olete rahul Eelmise probleem, see on parem. 688 00:30:01,400 --> 00:30:02,250 Miks? 689 00:30:02,250 --> 00:30:03,250 >> Sihtrühm: [kuuldamatu]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. Humala: Hea. 692 00:30:07,110 --> 00:30:09,970 Nii et sel juhul on line 16 On parem, selles mõttes 693 00:30:09,970 --> 00:30:12,030 et me oleme selgelt eraldades mõned mälu. 694 00:30:12,030 --> 00:30:14,190 Me ei kasuta malloc, me kasutame nädal 2 695 00:30:14,190 --> 00:30:16,060 lähenemine lihtsalt kuulutatakse massiivi. 696 00:30:16,060 --> 00:30:18,130 Ja me oleme varem öelnud, et string on lihtsalt massiivi tähemärki 697 00:30:18,130 --> 00:30:19,690 nii et see on täiesti õigustatud. 698 00:30:19,690 --> 00:30:22,910 Aga see, muidugi, nagu sa tähele, fikseeritud suurusega 16. 699 00:30:22,910 --> 00:30:25,440 >> Nii et see programm on täiesti ohutu, kui ma tüüpi 700 00:30:25,440 --> 00:30:29,760 ühes märgijadadena kaks iseloomu stringid, 15 tähemärke. 701 00:30:29,760 --> 00:30:34,970 Aga niipea, kui ma hakake kirjutama 16 17, 18, 1000 tähemärke, 702 00:30:34,970 --> 00:30:37,390 Kus on see string läheb lõpuks? 703 00:30:37,390 --> 00:30:39,570 See läheb lõpuks osaliselt siin. 704 00:30:39,570 --> 00:30:42,820 Aga kes teab mida veel on piiridest 705 00:30:42,820 --> 00:30:44,270 selle konkreetse massiivi? 706 00:30:44,270 --> 00:30:48,015 >> See on nii, nagu ma olen kuulutas 16. kastid siin. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Nii et pigem joonistada kõik 16, paneme lihtsalt teeselda, et ma olen koostanud 16. 709 00:30:52,690 --> 00:30:56,540 Aga kui ma siis proovige lugeda string see on palju pikem, nagu 50 tähemärki, 710 00:30:56,540 --> 00:31:01,270 Ma hakkan panna a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Ja see on ilmselt mõned teised mälu segmenti 712 00:31:04,916 --> 00:31:06,790 et jällegi võib põhjustada minu programmi krahhi, 713 00:31:06,790 --> 00:31:10,600 sest ma ei ole palunud midagi enamat kui lihtsalt 16 baiti. 714 00:31:10,600 --> 00:31:12,260 >> Nii et keda see huvitab? 715 00:31:12,260 --> 00:31:13,880 Noh, siin on CS50 raamatukogu. 716 00:31:13,880 --> 00:31:17,220 Ja kõige tähtsam on see lihtsalt nagu juhendid üleval. 717 00:31:17,220 --> 00:31:21,670 CS50 raamatukogu, kõik see aeg, on olnud seda joont line 52. 718 00:31:21,670 --> 00:31:23,680 Me oleme näinud typedef või näed typedef 719 00:31:23,680 --> 00:31:27,930 aastal pset 4, mis lihtsalt tekitab sünonüüm, mille char star võib olla rohkem 720 00:31:27,930 --> 00:31:29,290 nimetatud lihtsalt stringi. 721 00:31:29,290 --> 00:31:31,540 Seega on see üks paari Apupyörät 722 00:31:31,540 --> 00:31:34,120 Me kasutasime salaja all kapuuts. 723 00:31:34,120 --> 00:31:36,490 >> Vahepeal siin on funktsioon, getchar. 724 00:31:36,490 --> 00:31:38,190 Nüüd paistab, et seal ei ole keha ta. 725 00:31:38,190 --> 00:31:40,273 Ja tegelikult, kui ma hoida kerida, ma tegelikult ei 726 00:31:40,273 --> 00:31:42,080 näe rakendused Nende funktsioonide. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Nagu meelerahu kontrolli, miks see nii on? 729 00:31:45,516 --> 00:31:46,795 >> Sihtrühm: [kuuldamatu]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. Humala: Jah. 731 00:31:47,670 --> 00:31:48,950 Nii et see on päisefailis. 732 00:31:48,950 --> 00:31:52,520 Ja header failid sisaldavad prototüübid, pluss mõned muud asjad, tundub, 733 00:31:52,520 --> 00:31:53,780 nagu typedefs. 734 00:31:53,780 --> 00:31:56,910 Aga CS50.c, mis me oleme kunagi andnud teile otse, 735 00:31:56,910 --> 00:32:02,100 kuid on olnud CS50 seadme kõik Selle aja sügavale selle kaustad 736 00:32:02,100 --> 00:32:04,990 märgata, et seal on terve hunnik funktsioone siin. 737 00:32:04,990 --> 00:32:06,720 >> Tegelikult olgem keri. 738 00:32:06,720 --> 00:32:08,810 Ignoreerime enamik neist nüüd. 739 00:32:08,810 --> 00:32:12,670 Aga kerige getInt ja vaata, kuidas getInt toimib. 740 00:32:12,670 --> 00:32:13,890 Nii et siin on getInt. 741 00:32:13,890 --> 00:32:17,727 Ja kui sa kunagi hoolinud, kuidas saada int töötab, siin on selle dokumentatsioon. 742 00:32:17,727 --> 00:32:19,560 Ja vahel asjad ta ütleb, on ta ütleb teile, 743 00:32:19,560 --> 00:32:21,340 mis väärtustele ta saab tagasi. 744 00:32:21,340 --> 00:32:24,400 See on sisuliselt negatiivne 2 miljardit positiivsele 2 miljardit, anda või võtta. 745 00:32:24,400 --> 00:32:26,420 >> Ja selgub, kõik see aega, kuigi me pole kunagi 746 00:32:26,420 --> 00:32:28,570 oli teil kontrollida seda, kui midagi läheb valesti, 747 00:32:28,570 --> 00:32:30,680 Selgub, et kõik Selle aja getInt on 748 00:32:30,680 --> 00:32:33,600 ole naasmist eriline pidev, mitte null, 749 00:32:33,600 --> 00:32:36,760 pigem int_max, mis on lihtsalt programmeerija konventsioon. 750 00:32:36,760 --> 00:32:38,846 See tähendab, et siin on eriline väärtus. 751 00:32:38,846 --> 00:32:41,470 Veenduge, et vaadata seda, just kui midagi läheb valesti. 752 00:32:41,470 --> 00:32:43,261 Kuid me pole kunagi vaevunud koos, et siiani 753 00:32:43,261 --> 00:32:45,200 sest jällegi seda eesmärgiks on lihtsustada. 754 00:32:45,200 --> 00:32:46,950 >> Aga kuidas getInt saada rakendatakse? 755 00:32:46,950 --> 00:32:48,450 Noh, üks, see ei võta argumente. 756 00:32:48,450 --> 00:32:49,390 Me teame seda. 757 00:32:49,390 --> 00:32:50,820 Ta naaseb int. 758 00:32:50,820 --> 00:32:51,950 Me teame seda. 759 00:32:51,950 --> 00:32:54,460 Niisiis, kuidas see toimib all kapuuts? 760 00:32:54,460 --> 00:32:58,290 >> Nii et ilmselt lõpmatu silmus, vähemalt välimuse üks. 761 00:32:58,290 --> 00:33:00,290 Pange tähele, et me kasutame getString. 762 00:33:00,290 --> 00:33:04,000 Nii et see on huvitav. getInt kutsub oma funktsiooni, getString. 763 00:33:04,000 --> 00:33:05,645 Ja nüüd Miks see nii on? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Miks ma kaitsev Liini 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Mis võib juhtuda, kooskõlas 164, lihtsalt olla kindel? 768 00:33:15,639 --> 00:33:16,930 See on sama vastus nagu enne. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Võib olla ainult mälu. 771 00:33:20,089 --> 00:33:23,130 Midagi läheb valesti getString, me peame suutma hakkama. 772 00:33:23,130 --> 00:33:27,070 Ja põhjus, miks ma tagasi ei tule null on et tehniliselt null on kursor. 773 00:33:27,070 --> 00:33:29,120 getInt on tagasi int. 774 00:33:29,120 --> 00:33:31,060 Nii et ma olen meelevaldselt otsustas sisuliselt, 775 00:33:31,060 --> 00:33:34,600 et 2 miljardit, anda või võtta, läheb olema eriline väärtus, et ma ei saa kunagi 776 00:33:34,600 --> 00:33:35,970 tegelikult saada kasutaja. 777 00:33:35,970 --> 00:33:39,930 See on lihtsalt üks väärtus ma lähen raisata esindama veakood. 778 00:33:39,930 --> 00:33:41,540 >> Nii et nüüd, kui asjad veidi fancy. 779 00:33:41,540 --> 00:33:44,670 Ja see pole päris sama funktsioon nagu enne, kuid see on väga sarnane. 780 00:33:44,670 --> 00:33:50,120 Nii teate, ma kinnitan, siin, kooskõlas 172, nii int n ja char c. 781 00:33:50,120 --> 00:33:53,600 Ja siis ma kasutan seda funky liin, sscanf, mis tuleb välja 782 00:33:53,600 --> 00:33:55,990 ei otsiks string klaviatuuri. 783 00:33:55,990 --> 00:33:59,226 Ta seisab olemasoleva stringi kasutaja on juba trükitud. 784 00:33:59,226 --> 00:34:02,100 Nii et ma juba kutsunud getString, mis tähendab, et mul stringi mälu. 785 00:34:02,100 --> 00:34:05,020 sscanf on mida sa helistada liigendamine funktsioon. 786 00:34:05,020 --> 00:34:07,760 Vaadeldakse string ma olen kirjutada, tähemärgi haaval, 787 00:34:07,760 --> 00:34:09,250 ja ei midagi kasulikku. 788 00:34:09,250 --> 00:34:10,969 See string salvestatakse liin. 789 00:34:10,969 --> 00:34:13,560 Ja ma tean, et ainult minnes varundada siin ja öelda, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Ma kutsusin ta ei s seekord, kuid liin. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Ja nüüd on see natuke erinev. 793 00:34:18,080 --> 00:34:22,480 Aga see tähendab tegelikult põhjustel me mõnevõrra laine oma käsi täna 794 00:34:22,480 --> 00:34:26,070 et me kontrollime, et vaata kui kasutaja tipitud 795 00:34:26,070 --> 00:34:29,909 ja int ja võibolla teise iseloomu. 796 00:34:29,909 --> 00:34:33,610 Kui kasutaja tipitud int, see on kavatse olla salvestatud n, sest ma olen 797 00:34:33,610 --> 00:34:36,739 kulgeb seda aadressi uus trikk oleme näinud täna. 798 00:34:36,739 --> 00:34:41,570 Kui kasutaja ka trükitud aastal nagu 123x, et x 799 00:34:41,570 --> 00:34:45,060 läheb lõpuks kirja iseloomu c. 800 00:34:45,060 --> 00:34:48,739 >> Nüüd selgub, et sscanf ütleb mulle, arukalt, 801 00:34:48,739 --> 00:34:54,750 kui palju muutujaid sscanf edukalt suudab täita. 802 00:34:54,750 --> 00:34:58,770 Nii et see loogika, kui funktsioon Ma rakendamisel on getInt, 803 00:34:58,770 --> 00:35:00,900 aga ma kontrollida, potentsiaalselt jaoks alla 804 00:35:00,900 --> 00:35:04,190 kuni on sisestatud int järgneb midagi muud, 805 00:35:04,190 --> 00:35:08,580 mida ma tahan sscanf on tagastatav väärtus tõesti olla? 806 00:35:08,580 --> 00:35:10,950 Kui eesmärgiks on saada lihtsalt int kasutaja? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Nii et kui sscanf tagasi 2, siis mida see tähendab? 809 00:35:19,300 --> 00:35:21,660 Kasutaja tipitud midagi sellist, sõna otseses mõttes, 810 00:35:21,660 --> 00:35:24,770 123x, mis on lihtsalt jama. 811 00:35:24,770 --> 00:35:27,490 See tõrge ning Ma tahan, et kontrollida seda. 812 00:35:27,490 --> 00:35:32,960 >> Nii et kui kasutaja tipib seda, mida Selle loogika järgi, mis ei sscanf tagasi, 813 00:35:32,960 --> 00:35:33,740 sa ütleksid? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Nii see läheb tagasi 2, sest 123 läheb minema siit, 816 00:35:39,130 --> 00:35:41,580 ja x läheb lõpuks siin. 817 00:35:41,580 --> 00:35:43,970 Aga ma ei taha, et x, et saada täis. 818 00:35:43,970 --> 00:35:48,580 Tahan sscanf ainult õnnestub Täitmise esimene selle muutujad. 819 00:35:48,580 --> 00:35:52,490 Ja nii see on, miks ma tahad sscanf tagasi 1. 820 00:35:52,490 --> 00:35:55,750 >> Ja kui see on natuke üle pea hetkel, see on täiesti korras. 821 00:35:55,750 --> 00:36:00,030 Aru küll, et üks väärtused getInt ja getString 822 00:36:00,030 --> 00:36:03,630 on see, et me teeme Heck palju viga kontrollides niimoodi nii 823 00:36:03,630 --> 00:36:07,130 , et seni, saad päris palju kirjuta midagi oma klaviatuuri, 824 00:36:07,130 --> 00:36:08,490 ja me püüda seda. 825 00:36:08,490 --> 00:36:10,592 Ja me kindlasti, personal, kindlasti ei 826 00:36:10,592 --> 00:36:13,300 allikaks on viga teie programm, sest me oleme kaitsele 827 00:36:13,300 --> 00:36:16,270 kontrollida kõigi loll asju, mida kasutaja võib teha, 828 00:36:16,270 --> 00:36:18,900 näiteks sisestatud string, kui sa tõesti tahtsid int. 829 00:36:18,900 --> 00:36:21,350 Nii nüüd-- me tuleme tagasi sellele enne long-- 830 00:36:21,350 --> 00:36:23,710 kuid kõik see aeg, getString ja getInt on 831 00:36:23,710 --> 00:36:29,950 olnud all kapuuts, kasutades seda Põhiidee mälu aadressid. 832 00:36:29,950 --> 00:36:32,580 >> Nii et nüüd, teeme asju natuke rohkem kasutajasõbralikumaks. 833 00:36:32,580 --> 00:36:38,740 Nagu te võib-olla mäletate, alates Binky viimane aeg-- kui mu hiir cooperate-- nii 834 00:36:38,740 --> 00:36:42,560 meil oli see kood, mis ausalt öeldes on üsna mõttetu. 835 00:36:42,560 --> 00:36:45,330 See kood ei saavutata midagi kasulik, kuid see oli näiteks 836 00:36:45,330 --> 00:36:48,330 et professor Parlante kasutatakse selleks, et esindada 837 00:36:48,330 --> 00:36:51,840 mis toimub sisse programm, mis hõlmab mälu. 838 00:36:51,840 --> 00:36:54,850 >> Nii et olgem jutustan selle lugu super lühidalt. 839 00:36:54,850 --> 00:36:58,720 Need kaks esimest rida, on Inglise, ei mida, sa ütleksid? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Just põhjendatult inimese, kuid veidi tehnilisi tingimusi, võtab torkehaav. 842 00:37:05,430 --> 00:37:06,346 Sihtrühm: [kuuldamatu]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. Humala: OK, sa oled, millega kehtestatakse aadressid oma x ja y muutujad. 845 00:37:11,080 --> 00:37:15,520 Mitte päris, sest x ja y ei ole muutujaid traditsioonilises mõttes. 846 00:37:15,520 --> 00:37:18,054 x ja y on aadressid või salvestab aadress. 847 00:37:18,054 --> 00:37:19,220 Nii et proovime seda veel korra. 848 00:37:19,220 --> 00:37:21,010 Ei ole halb algus, kuigi. 849 00:37:21,010 --> 00:37:21,510 Jah? 850 00:37:21,510 --> 00:37:22,426 >> Sihtrühm: [kuuldamatu]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. Humala: Hea. 853 00:37:24,840 --> 00:37:26,173 Ma arvan, et see on natuke puhtamaks. 854 00:37:26,173 --> 00:37:28,630 Deklareerimine kaks suunanäitajaks, kaks täisarvu. 855 00:37:28,630 --> 00:37:30,150 Ja me kutsudes neid x ja y. 856 00:37:30,150 --> 00:37:32,790 Või kui me joonistaks seda pilti jällegi 857 00:37:32,790 --> 00:37:36,410 meenutada lihtsalt, et kõik me teeme selle esimese rea 858 00:37:36,410 --> 00:37:39,690 joonistab kasti niimoodi, mõned prügi väärtus see, 859 00:37:39,690 --> 00:37:41,920 ja kutsus ta X ja siis teise kasti niimoodi, 860 00:37:41,920 --> 00:37:43,880 mõned prügi väärtus ta, nimetades seda y. 861 00:37:43,880 --> 00:37:45,810 Oleme kuulutanud kaks vihjeid, et lõppkokkuvõttes 862 00:37:45,810 --> 00:37:47,860 salvestab aadress int. 863 00:37:47,860 --> 00:37:49,170 Nii et kõik on seal. 864 00:37:49,170 --> 00:37:53,290 >> Nii et kui Binky tegi seda, savi lihtsalt tundus see. 865 00:37:53,290 --> 00:37:55,350 Ja Nick lihtsalt selline tõmmati nooled 866 00:37:55,350 --> 00:37:57,590 sest kuigi nad ei juhtides ükskõik eriti, sest nad on lihtsalt 867 00:37:57,590 --> 00:37:58,250 prügi väärtused. 868 00:37:58,250 --> 00:38:01,670 Nad ei ole selgesõnaliselt vormindatud kusagil eelkõige. 869 00:38:01,670 --> 00:38:03,980 >> Nüüd järgmine rida kood, mäletate, oli see. 870 00:38:03,980 --> 00:38:07,510 Nii mõistlikult kasutajasõbralik, kuid mõnevõrra tehniline inglise keel, 871 00:38:07,510 --> 00:38:09,790 mis see koodirida teed? 872 00:38:09,790 --> 00:38:10,391 Jah? 873 00:38:10,391 --> 00:38:11,333 >> Sihtrühm: [kuuldamatu]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. Humala: Perfect. 876 00:38:13,950 --> 00:38:17,016 See eraldamise patakas mälu, mis on suurus int. 877 00:38:17,016 --> 00:38:18,140 Ja see on pool vastust. 878 00:38:18,140 --> 00:38:20,056 Te vastasite õigus poolel väljendus. 879 00:38:20,056 --> 00:38:22,473 Mis toimub vasakul pool võrdusmärki? 880 00:38:22,473 --> 00:38:22,972 Jah? 881 00:38:22,972 --> 00:38:24,814 Sihtrühm: ja annab see muutuja x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. Humala: ja annab see muutuja x. 883 00:38:27,690 --> 00:38:31,650 Nii et sulgege, paremal pool eraldab piisavalt mälu, et salvestada int. 884 00:38:31,650 --> 00:38:34,150 Aga malloc spetsiaalselt tagastab aadress 885 00:38:34,150 --> 00:38:37,270 Selle patakas mälu, mida olete lihtsalt ettepaneku saab salvestatud x. 886 00:38:37,270 --> 00:38:42,560 >> Mida Nick eelmisel korral koos Binky on Ta lohistas et osuti välja, savi, 887 00:38:42,560 --> 00:38:46,820 juhtida praegu valge patakas mälu mis on võrdne suurus int. 888 00:38:46,820 --> 00:38:49,360 Ja tõepoolest, see on mõeldud esindama neli baiti. 889 00:38:49,360 --> 00:38:55,310 >> Nüüd, järgmine rida koodi tegin seda, star x saab 42. 890 00:38:55,310 --> 00:38:58,530 Nii et 42 on lihtne kohta paremal küljel, elu mõte. 891 00:38:58,530 --> 00:39:00,500 Vasakul pool, star x tähendab mida? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Ka see võib olla läinud-- see on OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Sihtrühm: Põhimõtteliselt, minna [kuuldamatu] 896 00:39:06,875 --> 00:39:07,750 DAVID J. Humala: Hea. 897 00:39:07,750 --> 00:39:08,760 Sihtrühm: [kuuldamatu]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. Humala: Täpselt. 899 00:39:09,760 --> 00:39:11,979 Vasakul pool tähendab minna x. 900 00:39:11,979 --> 00:39:12,520 x on aadress. 901 00:39:12,520 --> 00:39:15,520 See on nagu 33 Oxford Street, või OX1. 902 00:39:15,520 --> 00:39:18,690 Ja täht x tähendab minna, et tegeleda ja panna mida seal? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Nii et tõesti, see on täpselt see, mida Nick tegi. 905 00:39:21,290 --> 00:39:23,740 Ta alustas poolt, sisuliselt vaimselt 906 00:39:23,740 --> 00:39:26,270 osutab sõrmega x Pärast nool 907 00:39:26,270 --> 00:39:30,670 valge kast paremal pool, ja paneb number 42 olemas. 908 00:39:30,670 --> 00:39:34,120 Aga siis asjad sain veidi ohtlik, eks? 909 00:39:34,120 --> 00:39:35,860 Binky on umbes kaotada oma peaga. 910 00:39:35,860 --> 00:39:39,465 >> Star y võrdub 13, halb õnn, tähendab mida? 911 00:39:39,465 --> 00:39:43,620 Nii täht y abil minna aadressile y. 912 00:39:43,620 --> 00:39:45,630 Aga milline on aadressi y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Olgu, see on prügi raha, eks? 915 00:39:49,440 --> 00:39:50,800 Ma joonistasin seda küsimärk. 916 00:39:50,800 --> 00:39:54,850 Nick tõmbas see keerduv nool. 917 00:39:54,850 --> 00:39:59,600 Ja niipea, kui üritate teha star y, öeldes sinna minna, 918 00:39:59,600 --> 00:40:03,872 kuid ei ole õigustatud aadress, see on mingi võlts asukoht, 919 00:40:03,872 --> 00:40:05,080 Programm läheb krahhi. 920 00:40:05,080 --> 00:40:08,580 Ja Binky pea läheb lennata ära siit, nagu ta seda tegi. 921 00:40:08,580 --> 00:40:12,130 >> Nii et lõpuks on see programm oli lihtsalt korter läbi viga. 922 00:40:12,130 --> 00:40:13,540 See oli vigane programm. 923 00:40:13,540 --> 00:40:14,760 Ja seda tuleb parandada. 924 00:40:14,760 --> 00:40:18,260 Ja ainus viis, tõesti, seda parandada oleks, näiteks, see liin, 925 00:40:18,260 --> 00:40:21,010 mida me isegi ei saada, sest Programmi kukkus liiga kiiresti. 926 00:40:21,010 --> 00:40:26,170 Aga kui me määrata see, mida mõju ei teinud y võrdub x on? 927 00:40:26,170 --> 00:40:30,010 Noh, see sisuliselt juhib y juures mis iganes x väärtus on osutavad. 928 00:40:30,010 --> 00:40:32,430 >> Nii Nicki lugu, või Binky lugu, nii 929 00:40:32,430 --> 00:40:34,640 x ja y on vastakuti valge patakas mälu, 930 00:40:34,640 --> 00:40:38,300 nii et lõpuks, kui sa ei täht y võrdub 13 uuesti, 931 00:40:38,300 --> 00:40:43,080 sa lõpuks paneb 13 sobivas kohas. 932 00:40:43,080 --> 00:40:47,640 Nii et kõik need liinid on täiesti õigustatud, välja arvatud see, 933 00:40:47,640 --> 00:40:51,730 kui see juhtus enne, kui tegelikult määratud y mingi väärtus. 934 00:40:51,730 --> 00:40:54,290 >> Nüüd õnneks sa ei ole on mõelda läbi kõik 935 00:40:54,290 --> 00:40:56,560 Nende laadi küsimused ise. 936 00:40:56,560 --> 00:40:59,310 Lubage mul minna ja avada kuni terminal window siin 937 00:40:59,310 --> 00:41:03,050 ja avada, hetkeks, super lühike programm, mis 938 00:41:03,050 --> 00:41:04,360 Samuti on omamoodi mõttetu. 939 00:41:04,360 --> 00:41:05,152 See on inetu. 940 00:41:05,152 --> 00:41:06,610 See ei saavuta midagi kasulikku. 941 00:41:06,610 --> 00:41:10,180 Aga see ei näidata küsimuste mälu, nii et võtame pilk. 942 00:41:10,180 --> 00:41:11,830 >> Main, super lihtne. 943 00:41:11,830 --> 00:41:14,830 See ilmselt nõuab funktsiooni, f, ja siis tagastab 0. 944 00:41:14,830 --> 00:41:16,310 See on omamoodi raske jama see üles. 945 00:41:16,310 --> 00:41:18,540 Nii Main on päris hea siiani. 946 00:41:18,540 --> 00:41:20,100 >> Nii et f on problemaatiline. 947 00:41:20,100 --> 00:41:22,120 Ja lihtsalt ei pane palju vaeva nimetades seda 948 00:41:22,120 --> 00:41:23,990 siin, et hoida keskenduda koodi. 949 00:41:23,990 --> 00:41:25,740 f on kaks rida. 950 00:41:25,740 --> 00:41:27,610 Ja vaatame, mis nüüd toimub. 951 00:41:27,610 --> 00:41:29,840 Niisiis käsitleb ühest küljest siin-- ja las ma teen 952 00:41:29,840 --> 00:41:32,680 Selle kooskõlas eelmise example-- kohta ühelt 953 00:41:32,680 --> 00:41:35,830 vasakul pool on seda, mida inglise keeles? 954 00:41:35,830 --> 00:41:36,493 See ongi 955 00:41:36,493 --> 00:41:37,701 Sihtrühm: Loomine pointer. 956 00:41:37,701 --> 00:41:40,830 DAVID J. Humala: Creating pointer int ja nimetades seda x. 957 00:41:40,830 --> 00:41:43,789 Nii et see on loomise üks neist kastid Hoian kasutades puuteekraani. 958 00:41:43,789 --> 00:41:45,913 Ja nüüd on parempoolne küljel malloc loomulikult 959 00:41:45,913 --> 00:41:47,420 eraldab patakas mälu. 960 00:41:47,420 --> 00:41:49,989 Ja lihtsalt olema selge, kuidas palju mälu on see ilmselt 961 00:41:49,989 --> 00:41:52,030 jaotamisel, kui sa lihtsalt objekti ei matemaatikat siin? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Nii et see on 40 baiti. 964 00:41:54,040 --> 00:41:57,400 Ja ma tean, et ainult sellepärast, et ma tean, int, on CS50 seade vähemalt 965 00:41:57,400 --> 00:41:58,060 on neli baiti. 966 00:41:58,060 --> 00:41:59,610 Nii 10 korda 4 on 40. 967 00:41:59,610 --> 00:42:04,924 Nii et see salvestab x, aadress esimese 40-ints et 968 00:42:04,924 --> 00:42:07,340 on eraldatud ruumi tagasi, tagasi, tagasi, edasi-tagasi. 969 00:42:07,340 --> 00:42:08,470 >> Ja see on võti umbes malloc. 970 00:42:08,470 --> 00:42:11,261 See ei võta vähe mälu siin, natuke siit, natuke siin. 971 00:42:11,261 --> 00:42:14,220 See annab teile üks patakas mälu, lähestikku, alates operatsioonisüsteemi 972 00:42:14,220 --> 00:42:15,240 süsteemis. 973 00:42:15,240 --> 00:42:18,500 >> Nüüd kuidas see, x sulg 10 on 0? 974 00:42:18,500 --> 00:42:19,470 Suvalised rida koodi. 975 00:42:19,470 --> 00:42:21,100 See ei saavuta midagi kasulikku. 976 00:42:21,100 --> 00:42:26,128 Aga see on huvitav, sest x sulg 10--? 977 00:42:26,128 --> 00:42:26,628 Jah? 978 00:42:26,628 --> 00:42:27,912 >> Sihtrühm: [kuuldamatu]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. Humala: x sulg 10 ei pea olema null. 980 00:42:30,500 --> 00:42:35,070 Null detail ainult tuleb mängu koos stringid, lõpus stringi. 981 00:42:35,070 --> 00:42:36,700 Aga hea mõte. 982 00:42:36,700 --> 00:42:39,615 >> Kui suur on see massiiv, isegi kuigi ma olen eraldatud 40 baiti? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 See on 0 kuni üheksa, eks? 985 00:42:43,690 --> 00:42:45,120 See on 10 ints kokku. 986 00:42:45,120 --> 00:42:48,790 40 baiti, kuid 10 ints, indekseeritud 0 kuni 0. 987 00:42:48,790 --> 00:42:50,930 >> Nii et mis see on x sulg 10? 988 00:42:50,930 --> 00:42:53,090 See on tegelikult mõned tundmatu prügi väärtus. 989 00:42:53,090 --> 00:42:54,780 See on mälu, mis ei kuulu mulle. 990 00:42:54,780 --> 00:42:59,650 Ma ei tohiks liigutav, et bait number 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Ma lähen natuke liiga kaugele. 992 00:43:01,420 --> 00:43:04,490 >> Ja tõepoolest, kui ma saan seda programmi, see võib väga hästi krahhi. 993 00:43:04,490 --> 00:43:05,790 Aga mõnikord, meil veab. 994 00:43:05,790 --> 00:43:07,706 Ja nii lihtsalt näidata seda-- ja ausalt öeldes, 995 00:43:07,706 --> 00:43:11,000 sa ei tea kunagi, enne kui ei Kui-- olgem käivitada. 996 00:43:11,000 --> 00:43:12,480 See tegelikult ei krahhi. 997 00:43:12,480 --> 00:43:15,032 >> Aga kui ma seda muuta, et Näiteks olla nagu 1000, 998 00:43:15,032 --> 00:43:16,740 teha seda tõesti tahtlik, vaatame 999 00:43:16,740 --> 00:43:18,710 kas me saame seda krahhi seekord. 1000 00:43:18,710 --> 00:43:20,070 OK, see ei ole viga. 1001 00:43:20,070 --> 00:43:22,600 Kuidas 100000? 1002 00:43:22,600 --> 00:43:25,000 Olgem uusversioon, ja nüüd uuesti, see. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Puhh. 1005 00:43:25,960 --> 00:43:26,460 Olgu. 1006 00:43:26,460 --> 00:43:29,090 Nii et ilmselt jällegi need segmentides mälu, nii et rääkida, 1007 00:43:29,090 --> 00:43:32,660 on piisavalt suur, et saaksime veab ikka ja jälle. 1008 00:43:32,660 --> 00:43:36,510 Aga lõpuks, kui sa saad naeruväärne ja tõesti minna kaugele ekraanil 1009 00:43:36,510 --> 00:43:39,120 sa puudutage mälu tõesti, tegelikult ei kuulu teile. 1010 00:43:39,120 --> 00:43:40,870 >> Aga ausalt öeldes, need liiki vead lähevad 1011 00:43:40,870 --> 00:43:43,020 olla raskem ja raskem nuputada ise. 1012 00:43:43,020 --> 00:43:47,880 Aga õnneks, nagu programmeerijad, peame vahendid, mis võimaldavad meil seda teha meie jaoks. 1013 00:43:47,880 --> 00:43:50,140 Nii et see on võib-olla üks koledamas programmide 1014 00:43:50,140 --> 00:43:52,060 isegi koledam kui GDB väljund. 1015 00:43:52,060 --> 00:43:55,670 Aga see on alati line või kaks, mis on super kasulik. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind on programm, mis aitab sa ei siluda programmi, per se, 1017 00:44:00,310 --> 00:44:03,500 kuid ei leia mälu seotud probleeme, konkreetselt. 1018 00:44:03,500 --> 00:44:07,590 See automaatselt käivitada oma kood te ning otsida vähemalt kaks asja. 1019 00:44:07,590 --> 00:44:10,680 Üks, sa tegid midagi juhuslik nagu touch mälu 1020 00:44:10,680 --> 00:44:11,980 mis ei kuulu sulle? 1021 00:44:11,980 --> 00:44:13,590 See aitab teil leida need juhtumid. 1022 00:44:13,590 --> 00:44:15,710 >> Ja kaks, see aitab leiad midagi, mida nimetatakse 1023 00:44:15,710 --> 00:44:19,270 mälu lekked, mis meil on täiesti tähelepanuta, naiivselt, 1024 00:44:19,270 --> 00:44:21,380 mõnda aega ja õndsalt. 1025 00:44:21,380 --> 00:44:23,140 Aga selgub, kõik Selle aja kui 1026 00:44:23,140 --> 00:44:26,620 olete kutsutud getString sisse nii paljud meie programme, 1027 00:44:26,620 --> 00:44:28,930 sa palud operatsioonisüsteemi süsteemi mälu, 1028 00:44:28,930 --> 00:44:32,070 kuid teil on mälestus kunagi andes 1029 00:44:32,070 --> 00:44:36,169 tagasi, tehes UNALLOC või tasuta, nagu seda nimetatakse. 1030 00:44:36,169 --> 00:44:37,960 Ei, sest me pole kunagi palus sul seda teha. 1031 00:44:37,960 --> 00:44:41,250 >> Kuid kõik see aeg, programmide sa oled kirjalikult C 1032 00:44:41,250 --> 00:44:43,800 on lekib mälu paludes operatsioonisüsteemi 1033 00:44:43,800 --> 00:44:46,190 süsteemi rohkem mälu stringid ja tühi-tähi, 1034 00:44:46,190 --> 00:44:47,870 kuid mitte kunagi jagab seda tagasi. 1035 00:44:47,870 --> 00:44:50,080 Ja nüüd on see natuke ja järeleandmisi, 1036 00:44:50,080 --> 00:44:53,550 aga kui sa oled kunagi käivitada oma Mac või arvutis juba mõnda aega, avades 1037 00:44:53,550 --> 00:44:55,790 palju programme, võibolla programmide sulgemist, 1038 00:44:55,790 --> 00:44:57,795 ja isegi oma arvuti ei ole krahhi, 1039 00:44:57,795 --> 00:45:01,690 Läheb nii palju aeglasem nagu ta on tõesti 1040 00:45:01,690 --> 00:45:04,290 kasutades palju mälu või ressursse, kuigi, 1041 00:45:04,290 --> 00:45:06,070 kui sa ei ole isegi puudutamata klaviatuur, 1042 00:45:06,070 --> 00:45:10,430 mis võiks olema-- kuid ei always-- võiks olema, et programmid näed 1043 00:45:10,430 --> 00:45:11,920 on ise mälu lekkeid. 1044 00:45:11,920 --> 00:45:15,645 Ja nad hoiavad küsib OS rohkem ja rohkem mälu, kuid unustades selle kohta, 1045 00:45:15,645 --> 00:45:18,470 tegelikult ei kasuta, kuid Seega võttes mälu ära 1046 00:45:18,470 --> 00:45:20,500 muudest programmidest, et võiksite seda. 1047 00:45:20,500 --> 00:45:23,940 Nii et see on ühine selgitus. 1048 00:45:23,940 --> 00:45:25,940 Nüüd siin on koht, kus Valgrind on väljund on täiesti 1049 00:45:25,940 --> 00:45:29,290 jõle neile vähem ja mugavamaks samasugused. 1050 00:45:29,290 --> 00:45:32,690 Aga huvitav stuff on siin üleval. 1051 00:45:32,690 --> 00:45:37,060 Ta räägib mulle vale kirjutada ning suurus neli juhtub selles programmis, 1052 00:45:37,060 --> 00:45:40,640 eelkõige real 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Kui ma lähen liinile 21, hm, seal tõesti on kehtetu kirjutada suuruse neli. 1054 00:45:45,450 --> 00:45:46,250 Miks size neli? 1055 00:45:46,250 --> 00:45:49,500 Noh, see number-- ja see võiks olla midagi-- on int. 1056 00:45:49,500 --> 00:45:50,450 Nii et see on neli baiti. 1057 00:45:50,450 --> 00:45:52,550 Nii et ma panen nelja baiti kui nad ei kuulu. 1058 00:45:52,550 --> 00:45:55,080 Seda Valgrind tegelikult mulle. 1059 00:45:55,080 --> 00:45:57,600 Peale selle on ka ütle mulle, kui me näeme, 1060 00:45:57,600 --> 00:46:01,490 kui sa jooksed seda tulevikus pset, kas ja kui olete lekkinud mälu, mis tõepoolest 1061 00:46:01,490 --> 00:46:05,300 Mul on, sest ma olen kutsutud malloc, kuid ma ei ole tegelikult 1062 00:46:05,300 --> 00:46:08,010 nimetatakse antud juhul, vaba, mida me lõpuks näha 1063 00:46:08,010 --> 00:46:09,830 on vastupidine malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Nüüd ma arvan, et viimane näide. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Nii et see üks on natuke rohkem kauge, aga see on võib-olla 1068 00:46:16,690 --> 00:46:19,180 Suurim põhjus olema ettevaatlik, mäluga, 1069 00:46:19,180 --> 00:46:24,490 ja sel põhjusel, et paljud programmid ja / või veebiserverite, isegi kuni tänase päevani, 1070 00:46:24,490 --> 00:46:28,200 on üle võtnud pahad kusagil aasta Interneti kes on kuidagi 1071 00:46:28,200 --> 00:46:33,390 saates võlts pakette serverisse püüab ohustada teie kontosid, 1072 00:46:33,390 --> 00:46:36,420 või võtta oma andmed, või lihtsalt üldiselt üle võtta masin. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, kui nimigi ütleb, vahendid 1074 00:46:38,910 --> 00:46:40,740 täis ei int, kuid puhvris. 1075 00:46:40,740 --> 00:46:43,490 Ja puhver on lihtsalt fancy viis öelda, et see on hunnik mälu. 1076 00:46:43,490 --> 00:46:46,710 >> Ja tõepoolest, ma helistasin string Enne puhvri asemel s. 1077 00:46:46,710 --> 00:46:49,234 Sest kui see puhver, nagu YouTube mõttes 1078 00:46:49,234 --> 00:46:52,400 või iga kord, kui vaatate video, te olete näinud sõna puhverdamine, 1079 00:46:52,400 --> 00:46:53,040 dot, dot, dot. 1080 00:46:53,040 --> 00:46:54,240 See on uskumatult tüütu. 1081 00:46:54,240 --> 00:46:55,990 Ja see tähendab lihtsalt et oma videopleier 1082 00:46:55,990 --> 00:46:58,710 üritab alla laadida palju baitide, palju baiti 1083 00:46:58,710 --> 00:47:00,170 alates video internetis. 1084 00:47:00,170 --> 00:47:02,920 Aga see on aeglane, seega üritab laadida kobar 1085 00:47:02,920 --> 00:47:06,430 täita puhver, konteiner, nii et sul on piisavalt baiti, et see saab siis 1086 00:47:06,430 --> 00:47:09,174 näidata teile video, Kõhklemata pidevalt. 1087 00:47:09,174 --> 00:47:11,340 Aga selgub, saate on puhvri sellele suur. 1088 00:47:11,340 --> 00:47:15,710 Aga proovida panna nii palju andmeid seda ja väga halbu asju võib juhtuda. 1089 00:47:15,710 --> 00:47:22,780 Nii näiteks, vaatame See viimane teaser näiteks. 1090 00:47:22,780 --> 00:47:24,720 See on teine ​​programm et esmapilgul 1091 00:47:24,720 --> 00:47:26,540 ei midagi super kasulik. 1092 00:47:26,540 --> 00:47:29,590 See sai Põhiülesanne mis nõuab, et funktsioon f. 1093 00:47:29,590 --> 00:47:36,640 Ja see funktsioon, f, siin on char massiiv nimega c, suurus 12. 1094 00:47:36,640 --> 00:47:39,340 Ja siis ta kasutab seda uus funktsioon nimega strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Selgub, et selle lihtsa, lihtne rida koodi, vaid kaks rida, 1097 00:47:45,190 --> 00:47:49,130 oleme teinud kogu oma programm, ja seega kogu mu arvuti, 1098 00:47:49,130 --> 00:47:54,000 ja minu konto ja minu raske sõita kaitsetud keegi 1099 00:47:54,000 --> 00:47:58,170 kes teab ja on piisavalt hea, et käivitada Selle programmi teatud käsurea 1100 00:47:58,170 --> 00:47:58,900 argument. 1101 00:47:58,900 --> 00:48:03,400 Teisisõnu, kui see paha poiss paneb sees argvargv [1] kirjutades 1102 00:48:03,400 --> 00:48:08,750 klaviatuuri väga spetsiaalselt formuleeritud string, mitte abc, 123, kuid sisuliselt 1103 00:48:08,750 --> 00:48:15,180 binaarne sümbolid on käivitatav kood, programm, mida ta kirjutas, 1104 00:48:15,180 --> 00:48:19,190 Selle lihtsa programmi, mis on esindaja tuhandeid programme 1105 00:48:19,190 --> 00:48:23,610 mis on samuti haavatavad, daresay, ta võib lõpuks kustutada kõik 1106 00:48:23,610 --> 00:48:26,680 failid minu kõvakettale saada vilgub kiirelt, nii et ta saab 1107 00:48:26,680 --> 00:48:30,170 käske oma, saatke kõik failid ise. 1108 00:48:30,170 --> 00:48:34,660 Kõik, mis ma teha saan, et ta või ta saab teha seda koodi. 1109 00:48:34,660 --> 00:48:36,575 >> Me pole päris lahendada veel. 1110 00:48:36,575 --> 00:48:38,700 Ja tegelikult, see läheb kaasata vähe pilt 1111 00:48:38,700 --> 00:48:41,470 nagu see, mis me varsti mõista kõik parem. 1112 00:48:41,470 --> 00:48:44,480 Aga täna, olgem lõpeb mis loodetavasti veidi rohkem 1113 00:48:44,480 --> 00:48:48,360 arusaadav XKCD nali, kuni jätkame järgmine kord. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Olgu. 1116 00:48:51,600 --> 00:48:53,446 Näeme kolmapäeval. 1117 00:48:53,446 --> 00:48:54,754 >> [Muusika mängimine] 1118 00:48:54,754 --> 00:48:57,790 >> SPEAKER: Ja nüüd, sügav mõtteid, mida Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Mälu on nagu hüpped kuhi kuldne lehed pühapäeva pärastlõunal. 1121 00:49:04,770 --> 00:49:09,000 Tuul puhub, visklemine oma hair-- oh, ma igatsen päeva ta-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Naer] 1124 00:49:12,650 --> 00:49:13,750