1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Musiikki soi] 3 00:00:11,261 --> 00:00:12,640 >> DAVID J. MALAN: Okei. 4 00:00:12,640 --> 00:00:14,525 Tämä on CS50. 5 00:00:14,525 --> 00:00:16,009 Ja tämä on alku viikko 5. 6 00:00:16,009 --> 00:00:18,050 Ja kuten olet ehkä huomannut, osa materiaalista 7 00:00:18,050 --> 00:00:21,050 on saada hieman enemmän monimutkainen, hieman tiheämpi. 8 00:00:21,050 --> 00:00:24,560 >> Ja se on hyvin helppoa, varsinkin jos olet ollut tapana jo jonkin aikaa, 9 00:00:24,560 --> 00:00:28,600 voidaan yrittää raapustaa alas eniten mitä teemme, sanomme luokassa. 10 00:00:28,600 --> 00:00:31,626 Mutta ymmärtää, että ei ole ehkä ihanteellinen pedagoginen lähestymistapa 11 00:00:31,626 --> 00:00:34,250 oppimiseen tällaista materiaalia, ja materiaali yleisemmin. 12 00:00:34,250 --> 00:00:37,250 Ja niin meillä on ilo ilmoittaa, että CS50 oma Gheng 13 00:00:37,250 --> 00:00:39,780 Gong on alkanut valmistella kanoninen joukko muistiinpanoja 14 00:00:39,780 --> 00:00:42,100 kurssille, toivo joka on, että yksi, nämä 15 00:00:42,100 --> 00:00:44,030 ole ainoastaan viite-ja voimavara 16 00:00:44,030 --> 00:00:47,410 tarkistamiseksi materiaalia ja menossa taaksepäin materiaalia, joka saattaa olla 17 00:00:47,410 --> 00:00:51,230 pakeni voit ensimmäisellä kerralla, mutta myös niin, että päät voivat olla 18 00:00:51,230 --> 00:00:53,740 ylös kuin alas, kun se tulee aika luento, 19 00:00:53,740 --> 00:00:56,960 jotta voisitte käydä enemmän mietteliäänä, sillä 20 00:00:56,960 --> 00:00:59,170 vastakohtana enemmän scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Että sanoi, mitä löydät sivusto on tällaisia ​​asiakirjoja kuten tämä. 22 00:01:02,510 --> 00:01:04,660 Ja ilmoitus, vasemmassa yläkulmassa, siellä ei vain sisällysluettelo, 23 00:01:04,660 --> 00:01:06,920 vaan myös aika-koodeja, jotka heti hypätä sinua 24 00:01:06,920 --> 00:01:09,077 asianmukaiseen osaan video verkossa. 25 00:01:09,077 --> 00:01:11,410 Ja mitä Chang täällä on tehnyt on pääosin dokumentoitu 26 00:01:11,410 --> 00:01:13,340 mitä tapahtui tässä Erityisesti luento. 27 00:01:13,340 --> 00:01:16,370 Ja monet luennot ovat jo verkossa nyt tämän URL. 28 00:01:16,370 --> 00:01:20,110 Ja jatkamme lähettää loput Näiden mukaan tämän viikon lopulla, 29 00:01:20,110 --> 00:01:22,380 joten älä hyödyntää tätä resurssia. 30 00:01:22,380 --> 00:01:25,740 >> Joten pitemmittä puheitta, aloimme kuoria takaisin 31 00:01:25,740 --> 00:01:28,180 kerros, joka on ollut string jonkin aikaa. 32 00:01:28,180 --> 00:01:30,670 Ja mitä sanomme merkkijono oikeastaan ​​on viime viikolla? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Niin char tähti. 35 00:01:32,900 --> 00:01:34,900 Ja nieriää tähti, hyvin, mitä ei se oikeastaan ​​tarkoittaa? 36 00:01:34,900 --> 00:01:37,150 No, koko tämän ajan, jos olemme soitellut toiminto, 37 00:01:37,150 --> 00:01:40,450 kuten getString ja varastointi niin sanottu paluu 38 00:01:40,450 --> 00:01:42,910 arvo getString vuonna variable-- sitä kutsutaan 39 00:01:42,910 --> 00:01:47,721 tyyppinumeroiden string-- olemme kirjallisesti rivi koodia sinne yllä. 40 00:01:47,721 --> 00:01:49,970 Ja se on vasta kun näen käsiala suurennettu täällä 41 00:01:49,970 --> 00:01:51,930 En ymmärrä, kuinka kamalaa tämä on. 42 00:01:51,930 --> 00:01:54,180 >> Kuitenkin Oletetaan, että oikealla puolella 43 00:01:54,180 --> 00:01:57,070 on silti kohtuullinen kuvaus siitä, mitä on 44 00:01:57,070 --> 00:01:58,880 jatkuneet kaiken tämän aikaa getString. 45 00:01:58,880 --> 00:02:00,380 getString tietenkin saa merkkijono. 46 00:02:00,380 --> 00:02:01,691 Mutta mitä se oikeastaan ​​tarkoittaa? 47 00:02:01,691 --> 00:02:04,190 Se tarkoittaa sitä saa kimpale muisti käyttöjärjestelmä 48 00:02:04,190 --> 00:02:06,040 soittamalla toiminto, jota kutsutaan malloc. 49 00:02:06,040 --> 00:02:07,390 Mutta siitä lisää myöhemmin. 50 00:02:07,390 --> 00:02:09,139 Ja sitten se asuttujen että kimpale muistia 51 00:02:09,139 --> 00:02:11,764 kirjaimilla käyttäjällä on kirjoitettu, ja sen jälkeen, tietenkin, 52 00:02:11,764 --> 00:02:14,800 null hahmo, tai kenoviiva nolla aivan lopussa. 53 00:02:14,800 --> 00:02:18,280 >> Samaan aikaan, vasemmalla puolella tämän tarinan, kaikki tällä kertaa, 54 00:02:18,280 --> 00:02:20,850 olemme julistaa muuttuja, kuten s. 55 00:02:20,850 --> 00:02:24,770 Ja että muuttuja on mitä nyt alkaa soittaa osoitin. 56 00:02:24,770 --> 00:02:29,190 Se ei ole laatikko jonka sisällä laitamme merkkijonon, Daven, sinänsä, 57 00:02:29,190 --> 00:02:32,550 vaan panemme että neliö laatikko vasemmalla mitä? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Joo? 60 00:02:35,390 --> 00:02:37,118 >> Yleisö: osoite missä se sijaitsee muistissa. 61 00:02:37,118 --> 00:02:38,118 >> DAVID J. MALAN: Aivan. 62 00:02:38,118 --> 00:02:40,690 Osoite, jossa Daven sijaitsee muistissa. 63 00:02:40,690 --> 00:02:44,650 Ja ei kun kaikki Daven sijaitsee, sinänsä, vaan nimenomaan osoite 64 00:02:44,650 --> 00:02:45,150 mitä? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Joo? 67 00:02:46,810 --> 00:02:47,460 >> Yleisö: Ensimmäinen merkki. 68 00:02:47,460 --> 00:02:50,209 >> DAVID J. MALAN: ensimmäinen merkki vuonna Daven, joka tässä tapauksessa 69 00:02:50,209 --> 00:02:53,820 Ehdotin oli mielivaltaisesti ja epärealistisen 1, OX1, 70 00:02:53,820 --> 00:02:55,910 mikä tarkoittaa vain heksadesimaalinumero 1. 71 00:02:55,910 --> 00:02:57,993 Mutta se on luultavasti olla paljon suurempi numero 72 00:02:57,993 --> 00:03:01,260 että voisimme tehdä kanssa 0x etuliitteenä, 73 00:03:01,260 --> 00:03:02,806 mikä heksamerkki. 74 00:03:02,806 --> 00:03:05,930 Ja koska meidän ei tarvitse tietää, missä loput merkkiä Daven 75 00:03:05,930 --> 00:03:09,860 ovat, koska mitä yksinkertainen muotoilu päätös, joka on tehty monta vuotta sitten? 76 00:03:09,860 --> 00:03:10,548 Joo? 77 00:03:10,548 --> 00:03:11,651 >> Yleisö: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 DAVID J. MALAN: Joo, aivan. 79 00:03:12,900 --> 00:03:18,100 Kenoviiva- 0 voit, vaikkakin lineaarinen aika, kulkea merkkijono, 80 00:03:18,100 --> 00:03:20,400 kävellä vasemmalta oikealle, jossa silmukka, tai kun 81 00:03:20,400 --> 00:03:22,608 silmukka, tai jotain että, ja määrittää, oh, tässä 82 00:03:22,608 --> 00:03:24,751 on loppuun tässä merkkijono. 83 00:03:24,751 --> 00:03:27,000 Niin vain osoitteen alussa merkkijonon, 84 00:03:27,000 --> 00:03:30,290 voimme käyttää kokonaisuudessaan se, koska koko tämän ajan, 85 00:03:30,290 --> 00:03:32,030 merkkijono on juuri merkkiä tähti. 86 00:03:32,030 --> 00:03:36,370 >> Joten se on varmasti hieno jatkaa CS50 kirjasto ja tämä abstraktio, 87 00:03:36,370 --> 00:03:38,440 niin sanotusti, mutta me alkaa nähdä tarkalleen 88 00:03:38,440 --> 00:03:41,230 mitä on tekeillä alla koko tämän ajan. 89 00:03:41,230 --> 00:03:45,260 Joten ehkä muistatte tässä esimerkissä Myös viime hetkellä vertailla 0, 90 00:03:45,260 --> 00:03:47,300 joka ei oikeastaan ​​verrata. 91 00:03:47,300 --> 00:03:49,070 Mutta aloimme ratkaista. 92 00:03:49,070 --> 00:03:52,020 >> Mutta ehkä kertaus, voisin kiinnostaa jotakuta 93 00:03:52,020 --> 00:03:54,261 vaaleanpunainen norsu tänään, myös Chang? 94 00:03:54,261 --> 00:03:55,760 Miten sinusta edessä? [Äänetön]. 95 00:03:55,760 --> 00:03:56,660 Tule ylös. 96 00:03:56,660 --> 00:03:58,740 >> Ja sillä välin, niin keksitte, katsotaanpa 97 00:03:58,740 --> 00:04:01,670 harkita hetkeksi mitä tämä koodi on juuri tekemässä. 98 00:04:01,670 --> 00:04:04,917 Se julistaa kaksi muuttujaa ylös top, s ja t, ja soittaa getString. 99 00:04:04,917 --> 00:04:08,250 Tämä ei ole kovin käyttäjäystävällinen ohjelma, koska se ei kerro mitä tehdä. 100 00:04:08,250 --> 00:04:10,541 Mutta katsotaanpa vain olettaa, että olemme keskittyen mehukas osa. 101 00:04:10,541 --> 00:04:14,470 Ja sitten teemme, jos vertaistuki vastaa t, se pitäisi sanoa printf, 102 00:04:14,470 --> 00:04:16,170 kirjoitit sama asia. 103 00:04:16,170 --> 00:04:16,670 Hei. 104 00:04:16,670 --> 00:04:17,050 Mikä sinun nimesi on? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 DAVID J. MALAN: Janelle, nice to meet you. 107 00:04:19,529 --> 00:04:21,800 Joten haaste käsi elefantin 108 00:04:21,800 --> 00:04:25,230 on ensin piirtää meille kuvan siitä, mitä on ovat edustettuina näissä kahdessa ensimmäisessä 109 00:04:25,230 --> 00:04:25,970 linjat. 110 00:04:25,970 --> 00:04:28,139 Joten s ja t voivat olla edustettuna miten ruudulla? 111 00:04:28,139 --> 00:04:30,680 Ja voit vain vetää sen sormea ​​tällä valkokankaalla. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Joten siellä on kaksi puolikkaat kummallakin puolella yhtälö. 114 00:04:34,510 --> 00:04:37,760 Joten siellä s vasemmalla, ja Sitten getString oikealla. 115 00:04:37,760 --> 00:04:40,540 Ja sitten on t vasemmalla, ja sitten getString oikealla. 116 00:04:40,540 --> 00:04:42,630 Joten miten voisi alamme piirtävät kuvan, että 117 00:04:42,630 --> 00:04:46,340 edustaa mitä tapahtuu täällä muistissa, sanoisit? 118 00:04:46,340 --> 00:04:49,150 Ja sallikaa minun antaa teille selittää mitä teet kuten mennä. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 No, ensinnäkin se olisi kysyä saat syötteen. 121 00:04:58,890 --> 00:05:00,439 Ja se store-- Anteeksi. 122 00:05:00,439 --> 00:05:01,230 DAVID J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Hyvä. 124 00:05:01,730 --> 00:05:03,330 Ja tätä kutsutaan mitä? 125 00:05:03,330 --> 00:05:03,950 Voi, OK. 126 00:05:03,950 --> 00:05:04,450 Jatkakaa. 127 00:05:04,450 --> 00:05:05,575 En tarkoittanut keskeyttää. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Anteeksi. 129 00:05:07,060 --> 00:05:14,237 Niin se olisi sen syöttäminen osoite of-- ole varma. 130 00:05:14,237 --> 00:05:17,320 En tarkalleen muista numero, mutta uskon, että se on alkaen 0. 131 00:05:17,320 --> 00:05:18,420 >> DAVID J. MALAN: Ei se mitään, koska tein numerot ylös, 132 00:05:18,420 --> 00:05:19,650 joten ei ole oikea vastaus. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Alkaen 0 kaaren. 134 00:05:22,105 --> 00:05:24,000 >> DAVID J. MALAN: OK, joten elementti 0. 135 00:05:24,000 --> 00:05:24,765 Toki. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: Ja sitten jos oli kuin vain kahden kirjeitse 137 00:05:28,295 --> 00:05:30,496 >> DAVID J. MALAN: OK, takaisin sinulle. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Niin elementti 0, ja Sitten elementti 1 tai elementti 2. 139 00:05:33,629 --> 00:05:36,670 DAVID J. MALAN: Ja mikä pala kuva olet piirustus juuri nyt? 140 00:05:36,670 --> 00:05:37,690 Puhelu getString? 141 00:05:37,690 --> 00:05:38,830 Tai ilmoitus s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: ilmoitus S, uskon. 143 00:05:42,890 --> 00:05:45,980 Voi, getString, koska se Sisään syötetty kuhunkin [? alueella. ?] 144 00:05:45,980 --> 00:05:46,510 >> DAVID J. MALAN: Hyvä. 145 00:05:46,510 --> 00:05:47,051 Täsmälleen. 146 00:05:47,051 --> 00:05:49,300 Vaikka tämän tehokkaasti palauttaa matriisin, muistaa, 147 00:05:49,300 --> 00:05:53,300 kun palaamme merkkijonon, voimme indeksinä että merkkijono käyttäen 01 ja 2. 148 00:05:53,300 --> 00:05:56,180 Teknisesti nämä ovat luultavasti edustajanaan yksittäisiä osoitteita, 149 00:05:56,180 --> 00:05:57,100 mutta se on hieno. 150 00:05:57,100 --> 00:06:00,170 >> Niin kai, jos voin vain nopeasti toimittaa mihin jäimme 151 00:06:00,170 --> 00:06:04,320 viime kerralla, jos jokin jouset oli g b e, 152 00:06:04,320 --> 00:06:10,337 kenoviiva 0, mikä edustaa Gaben tulo, miten voisi edustamme s nyt? 153 00:06:10,337 --> 00:06:12,670 Jos tämä on muisti, joka on palauttanut getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: Olisiko asiamiehet kaari? 156 00:06:17,610 --> 00:06:18,750 >> DAVID J. MALAN: By kaari? 157 00:06:18,750 --> 00:06:19,130 No, no. 158 00:06:19,130 --> 00:06:21,171 Sanotaan vain, kuvallisesti, haluan vain mennä eteenpäin 159 00:06:21,171 --> 00:06:25,710 ja ehdottaa, että jos tämä on s, tämä on paluu arvo getString. 160 00:06:25,710 --> 00:06:29,482 Ja olet laatinut tätä 0, 1, 2, joka on täysin järkevää, koska me 161 00:06:29,482 --> 00:06:30,940 voi indeksoida osaksi merkkijono sellaisenaan. 162 00:06:30,940 --> 00:06:33,340 Mutta vain olla johdonmukaisia viimeisen kerran, anna minun mennä eteenpäin 163 00:06:33,340 --> 00:06:37,310 ja mielivaltaisesti ehdottaa, että tämä on osoite 1, tämä on osoite 2, 164 00:06:37,310 --> 00:06:39,597 tämä on osoitteen 3, ja niin edelleen. 165 00:06:39,597 --> 00:06:41,430 Ja niin, vain olla erittäin selvää, mitä tapahtuu 166 00:06:41,430 --> 00:06:44,580 mennä s seurauksena, että ensimmäinen rivi koodia, sanoisit? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Osoite 1? 168 00:06:45,420 --> 00:06:46,420 >> DAVID J. MALAN: Aivan. 169 00:06:46,420 --> 00:06:47,190 Joten puuttua 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 Ja sillä välin, anna minun mennä eteenpäin ja päällekkäisiä paljon siitä, mitä olet tehnyt 172 00:06:51,230 --> 00:06:52,740 ja lisätä oman t täällä. 173 00:06:52,740 --> 00:06:56,340 Jos minun pitäisi kirjoittaa Gabe jälleen, toisen kerran, 174 00:06:56,340 --> 00:07:01,530 kehoitteen getString, missä, tietenkin on Gabe menossa? 175 00:07:01,530 --> 00:07:02,280 No, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Kuten täällä? 178 00:07:05,975 --> 00:07:06,850 DAVID J. MALAN: Joo. 179 00:07:06,850 --> 00:07:08,516 JANELLE: Tai se on myös samalla laatikot? 180 00:07:08,516 --> 00:07:11,940 DAVID J. MALAN: Saanen ehdottaa, joo, tarkalleen, joten nämä ylimääräiset laatikot. 181 00:07:11,940 --> 00:07:15,230 Mutta mitä avain on, että nyt, vaikka vaikka olen laatinut nämä melko lähellä 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, tämä on 0x2-- todellisuudessa, 183 00:07:18,650 --> 00:07:25,750 tämä nyt voisi olla osoite 0x10, Esimerkiksi, ja 0x11 ja 0x12, 184 00:07:25,750 --> 00:07:26,870 ja niin edelleen. 185 00:07:26,870 --> 00:07:29,955 Ja niin, jos näin on, mitä tulee päätyä täällä t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 DAVID J. MALAN: Aivan. 188 00:07:31,830 --> 00:07:33,180 Niin 0x10. 189 00:07:33,180 --> 00:07:34,570 Ja nyt, viimeinen kysymys. 190 00:07:34,570 --> 00:07:37,510 Olet ylivoimaisesti oli työskennellä vaikeinta norsu toistaiseksi. 191 00:07:37,510 --> 00:07:42,650 Nyt, jos vedän ylös koodi uudelleen, kun teen, linjassa kolme, 192 00:07:42,650 --> 00:07:47,630 jos vertaistuki vastaa t, mitä olen oikeastaan verrataan että olemme piirretään täällä? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: kaksi osoitetta? 194 00:07:49,271 --> 00:07:50,270 DAVID J. MALAN: Aivan. 195 00:07:50,270 --> 00:07:53,350 Joten sanon on S yhtä yhtä t? 196 00:07:53,350 --> 00:07:56,210 Toisin sanoen, on 1 yhtä yhtä suuri kuin 10? 197 00:07:56,210 --> 00:07:59,710 Ja tietenkin, Ilmeinen vastaus on nyt, ei. 198 00:07:59,710 --> 00:08:02,920 Ja niin tämä ohjelma on viime kädessä painoon mitä sanoisit? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: Olisiko, kirjoitit sama asia? 201 00:08:08,405 --> 00:08:11,446 >> DAVID J. MALAN: Joten jos s on 1 ja t on 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: Kirjoitit eri asioita. 203 00:08:13,320 --> 00:08:13,570 >> DAVID J. MALAN: Aivan. 204 00:08:13,570 --> 00:08:14,480 Kirjoitit eri asioita. 205 00:08:14,480 --> 00:08:14,850 Kunnossa. 206 00:08:14,850 --> 00:08:16,714 Joten aplodit, jos voisimme täällä. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 Se oli tuskallista. 209 00:08:17,708 --> 00:08:18,208 Tiedän. 210 00:08:18,208 --> 00:08:19,684 Hienosti tehty. 211 00:08:19,684 --> 00:08:24,690 Nyt katsotaanpas jos emme voi tease lisäksi mitä korjaus oli. 212 00:08:24,690 --> 00:08:28,040 Ja tietysti, kun korjasimme this-- jonka minä nyt edustan green-- 213 00:08:28,040 --> 00:08:29,690 teimme pari parannuksia täällä. 214 00:08:29,690 --> 00:08:32,409 Ensimmäinen, kuten järki tarkista, olen ensimmäinen tarkkailun 215 00:08:32,409 --> 00:08:35,110 jos s vastaa null ja t on nolla. 216 00:08:35,110 --> 00:08:39,440 Ja vain olla selkeä, kun pitää s tai t olla tyhjä koodin näin? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kun voi s tai t olla tyhjä. 219 00:08:44,490 --> 00:08:44,990 Joo? 220 00:08:44,990 --> 00:08:45,990 >> Yleisö: [kuulumaton]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> DAVID J. MALAN: Aivan. 223 00:08:50,510 --> 00:08:52,840 Jos merkkijonon että käyttäjä kirjoitit on aivan liian pitkä 224 00:08:52,840 --> 00:08:56,140 mahtua muistiin, tai jotkut outo nurkka kaltainen tapaus, 225 00:08:56,140 --> 00:08:59,010 getString, kuten tulemme näkemään, kirjaimellisesti tänään, sen dokumentointi, 226 00:08:59,010 --> 00:09:02,330 sanoo se palauttaa null kuten erityistä kiinteän pisteen arvo, 227 00:09:02,330 --> 00:09:05,417 tai vain eräänlainen erityinen tunnusmerkki se tarkoittaa, että jotain meni pieleen. 228 00:09:05,417 --> 00:09:07,500 Joten haluamme tarkistaa että, koska se kääntyy pois 229 00:09:07,500 --> 00:09:09,720 että null on erittäin vaarallinen arvo. 230 00:09:09,720 --> 00:09:14,250 >> Usein jos yrität tehdä jotain null johon function-- kulkee sen 231 00:09:14,250 --> 00:09:17,470 syötteenä varten instance-- että toiminto voisi hyvin kaatuu ja sen mukana 232 00:09:17,470 --> 00:09:19,090 ottaa alas koko ohjelma. 233 00:09:19,090 --> 00:09:22,570 Joten tämä kolmas linja on nyt vain järki tarkistaa, virheiden tarkistus, jos haluatte. 234 00:09:22,570 --> 00:09:25,450 Se on hyvä tapa nyt meitä päästä tahansa me 235 00:09:25,450 --> 00:09:28,050 yritä käyttää arvoa, joka voisi mahdollisesti olla tyhjä. 236 00:09:28,050 --> 00:09:32,000 >> Nyt neljännellä rivillä täällä, "Jos strcmp (s, t)," hyvin, 237 00:09:32,000 --> 00:09:33,180 mikä se viittaa? 238 00:09:33,180 --> 00:09:36,750 No, me sanoi tämän olevan hyvin ytimekkäästi nimetty toiminto merkkijonon vertailu. 239 00:09:36,750 --> 00:09:40,370 Ja sen tarkoitus elämässä on vertailla Ensimmäisessä väitteessään sitä vastaan ​​toisen, 240 00:09:40,370 --> 00:09:44,640 mutta ei niinkään niiden osoitteet, kuten teimme tahattomasti hetki 241 00:09:44,640 --> 00:09:48,270 sitten punaisen koodin, mutta pikemminkin verrata näitä kahta 242 00:09:48,270 --> 00:09:53,210 jousille inhimillisesti intuitiivinen tavalla vertaamalla tätä, tätä, 243 00:09:53,210 --> 00:09:56,690 tätä, tätä, ja sitten pysähtymättä jos ja kun jokin 244 00:09:56,690 --> 00:09:59,590 tai molemmat sormet osuu kenoviiva 0. 245 00:09:59,590 --> 00:10:04,530 Niin joku vuosi sitten toteutettu strcmp toteuttaa meille toiminnallisuutta 246 00:10:04,530 --> 00:10:08,890 että toivoimme olisimme saaneet mukaan vain vertaamalla kahta yksinkertaista arvoja. 247 00:10:08,890 --> 00:10:14,929 >> Nyt rehellisesti, pidän piirustus kaikki nämä eri numeroita. 248 00:10:14,929 --> 00:10:17,470 Mutta todellisuus on, olen ollut tekevät näitä ylös koko ajan. 249 00:10:17,470 --> 00:10:19,580 Ja niin haluan vain mennä eteenpäin ja raapustaa nämä pois 250 00:10:19,580 --> 00:10:23,100 tehdä kohta, että lopussa Päivän ja eteenpäin, 251 00:10:23,100 --> 00:10:30,160 emme todellakaan aio välitä mitä käsitellään asiat ovat todella 252 00:10:30,160 --> 00:10:30,790 muistiin. 253 00:10:30,790 --> 00:10:34,320 Joten en aio tehdä näitä Erilaisia ​​numeroita niin paljon enää, 254 00:10:34,320 --> 00:10:38,970 Olen vain abstrakti tätä pois hieman enemmän ystävällinen vain nuolia. 255 00:10:38,970 --> 00:10:42,060 >> Toisin sanoen, jos s on osoitin, No, katsotaanpa vain vetää se, kirjaimellisesti, 256 00:10:42,060 --> 00:10:45,430 kuten osoitin, nuoli alkaen itse jotain muuta, 257 00:10:45,430 --> 00:10:48,280 ja murehdi liikaa lisää minutia näistä osoitteista 258 00:10:48,280 --> 00:10:49,910 joka taas Tein kuitenkin. 259 00:10:49,910 --> 00:10:52,680 Mutta näemme näistä osoitteista, joskus, kun virheenkorjaus koodi. 260 00:10:52,680 --> 00:10:56,450 >> Nyt Samalla tämä ohjelma täällä korjauksia, tietenkin, 261 00:10:56,450 --> 00:10:58,720 että ongelma vertaamalla nämä kaksi merkkijonoa. 262 00:10:58,720 --> 00:11:00,260 Mutta törmäsimme toinen ongelma. 263 00:11:00,260 --> 00:11:03,180 Tämä oli kopio ohjelmoida viimeisen kerran, 264 00:11:03,180 --> 00:11:06,880 jolloin yritin hyödyntää vain ensimmäisen merkin merkkijono. 265 00:11:06,880 --> 00:11:09,620 Mutta mikä oli oire näimme viime kerralla kun 266 00:11:09,620 --> 00:11:14,150 käyttäjä kirjoitetaan arvo, kuten Gabe pienillä, S, 267 00:11:14,150 --> 00:11:19,310 sitten valittu s kohti t, kuin kolmannella rivillä siellä, 268 00:11:19,310 --> 00:11:22,900 ja sitten yritin isolla t kiinnike 0? 269 00:11:22,900 --> 00:11:25,950 Mikä oli vaikutus muuttuviin t kiinnike 0 täällä? 270 00:11:25,950 --> 00:11:27,150 >> Yleisö: Se muutti s. 271 00:11:27,150 --> 00:11:29,360 >> DAVID J. MALAN: Joo, Vaihdoin s, samoin. 272 00:11:29,360 --> 00:11:31,050 Koska se, mitä todella tapahtuu? 273 00:11:31,050 --> 00:11:34,130 No, anna minun nähdä, jos voin puhdistaa tätä kuvaa seuraavasti. 274 00:11:34,130 --> 00:11:41,390 >> Jos s on taas sana g, a, b, e, kenoviivan, 0, ja s 275 00:11:41,390 --> 00:11:44,084 Jatkamme piirustuksen laatikko täällä, mutta ei enempää osoitteita. 276 00:11:44,084 --> 00:11:45,250 Lopetetaan tehdä asioita. 277 00:11:45,250 --> 00:11:47,510 Haluan vain piirtää kuva yksinkertaistaa maailmaa. 278 00:11:47,510 --> 00:11:52,640 >> Kun Julistan t narulla t, joka luo että kimpale muistia. 279 00:11:52,640 --> 00:11:55,850 Square sattuu olemaan 32 bittiä useimmissa tietokoneissa. 280 00:11:55,850 --> 00:11:59,530 Itse asiassa, jos olet koskaan kuullut tietokone, jossa on 32-bittinen arkkitehtuuri, 281 00:11:59,530 --> 00:12:03,000 todella fancy-puhua, että vain tarkoittaa, että se käyttää 32-bittisiä osoitteita. 282 00:12:03,000 --> 00:12:05,370 Ja teknisenä syrjään, Jos olet joskus miettinyt, 283 00:12:05,370 --> 00:12:09,630 miksi vanhemmissa tietokoneissa, jos todella yritti keitto niiden kanssa paljon muistia, 284 00:12:09,630 --> 00:12:12,360 voi vain olla enintään neljä gigatavua RAM-muistia, 285 00:12:12,360 --> 00:12:14,860 hyvin se johtuu siitä, kirjaimellisesti, vanha tietokone voi esittää ainoastaan 286 00:12:14,860 --> 00:12:17,250 laskea jopa 4 miljardia, 4 miljardia tavua, 287 00:12:17,250 --> 00:12:20,590 koska se on 32-bittisten numerot osoitteita. 288 00:12:20,590 --> 00:12:23,260 >> Mutta joka tapauksessa, tässä Esimerkiksi tarinan paljon yksinkertaisempi. 289 00:12:23,260 --> 00:12:27,250 t on vain yksi osoitin, tai todella char tähti, eli merkkijono. 290 00:12:27,250 --> 00:12:30,860 Ja miten haluan päivittää tätä kuvaa nyt, että toisella rivillä koodia, 291 00:12:30,860 --> 00:12:31,950 jälkeen piste, piste, piste? 292 00:12:31,950 --> 00:12:35,845 Kun teen nuora t on s puolipiste, Miten tämä kuva muuttuu? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Joo? 295 00:12:38,000 --> 00:12:38,916 >> Yleisö: [kuulumaton]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> DAVID J. MALAN: Joo. 298 00:12:42,020 --> 00:12:42,600 Täsmälleen. 299 00:12:42,600 --> 00:12:45,620 Sain laittaa nuoli t laatikko samaan osoitteeseen, 300 00:12:45,620 --> 00:12:47,570 Sama ensimmäinen kirjain antoi. 301 00:12:47,570 --> 00:12:50,850 Tai teknisesti, jos tämä kaveri oli vielä 0x1, 302 00:12:50,850 --> 00:12:53,052 se on niin kuin minulla olisi 0x1 täällä ja 0x1 täällä. 303 00:12:53,052 --> 00:12:54,760 Mutta jälleen kerran, kuka välittää noin osoitteet? 304 00:12:54,760 --> 00:12:56,345 Se on vain ajatus, että nyt on merkitystä. 305 00:12:56,345 --> 00:12:57,720 Joten tämä on mitä täällä tapahtuu. 306 00:12:57,720 --> 00:13:02,690 Niin tietysti, jos et t kiinnike 0, joka on array merkintä, 307 00:13:02,690 --> 00:13:05,650 sekä course-- ja rehellisesti, se näyttää kuin olisi array täällä, 308 00:13:05,650 --> 00:13:07,340 mutta nyt on tämä outo juttu. 309 00:13:07,340 --> 00:13:11,160 Tiedä, että ohjelmointikieli, C tarjoaa tätä ominaisuutta, 310 00:13:11,160 --> 00:13:14,650 jolloin, vaikka t on osoitin, tai s on osoitin, 311 00:13:14,650 --> 00:13:18,050 voit silti käyttää, että tuttu, mukava hakasulkeen 312 00:13:18,050 --> 00:13:22,520 merkintätapa mennä ensimmäinen osa, tai toinen elementti tai sen osaa 313 00:13:22,520 --> 00:13:26,130 että osoitin osoittaa ja koska oletettavasti se 314 00:13:26,130 --> 00:13:29,410 on, kuten tässä tapauksessa, osoittaen joitakin array. 315 00:13:29,410 --> 00:13:30,340 >> Miten siis korjata? 316 00:13:30,340 --> 00:13:33,660 Rehellisesti sanottuna tämä on, jos se sai hieman ylivoimainen ensi silmäyksellä. 317 00:13:33,660 --> 00:13:35,340 Mutta tässä on uusi ja parannettu versio. 318 00:13:35,340 --> 00:13:37,460 >> Joten ensimmäinen, Saan eroon CS50 kirjasto, 319 00:13:37,460 --> 00:13:41,170 vain paljastaa, että s on todellakin char tähti, vain synonyymi. 320 00:13:41,170 --> 00:13:43,540 Ja t on myös char tähti. 321 00:13:43,540 --> 00:13:48,290 Mutta mitä on tekeillä oikealla puolella viivaa 322 00:13:48,290 --> 00:13:49,970 missä t annetaan arvo? 323 00:13:49,970 --> 00:13:50,790 >> Mikä on malloc? 324 00:13:50,790 --> 00:13:51,630 Mitä se strlen? 325 00:13:51,630 --> 00:13:52,547 Mikä on sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Miksi hitossa tämä line näyttävät niin monimutkaista? 327 00:13:54,380 --> 00:13:55,713 Mitä se tekee korkealla tasolla? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Mitä se tallentaminen t? 330 00:13:57,440 --> 00:13:58,646 Joo? 331 00:13:58,646 --> 00:14:01,104 Yleisö: Se jaettaessa tietty määrä muistia. 332 00:14:01,104 --> 00:14:03,032 Se tallentaa, luulisin, kirjeet [äänetön]. 333 00:14:03,032 --> 00:14:04,032 >> DAVID J. MALAN: Perfect. 334 00:14:04,032 --> 00:14:04,540 Perfect. 335 00:14:04,540 --> 00:14:06,650 Se kohdentaa tiettyihin määrä muistia 336 00:14:06,650 --> 00:14:08,940 tallentaa oletettavasti tulevaisuudessa kirjaimia. 337 00:14:08,940 --> 00:14:11,310 Ja erityisesti, malloc Siksi palaamassa mitä? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Yleisö: Palatakseni [äänetön]? 340 00:14:14,851 --> 00:14:15,850 DAVID J. MALAN: Aivan. 341 00:14:15,850 --> 00:14:18,850 Palauttamalla osoitteen että muisti, joka on hieno tapa sanoa, 342 00:14:18,850 --> 00:14:21,640 palauttaa osoitteen ensimmäinen tavu että muisti. 343 00:14:21,640 --> 00:14:25,460 Velvollisuutena on minun muistavan kuinka paljon muistia Olen itse 344 00:14:25,460 --> 00:14:27,140 kohdistettu tai pyytänyt malloc varten. 345 00:14:27,140 --> 00:14:28,384 >> Nyt, kuinka paljon se on? 346 00:14:28,384 --> 00:14:30,550 No, vaikka siellä paljon sulkeissa täällä, 347 00:14:30,550 --> 00:14:32,970 malloc kestää vain yhden argumentin. 348 00:14:32,970 --> 00:14:37,250 Ja olen täsmennetään strlen S, niin anna minua niin monta tavua kuin on S, 349 00:14:37,250 --> 00:14:37,800 mutta lisätään yksi. 350 00:14:37,800 --> 00:14:38,300 Miksi? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Joo? 353 00:14:39,530 --> 00:14:40,840 >> Yleisö: kenoviiva 0. 354 00:14:40,840 --> 00:14:41,840 DAVID J. MALAN: Aivan. 355 00:14:41,840 --> 00:14:43,423 Meidän täytyy tehdä vähän taloudenhoito. 356 00:14:43,423 --> 00:14:45,970 Joten koska siellä kenoviiva 0, olisimme paremmin muistaa. 357 00:14:45,970 --> 00:14:47,310 Muuten olemme menossa luoda merkkijono, joka 358 00:14:47,310 --> 00:14:49,170 ei ole tätä erityistä terminaattori. 359 00:14:49,170 --> 00:14:52,640 >> Samaan aikaan, vain olla erittäin anaali, minulla on sizeof (char), 360 00:14:52,640 --> 00:14:55,730 vain jos joku juoksee minun koodi ei CS50 laite, 361 00:14:55,730 --> 00:14:58,220 mutta ehkä eri tietokoneeseen kokonaan, jos merkkiä 362 00:14:58,220 --> 00:15:01,470 ovat yksi tavu, sopimuksen mukaan, mutta kaksi tavua, tai jotain suurempaa kuin. 363 00:15:01,470 --> 00:15:04,490 Se on vain olla super, Super vastenmielinen virheitä. 364 00:15:04,490 --> 00:15:06,940 Vaikka todellisuudessa se on todennäköisimmin olemaan 1. 365 00:15:06,940 --> 00:15:11,490 >> Nyt puolestaan ​​menen eteenpäin ja kopioi merkkijono, t kiinnike i vastaa t kiinnike s. 366 00:15:11,490 --> 00:15:14,962 Ja minä taivun viime viikolla lähdekoodin nähdä mitä tapahtuu. 367 00:15:14,962 --> 00:15:17,670 Mutta avain nouto, ja Siksi laitoin sen nyt vihreä, 368 00:15:17,670 --> 00:15:22,520 johtuu siitä, että hyvin viimeinen rivi, t kiinnike 0 vastaa toupper, 369 00:15:22,520 --> 00:15:25,230 vaikutus on aktivointiin joka merkkijonon? 370 00:15:25,230 --> 00:15:26,960 t ja / tai s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Että viimeisen rivin koodia. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Vain t, koska mitä tapahtui tällä kertaa, 375 00:15:35,560 --> 00:15:41,500 jos olen hieman kumoa että viimeinen vaihe, mitä on tapahtunut on, kun soitan malloc, 376 00:15:41,500 --> 00:15:45,380 Olen lähinnä saada kimpale muistia joka on samankokoinen kuin alkuperäinen, 377 00:15:45,380 --> 00:15:47,020 koska se on aritmeettinen tein. 378 00:15:47,020 --> 00:15:50,920 Olen tallentaminen t osoitteeseen Kyseisen kimpale muistia. 379 00:15:50,920 --> 00:15:53,370 Vaikka tämä näyttää hienolta ja kaunis, mukava ja tyhjä, 380 00:15:53,370 --> 00:15:56,882 todellisuus on olemassa, mitä jaamme pitää soittaa, roskat arvot täällä. 381 00:15:56,882 --> 00:15:59,340 Että kimpale muistia pitää hyvin hyvin on käytetty ennen, 382 00:15:59,340 --> 00:16:00,940 muutaman sekunnin, muutama minuutti sitten. 383 00:16:00,940 --> 00:16:04,410 Joten siellä voisi ehdottomasti olla numeroita tai kirjaimia siellä sattumalta. 384 00:16:04,410 --> 00:16:08,580 Mutta ne eivät ole voimassa, kunnes itse asuttaa tämä kimpale muistia 385 00:16:08,580 --> 00:16:12,510 todellisilla merkkiä, niin minä tehdä, että silmukka. 386 00:16:12,510 --> 00:16:13,180 Kaikki hyvin? 387 00:16:13,180 --> 00:16:16,180 >> Joten nyt kliimaksi Nämä kolme esimerkkiä 388 00:16:16,180 --> 00:16:20,730 jotka näennäisesti rikki viime kerralla, Tämän Swap Esimerkiksi tämä toiminto 389 00:16:20,730 --> 00:16:23,670 työskenteli mielessä että se vaihtoivat ja b. 390 00:16:23,670 --> 00:16:25,620 Mutta se ei toimi, mitä muut mielessä? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Joo? 393 00:16:28,614 --> 00:16:29,612 >> Yleisö: [kuulumaton]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> DAVID J. MALAN: Aivan. 396 00:16:36,700 --> 00:16:39,530 Jos minun pitäisi kutsua tätä toimintoa alkaen another-- esimerkiksi 397 00:16:39,530 --> 00:16:42,870 alkaen toimivat kuin tärkein, jos Minulla on muuttuja, x ja y, niin minä 398 00:16:42,870 --> 00:16:46,160 tein viime viikolla, sama koodi, ja kuljen vuonna x ja y 399 00:16:46,160 --> 00:16:49,860 Vuorottelu ja soita Swap-- tätä, tietenkin on oikea versio 400 00:16:49,860 --> 00:16:52,220 on mitä aiomme see-- se ei toimi. 401 00:16:52,220 --> 00:16:53,770 Niin mikä on korjata? 402 00:16:53,770 --> 00:16:56,850 >> No, niin vain olla selvää, anna minun mennä eteenpäin 403 00:16:56,850 --> 00:17:05,450 ja-- anna minulle yksi toinen tänne, ja katso jos voin näyttää viimeinen, joka 404 00:17:05,450 --> 00:17:12,464 tulee in-- Katsotaan jos löydän Tässä todellinen fast-- OK, [äänetön]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, siellä se on. 407 00:17:19,240 --> 00:17:21,000 Joten unohda komennot olen vain kirjoittamalla. 408 00:17:21,000 --> 00:17:23,780 Haluan sen hakea osoitteessa viime hetken esimerkki 409 00:17:23,780 --> 00:17:27,960 viime aika, joka on nyt nimeltään no Vaihda. 410 00:17:27,960 --> 00:17:30,200 >> Joten ei Swap on silloin jäimme viime kerralla, 411 00:17:30,200 --> 00:17:32,930 jolloin olen alustettu x 1 ja y 2. 412 00:17:32,930 --> 00:17:35,840 Sitten soittaa Swap, kulkee 1 ja 2. 413 00:17:35,840 --> 00:17:37,930 Ja sitten tämä toiminto työskenteli jossain mielessä, 414 00:17:37,930 --> 00:17:40,750 mutta se ei ollut vakituista Vaikutus x ja y. 415 00:17:40,750 --> 00:17:45,430 Joten kysymys käsillä on, miten nyt me itse korjata tämän ongelman? 416 00:17:45,430 --> 00:17:47,820 Mikä on ratkaisu käsillä? 417 00:17:47,820 --> 00:17:53,150 >> No, swap.c, joka on uusi tänään huomaa pari eroja. 418 00:17:53,150 --> 00:17:54,700 x ja y ovat samoja. 419 00:17:54,700 --> 00:17:57,250 Mutta mikä on selvästi erilaista linjaa 25? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Mitä uutta siellä, jos muistat miltä se näytti hetki sitten? 422 00:18:01,715 --> 00:18:02,565 >> Yleisö: [kuulumaton]. 423 00:18:02,565 --> 00:18:03,440 >> DAVID J. MALAN: Joo. 424 00:18:03,440 --> 00:18:06,680 Niin et-merkkejä ovat uusi pala syntaksin ei ainoastaan ​​tässä ohjelmassa, 425 00:18:06,680 --> 00:18:08,560 mutta myös yleisemmin CS50. 426 00:18:08,560 --> 00:18:10,680 Toistaiseksi en usko olemme nähneet yhtään esimerkkiä 427 00:18:10,680 --> 00:18:14,070 tai oikeastaan ​​puhuneet niistä mitään yksityiskohta, muu kuin, ehkä, preemptively 428 00:18:14,070 --> 00:18:16,467 jaksossa, et-merkki näin. 429 00:18:16,467 --> 00:18:19,300 No, se kääntyy pois et-merkki on yksi viimeisen kappaletta uusia syntaksin 430 00:18:19,300 --> 00:18:20,174 aiomme oppia. 431 00:18:20,174 --> 00:18:23,500 Kaikki se tarkoittaa, osoite joidenkin muuttuja. 432 00:18:23,500 --> 00:18:25,070 Millä osoite ei x elää? 433 00:18:25,070 --> 00:18:26,510 Mutta mitä osoitetta ei y elää? 434 00:18:26,510 --> 00:18:28,700 Koska jos perustavanlaatuinen ongelma ennen 435 00:18:28,700 --> 00:18:32,970 on, että x ja y ovat johdettiin kopioina, mitä todella haluamme tehdä 436 00:18:32,970 --> 00:18:38,780 on tarjota Swap kanssa kuin aarre kartta, joka johtaa siihen, missä x ja y tosiasiallisesti 437 00:18:38,780 --> 00:18:41,910 ovat RAM-muistia, niin että Swap voi seurata, että kartta 438 00:18:41,910 --> 00:18:47,760 ja mennä minne x tai y merkitsee paikalla ja muuttaa todelliset arvot 1 ja 2 439 00:18:47,760 --> 00:18:48,270 siellä. 440 00:18:48,270 --> 00:18:50,710 >> Niin Swap muututtava hieman liikaa. 441 00:18:50,710 --> 00:18:53,760 Ja ensi silmäyksellä, tämä saattaa tuntua hieman samanlainen merkkiä tähden. 442 00:18:53,760 --> 00:18:54,850 Ja se todellakin on. 443 00:18:54,850 --> 00:18:59,635 Joten on osoitin minkälaisia ​​tietoja, perustuu tähän korostettu osaan? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Joten se on int. 446 00:19:01,620 --> 00:19:04,880 >> Joten ei ole enää int, se osoite int. 447 00:19:04,880 --> 00:19:07,910 Ja vastaavasti b on nyt menossa olevan osoitteen int. 448 00:19:07,910 --> 00:19:12,470 Joten kun nyt soittaa Swap päässä Main, En aio antaa Swap 1 ja 2. 449 00:19:12,470 --> 00:19:15,540 Aion antaa sille kuin Ox-jotain ja Ox-jotain, 450 00:19:15,540 --> 00:19:19,820 kaksi osoitetta, joka johtaa Swap niiden sijainnit 451 00:19:19,820 --> 00:19:21,310 minun tietokoneen muistiin. 452 00:19:21,310 --> 00:19:25,580 >> Joten nyt minun jäljellä täytäntöönpano muututtava hitusen. 453 00:19:25,580 --> 00:19:28,650 Mikä on tietysti erilainen nyt Näiden kolmen riviä koodia? 454 00:19:28,650 --> 00:19:31,350 Ei näitä hemmetin tähteä kaikki paikka, okei? 455 00:19:31,350 --> 00:19:33,014 Joten mitä täällä tapahtuu? 456 00:19:33,014 --> 00:19:33,514 Joo? 457 00:19:33,514 --> 00:19:35,055 >> Yleisö: Se on tietenkin [kuulumaton]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> DAVID J. MALAN: Aivan. 460 00:19:37,990 --> 00:19:41,560 Joten tässä context--, ja tämä ei ollut paras design tosin päätöksessä 461 00:19:41,560 --> 00:19:42,530 vuotta sitten. 462 00:19:42,530 --> 00:19:45,110 Tässä yhteydessä, jossa sinulla on vain tähti, 463 00:19:45,110 --> 00:19:48,240 ja sinulla ei ole tietotyyppiä, kuten int, heti vasemmalle, 464 00:19:48,240 --> 00:19:53,146 sen sijaan sinulla on yhtäläisyysmerkki, selvästi, Tässä yhteydessä, kun sanot tähti, 465 00:19:53,146 --> 00:19:56,980 se tarkoittaa, että mene osoite se on. 466 00:19:56,980 --> 00:19:58,870 Seuraa aarrekartan, niin sanoakseni. 467 00:19:58,870 --> 00:20:01,720 >> Ja sillä välin, linjassa 37, se tarkoittaa samaa asiaa. 468 00:20:01,720 --> 00:20:05,460 Mene osoitteeseen, ja laittaa mitä siellä? 469 00:20:05,460 --> 00:20:09,520 Riippumatta on Paikkakunta että b täsmennetään. 470 00:20:09,520 --> 00:20:10,980 Toisin sanoen, mene b. 471 00:20:10,980 --> 00:20:12,130 Ota tuo arvo. 472 00:20:12,130 --> 00:20:15,620 Mene ja kohti yhtä allekirjoittaa, sijoitusoperaattori, 473 00:20:15,620 --> 00:20:17,010 Laita se arvo siellä. 474 00:20:17,010 --> 00:20:19,272 >> Samoin int temp on vain int. 475 00:20:19,272 --> 00:20:20,730 Mitään ei tarvitse muuttaa noin temp. 476 00:20:20,730 --> 00:20:24,810 Se on vain ylimääräinen lasi Annenberg joidenkin maitoa tai appelsiinimehua. 477 00:20:24,810 --> 00:20:27,630 Mutta en tarvitse sanoa, mennä b. 478 00:20:27,630 --> 00:20:31,449 Mene tuohon määränpäähän ja laittaa arvo temp siellä. 479 00:20:31,449 --> 00:20:32,490 Joten mitä tapahtuu sitten? 480 00:20:32,490 --> 00:20:36,540 Kun olen itse soittaa Swap tällä kertaa, jos Tässä ensimmäinen lokero täällä edustaa Main, 481 00:20:36,540 --> 00:20:42,270 tämä toinen lokero edustaa Swap, kun Kuljen ampersand x ja ampersand y 482 00:20:42,270 --> 00:20:47,150 Main Swap, vain olla selkeä, mikä on tämä pinokehys vastaanottavalle? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Joo? 485 00:20:49,200 --> 00:20:50,180 >> Yleisö: [kuulumaton]. 486 00:20:50,180 --> 00:20:51,180 DAVID J. MALAN: Aivan. 487 00:20:51,180 --> 00:20:53,129 Osoite x ja osoite y. 488 00:20:53,129 --> 00:20:55,170 Ja voit ajatella näitä kuten postiosoitteet. 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 haluat siirtää kaksi rakennusta jotka ovat kyseisissä paikoissa. 491 00:21:01,230 --> 00:21:04,680 >> Se on tavallaan naurettavaa ajatus, mutta siinä kaikki me tarkoitamme osoite. 492 00:21:04,680 --> 00:21:07,000 Missä päin maailmaa voi löydät nämä kaksi ints? 493 00:21:07,000 --> 00:21:09,470 Missä ihmeessä voitte löytää ne kaksi rakennusta? 494 00:21:09,470 --> 00:21:15,170 Joten jos lopuksi, kun kaikki tällä kertaa mennä tänään lähdekoodin ja kääntää 495 00:21:15,170 --> 00:21:22,110 Swap ja ajaa ./swap lopuksi, että Ensimmäistä kertaa me itse nähdä, että 496 00:21:22,110 --> 00:21:25,330 arvoni ovat todella vaihtaneet onnistuneesti. 497 00:21:25,330 --> 00:21:30,860 Ja nyt voimme jopa ottaa merkille vaikkapa gdb. 498 00:21:30,860 --> 00:21:32,740 >> Joten anna minun mennä samaan tiedostoon. 499 00:21:32,740 --> 00:21:35,010 Anna minun mennä eteenpäin ja ajaa gdb of ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 Ja nyt, vuonna Swap, aion mennä eteenpäin ja asettaa taitekohta Main. 502 00:21:40,547 --> 00:21:42,630 Ja nyt aion mennä eteenpäin ja suorita ohjelma. 503 00:21:42,630 --> 00:21:45,810 Ja nyt näemme minun koodi pysähdyin että linja. 504 00:21:45,810 --> 00:21:48,330 >> Jos menen eteenpäin ja tulosta x, mitä minun pitäisi nähdä täällä? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Se on kysymys. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Sano uudestaan? 509 00:21:51,530 --> 00:21:52,295 >> Yleisö: [kuulumaton]. 510 00:21:52,295 --> 00:21:53,910 >> DAVID J. MALAN: So satunnaisia ​​numeroita, ehkä. 511 00:21:53,910 --> 00:21:56,010 Ehkä onnistaa, ja se on mukava ja yksinkertainen, kuten 0. 512 00:21:56,010 --> 00:21:57,230 Mutta ehkä se on jokin satunnainen numero. 513 00:21:57,230 --> 00:21:58,090 Tässä tapauksessa minulla kävi tuuri. 514 00:21:58,090 --> 00:21:59,030 Se vain sattuu olemaan 0. 515 00:21:59,030 --> 00:22:00,780 Mutta se on todellakin onni, koska vasta I 516 00:22:00,780 --> 00:22:06,280 kirjoita seuraava ja sitten tulostaa x on, että riviä koodia, linja 19, on teloitettu. 517 00:22:06,280 --> 00:22:10,942 >> Samaan aikaan, jos kirjoitan seuraavan kerran, ja nyt tulostaa y, aion nähdä 2. 518 00:22:10,942 --> 00:22:13,900 Nyt, jos kirjoitan seuraavaksi, se tulee saada hieman sekava, koska nyt 519 00:22:13,900 --> 00:22:17,250 printf tulee näkyä näyttö, kuten se teki. x on 1. 520 00:22:17,250 --> 00:22:18,606 >> Tehdään tämä uudestaan. 521 00:22:18,606 --> 00:22:20,480 Ja nyt, tässä tarina asiat mielenkiintoisia. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Ennen kuin soitan Vaihda tai jopa askel siihen, otetaan vähän kurkistaa. 524 00:22:26,580 --> 00:22:28,980 x on, jälleen, 1. 525 00:22:28,980 --> 00:22:33,240 Y on, tietenkin, nopea järki tarkista, 2, joten ei ole vaikea siellä. 526 00:22:33,240 --> 00:22:35,740 Mutta mikä on ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Vastaus, se on tavallaan upea näköinen. 529 00:22:39,350 --> 00:22:43,500 Mutta int tähti suluissa on vain GDP: n tapa sanoa tämä on osoite. 530 00:22:43,500 --> 00:22:48,290 Se ei ole int, se on osoitin int, tai muuten tunnetaan osoite. 531 00:22:48,290 --> 00:22:49,742 >> Mikä on tämä hullu juttu? 532 00:22:49,742 --> 00:22:51,825 Emme ole koskaan nähneet jotain aivan tuollaisena. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Joten tämä on osoite tietokoneeni muisto jossa x sattuu asumaan. 535 00:22:58,120 --> 00:22:59,040 Se Ox-jotain. 536 00:22:59,040 --> 00:23:01,290 Ja tämä on suoraan sanoen miksi Olen ryhtyi piirtämään nuolia, 537 00:23:01,290 --> 00:23:03,340 numeroiden sijasta, sillä kuka todella välittää 538 00:23:03,340 --> 00:23:06,890 että int on tietyllä osoite, joka on niin iso. 539 00:23:06,890 --> 00:23:12,160 Mutta bffff0c4, nämä ovat kaikki todellakin heksadesimaaliyksikön, 540 00:23:12,160 --> 00:23:13,720 jotka ovat 0-F. 541 00:23:13,720 --> 00:23:16,590 >> Joten emme aio asua liian pitkään, mitä nämä asiat ovat. 542 00:23:16,590 --> 00:23:19,400 Mutta jos tulostaa y, En tietenkään katso 2. 543 00:23:19,400 --> 00:23:22,440 Mutta et-y, näen tämän osoitteen. 544 00:23:22,440 --> 00:23:26,527 Ja varoitusajalla, utelias, kuinka kaukana ovat x ja y? 545 00:23:26,527 --> 00:23:27,985 Voit jättää useimmat osoite. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Neljä tavua. 548 00:23:29,920 --> 00:23:33,510 Ja se vastaa meidän aiemmin väittävät, että kuinka suuri on int? 549 00:23:33,510 --> 00:23:34,130 Neljä tavua. 550 00:23:34,130 --> 00:23:37,420 Niin se näyttää kaikki on riviin kauniisti, niin saatat toivoa, muistissa. 551 00:23:37,420 --> 00:23:40,010 >> Joten nyt haluan vain eteenpäin loppuun tämän tarinan. 552 00:23:40,010 --> 00:23:43,290 Mennään eteenpäin ja kirjoita vaihe, sukeltaa Swap-toiminto. 553 00:23:43,290 --> 00:23:46,880 Nyt huomaa, jos en kirjoita, se on identtinen osoitteen x. 554 00:23:46,880 --> 00:23:52,130 Jos kirjoitan b, se on identtinen osoitteeseen y. 555 00:23:52,130 --> 00:23:57,020 Joten mitä minun pitäisi nähdä, jos olen sanoa, mene osoitteeseen? 556 00:23:57,020 --> 00:23:58,120 Joten tulosta tähti. 557 00:23:58,120 --> 00:24:00,130 Joten tähti tarkoittaa mennä sinne, tässä yhteydessä. 558 00:24:00,130 --> 00:24:02,730 Ampersand tarkoittaa mitä osoitteen. 559 00:24:02,730 --> 00:24:05,000 Joten tähti keinoin 1. 560 00:24:05,000 --> 00:24:09,590 Ja tulostaa tähti b antaa minulle 2. 561 00:24:09,590 --> 00:24:15,750 >> Ja anna minun olettaa, että tällä hetkellä että ainakin koodin, joka 562 00:24:15,750 --> 00:24:18,950 etenee suorittaa nyt voi olla perustellun kautta tällä tavalla. 563 00:24:18,950 --> 00:24:21,150 Mutta me palaamme asiaan idea ennen pitkää. 564 00:24:21,150 --> 00:24:23,850 Joten tämä versio Swap on nyt oikea ja mahdollistaa 565 00:24:23,850 --> 00:24:26,650 voimme vaihtaa tässä tietotyyppi. 566 00:24:26,650 --> 00:24:29,120 >> Joten kysyttävää sitten Swap? 567 00:24:29,120 --> 00:24:29,890 Star? 568 00:24:29,890 --> 00:24:30,690 Käytössä osoite? 569 00:24:30,690 --> 00:24:33,270 Ja näet, kanssa Harjoitus 4, tavallaan, 570 00:24:33,270 --> 00:24:37,310 mutta ongelma asettaa 5, varmasti, miten nämä asiat ovat hyödyllisiä ja saada paljon enemmän 571 00:24:37,310 --> 00:24:39,584 mukava niiden kanssa, seurauksena. 572 00:24:39,584 --> 00:24:40,430 Yhtään mitään? 573 00:24:40,430 --> 00:24:40,930 Kunnossa. 574 00:24:40,930 --> 00:24:44,350 Niin malloc on, jälleen, tämä toiminto että juuri varaa, muistikapasiteetti 575 00:24:44,350 --> 00:24:45,330 jako. 576 00:24:45,330 --> 00:24:47,024 Ja miksi tämä on hyödyllistä? 577 00:24:47,024 --> 00:24:48,940 No, koko tämän ajan, olet käyttänyt malloc. 578 00:24:48,940 --> 00:24:52,230 Jos ajatellaan nyt, miten getString teoksia, oletettavasti, se on 579 00:24:52,230 --> 00:24:56,140 pyytänyt joku kimpale muisti, milloin käyttäjä kirjoittaa merkkijonon 580 00:24:56,140 --> 00:24:59,040 vuonna, koska me varmasti ei tiennyt, koska CS50 henkilökunta, 581 00:24:59,040 --> 00:25:02,710 kuinka suuri ne jouset että ihmiset aiot kirjoittaa voisi olla. 582 00:25:02,710 --> 00:25:07,910 >> Joten, ensimmäistä kertaa, alkaa kuori takaisin miten CS50 kirjaston teoksia, 583 00:25:07,910 --> 00:25:10,990 Poiketen pari esimerkkiä joka johtaa meidät sinne. 584 00:25:10,990 --> 00:25:15,300 Jos siis avata gedit ja avata scanf 0, 585 00:25:15,300 --> 00:25:17,055 aiomme nähdä seuraava koodi. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, saatavilla verkkosivuilla tänään, on melko muutaman rivin koodia 588 00:25:23,530 --> 00:25:25,351 Täältä 14 kautta 20. 589 00:25:25,351 --> 00:25:26,600 Ja katsotaan mitä se tekee. 590 00:25:26,600 --> 00:25:28,920 Se julistaa int, nimeltään x. 591 00:25:28,920 --> 00:25:30,850 Se kertoo jotain, numero kiitos. 592 00:25:30,850 --> 00:25:33,940 Ja nyt se sanoo, scanf% i, ja x. 593 00:25:33,940 --> 00:25:35,620 Joten siellä on nippu uusia juttuja siellä. 594 00:25:35,620 --> 00:25:38,420 >> Mutta scanf, voit sellaista ajatella AS vastakohta printf. 595 00:25:38,420 --> 00:25:40,090 printf tietenkin tulostaa näytölle. 596 00:25:40,090 --> 00:25:44,410 scanf tavallaan skannaa käyttäjän näppäimistön jotain hän on kirjoittanut. 597 00:25:44,410 --> 00:25:46,550 >> % I on kuin printf. 598 00:25:46,550 --> 00:25:49,410 Tämä tarkoittaa sitä odottaa käyttäjä voi kirjoittaa int. 599 00:25:49,410 --> 00:25:52,820 Ja nyt, miksi luulet minun ehkä ohimennen scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Jos elämän tarkoitus on scanf on saada jotain käyttäjältä, 602 00:25:57,770 --> 00:26:02,480 mikä on tarkoitettu kulkee sen, ja x, nyt? 603 00:26:02,480 --> 00:26:02,980 Joo? 604 00:26:02,980 --> 00:26:03,896 >> Yleisö: [kuulumaton]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 DAVID J. MALAN: Aivan. 607 00:26:06,540 --> 00:26:12,900 Riippumatta minä, ihminen, kirjoita, minun panos aiotaan tallennettu kyseisessä paikassa. 608 00:26:12,900 --> 00:26:17,660 Se ei riitä, muistuttaa, että vain pass x, koska olemme nähneet jo, 609 00:26:17,660 --> 00:26:21,630 milloin ohitat vain raaka-muuttuja, kuten int, johonkin muuhun toiminto, 610 00:26:21,630 --> 00:26:25,640 Toki, se voi muuttaa sitä vaihteleva, mutta ei pysyvästi. 611 00:26:25,640 --> 00:26:27,360 Se ei voi olla vaikutusta Main. 612 00:26:27,360 --> 00:26:29,420 Se voi muuttaa vain oman paikallisen kopion. 613 00:26:29,420 --> 00:26:32,560 Mutta jos sen sijaan, et antaa minulle todellista int, 614 00:26:32,560 --> 00:26:36,640 mutta annat minulle ohjeet että int, minä nyt, että scanf, 615 00:26:36,640 --> 00:26:41,050 Totisesti, minä voi seurata, että käsitellä ja laittaa numero siellä 616 00:26:41,050 --> 00:26:43,280 joten voit käyttää sitä myös. 617 00:26:43,280 --> 00:26:45,120 >> Joten kun käytän tätä ohjelmaa, katsotaanpa. 618 00:26:45,120 --> 00:26:49,660 Tee scanf 0 dot slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 Ja jos minä nyt kirjoita numero kuten 50, kiitos 50. 620 00:26:54,030 --> 00:26:58,150 Jos minä nyt kirjoita numero kuin negatiivinen 1, negatiivista 1. 621 00:26:58,150 --> 00:27:04,200 En nyt kirjoita numero kuin 1,5, hm. 622 00:27:04,200 --> 00:27:06,030 Miksi ohjelma sivuuttaa minua? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 No, koska yksinkertaisesti, sanoin se odottaa int vain. 625 00:27:09,880 --> 00:27:10,380 Kunnossa. 626 00:27:10,380 --> 00:27:11,630 Niin, että yksi versio tästä. 627 00:27:11,630 --> 00:27:16,600 Otetaanpa asioita lovi ja ehdottaa, että tämä ei ole hyvä. 628 00:27:16,600 --> 00:27:20,530 Ja tässä piilee hyvin yksinkertainen esimerkki miten voimme alkaa kirjoittaa koodia 629 00:27:20,530 --> 00:27:24,450 että muut ihmiset voivat hyödyntää tai vaarantaa tekemällä pahoja asioita. 630 00:27:24,450 --> 00:27:28,336 Joten linja 16, niin samanlaisia hengeltään ennen, 631 00:27:28,336 --> 00:27:29,960 mutta en julistaa int tällä kertaa. 632 00:27:29,960 --> 00:27:32,970 Olen julistaa nieriää tähden, eli merkkijono. 633 00:27:32,970 --> 00:27:35,190 >> Mutta mitä se oikeastaan ​​tarkoittaa? 634 00:27:35,190 --> 00:27:38,790 Joten jos en määritä address-- ja Soitan sitä mielivaltaisesti, puskuri, 635 00:27:38,790 --> 00:27:43,370 mutta voisin kutsua sitä s, olla simple-- ja sitten teen tämän, selittää minulle, 636 00:27:43,370 --> 00:27:48,630 jos voisit, joka perustuu edellisen logiikka, mitä scanf tekee linja 18, 637 00:27:48,630 --> 00:27:55,000 jos pass% s ja puskuri, mikä on osoite? 638 00:27:55,000 --> 00:27:58,210 Mikä on scanf, jos haet täsmälleen samaa logiikkaa kuin versio 0, 639 00:27:58,210 --> 00:28:00,640 yrittävät tehdä täällä, kun käyttäjä kirjoittaa jotain? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Joo? 642 00:28:03,409 --> 00:28:04,407 >> Yleisö: [kuulumaton]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> DAVID J. MALAN: Aivan. 645 00:28:08,890 --> 00:28:11,577 Scanf, jonka logiikka aikaisemmin, vie merkkijonon 646 00:28:11,577 --> 00:28:13,410 että ihmisen kirjoitetut in-- se nyt merkkijono, 647 00:28:13,410 --> 00:28:15,790 se ei ole numero, oletettavasti, jos hän cooperates-- 648 00:28:15,790 --> 00:28:19,310 ja se tulee yrittää laittaa että merkkijono muistiin tahansa osoitteeseen 649 00:28:19,310 --> 00:28:20,340 puskuri määrittelee. 650 00:28:20,340 --> 00:28:23,870 Ja tämä on suuri, koska puskuri on todellakin tarkoitus olla osoite. 651 00:28:23,870 --> 00:28:30,470 >> Mutta Väitän tämä ohjelma on buginen erittäin vakavasti, koska mitä arvoa on 652 00:28:30,470 --> 00:28:31,330 puskuri oletuksena? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Mitä olen alustetaan osaksi? 655 00:28:34,790 --> 00:28:35,770 Mikä kimpale muistia? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 En ole, eikö? 658 00:28:38,620 --> 00:28:42,265 >> Joten vaikka olen varattu nieriää tähti, joka ei ole enää nimeltään s, 659 00:28:42,265 --> 00:28:48,030 sitä vaan kutsutaan, buffer-- niin Katsotaanpa piirtää muuttujan nimi 660 00:28:48,030 --> 00:28:53,380 nyt buffer-- jos en ole kutsutaan getString tai malloc täällä, 661 00:28:53,380 --> 00:28:56,030 että käytännössä sitä, että puskuri on vain joitakin roskaa arvo. 662 00:28:56,030 --> 00:28:57,030 >> Nyt mitä se tarkoittaa? 663 00:28:57,030 --> 00:29:00,220 Se tarkoittaa, että olen kertonut scanf odottaa merkkijonon käyttäjältä. 664 00:29:00,220 --> 00:29:01,300 Ja tiedätkö mitä? 665 00:29:01,300 --> 00:29:03,883 Mitä tämä asia osoittaa to-- ja piirrän kysymysmerkki, 666 00:29:03,883 --> 00:29:07,060 mutta todellisuudessa se tulee olemaan jotain OX1, 2, 3, eikö? 667 00:29:07,060 --> 00:29:10,730 On joitakin vääriä arvo vain sattuu olemaan siellä ennen. 668 00:29:10,730 --> 00:29:13,440 Joten toisin sanoin, se on ikään kuin puskuri on vain 669 00:29:13,440 --> 00:29:16,180 osoittaa jotain muistiin. 670 00:29:16,180 --> 00:29:17,610 Minulla ei ole aavistustakaan mitä. 671 00:29:17,610 --> 00:29:24,130 >> Jos siis kirjoitat Gabe nyt, se tulee yrittää laittaa g-a-b-e / 0 siellä. 672 00:29:24,130 --> 00:29:25,530 Mutta kuka tietää, mitä se on? 673 00:29:25,530 --> 00:29:27,480 Ja aiemmin kaikki ajan olemme yrittäneet koskettaa 674 00:29:27,480 --> 00:29:29,770 muisti, joka ei kuulu meille, mitä on tapahtunut? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 Tai lähes joka kerta. 677 00:29:32,870 --> 00:29:34,310 Segmentointi vika, eikö? 678 00:29:34,310 --> 00:29:37,829 >> Tämä nuoli, minulla ei ole aavistustakaan, missä se on osoittaa. se on vain joku satunnainen arvo. 679 00:29:37,829 --> 00:29:40,370 Ja tietenkin, jos tulkitsemaan Satunnaisen arvon osoitteena, 680 00:29:40,370 --> 00:29:42,610 aiot mennä joitakin satunnaisia ​​määränpää. 681 00:29:42,610 --> 00:29:46,810 Joten Gabe voisi todellakin kaatua minun ohjelma tässä asiassa. 682 00:29:46,810 --> 00:29:50,600 >> Mitä voimme tehdä, että on melkein yhtä huono? 683 00:29:50,600 --> 00:29:52,660 Mieti tätä kolmannen ja lopullinen esimerkki scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Tämä versio on parempi missä mielessä? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Jos olet tyytyväinen edellinen ongelma, tämä on parempi. 688 00:30:01,400 --> 00:30:02,250 Miksi? 689 00:30:02,250 --> 00:30:03,250 >> Yleisö: [kuulumaton]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 DAVID J. MALAN: Hyvä. 692 00:30:07,110 --> 00:30:09,970 Joten tässä tapauksessa linjan 16 on parempi, siinä mielessä 693 00:30:09,970 --> 00:30:12,030 että olemme nimenomaisesti osoitetaan osa muistia. 694 00:30:12,030 --> 00:30:14,190 Emme käyttäen malloc, käytämme viikko 2 695 00:30:14,190 --> 00:30:16,060 lähestymistapa vain julistaa array. 696 00:30:16,060 --> 00:30:18,130 Ja olemme sanoneet aiemmin, että merkkijonon on vain joukko merkkejä, 697 00:30:18,130 --> 00:30:19,690 joten tämä on täysin laillista. 698 00:30:19,690 --> 00:30:22,910 Mutta se on, tietenkin, kuten huomaat, kiinteä koko, 16. 699 00:30:22,910 --> 00:30:25,440 >> Niin tämä ohjelma on täysin turvassa, jos en kirjoita 700 00:30:25,440 --> 00:30:29,760 yhdessä merkkijonojen, kaksi merkki jouset, 15 merkkijonojen. 701 00:30:29,760 --> 00:30:34,970 Mutta heti kun aloitan kirjoittamisen 16, 17, 18, 1000 merkkijonoja, 702 00:30:34,970 --> 00:30:37,390 Missä se merkkijono ehdi? 703 00:30:37,390 --> 00:30:39,570 Se tulee päätyä osittain tästä. 704 00:30:39,570 --> 00:30:42,820 Mutta kuka tietää mitä muuta on rajojen 705 00:30:42,820 --> 00:30:44,270 Tämän erityisen array? 706 00:30:44,270 --> 00:30:48,015 >> Se on ikään kuin olen julisti 16 laatikot täällä. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Joten sen sijaan vetää kaikki 16, me vain teeskennellä, että olen laatinut 16. 709 00:30:52,690 --> 00:30:56,540 Mutta jos en yritä lukea merkkijono joka on paljon pidempi, kuin 50 merkkiä, 710 00:30:56,540 --> 00:31:01,270 Aion aloittaa laskemisesta a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 Ja tämä on oletettavasti joitakin muita muistisegmentin 712 00:31:04,916 --> 00:31:06,790 että, uudelleen, saattaa aiheuttaa Oma ohjelma kaatuu, 713 00:31:06,790 --> 00:31:10,600 koska en ole pyytänyt jotain enemmän kuin vain 16 tavua. 714 00:31:10,600 --> 00:31:12,260 >> Joten who cares? 715 00:31:12,260 --> 00:31:13,880 No, tässä on CS50 kirjastoon. 716 00:31:13,880 --> 00:31:17,220 Ja suurin osa tästä on vain kuten ohjeita alkuun asti. 717 00:31:17,220 --> 00:31:21,670 CS50 kirjasto, koko tämän ajan, on ollut tämän linjan mukainen 52. 718 00:31:21,670 --> 00:31:23,680 Olemme nähneet typedef, tai näet typedef 719 00:31:23,680 --> 00:31:27,930 vuonna PSET 4, joka vain luo synonyymi jolloin nieriää tähti voi olla enemmän 720 00:31:27,930 --> 00:31:29,290 yksinkertaisesti kutsutaan merkkijono. 721 00:31:29,290 --> 00:31:31,540 Joten tämä on yksi Muutaman apupyörät 722 00:31:31,540 --> 00:31:34,120 olemme käyttäneet salaa alla huppu. 723 00:31:34,120 --> 00:31:36,490 >> Samalla tässä on toiminto, getchar. 724 00:31:36,490 --> 00:31:38,190 Nyt ilmeisesti ei ole ruumiin siihen. 725 00:31:38,190 --> 00:31:40,273 Ja itse asiassa, jos pidän vieritys, en oikeastaan 726 00:31:40,273 --> 00:31:42,080 Katso kaikki toteutukset näistä toiminnoista. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Koska järki tarkistaa, miksi? 729 00:31:45,516 --> 00:31:46,795 >> Yleisö: [kuulumaton]. 730 00:31:46,795 --> 00:31:47,670 DAVID J. MALAN: Joo. 731 00:31:47,670 --> 00:31:48,950 Joten tämä on header-tiedosto. 732 00:31:48,950 --> 00:31:52,520 Ja header-tiedostot sisältävät prototyyppejä, sekä joitakin muita juttuja, näyttää siltä, 733 00:31:52,520 --> 00:31:53,780 kuten typedefs. 734 00:31:53,780 --> 00:31:56,910 Mutta CS50.c, josta olemme koskaan antanut teille suoralta kädeltä, 735 00:31:56,910 --> 00:32:02,100 mutta on ollut CS50 laitteen kaikki tällä kertaa syvälle sen kansioita, 736 00:32:02,100 --> 00:32:04,990 huomaa, että siellä on koko Joukko toimintoja täällä. 737 00:32:04,990 --> 00:32:06,720 >> Itse asiassa, nyt selaa alaspäin. 738 00:32:06,720 --> 00:32:08,810 Katsotaanpa jättää useimmat niistä, nyt. 739 00:32:08,810 --> 00:32:12,670 Mutta selaa getInt ja miten getInt toimii. 740 00:32:12,670 --> 00:32:13,890 Joten tässä on getInt. 741 00:32:13,890 --> 00:32:17,727 Ja jos joskus todella välitti miten saada int toimii, tässä on sen dokumentointi. 742 00:32:17,727 --> 00:32:19,560 Ja joukossa asioita se sanoo on se kertoo sinulle 743 00:32:19,560 --> 00:32:21,340 mitä arvoalueita se voi palata. 744 00:32:21,340 --> 00:32:24,400 Se on pääosin kielteinen 2000000000 positiiviseen 2000000000, antaa tai ottaa. 745 00:32:24,400 --> 00:32:26,420 >> Ja se kääntyy pois, kaikki tämä aikaa, vaikka emme ole koskaan 746 00:32:26,420 --> 00:32:28,570 oli tarkistaa sitä, jos jokin menee pieleen, 747 00:32:28,570 --> 00:32:30,680 käy ilmi, että kaikki tällä kertaa, getInt on 748 00:32:30,680 --> 00:32:33,600 on palaamassa erityinen vakio, ei ole tyhjä, 749 00:32:33,600 --> 00:32:36,760 vaan INT_MAX, joka on vain ohjelmoijan sopimusta. 750 00:32:36,760 --> 00:32:38,846 Se tarkoittaa tässä erityinen arvo. 751 00:32:38,846 --> 00:32:41,470 Muista tarkistaa tämän, vain jos jotain menee pieleen. 752 00:32:41,470 --> 00:32:43,261 Mutta emme ole koskaan vaivautunut kanssa, että tähän mennessä 753 00:32:43,261 --> 00:32:45,200 koska jälleen, tämä on tarkoitus yksinkertaistaa. 754 00:32:45,200 --> 00:32:46,950 >> Mutta miten getInt saa toteuttaa? 755 00:32:46,950 --> 00:32:48,450 No, yksi, se ei ota argumentteja. 756 00:32:48,450 --> 00:32:49,390 Tiedämme, että. 757 00:32:49,390 --> 00:32:50,820 Se palauttaa int. 758 00:32:50,820 --> 00:32:51,950 Tiedämme, että. 759 00:32:51,950 --> 00:32:54,460 Joten miten se toimii alla huppu? 760 00:32:54,460 --> 00:32:58,290 >> Joten siellä on ilmeisesti ääretön silmukka, ainakin ulkonäkö yhden. 761 00:32:58,290 --> 00:33:00,290 Huomaa, että käytämme getString. 762 00:33:00,290 --> 00:33:04,000 Joten on mielenkiintoista. getInt kutsuu meidän oma funktionsa, getString. 763 00:33:04,000 --> 00:33:05,645 Ja nyt, mitä tämä voisi olla kyse? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Miksi minulle puolustava täällä line 165? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Mitä voisi tapahtua linjassa 164, vain olla selvä? 768 00:33:15,639 --> 00:33:16,930 Se on sama vastaus kuin ennen. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Voisi vain muisti. 771 00:33:20,089 --> 00:33:23,130 Jokin menee pieleen getString, meidän täytyy pystyä käsittelemään sitä. 772 00:33:23,130 --> 00:33:27,070 Ja syy en palaa null on että teknisesti, null on osoitin. 773 00:33:27,070 --> 00:33:29,120 getInt on palauttaa int. 774 00:33:29,120 --> 00:33:31,060 Joten olen mielivaltaisesti päätti, pääasiallisesti, 775 00:33:31,060 --> 00:33:34,600 että 2 miljardia, antaa tai ottaa, on menossa olla erityistä arvoa kuin voin koskaan 776 00:33:34,600 --> 00:33:35,970 itse saada käyttäjältä. 777 00:33:35,970 --> 00:33:39,930 Se on vain yksi arvo aion tuhlata edustamaan virhekoodi. 778 00:33:39,930 --> 00:33:41,540 >> Joten nyt, asiat saavat hieman fancy. 779 00:33:41,540 --> 00:33:44,670 Ja se ei ole aivan sama toiminto kuin ennen, mutta se on hyvin samanlainen. 780 00:33:44,670 --> 00:33:50,120 Niin huomaa, julistan täällä, vastaa 172, sekä int n ja char. 781 00:33:50,120 --> 00:33:53,600 Ja sitten käytän tätä funky linja, sscanf, jossa se kääntyy pois 782 00:33:53,600 --> 00:33:55,990 ei skannaa merkkijono näppäimistöltä. 783 00:33:55,990 --> 00:33:59,226 Se seisoo olemassa olevan merkkijonon käyttäjä on jo kirjoitettu. 784 00:33:59,226 --> 00:34:02,100 Niin Soitin jo getString, joka tarkoittaa, että minun on merkkijono muistiin. 785 00:34:02,100 --> 00:34:05,020 sscanf on mitä haluat soita jäsentämiseen toimintoa. 786 00:34:05,020 --> 00:34:07,760 Siinä tarkastellaan merkkijonon olen kirjoitettu merkki kerrallaan, 787 00:34:07,760 --> 00:34:09,250 ja tekee jotain hyödyllistä. 788 00:34:09,250 --> 00:34:10,969 Että merkkijono tallennetaan linjaa. 789 00:34:10,969 --> 00:34:13,560 Ja tiedän, että vain menemällä varmuuskopioida tänne ja sanoi, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Kutsuin sitä ei s tällä kertaa, mutta linja. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> Ja nyt tämä on hieman erilainen. 793 00:34:18,080 --> 00:34:22,480 Mutta tämä käytännössä tarkoittaa, syistä me hieman aalto meidän käsissä tänään, 794 00:34:22,480 --> 00:34:26,070 että me Tarkistamme onko käyttäjä kirjoitettu 795 00:34:26,070 --> 00:34:29,909 ja int ja ehkä toisen hahmon. 796 00:34:29,909 --> 00:34:33,610 Jos käyttäjä kirjoitetaan int, se on aiotaan varastoida n, koska olen 797 00:34:33,610 --> 00:34:36,739 läpäisee tämän osoitteen, uusi temppu olemme nähneet tänään. 798 00:34:36,739 --> 00:34:41,570 Jos käyttäjä on kirjoittanut samanlaisissa 123x, että x 799 00:34:41,570 --> 00:34:45,060 ei ehdi kirje luonteeltaan c. 800 00:34:45,060 --> 00:34:48,739 >> Nyt on käynyt ilmi, että sscanf kertoo minulle, älykkäästi, 801 00:34:48,739 --> 00:34:54,750 kuinka monia muuttujia on sscanf onnistuneesti pystynyt täyttämään. 802 00:34:54,750 --> 00:34:58,770 Joten tämän logiikan, jos toiminto Olen täytäntöönpanossa on getInt, 803 00:34:58,770 --> 00:35:00,900 mutta olen tarkkailun, mahdollisesti käyttäjälle 804 00:35:00,900 --> 00:35:04,190 olleen kirjoitettu int seuraa jotain muuta, 805 00:35:04,190 --> 00:35:08,580 mitä haluan sscanf n paluuarvo todella olla? 806 00:35:08,580 --> 00:35:10,950 Jos tarkoituksena on saada vain int käyttäjältä? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Joten jos sscanf palaa 2, mitä se tarkoittaa? 809 00:35:19,300 --> 00:35:21,660 Käyttäjä kirjoitetaan jotain, kirjaimellisesti, 810 00:35:21,660 --> 00:35:24,770 123x, joka on vain hölynpölyä. 811 00:35:24,770 --> 00:35:27,490 Se on virhetilanne, ja Haluan tarkistaa, että. 812 00:35:27,490 --> 00:35:32,960 >> Joten jos käyttäjä kirjoittaa tämän, jonka Tämän logiikan mukaan mitä sscanf palata, 813 00:35:32,960 --> 00:35:33,740 sanoisit? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Niin se tulee palauttaa 2, koska 123 ei mene täällä, 816 00:35:39,130 --> 00:35:41,580 ja x on menossa päätyä tänne. 817 00:35:41,580 --> 00:35:43,970 Mutta en halua x saada täytetty. 818 00:35:43,970 --> 00:35:48,580 Haluan sscanf vain menestyä täyttämällä ensimmäinen muuttujia. 819 00:35:48,580 --> 00:35:52,490 Ja niin siksi olen haluavat sscanf palata 1. 820 00:35:52,490 --> 00:35:55,750 >> Ja jos tämä on vähän yli pään tällä hetkellä, joka on täysin kunnossa. 821 00:35:55,750 --> 00:36:00,030 Ymmärtää kuitenkin, että yksi arvot getInt ja getString 822 00:36:00,030 --> 00:36:03,630 on, että me teemme pahus Paljon virheentarkistusta näin niin 823 00:36:03,630 --> 00:36:07,130 että tähän mennessä, voit melko paljon kirjoita mitään näppäimistön, 824 00:36:07,130 --> 00:36:08,490 ja me sen kiinni. 825 00:36:08,490 --> 00:36:10,592 Ja me varmasti, henkilöstö, ei varmasti 826 00:36:10,592 --> 00:36:13,300 olla lähde vika omassa ohjelma, koska olemme puolustauduttava 827 00:36:13,300 --> 00:36:16,270 tarkistaa kaikki tyhmä asioita, joita käyttäjä voisi tehdä, 828 00:36:16,270 --> 00:36:18,900 kuten kirjoittamalla merkkijonon, kun todella halusi int. 829 00:36:18,900 --> 00:36:21,350 Joten now-- tulemme takaisin tähän ennen long-- 830 00:36:21,350 --> 00:36:23,710 mutta kaikki tällä kertaa, getString ja getInt on 831 00:36:23,710 --> 00:36:29,950 ollut alla huppu käyttämisen perusajatus osoitteet muistia. 832 00:36:29,950 --> 00:36:32,580 >> Joten nyt, tehkäämme asiat hieman enemmän käyttäjäystävällinen. 833 00:36:32,580 --> 00:36:38,740 Kuten ehkä muistatte, alkaen Binky viimeksi time-- jos hiiri cooperate-- niin 834 00:36:38,740 --> 00:36:42,560 meillä oli tämä koodi, joka rehellisesti, on melko järjetöntä. 835 00:36:42,560 --> 00:36:45,330 Tämä koodi saa aikaan mitään hyödyllistä, mutta se oli esimerkki 836 00:36:45,330 --> 00:36:48,330 että professori Parlante käytetään edustamaan 837 00:36:48,330 --> 00:36:51,840 mitä oli tekeillä ohjelma, johon muisti. 838 00:36:51,840 --> 00:36:54,850 >> Joten mukailevat tätä tarina Super lyhyesti. 839 00:36:54,850 --> 00:36:58,720 Nämä kaksi ensimmäistä riviä, vuonna Englanti, ei mitä, sanoisit? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 Vain kohtuullisesti ihmisen, mutta hieman teknisiä termejä, ottaa puukottaa. 842 00:37:05,430 --> 00:37:06,346 Yleisö: [kuulumaton]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> DAVID J. MALAN: OK, olet perustamisesta osoitteet oman x ja y muuttujia. 845 00:37:11,080 --> 00:37:15,520 Ei aivan, koska x ja y eivät ole muuttujat perinteisessä mielessä. 846 00:37:15,520 --> 00:37:18,054 x ja y ovat osoitteita tai tallentaa osoitteen. 847 00:37:18,054 --> 00:37:19,220 Joten kokeile tätä vielä kerran. 848 00:37:19,220 --> 00:37:21,010 Ei huono alku, vaikka. 849 00:37:21,010 --> 00:37:21,510 Joo? 850 00:37:21,510 --> 00:37:22,426 >> Yleisö: [kuulumaton]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 DAVID J. MALAN: Hyvä. 853 00:37:24,840 --> 00:37:26,173 Mielestäni on hieman puhtaampi. 854 00:37:26,173 --> 00:37:28,630 Julistaa kaksi osoitinta, kahden kokonaisluvun. 855 00:37:28,630 --> 00:37:30,150 Ja me kutsuen heitä x ja y. 856 00:37:30,150 --> 00:37:32,790 Tai jos me tehdä tämä kuva taas 857 00:37:32,790 --> 00:37:36,410 muistuttaa yksinkertaisesti, että kaikki teemme on, että ensimmäinen rivi 858 00:37:36,410 --> 00:37:39,690 vetää laatikon näin, joitakin roskat arvoa siinä, 859 00:37:39,690 --> 00:37:41,920 ja kutsuen sitä X ja sitten toiseen ruutuun näin, 860 00:37:41,920 --> 00:37:43,880 joitakin roskat arvo siinä, kutsuen sitä y. 861 00:37:43,880 --> 00:37:45,810 Olemme julisti kaksi viitteitä, että viime kädessä 862 00:37:45,810 --> 00:37:47,860 tallentaa osoitteen int. 863 00:37:47,860 --> 00:37:49,170 Niin että kaikki on. 864 00:37:49,170 --> 00:37:53,290 >> Joten kun Binky teki tämän, savi aivan näytti tältä. 865 00:37:53,290 --> 00:37:55,350 Ja Nick vain eräänlainen kääritty ylös nuolia, 866 00:37:55,350 --> 00:37:57,590 ikään kuin he ei osoita minnekään erityisesti, koska ne ovat vain 867 00:37:57,590 --> 00:37:58,250 roskat arvot. 868 00:37:58,250 --> 00:38:01,670 He eivät nimenomaisesti alustettu missään erityisesti. 869 00:38:01,670 --> 00:38:03,980 >> Nyt seuraava rivi koodia, muistaa, oli tämä. 870 00:38:03,980 --> 00:38:07,510 Joten kohtuullisen käyttäjäystävällisiä, mutta jonkin verran teknistä Englanti, 871 00:38:07,510 --> 00:38:09,790 mikä on tämä rivi koodia teet? 872 00:38:09,790 --> 00:38:10,391 Joo? 873 00:38:10,391 --> 00:38:11,333 >> Yleisö: [kuulumaton]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> DAVID J. MALAN: Perfect. 876 00:38:13,950 --> 00:38:17,016 Se kohdentaa kimpale muisti, joka on koko int. 877 00:38:17,016 --> 00:38:18,140 Ja se puoli vastausta. 878 00:38:18,140 --> 00:38:20,056 Vastasit oikeus puolet ilme. 879 00:38:20,056 --> 00:38:22,473 Mitä tapahtuu vasemmalla puolella yhtäläisyysmerkki? 880 00:38:22,473 --> 00:38:22,972 Joo? 881 00:38:22,972 --> 00:38:24,814 Yleisö: ja osoittaa se muuttuja x? 882 00:38:24,814 --> 00:38:27,690 >> DAVID J. MALAN: ja määrittää se muuttuja x. 883 00:38:27,690 --> 00:38:31,650 Joten kertaus, oikea puoli allokoi tarpeeksi muisti tallentaa int. 884 00:38:31,650 --> 00:38:34,150 Mutta malloc nimenomaan palauttaa osoitteen 885 00:38:34,150 --> 00:38:37,270 Kyseisen kimpale muistia, jota olet juuri ehdottanut saa varastoida x. 886 00:38:37,270 --> 00:38:42,560 >> Joten mitä Nick teki viimeisen kerran Binky on Hän raahasi että osoitin ulos, savi, 887 00:38:42,560 --> 00:38:46,820 huomauttaa nyt valkoinen kimpale muistia , joka on yhtä suuri kuin koko int. 888 00:38:46,820 --> 00:38:49,360 Ja todellakin, että on tarkoituskin edustaa neljä tavua. 889 00:38:49,360 --> 00:38:55,310 >> Nyt seuraava rivi koodia teki tämän, tähti x saa 42. 890 00:38:55,310 --> 00:38:58,530 Joten 42 on suoraviivainen päälle oikea puoli, elämän tarkoitusta. 891 00:38:58,530 --> 00:39:00,500 Vasen puoli, tähti x tarkoittaa mitä? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Sekin voi olla gone-- se on OK. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Yleisö: Periaatteessa, Siirry [kuultavissa] 896 00:39:06,875 --> 00:39:07,750 DAVID J. MALAN: Hyvä. 897 00:39:07,750 --> 00:39:08,760 Yleisö: [kuulumaton]. 898 00:39:08,760 --> 00:39:09,760 DAVID J. MALAN: Aivan. 899 00:39:09,760 --> 00:39:11,979 Vasemmanpuoleista tarkoittaa mennä x. 900 00:39:11,979 --> 00:39:12,520 x on osoite. 901 00:39:12,520 --> 00:39:15,520 Se on kuin 33 Oxford Street, tai OX1. 902 00:39:15,520 --> 00:39:18,690 Ja tähti x tarkoittaa mene, että käsitellä ja laittaa mitä siellä? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Niin tosiaan, se on juuri sitä mitä Nick teki. 905 00:39:21,290 --> 00:39:23,740 Hän aloitti mukaan, olennaisesti, henkisesti 906 00:39:23,740 --> 00:39:26,270 osoittaa sormella x, nuolen 907 00:39:26,270 --> 00:39:30,670 valkoiseen ruutuun oikealla puolella, ja laittoi numero 42 siellä. 908 00:39:30,670 --> 00:39:34,120 Mutta sitten asiat menivät vähän vaarallista, eikö? 909 00:39:34,120 --> 00:39:35,860 Binky n noin menettää päänsä. 910 00:39:35,860 --> 00:39:39,465 >> Star y on yhtä kuin 13, huonoa onnea, tarkoittaa mitä? 911 00:39:39,465 --> 00:39:43,620 Joten tähti y keino mennä osoitteeseen y. 912 00:39:43,620 --> 00:39:45,630 Mutta mikä on osoite y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Okei, se on roskaa arvo, eikö? 915 00:39:49,440 --> 00:39:50,800 Piirsin sen kysymysmerkki. 916 00:39:50,800 --> 00:39:54,850 Nick veti sen käpertyneenä nuoli. 917 00:39:54,850 --> 00:39:59,600 Ja heti kun yrität do tähti y sanoen sinne, 918 00:39:59,600 --> 00:40:03,872 mutta ei ole oikeutettua osoite, se on jokin väärä sijainti, 919 00:40:03,872 --> 00:40:05,080 Ohjelman tulee kaatumaan. 920 00:40:05,080 --> 00:40:08,580 Ja Binky pää on menossa lentää pois täältä, kuten se teki. 921 00:40:08,580 --> 00:40:12,130 >> Joten lopulta, tämä ohjelma oli vain täysillä virhe. 922 00:40:12,130 --> 00:40:13,540 Se oli buginen ohjelma. 923 00:40:13,540 --> 00:40:14,760 Ja se jouduttiin tekemään. 924 00:40:14,760 --> 00:40:18,260 Ja ainoa tapa, todella, se korjataan Olisi esimerkiksi tätä linjaa, 925 00:40:18,260 --> 00:40:21,010 jota emme edes päästä, koska ohjelma kaatui liian aikaisin. 926 00:40:21,010 --> 00:40:26,170 Mutta jos me korjata, mitä vaikutus ei tee y equal x on? 927 00:40:26,170 --> 00:40:30,010 No, se lähinnä muistuttaa y at arvosta riippumatta x on suunnattu. 928 00:40:30,010 --> 00:40:32,430 >> Joten Nickin tarina, tai Binky tarina, molemmat 929 00:40:32,430 --> 00:40:34,640 x ja y ovat osoittaen valkoinen kimpale muistia, 930 00:40:34,640 --> 00:40:38,300 niin, että lopulta, kun älä tähti y vastaa 13 uudelleen, 931 00:40:38,300 --> 00:40:43,080 päädyt laskemisesta 13 sopivaan paikkaan. 932 00:40:43,080 --> 00:40:47,640 Joten kaikki nämä linjat ovat täysin oikeutettua, paitsi tämä yksi, 933 00:40:47,640 --> 00:40:51,730 kun se tapahtui, ennen kuin tosiasiallisesti myönnetty y jotain arvoa. 934 00:40:51,730 --> 00:40:54,290 >> Nyt onneksi et täytyy järkeillä läpi kaikki 935 00:40:54,290 --> 00:40:56,560 Tällaisten kysymysten itse. 936 00:40:56,560 --> 00:40:59,310 Anna minun mennä eteenpäin ja avata ylös pääteikkunassa täällä 937 00:40:59,310 --> 00:41:03,050 ja avata, vain hetken, Super lyhyt ohjelma, joka 938 00:41:03,050 --> 00:41:04,360 Lisäksi on tavallaan turhaa. 939 00:41:04,360 --> 00:41:05,152 Se on ruma. 940 00:41:05,152 --> 00:41:06,610 Se ei saavuteta mitään hyötyä. 941 00:41:06,610 --> 00:41:10,180 Mutta se osoittaa kysymyksiä muistia, joten katsotaanpa katsomaan. 942 00:41:10,180 --> 00:41:11,830 >> Main, super yksinkertainen. 943 00:41:11,830 --> 00:41:14,830 Se ilmeisesti kutsuu funktiota, f, ja palaa sitten 0. 944 00:41:14,830 --> 00:41:16,310 Se on tavallaan vaikea sotkea tähän asti. 945 00:41:16,310 --> 00:41:18,540 Joten Main on melko hyvä, toistaiseksi. 946 00:41:18,540 --> 00:41:20,100 >> Joten f on ongelmallista. 947 00:41:20,100 --> 00:41:22,120 Ja vain ei laita paljon vaivaa sen nimestä 948 00:41:22,120 --> 00:41:23,990 täällä, pitää keskittyä koodin. 949 00:41:23,990 --> 00:41:25,740 f on kaksi riviä. 950 00:41:25,740 --> 00:41:27,610 Ja katsotaanpa mitä nyt tapahtuu. 951 00:41:27,610 --> 00:41:29,840 Niin toisaalta here-- ja haluan tehdä 952 00:41:29,840 --> 00:41:32,680 Tämän yhdenmukainen aiempien example-- toisaalta, 953 00:41:32,680 --> 00:41:35,830 vasen puoli on tekee mitä, vuonna Englanti? 954 00:41:35,830 --> 00:41:36,493 Se on-- 955 00:41:36,493 --> 00:41:37,701 Yleisö: Creating osoitin. 956 00:41:37,701 --> 00:41:40,830 DAVID J. MALAN: Creating osoitin int ja sen hakeminen x. 957 00:41:40,830 --> 00:41:43,789 Joten se on luoda yksi niistä laatikot En pidä piirustus kosketusnäytöllä. 958 00:41:43,789 --> 00:41:45,913 Ja nyt on oikea puolella, malloc, tietenkin, 959 00:41:45,913 --> 00:41:47,420 ei myönnä kimpale muistia. 960 00:41:47,420 --> 00:41:49,989 Ja vain olla selkeä, miten paljon muistia on se ilmeisesti 961 00:41:49,989 --> 00:41:52,030 myöntämistä, jos vain tavallaan tehdä matematiikka täällä? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Joten se on 40 tavua. 964 00:41:54,040 --> 00:41:57,400 Ja tiedän, että vain koska tiedän int, on CS50 laite, ainakin, 965 00:41:57,400 --> 00:41:58,060 on neljä tavua. 966 00:41:58,060 --> 00:41:59,610 Joten 10 kertaa 4 on 40. 967 00:41:59,610 --> 00:42:04,924 Joten tämä on tallentamisen x, osoite Ensimmäisen ulos 40 ints että 968 00:42:04,924 --> 00:42:07,340 on varattu tilaa takaisin, takaisin, takaisin, takaisin. 969 00:42:07,340 --> 00:42:08,470 >> Ja sitähän on avain noin malloc. 970 00:42:08,470 --> 00:42:11,261 Se ei vie vähän muistia täällä, vähän siellä, vähän täällä. 971 00:42:11,261 --> 00:42:14,220 Se antaa sinulle yksi kimpale muistia, vierekkäin, alkaen toiminta 972 00:42:14,220 --> 00:42:15,240 järjestelmä. 973 00:42:15,240 --> 00:42:18,500 >> Nyt mitä tästä, x kiinnike 10 on yhtä kuin 0? 974 00:42:18,500 --> 00:42:19,470 Mielivaltainen riviä koodia. 975 00:42:19,470 --> 00:42:21,100 Se ei saavuteta mitään hyötyä. 976 00:42:21,100 --> 00:42:26,128 Mutta on mielenkiintoista, koska x kiinnike 10--? 977 00:42:26,128 --> 00:42:26,628 Joo? 978 00:42:26,628 --> 00:42:27,912 >> Yleisö: [kuulumaton]? 979 00:42:27,912 --> 00:42:30,500 >> DAVID J. MALAN: x kiinnike 10 ei tarvitse olla tyhjä. 980 00:42:30,500 --> 00:42:35,070 Null yksityiskohtaisesti vasta tulee pelata jousten, lopussa merkkijonon. 981 00:42:35,070 --> 00:42:36,700 Mutta hyvä ajatus. 982 00:42:36,700 --> 00:42:39,615 >> Kuinka suuri tämä joukko, jopa vaikka olen varattu 40 tavua? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Se on 0 yhdeksään, eikö? 985 00:42:43,690 --> 00:42:45,120 Se on 10 ints yhteensä. 986 00:42:45,120 --> 00:42:48,790 40 tavua, mutta 10 ints, indeksoitu 0 kautta 0. 987 00:42:48,790 --> 00:42:50,930 >> Mikä siis on, että x kiinnike 10? 988 00:42:50,930 --> 00:42:53,090 Se on todella jokin tuntematon roskat arvo. 989 00:42:53,090 --> 00:42:54,780 Se on muisti, joka ei kuulu minulle. 990 00:42:54,780 --> 00:42:59,650 Minun ei pitäisi olla koskematta, että tavu numero 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Aion hieman liian pitkälle. 992 00:43:01,420 --> 00:43:04,490 >> Ja todellakin, jos juoksen tämän ohjelma, se saattaa hyvinkin kaatua. 993 00:43:04,490 --> 00:43:05,790 Mutta joskus, me onnistaa. 994 00:43:05,790 --> 00:43:07,706 Ja niin vain osoittamaan this-- ja rehellisesti, 995 00:43:07,706 --> 00:43:11,000 eihän sitä koskaan tiedä ennen kuin älä se-- juostaan ​​tätä. 996 00:43:11,000 --> 00:43:12,480 Se ei oikeastaan ​​kaatua. 997 00:43:12,480 --> 00:43:15,032 >> Mutta jos muutan tätä varten Esimerkiksi olla kuin 1000, 998 00:43:15,032 --> 00:43:16,740 jotta tämä todella tahallinen, katsotaanpa 999 00:43:16,740 --> 00:43:18,710 jos saamme sen kaatuvan tällä kertaa. 1000 00:43:18,710 --> 00:43:20,070 OK, se ei kaadu. 1001 00:43:20,070 --> 00:43:22,600 Entä 100000? 1002 00:43:22,600 --> 00:43:25,000 Katsotaan sen uudestaan, ja nyt uusintana se. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Huh huh. 1005 00:43:25,960 --> 00:43:26,460 Kunnossa. 1006 00:43:26,460 --> 00:43:29,090 Joten ilmeisesti nämäkään segmentit muistia, niin sanoakseni, 1007 00:43:29,090 --> 00:43:32,660 ovat kohtuullisen suuria, joten voimme onnekas uudestaan ​​ja uudestaan. 1008 00:43:32,660 --> 00:43:36,510 Mutta lopulta, kun saat naurettava ja todella mennä pitkälle ruudulla, 1009 00:43:36,510 --> 00:43:39,120 kosketat muistin että todella, ei todellakaan kuulu sinulle. 1010 00:43:39,120 --> 00:43:40,870 >> Mutta suoraan sanottuna, nämä Erilaisia ​​vikoja ovat menossa 1011 00:43:40,870 --> 00:43:43,020 olla vaikeampaa selvittää itse. 1012 00:43:43,020 --> 00:43:47,880 Mutta onneksi, kuten ohjelmoijat, olemme työkaluja, joiden avulla voimme tehdä tämän meille. 1013 00:43:47,880 --> 00:43:50,140 Joten tämä on ehkä yksi rumin ohjelmia, 1014 00:43:50,140 --> 00:43:52,060 jopa rumempi kuin gdb tuotannosta. 1015 00:43:52,060 --> 00:43:55,670 Mutta se on aina rivin tai kaksi, jotka ovat erittäin hyödyllisiä. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind on ohjelma, joka auttaa Ettekö debug ohjelman, sinänsä, 1017 00:44:00,310 --> 00:44:03,500 mutta löytää muistiin liittyviä ongelmia, erityisesti. 1018 00:44:03,500 --> 00:44:07,590 Se automaattisesti ajaa koodi te ja etsiä ainakin kaksi asiaa. 1019 00:44:07,590 --> 00:44:10,680 Yksi, teit jotain vahingossa tuntu muisti 1020 00:44:10,680 --> 00:44:11,980 jotka eivät kuulu sinulle? 1021 00:44:11,980 --> 00:44:13,590 Se auttaa sinua löytämään ne tapaukset. 1022 00:44:13,590 --> 00:44:15,710 >> Ja kaksi, se auttaa löydät jotain kutsutaan 1023 00:44:15,710 --> 00:44:19,270 muisti vuotaa, mikä meillä on täysin huomiotta, naiivisti, 1024 00:44:19,270 --> 00:44:21,380 jonkin aikaa ja autuaana. 1025 00:44:21,380 --> 00:44:23,140 Mutta näyttää siltä, ​​kaikki tällä kertaa, kun 1026 00:44:23,140 --> 00:44:26,620 olet kutsuttu getString vuonna niin monet ohjelmat, 1027 00:44:26,620 --> 00:44:28,930 pyydät toiminta järjestelmä muisti, 1028 00:44:28,930 --> 00:44:32,070 mutta teillä muistikuvaa koskaan antaa sille 1029 00:44:32,070 --> 00:44:36,169 takaisin, tekee Kohdenta-, tai vapaa, kuten sitä kutsutaan. 1030 00:44:36,169 --> 00:44:37,960 Ei, koska emme ole koskaan pyytänyt sinua tekemään niin. 1031 00:44:37,960 --> 00:44:41,250 >> Mutta kaikki tällä kertaa, ohjelmat olet kirjoittanut C 1032 00:44:41,250 --> 00:44:43,800 on vuotaa muistiin, kysyy toiminta 1033 00:44:43,800 --> 00:44:46,190 järjestelmää enemmän ja enemmän muisti jousille ja vaikka mitä, 1034 00:44:46,190 --> 00:44:47,870 mutta ei koskaan sen palauttamista. 1035 00:44:47,870 --> 00:44:50,080 Ja nyt tämä on vähän ja yksinkertaistamista, 1036 00:44:50,080 --> 00:44:53,550 mutta jos olet joskus ajaa Macissa tai tietokoneesi jo jonkin aikaa, aukko 1037 00:44:53,550 --> 00:44:55,790 paljon ohjelmia, ehkä sulkematta ohjelmia, 1038 00:44:55,790 --> 00:44:57,795 ja vaikka sinun tietokone ei ole kaatunut, 1039 00:44:57,795 --> 00:45:01,690 se on jo niin paljon hitaampaa, kuin se olisi todella 1040 00:45:01,690 --> 00:45:04,290 käytetään paljon muistia tai resursseja, vaikka 1041 00:45:04,290 --> 00:45:06,070 jos et ole edes koskemasta näppäimistöön, 1042 00:45:06,070 --> 00:45:10,430 joka voisi olet-- mutta ei always-- voisi olla, että ohjelmat käytät 1043 00:45:10,430 --> 00:45:11,920 ovat itse muisti vuotaa. 1044 00:45:11,920 --> 00:45:15,645 Ja ne pitää pyytää OS enemmän ja enemmän muistia, mutta unohtaa sen, 1045 00:45:15,645 --> 00:45:18,470 ei todellisuudessa käyttävät sitä, mutta siis kun muisti pois 1046 00:45:18,470 --> 00:45:20,500 muista ohjelmista, jotka saattavat haluta sitä. 1047 00:45:20,500 --> 00:45:23,940 Niin, että yhteinen selitys. 1048 00:45:23,940 --> 00:45:25,940 Nyt täällä on, jos Valgrind n tuotos on täysin 1049 00:45:25,940 --> 00:45:29,290 hirvittävät niitä vähemmän ja mukavampaa samankaltaisia. 1050 00:45:29,290 --> 00:45:32,690 Mutta mielenkiintoinen tavaraa on aina täällä. 1051 00:45:32,690 --> 00:45:37,060 Se kertoo minulle kelpaa kirjoitus koko neljän tapahtuu tässä ohjelmassa, 1052 00:45:37,060 --> 00:45:40,640 erityisesti, riviltä 21 memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Jos menen linja 21, hm, siellä todellakin on virheellinen kirjoittaa koosta neljä. 1054 00:45:45,450 --> 00:45:46,250 Miksi koko neljä? 1055 00:45:46,250 --> 00:45:49,500 No, tämä number-- ja se voisi olla mitään-- on int. 1056 00:45:49,500 --> 00:45:50,450 Joten se on neljä tavua. 1057 00:45:50,450 --> 00:45:52,550 Joten Laitan neljä tavua jos ne eivät kuulu. 1058 00:45:52,550 --> 00:45:55,080 Sitähän Valgrind on todella kertoo minulle. 1059 00:45:55,080 --> 00:45:57,600 Lisäksi se myös Kerro minulle, kuten tulemme näkemään, 1060 00:45:57,600 --> 00:46:01,490 kun ajaa tätä tulevaisuudessa PSET, jos ja kun olet vuotanut muistia, joka todellakin 1061 00:46:01,490 --> 00:46:05,300 Minulla on, koska olen kutsuttu malloc, mutta en ole oikeastaan 1062 00:46:05,300 --> 00:46:08,010 kutsutaan tässä tapauksessa, ilmainen, jonka me lopulta nähdä 1063 00:46:08,010 --> 00:46:09,830 on vastakohta malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Joten nyt, luulen, viimeisenä esimerkkinä. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Joten tämä on hieman mystistä, mutta se on ehkä 1068 00:46:16,690 --> 00:46:19,180 Suurin syy olla varovainen muistilla, 1069 00:46:19,180 --> 00:46:24,490 ja syy, että monet ohjelmat ja / tai web-palvelimia, vielä tänäkin päivänä, 1070 00:46:24,490 --> 00:46:28,200 haltuunsa pahiksia jonnekin Internetissä, jotka ovat jotenkin 1071 00:46:28,200 --> 00:46:33,390 lähettämällä vääriä paketteja palvelimelle yrittää murtautua tilejä, 1072 00:46:33,390 --> 00:46:36,420 tai ottaa tietosi, tai vain yleensä ottaa koneeseen. 1073 00:46:36,420 --> 00:46:38,910 Puskurin ylivuoto, kuten Nimensä välineet 1074 00:46:38,910 --> 00:46:40,740 täynnä ei int, mutta puskuri. 1075 00:46:40,740 --> 00:46:43,490 Ja puskuri on vain hieno tapa sanoa se nippu muistia. 1076 00:46:43,490 --> 00:46:46,710 >> Ja todellakin, kutsuin merkkijono Ennen puskuria, sen sijaan, että s. 1077 00:46:46,710 --> 00:46:49,234 Koska jos se puskuri, kuten YouTube mielessä, 1078 00:46:49,234 --> 00:46:52,400 tai milloin olet katsomassa video, Olet ehkä nähnyt sanan puskurointi, 1079 00:46:52,400 --> 00:46:53,040 piste, piste, piste. 1080 00:46:53,040 --> 00:46:54,240 Se on uskomattoman ärsyttävää. 1081 00:46:54,240 --> 00:46:55,990 Ja että juuri tarkoittaa että videon tekijä 1082 00:46:55,990 --> 00:46:58,710 yrittää ladata paljon tavua, paljon tavuja 1083 00:46:58,710 --> 00:47:00,170 alkaen videoita internetistä. 1084 00:47:00,170 --> 00:47:02,920 Mutta se on hidasta, joten se yrittää ladata nippu niitä 1085 00:47:02,920 --> 00:47:06,430 täyttää puskurin, kontti, niin että sinulla on tarpeeksi tavua, että se voi sitten 1086 00:47:06,430 --> 00:47:09,174 näyttää videon, pysähtymättä jatkuvasti. 1087 00:47:09,174 --> 00:47:11,340 Mutta näyttää siltä, ​​voit on puskuri tähän iso. 1088 00:47:11,340 --> 00:47:15,710 Mutta yritä laittaa näin paljon tietoa se, ja erittäin huonoja asioita voi tapahtua. 1089 00:47:15,710 --> 00:47:22,780 Joten esimerkiksi Katsotaanpa tämä viimeinen teaser esimerkki. 1090 00:47:22,780 --> 00:47:24,720 Tämä on toinen ohjelma että, ensi silmäyksellä, 1091 00:47:24,720 --> 00:47:26,540 ei tee mitään super hyödyllinen. 1092 00:47:26,540 --> 00:47:29,590 Se sai Päätoiminto joka vaatii, että funktio f. 1093 00:47:29,590 --> 00:47:36,640 Ja että funktio f, täällä, on char array, nimeltään C, koosta 12. 1094 00:47:36,640 --> 00:47:39,340 Ja sitten se käyttää tätä uusi toiminto nimeltään strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> On käynyt ilmi, että tämä yksinkertainen, yksinkertainen rivi koodia, vain kaksi riviä, 1097 00:47:45,190 --> 00:47:49,130 olemme tehneet minun koko ohjelman, ja siksi minun koko tietokone, 1098 00:47:49,130 --> 00:47:54,000 ja minun käyttäjätilin, ja minun kova ajaa alttiin kenellekään 1099 00:47:54,000 --> 00:47:58,170 kuka tietää ja on tarpeeksi hyvä ajaa Tämän ohjelman tietty komentoriviltä 1100 00:47:58,170 --> 00:47:58,900 argumentti. 1101 00:47:58,900 --> 00:48:03,400 Toisin sanoen, jos tämä paha laittaa sisälle argvargv [1] kirjoittamalla 1102 00:48:03,400 --> 00:48:08,750 näppäimistöllä hyvin erityisesti muodostetun merkkijono, ei abc, 123, mutta pohjimmiltaan, 1103 00:48:08,750 --> 00:48:15,180 binäärisymbolien jotka edustavat suoritettavia koodia, ohjelma, että hän kirjoitti, 1104 00:48:15,180 --> 00:48:19,190 tämä yksinkertainen ohjelma, joka on edustaja tuhansia ohjelmien 1105 00:48:19,190 --> 00:48:23,610 jotka ovat yhtä haavoittuvia, daresay, hän voi lopulta poistaa kaikki 1106 00:48:23,610 --> 00:48:26,680 tiedostot kiintolevyllä, saat vilkkuu ajallaan niin että hän voi 1107 00:48:26,680 --> 00:48:30,170 komentojen omasta, lähetä kaikki tiedostot itselleni. 1108 00:48:30,170 --> 00:48:34,660 Mitään, että voin tehdä, hän tai hän voi tehdä tällä koodilla. 1109 00:48:34,660 --> 00:48:36,575 >> Emme aivan ratkaise tätä vielä. 1110 00:48:36,575 --> 00:48:38,700 Ja itse asiassa, se tulee liittyy pieni kuva 1111 00:48:38,700 --> 00:48:41,470 kuten tämä, jota me pian ymmärtää kaikki paremmin. 1112 00:48:41,470 --> 00:48:44,480 Mutta tänään, katsotaanpa päättyy mikä toivottavasti hieman enemmän 1113 00:48:44,480 --> 00:48:48,360 ymmärrettävää XKCD vitsi, kunnes jatkamme ensi kerralla. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Kunnossa. 1116 00:48:51,600 --> 00:48:53,446 Nähdään keskiviikkona. 1117 00:48:53,446 --> 00:48:54,754 >> [Musiikki soi] 1118 00:48:54,754 --> 00:48:57,790 >> Puhuja: Ja nyt, syvä ajatuksia, joita Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Muisti on kuin hyppäämällä kasa kultainen lehdet sunnuntaina iltapäivällä. 1121 00:49:04,770 --> 00:49:09,000 Tuuli puhaltaa, tossing hair-- oi, kaipaan päivän when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Naurua] 1124 00:49:12,650 --> 00:49:13,750