1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:11,261 [Musika nagpe-play] 3 00:00:11,261 --> 00:00:12,640 >> David J. MALAN: Lahat ng karapatan. 4 00:00:12,640 --> 00:00:14,525 Ito ay CS50. 5 00:00:14,525 --> 00:00:16,009 At ito ang simula ng linggo 5. 6 00:00:16,009 --> 00:00:18,050 At bilang maaari mong napansin, ang ilan sa mga materyal na 7 00:00:18,050 --> 00:00:21,050 ay hindi nakakakuha ng kaunti pa complex, ang maliit na mas siksik. 8 00:00:21,050 --> 00:00:24,560 >> At ito ay napakadali, lalo na kung ka pa sa ugali para sa ilang oras, 9 00:00:24,560 --> 00:00:28,600 na sinusubukan mong i-scribble down na pinaka kahit ano ang ginagawa namin, kami ay nagsasabi sa klase. 10 00:00:28,600 --> 00:00:31,626 Ngunit Napagtanto, iyon ay hindi marahil ang perpektong pedagogical diskarte 11 00:00:31,626 --> 00:00:34,250 sa pag-aaral ng ganitong uri ng materyal, at materyal sa mas pangkalahatang paraan. 12 00:00:34,250 --> 00:00:37,250 At kaya kami ay nalulugod sa ipahayag sariling Gheng na CS50 ni 13 00:00:37,250 --> 00:00:39,780 Gong nagsimula ay upang maghanda isang canonical na hanay ng mga tala 14 00:00:39,780 --> 00:00:42,100 para sa mga kurso, ang pag-asa ng na iyon, isa, ang mga 15 00:00:42,100 --> 00:00:44,030 magsilbi hindi lamang bilang isang sanggunian at mapagkukunan 16 00:00:44,030 --> 00:00:47,410 para sa pagsusuri ng materyal at pagpunta pabalik sa pamamagitan ng materyal na maaaring mayroon 17 00:00:47,410 --> 00:00:51,230 escaped mo sa unang pagkakataon sa paligid, ngunit rin upang ang iyong ulo ay maaaring maging mas 18 00:00:51,230 --> 00:00:53,740 hanggang sa pababa, kapag ito ay oras upang panayam, 19 00:00:53,740 --> 00:00:56,960 nang sa gayon ay maaari kang tumuon higit pa thoughtfully, bilang 20 00:00:56,960 --> 00:00:59,170 sumasalungat sa higit pang scribbly. 21 00:00:59,170 --> 00:01:02,510 >> Sa sinabi na iyon, kung anong makikita mo sa ang website ay tulad ng mga dokumento bilang na ito. 22 00:01:02,510 --> 00:01:04,660 At paunawa, sa kaliwang tuktok, mayroong hindi lamang ng isang talaan ng nilalaman, 23 00:01:04,660 --> 00:01:06,920 kundi pati na rin ng panahon mga code na Agad tumalon sa iyo 24 00:01:06,920 --> 00:01:09,077 sa naaangkop na bahagi sa video online. 25 00:01:09,077 --> 00:01:11,410 At kung ano Chang dito ay tapos na ay, mahalagang, dokumentado 26 00:01:11,410 --> 00:01:13,340 kung ano ang nangyari sa partikular na lecture. 27 00:01:13,340 --> 00:01:16,370 At marami sa mga aralin ay nasa online na ngayon sa URL na ito. 28 00:01:16,370 --> 00:01:20,110 At patuloy kaming mag-post ang natitira ng mga sa pagtatapos ng linggong ito, 29 00:01:20,110 --> 00:01:22,380 kaya huwag samantalahin na mapagkukunan. 30 00:01:22,380 --> 00:01:25,740 >> Kaya nang walang karagdagang ado, Nagsimula kami sa Peel pabalik 31 00:01:25,740 --> 00:01:28,180 ang layer na naging string para sa ilang oras. 32 00:01:28,180 --> 00:01:30,670 At kung ano ang sinabi namin ang isang string talaga ay noong nakaraang linggo? 33 00:01:30,670 --> 00:01:31,720 34 00:01:31,720 --> 00:01:32,900 Kaya char star. 35 00:01:32,900 --> 00:01:34,900 At char bituin, na rin, kung ano ang ay na talagang sabihin? 36 00:01:34,900 --> 00:01:37,150 Well, ang lahat ng mga oras na ito, kung hindi namin Na-pagtawag ng isang function, 37 00:01:37,150 --> 00:01:40,450 tulad ng getString, at pag-iimbak ang tinatawag na return 38 00:01:40,450 --> 00:01:42,910 halaga ng getString sa isang variable-- ang tawag dito 39 00:01:42,910 --> 00:01:47,721 uri ng mga string-- namin ang nagsusulat ang linya ng code up doon sa itaas. 40 00:01:47,721 --> 00:01:49,970 At ito ay lamang kapag nakita ko ang aking sulat-kamay Pinalaking dito 41 00:01:49,970 --> 00:01:51,930 gawin Napag-alaman kong paano lamang atrocious ito ay. 42 00:01:51,930 --> 00:01:54,180 >> Gayunpaman, Ipagpalagay na ipaalam, sa kanang gilid 43 00:01:54,180 --> 00:01:57,070 ay, nonetheless, ng makatwirang paglalarawan ng kung ano ang 44 00:01:57,070 --> 00:01:58,880 nangyayari ang lahat ng ito oras na may getString. 45 00:01:58,880 --> 00:02:00,380 getString, siyempre, ay nakakakuha ng isang string. 46 00:02:00,380 --> 00:02:01,691 Ngunit ano ang na talagang ibig sabihin? 47 00:02:01,691 --> 00:02:04,190 Ang ibig sabihin nito ito ay makakakuha ng isang chunk ng memorya mula sa operating system 48 00:02:04,190 --> 00:02:06,040 sa pamamagitan ng pagtawag ng isang function, na tinatawag malloc. 49 00:02:06,040 --> 00:02:07,390 Ngunit higit pa sa na sa ibang pagkakataon. 50 00:02:07,390 --> 00:02:09,139 At pagkatapos nito populates na chunk ng memorya 51 00:02:09,139 --> 00:02:11,764 na may mga titik na ang gumagamit ay may nai-type sa, sinusundan ng, siyempre, 52 00:02:11,764 --> 00:02:14,800 isang null character, o backslash zero sa dulo napaka. 53 00:02:14,800 --> 00:02:18,280 >> Samantala, sa kaliwang gilid ng kuwentong ito, ang lahat ng mga oras na ito, 54 00:02:18,280 --> 00:02:20,850 na namin ang nai-pagdeklara ng variable, tulad ng s. 55 00:02:20,850 --> 00:02:24,770 At variable na iyon ay kung ano ngayon Magsisimula ang pagtawag sa isang pointer. 56 00:02:24,770 --> 00:02:29,190 Ito ay hindi isang kahon sa loob ng na ilalagay namin ang string, Daven, per se, 57 00:02:29,190 --> 00:02:32,550 ngunit sa halip naming ilagay sa na parisukat box sa kaliwa kung ano ang eksaktong? 58 00:02:32,550 --> 00:02:34,890 59 00:02:34,890 --> 00:02:35,390 Oo? 60 00:02:35,390 --> 00:02:37,118 >> Madla: Ang address ng kung saan ito matatagpuan sa memorya. 61 00:02:37,118 --> 00:02:38,118 >> David J. MALAN: Eksaktong. 62 00:02:38,118 --> 00:02:40,690 Ang address ng kung saan Daven Matatagpuan sa memorya. 63 00:02:40,690 --> 00:02:44,650 At hindi kung saan matatagpuan ang lahat ng Daven, per se, ngunit partikular na mga address 64 00:02:44,650 --> 00:02:45,150 ng kung ano? 65 00:02:45,150 --> 00:02:46,311 66 00:02:46,311 --> 00:02:46,810 Oo? 67 00:02:46,810 --> 00:02:47,460 >> Madla: Una character. 68 00:02:47,460 --> 00:02:50,209 >> David J. MALAN: Ang unang character sa Daven, na kung saan, sa kasong ito, 69 00:02:50,209 --> 00:02:53,820 Ipinanukala ako ay nagkataon at unrealistically 1, Ox1, 70 00:02:53,820 --> 00:02:55,910 na nangangahulugan lamang ng hexadecimal bilang ng mga 1. 71 00:02:55,910 --> 00:02:57,993 Ngunit marahil ito ang nangyayari upang maging isang mas mas malaking numero 72 00:02:57,993 --> 00:03:01,260 na maaari naming gumuhit may 0x bilang isang prefix, 73 00:03:01,260 --> 00:03:02,806 na kumakatawan sa isang hexadecimal character. 74 00:03:02,806 --> 00:03:05,930 At dahil hindi namin kailangan mong malaman kung saan ang natitirang bahagi ng ang mga character ng Daven 75 00:03:05,930 --> 00:03:09,860 ay, dahil sa kung ano simpleng disenyo desisyon na ginawa maraming taon na ang nakakaraan? 76 00:03:09,860 --> 00:03:10,548 Oo? 77 00:03:10,548 --> 00:03:11,651 >> Madla: Backslash 0. 78 00:03:11,651 --> 00:03:12,900 David J. MALAN: Oo, eksakto. 79 00:03:12,900 --> 00:03:18,100 Ang backslash 0 nagbibigay-daan sa iyo, albeit sa linear oras, sa traverse ang string, 80 00:03:18,100 --> 00:03:20,400 maglakad mula kaliwa hanggang kanang, may para sa loop, o isang habang 81 00:03:20,400 --> 00:03:22,608 loop, o isang bagay tulad ng iyon, at tinutukoy, oh, dito 82 00:03:22,608 --> 00:03:24,751 ay ang katapusan ng partikular na string. 83 00:03:24,751 --> 00:03:27,000 Kaya lang sa mga address na ito sa simula ng isang string, 84 00:03:27,000 --> 00:03:30,290 maaari naming ma-access ang kabuuan ng ito, dahil ang lahat habang ito, 85 00:03:30,290 --> 00:03:32,030 isang string Na naging isang char star. 86 00:03:32,030 --> 00:03:36,370 >> Kaya ito ay tiyak na masarap na ipagpatuloy ang paggamit ang CS50 library at ito abstraction, 87 00:03:36,370 --> 00:03:38,440 kaya upang makipag-usap, ngunit na aming mag-uumpisang makakita nang eksakto 88 00:03:38,440 --> 00:03:41,230 kung ano ang nangyayari sa ilalim na ito buong oras. 89 00:03:41,230 --> 00:03:45,260 Kaya maaari mong isipin ang halimbawang ito, Masyadong, mula sa huling beses, ihambing 0, 90 00:03:45,260 --> 00:03:47,300 na hindi aktwal na ihambing. 91 00:03:47,300 --> 00:03:49,070 Ngunit sinimulan namin upang malutas ito. 92 00:03:49,070 --> 00:03:52,020 >> Ngunit marahil bilang isang refresher, Maaaring ko na kawili-wili sa isang tao 93 00:03:52,020 --> 00:03:54,261 sa isang pink elephant ngayon, Nakagawa rin sa pamamagitan ng Chang? 94 00:03:54,261 --> 00:03:55,760 Paano tungkol sa iyo sa harap? [INAUDIBLE]. 95 00:03:55,760 --> 00:03:56,660 Halika sa up. 96 00:03:56,660 --> 00:03:58,740 >> At sa habang panahon, bilang dumating ka up, sabihin 97 00:03:58,740 --> 00:04:01,670 isaalang-alang para sa isang sandali lamang kung ano ang ang code na ito ay aktwal na paggawa. 98 00:04:01,670 --> 00:04:04,917 Ang pagdeklara ito ng dalawang variable up tuktok, s at t, at pagtawag getString. 99 00:04:04,917 --> 00:04:08,250 Ito ay hindi isang napaka-program ang user-friendly, dahil hindi nito sasabihin sa iyo kung ano ang gagawin. 100 00:04:08,250 --> 00:04:10,541 Ngunit sabihin ipinapalagay lang kami ay nagbibigay-diin sa juicy bahagi. 101 00:04:10,541 --> 00:04:14,470 At pagkatapos ay ginagawa namin, kung katumbas s ay katumbas t, dapat itong sabihin printf, 102 00:04:14,470 --> 00:04:16,170 iyong nai-type ang parehong bagay. 103 00:04:16,170 --> 00:04:16,670 Hello. 104 00:04:16,670 --> 00:04:17,050 Ano ang inyong pangalan? 105 00:04:17,050 --> 00:04:17,779 >> JANELLE: Janelle. 106 00:04:17,779 --> 00:04:19,529 David J. MALAN: Janelle, mabait sa matugunan mo. 107 00:04:19,529 --> 00:04:21,800 Kaya ang iyong mga hamon sa kamay para sa elephant 108 00:04:21,800 --> 00:04:25,230 ay ang unang gumuhit sa amin ng isang larawan ng kung ano ang na kinakatawan sa mga unang dalawang 109 00:04:25,230 --> 00:04:25,970 linya. 110 00:04:25,970 --> 00:04:28,139 Kaya s at t ay maaaring maging kinakatawan kung paano sa screen? 111 00:04:28,139 --> 00:04:30,680 At maaari kang gumuhit lamang ito sa ang iyong daliri sa malaking screen. 112 00:04:30,680 --> 00:04:31,780 113 00:04:31,780 --> 00:04:34,510 >> Kaya mayroong dalawang halves sa sa bawat gilid ng equation na iyon. 114 00:04:34,510 --> 00:04:37,760 Kaya walang s sa kaliwa, at pagkatapos getString sa kanan. 115 00:04:37,760 --> 00:04:40,540 At pagkatapos ay mayroong hindi sa kaliwa, at pagkatapos ay getString sa kanan. 116 00:04:40,540 --> 00:04:42,630 Kaya kung paano na maaari naming simulan pagguhit ng isang larawan na 117 00:04:42,630 --> 00:04:46,340 Kinakatawan ng kung ano ang nangyayari sa dito sa memory, nais mong sabihin? 118 00:04:46,340 --> 00:04:49,150 At hayaan mo akong ipaalam sa iyo ipaliwanag ano ang ginagawa mo habang nagpapatuloy ka. 119 00:04:49,150 --> 00:04:49,820 >> JANELLE: OK. 120 00:04:49,820 --> 00:04:58,890 Well, una, ito ay nagtatanong sa iyo upang makuha ang input ng string. 121 00:04:58,890 --> 00:05:00,439 At ito ay store-- oh, paumanhin. 122 00:05:00,439 --> 00:05:01,230 David J. MALAN: OK. 123 00:05:01,230 --> 00:05:01,730 Mahusay. 124 00:05:01,730 --> 00:05:03,330 At ito ay tinatawag na kung ano? 125 00:05:03,330 --> 00:05:03,950 Oh, ang OK. 126 00:05:03,950 --> 00:05:04,450 Panatilihin ang pagpunta. 127 00:05:04,450 --> 00:05:05,575 Hindi ko sinasadyang gambalain. 128 00:05:05,575 --> 00:05:07,060 JANELLE: Paumanhin. 129 00:05:07,060 --> 00:05:14,237 Kaya gagawin ito ng pag-input ito sa ang address of-- hindi sigurado. 130 00:05:14,237 --> 00:05:17,320 Hindi matandaan ko nang eksakto ang numero, ngunit naniniwala ko ito ay nagsisimula sa 0. 131 00:05:17,320 --> 00:05:18,420 >> David J. MALAN: Iyon ang lahat ng karapatan, dahil ginawa ko ang mga numero up, 132 00:05:18,420 --> 00:05:19,650 kaya walang tamang sagot. 133 00:05:19,650 --> 00:05:22,105 >> JANELLE: Simula sa 0 arc. 134 00:05:22,105 --> 00:05:24,000 >> David J. MALAN: OK, kaya elemento 0. 135 00:05:24,000 --> 00:05:24,765 Oo naman. 136 00:05:24,765 --> 00:05:28,295 >> JANELLE: At pagkatapos ay kung noon ay tulad ng isang dalawang-letter-- lamang 137 00:05:28,295 --> 00:05:30,496 >> David J. MALAN: OK, pabalik sa iyo. 138 00:05:30,496 --> 00:05:33,629 >> JANELLE: Kaya elemento 0, at pagkatapos elemento 1 o 2 elemento. 139 00:05:33,629 --> 00:05:36,670 David J. MALAN: At kung aling mga piraso ng ang larawan ay mo ang pagguhit ngayon? 140 00:05:36,670 --> 00:05:37,690 Ang tawag sa getString? 141 00:05:37,690 --> 00:05:38,830 O ang pagpapahayag ng s? 142 00:05:38,830 --> 00:05:42,890 >> JANELLE: Ang pagpapahayag ng s, Naniniwala akong. 143 00:05:42,890 --> 00:05:45,980 Oh, ang getString, dahil gagawin ito ay inputted sa bawat [? area. ?] 144 00:05:45,980 --> 00:05:46,510 >> David J. MALAN: Mahusay. 145 00:05:46,510 --> 00:05:47,051 Mismong. 146 00:05:47,051 --> 00:05:49,300 Kahit na ito nang epektibo ay nagbabalik ng isang array, pagpapabalik, 147 00:05:49,300 --> 00:05:53,300 kapag kami makababalik isang string, na aming makakaya index sa string na gamit 01 at 2. 148 00:05:53,300 --> 00:05:56,180 Technically, ang mga ito ay marahil kinakatawan ng indibidwal na mga address, 149 00:05:56,180 --> 00:05:57,100 ngunit iyon ang multa. 150 00:05:57,100 --> 00:06:00,170 >> Kaya ipagpalagay, kung maaari ko lamang mabilis ipasa sa kung saan iniwan namin off 151 00:06:00,170 --> 00:06:04,320 huling panahon, kung ang isa sa ang mga string ay g isang b e, 152 00:06:04,320 --> 00:06:10,337 backslash 0, at sa gayon ay kumakatawan sa Gabe ni input, kung paano maaari naming kumatawan s ngayon? 153 00:06:10,337 --> 00:06:12,670 Kung ito ang memorya na Na-ibinalik ng getString? 154 00:06:12,670 --> 00:06:14,415 155 00:06:14,415 --> 00:06:17,610 >> JANELLE: Gusto itong maging kinakatawan ng isang arc? 156 00:06:17,610 --> 00:06:18,750 >> David J. MALAN: Sa pamamagitan ng isang arc? 157 00:06:18,750 --> 00:06:19,130 Well, hindi. 158 00:06:19,130 --> 00:06:21,171 Sabihin nating lamang, pictorially, ipaalam sa akin pumunta lamang maaga 159 00:06:21,171 --> 00:06:25,710 at magmungkahi na, kung ito ay s, ito ay ang return halaga ng getString. 160 00:06:25,710 --> 00:06:29,482 At mo iguguhit na ito bilang 0, 1, 2, na ay perpektong makatwirang, dahil kami 161 00:06:29,482 --> 00:06:30,940 maaari index sa string, bilang tulad. 162 00:06:30,940 --> 00:06:33,340 Ngunit upang maging pare-pareho lang huling oras, hayaan mo akong sige 163 00:06:33,340 --> 00:06:37,310 at nagkataon ipanukala na ito ay address 1, ito ay address 2, 164 00:06:37,310 --> 00:06:39,597 ito ay address 3, at iba pa. 165 00:06:39,597 --> 00:06:41,430 At kaya, upang maging sobrang lamang malinaw, kung ano ang nangyayari 166 00:06:41,430 --> 00:06:44,580 upang pumunta sa mga bilang resulta ng na unang linya ng code, na gusto mong sabihin? 167 00:06:44,580 --> 00:06:45,420 >> JANELLE: Address 1? 168 00:06:45,420 --> 00:06:46,420 >> David J. MALAN: Eksaktong. 169 00:06:46,420 --> 00:06:47,190 Kaya tugunan ang 0x1. 170 00:06:47,190 --> 00:06:48,220 171 00:06:48,220 --> 00:06:51,230 At samantala, hayaan mo akong sige at doblehin karami ng kung ano ang nagawa mo na 172 00:06:51,230 --> 00:06:52,740 at magdagdag ng aking sariling t dito. 173 00:06:52,740 --> 00:06:56,340 Kung ako ay mag-type ng Gabe muli, sa pangalawang pagkakataon, 174 00:06:56,340 --> 00:07:01,530 kapag na-prompt sa getString, kung saan, siyempre, ay pagpunta sa pumunta Gabe? 175 00:07:01,530 --> 00:07:02,280 Well, presumably-- 176 00:07:02,280 --> 00:07:04,935 177 00:07:04,935 --> 00:07:05,975 >> JANELLE: Tulad ng sa dito? 178 00:07:05,975 --> 00:07:06,850 David J. MALAN: Oo. 179 00:07:06,850 --> 00:07:08,516 JANELLE: O ito ay din sa parehong mga kahon? 180 00:07:08,516 --> 00:07:11,940 David J. MALAN: Hayaan akong ipanukala, Oo, eksakto, kaya sa mga karagdagang mga kahon. 181 00:07:11,940 --> 00:07:15,230 Ngunit kung ano ang key na ngayon ay na, kahit bagaman iginuhit ko ang mga malapit sa katangian 182 00:07:15,230 --> 00:07:18,650 together-- 0x1, ito ay 0x2-- sa katotohanan, 183 00:07:18,650 --> 00:07:25,750 ito ngayon ay maaaring maging address 0x10, halimbawa, at 0x11, at 0x12, 184 00:07:25,750 --> 00:07:26,870 at iba pa. 185 00:07:26,870 --> 00:07:29,955 At kaya, kung iyon ang kaso, kung ano ang nangyayari sa mga end up dito sa t? 186 00:07:29,955 --> 00:07:30,830 >> JANELLE: 0x10? 187 00:07:30,830 --> 00:07:31,830 David J. MALAN: Eksaktong. 188 00:07:31,830 --> 00:07:33,180 Kaya 0x10. 189 00:07:33,180 --> 00:07:34,570 At kaya ngayon, huling tanong. 190 00:07:34,570 --> 00:07:37,510 Na sa iyo, sa pamamagitan ng malayo, ay nagkaroon upang gumana ang hardest para sa isang elephant kaya sa ngayon. 191 00:07:37,510 --> 00:07:42,650 Sa pamamagitan ng ngayon, kung hilahin ko up ang code muli, kapag gagawin ko, sa tatlong linya, 192 00:07:42,650 --> 00:07:47,630 kung katumbas s ay katumbas t, ano Ako talaga Ang paghahambing ng na-iguguhit namin dito? 193 00:07:47,630 --> 00:07:49,271 >> JANELLE: Ang dalawang mga address? 194 00:07:49,271 --> 00:07:50,270 David J. MALAN: Eksaktong. 195 00:07:50,270 --> 00:07:53,350 Kaya ako sinasabi ko ay katumbas ng y katumbas ng pang? 196 00:07:53,350 --> 00:07:56,210 Sa ibang salita, ay katumbas ng 1 katumbas ng 10? 197 00:07:56,210 --> 00:07:59,710 At syempre, ang halata sagot ay ngayon, hindi. 198 00:07:59,710 --> 00:08:02,920 At kaya programang ito ay sa huli pagpunta sa i-print ang ano, gusto mong sabihin? 199 00:08:02,920 --> 00:08:05,770 200 00:08:05,770 --> 00:08:08,405 >> JANELLE: Gusto itong maging, iyong nai-type ang parehong bagay? 201 00:08:08,405 --> 00:08:11,446 >> David J. MALAN: Kaya kung s ay 1 at t 10? 202 00:08:11,446 --> 00:08:13,320 >> JANELLE: nai-type mo ang iba't ibang mga bagay. 203 00:08:13,320 --> 00:08:13,570 >> David J. MALAN: Eksaktong. 204 00:08:13,570 --> 00:08:14,480 Nai-type mo ang iba't ibang mga bagay. 205 00:08:14,480 --> 00:08:14,850 Lahat ng karapatan. 206 00:08:14,850 --> 00:08:16,714 Kaya isang round ng applause, kung magagawa namin, dito. 207 00:08:16,714 --> 00:08:17,214 [APPLAUSE] 208 00:08:17,214 --> 00:08:17,708 Iyon ay masakit. 209 00:08:17,708 --> 00:08:18,208 Alam ko. 210 00:08:18,208 --> 00:08:19,684 Maayos na Natapos. 211 00:08:19,684 --> 00:08:24,690 Kaya ngayon sabihin makita kung hindi namin maaari tease bukod sa kung ano ang fix yan. 212 00:08:24,690 --> 00:08:28,040 At syempre, kapag naayos na namin this-- kung saan kukunin ko na ngayon ay kumakatawan sa green-- 213 00:08:28,040 --> 00:08:29,690 May ginawang kami ng ilang mga pagpapahusay dito. 214 00:08:29,690 --> 00:08:32,409 Una, tulad ng isang katinuan suriin, unang Lalabas na ako 215 00:08:32,409 --> 00:08:35,110 kung s ay katumbas ng walang bisa at hindi katumbas null. 216 00:08:35,110 --> 00:08:39,440 At upang maging malinaw lamang, kapag maaari s o t null sa code na tulad nito? 217 00:08:39,440 --> 00:08:43,140 218 00:08:43,140 --> 00:08:44,490 Kapag maaaring s o t null. 219 00:08:44,490 --> 00:08:44,990 Oo? 220 00:08:44,990 --> 00:08:45,990 >> Madla: [INAUDIBLE]. 221 00:08:45,990 --> 00:08:49,490 222 00:08:49,490 --> 00:08:50,510 >> David J. MALAN: Eksaktong. 223 00:08:50,510 --> 00:08:52,840 Kung ang string na ang gumagamit nai-type sa ay masyadong mahaba 224 00:08:52,840 --> 00:08:56,140 upang magkasya sa memorya, o ilang kakaiba sulok kaso na tulad nang, 225 00:08:56,140 --> 00:08:59,010 getString, dahil kakailanganin namin makita, nang literal ngayon, sa dokumentasyon nito, 226 00:08:59,010 --> 00:09:02,330 sabi ni ito ay bumalik null bilang isang espesyal na halaga Sentinel, 227 00:09:02,330 --> 00:09:05,417 o lamang uri ng isang espesyal na simbolo Ibig sabihin nito na may nangyaring mali. 228 00:09:05,417 --> 00:09:07,500 Kaya gusto naming suriin para sa na, dahil ito ay lumiliko out 229 00:09:07,500 --> 00:09:09,720 na null ay isang napaka-mapanganib na halaga. 230 00:09:09,720 --> 00:09:14,250 >> Madalas, kung sinubukan mong gawin ang isang bagay na may null na kinasasangkutan ng isang function-- pagpasa ito 231 00:09:14,250 --> 00:09:17,470 bilang input, para sa instance-- na function na maaaring napaka ay nagka-crash at, na may mga ito, 232 00:09:17,470 --> 00:09:19,090 tumagal down na ang iyong buong programa. 233 00:09:19,090 --> 00:09:22,570 Kaya pangatlong linya na ito ngayon ay isang katinuan lamang suriin, error checking, kung gagawin mo. 234 00:09:22,570 --> 00:09:25,450 Iyon ay isang mahusay na ugali na ngayon para sa amin upang makakuha ng mga ito sa anumang oras namin 235 00:09:25,450 --> 00:09:28,050 subukan na gumamit ng isang halaga na maaari, potensyal, maging null. 236 00:09:28,050 --> 00:09:32,000 >> Ngayon, sa ika-apat na linya dito, "Kung strcmp (s, t)," na rin, 237 00:09:32,000 --> 00:09:33,180 kung ano ang na nagre-refer sa? 238 00:09:33,180 --> 00:09:36,750 Well, sinabi namin na ito ay isang napaka succinctly pinangalanang pag-andar para sa string paghahambing. 239 00:09:36,750 --> 00:09:40,370 At nito layunin sa buhay ay upang ihambing ang unang argumento laban dito segundo, 240 00:09:40,370 --> 00:09:44,640 ngunit hindi sa mga tuntunin ng kanilang mga address, tulad ng ginawa namin sinasadyang isang sandali 241 00:09:44,640 --> 00:09:48,270 nakaraan gamit ang pulang code, ngunit sa halip na ihambing ang dalawang 242 00:09:48,270 --> 00:09:53,210 string sa humanly madaling maunawaan paraan sa pamamagitan ng paghahambing na ito, laban ito, 243 00:09:53,210 --> 00:09:56,690 laban na ito, laban na ito, at pagkatapos ay humihinto kung at kapag isa 244 00:09:56,690 --> 00:09:59,590 o pareho sa aking mga daliri hit ang isang backslash 0. 245 00:09:59,590 --> 00:10:04,530 Kaya ang isang tao taon na ang nakakaraan ipinatupad strcmp upang ipatupad para sa amin ang pag-andar 246 00:10:04,530 --> 00:10:08,890 na namin umaasa gusto namin na makakakuha ito sa pamamagitan ng paghahambing lamang ang dalawang simpleng mga halaga. 247 00:10:08,890 --> 00:10:14,929 >> Ngayon tapat, panatilihing ako drawing lahat ng mga iba't-ibang numero. 248 00:10:14,929 --> 00:10:17,470 Ngunit ang katotohanang ay, naging ako pagsasagawa ng mga ganitong up ang buong oras. 249 00:10:17,470 --> 00:10:19,580 At kaya ipaalam sa akin pumunta lamang maaga at scribble mga out 250 00:10:19,580 --> 00:10:23,100 upang gumawa ng puntong iyon, sa pagtatapos ng araw at sumusulong, 251 00:10:23,100 --> 00:10:30,160 Hindi kami talaga ng pagpunta sa nagmamalasakit sa kung ano ang humaharap sa mga bagay ay aktwal na 252 00:10:30,160 --> 00:10:30,790 sa memory. 253 00:10:30,790 --> 00:10:34,320 Kaya hindi ako pagpunta sa gumuhit ng mga mga uri ng mga numero kaya magkano ngayon, 254 00:10:34,320 --> 00:10:38,970 Ako lamang ng isang abstract ito ang layo ng isang kaunti pa friendly na sa pamamagitan lamang ng mga arrow. 255 00:10:38,970 --> 00:10:42,060 >> Sa ibang salita, kung s ay isang pointer, mahusay, gumuhit ng lang ito, literal ipaalam, 256 00:10:42,060 --> 00:10:45,430 bilang isang pointer, ang isang arrow na nakaturo mula mismo sa ibang bagay, 257 00:10:45,430 --> 00:10:48,280 at hindi mag-alala masyadong maraming higit pa tungkol sa ang minutia ng mga address na ito 258 00:10:48,280 --> 00:10:49,910 na kung saan, muli, na binubuo ko pa rin. 259 00:10:49,910 --> 00:10:52,680 Ngunit kami ay makita ang mga address na iyon, minsan, kapag ang pag-debug code. 260 00:10:52,680 --> 00:10:56,450 >> Ngayon samantala, ang program na ito dito ang mga pag-aayos, siyempre, 261 00:10:56,450 --> 00:10:58,720 na problema sa pamamagitan ng paghahambing dalawang mga string ng mga. 262 00:10:58,720 --> 00:11:00,260 Ngunit namin ang bumangga sa isa pang problema. 263 00:11:00,260 --> 00:11:03,180 Ito ay mula sa mga kopya programa huling oras, 264 00:11:03,180 --> 00:11:06,880 kung saan, ako ay sinusubukan upang mapakinabangan lang ang unang character sa isang string. 265 00:11:06,880 --> 00:11:09,620 Ngunit ano ang palatandaan Nakita namin huling beses kapag 266 00:11:09,620 --> 00:11:14,150 ang isang gumagamit na nai-type sa isang halaga, tulad ng Gabe sa maliliit na titik, para s, 267 00:11:14,150 --> 00:11:19,310 pagkatapos ay nagtalaga kami ng mga papunta t, tulad ng sa pangatlong linya doon, 268 00:11:19,310 --> 00:11:22,900 at pagkatapos ay sinubukan kong ika-capitalize t bracket 0? 269 00:11:22,900 --> 00:11:25,950 Ano ang epekto ng pagbabago t bracket 0 dito? 270 00:11:25,950 --> 00:11:27,150 >> Madla: Binago ito s. 271 00:11:27,150 --> 00:11:29,360 >> David J. MALAN: Oo, Binago ko s, pati na rin. 272 00:11:29,360 --> 00:11:31,050 Dahil kung ano ang talagang nangyari? 273 00:11:31,050 --> 00:11:34,130 Well, hayaan mo akong makita kung ang maaari kong linisin up ang larawang ito, gaya ng mga sumusunod. 274 00:11:34,130 --> 00:11:41,390 >> Kung s ay, muli, ang salitang g, a, b, e, backslash, 0, at mga 275 00:11:41,390 --> 00:11:44,084 patuloy kaming guhit bilang isang kahon dito, ngunit hindi hihigit address. 276 00:11:44,084 --> 00:11:45,250 Ni itigil ang paggawa ng mga bagay-bagay Hayaang. 277 00:11:45,250 --> 00:11:47,510 Gumuhit ng lang ng isang larawan Hayaan upang gawing simple ang mundo. 278 00:11:47,510 --> 00:11:52,640 >> Kapag Ipinahahayag ko t may string t, na lumilikha na chunk ng memorya. 279 00:11:52,640 --> 00:11:55,850 Square ang mangyayari sa maging 32 mga bit sa karamihan ng mga computer. 280 00:11:55,850 --> 00:11:59,530 Sa katunayan, kung nag-kailanman narinig ng isang computer na pagkakaroon ng 32-bit na arkitektura, 281 00:11:59,530 --> 00:12:03,000 talaga magarbong-makipag-usap, na lamang ang ibig sabihin nito ay gumagamit ng 32-bit na mga address. 282 00:12:03,000 --> 00:12:05,370 At bilang isang teknikal na bukod, kung sakaling mo na ang nagtaka 283 00:12:05,370 --> 00:12:09,630 bakit mas lumang mga computer, kung ikaw talaga Sinubukan ni na sopas up ang mga ito na may maraming ng RAM, 284 00:12:09,630 --> 00:12:12,360 maaari lamang magkaroon ng isang maximum na ng apat na gigabytes ng RAM, 285 00:12:12,360 --> 00:12:14,860 mahusay na ay dahil, literal, ang iyong lumang computer na maaari lamang 286 00:12:14,860 --> 00:12:17,250 mabibilang bilang mataas na bilang 4 bilyon, 4000000000 bytes, 287 00:12:17,250 --> 00:12:20,590 dahil ito ay gumagamit ng 32-bit mga numero para sa mga address. 288 00:12:20,590 --> 00:12:23,260 >> Ngunit sa anumang kaso, sa ganitong Halimbawa, kuwento ng magkano ang mas simple. 289 00:12:23,260 --> 00:12:27,250 t ay isa lamang pointer, o talaga ng char bituin, aka string. 290 00:12:27,250 --> 00:12:30,860 At kung paano ang gusto kong i-update ang larawang ito na ngayon ay mayroon na pangalawang linya ng code, 291 00:12:30,860 --> 00:12:31,950 pagkatapos ng tuldok, tuldok, tuldok? 292 00:12:31,950 --> 00:12:35,845 Kapag ginawa ko string t ay katumbas ng semicolon s, kung paano baguhin ang litratong ito? 293 00:12:35,845 --> 00:12:37,500 294 00:12:37,500 --> 00:12:38,000 Oo? 295 00:12:38,000 --> 00:12:38,916 >> Madla: [INAUDIBLE]. 296 00:12:38,916 --> 00:12:41,087 297 00:12:41,087 --> 00:12:42,020 >> David J. MALAN: Oo. 298 00:12:42,020 --> 00:12:42,600 Mismong. 299 00:12:42,600 --> 00:12:45,620 Ilagay ko lang ang isang arrow mula sa t kahon sa parehong address, 300 00:12:45,620 --> 00:12:47,570 Ibinigay ang parehong unang titik sa. 301 00:12:47,570 --> 00:12:50,850 O kaya technically, kung ito tao ay sa 0x1 pa rin, 302 00:12:50,850 --> 00:12:53,052 ito ay waring ako nagkaroon 0x1 dito at 0x1 dito. 303 00:12:53,052 --> 00:12:54,760 Ngunit muli, na pinahahalagahan ng tungkol sa mga address? 304 00:12:54,760 --> 00:12:56,345 Ito ay lamang sa ideya na ngayon ang mahalaga. 305 00:12:56,345 --> 00:12:57,720 Kaya ito ay kung ano ang nangyayari dito. 306 00:12:57,720 --> 00:13:02,690 Kaya siyempre, kung gagawin mo t bracket 0, na kung saan ay pagtatanda array, 307 00:13:02,690 --> 00:13:05,650 ng course-- at tapat, tinitingnan nito tulad ng mayroong isang array sa paglipas dito, 308 00:13:05,650 --> 00:13:07,340 ngunit ngayon ay may ito kakaiba bagay. 309 00:13:07,340 --> 00:13:11,160 Malaman na ang programming language, C, nag-aalok sa iyo ang tampok na ito, 310 00:13:11,160 --> 00:13:14,650 kung saan, kahit na t ay isang pointer, o s ay isang pointer, 311 00:13:14,650 --> 00:13:18,050 Maaari mo pa ring gamitin ang pamilyar na, kumportableng square bracket 312 00:13:18,050 --> 00:13:22,520 pagtatanda upang pumunta sa unang elemento, o ang pangalawang elemento, o anumang elemento ng 313 00:13:22,520 --> 00:13:26,130 na na pointer ay tumuturo upang dahil, baka, ito 314 00:13:26,130 --> 00:13:29,410 ay, tulad ng sa kasong ito, pagturo sa ilang mga array. 315 00:13:29,410 --> 00:13:30,340 >> Kaya paano ko namin ito aayusin? 316 00:13:30,340 --> 00:13:33,660 Tapat, ito ay kung saan ito nakakuha ng maliit na napakalaki sa unang tingin. 317 00:13:33,660 --> 00:13:35,340 Ngunit dito ay isang bago at pinahusay na bersyon. 318 00:13:35,340 --> 00:13:37,460 >> Kaya una, nakakakuha ako ng mga mapupuksa ng CS50 library, 319 00:13:37,460 --> 00:13:41,170 upang ilantad lamang na s ay sa katunayan isang char bituin, isang kasingkahulugan lamang. 320 00:13:41,170 --> 00:13:43,540 At t ding char star. 321 00:13:43,540 --> 00:13:48,290 Ngunit ano ang nangyayari sa sa ng kanang bahagi ng na linya 322 00:13:48,290 --> 00:13:49,970 kung saan t ay bibigyan ng isang halaga? 323 00:13:49,970 --> 00:13:50,790 >> Ano ang malloc? 324 00:13:50,790 --> 00:13:51,630 Ano ito ay strlen? 325 00:13:51,630 --> 00:13:52,547 Ano ang sizeof (char)? 326 00:13:52,547 --> 00:13:54,380 Bakit ito ang heck linya hitsura kaya mahirap unawain? 327 00:13:54,380 --> 00:13:55,713 Ano ang ginagawa nito sa isang mataas na antas? 328 00:13:55,713 --> 00:13:56,482 329 00:13:56,482 --> 00:13:57,440 Ano ang pag-iimbak nito sa t? 330 00:13:57,440 --> 00:13:58,646 Oo? 331 00:13:58,646 --> 00:14:01,104 Madla: Ito ay naglalaan ng isang tiyak na halaga ng puwang ng memory. 332 00:14:01,104 --> 00:14:03,032 Ito ay upang mag-imbak, hulaan ko, mga titik [INAUDIBLE]. 333 00:14:03,032 --> 00:14:04,032 >> David J. MALAN: Perpekto. 334 00:14:04,032 --> 00:14:04,540 Perpekto. 335 00:14:04,540 --> 00:14:06,650 Ang paglalaan ng mga ito sa isang tiyak na dami ng puwang ng memory 336 00:14:06,650 --> 00:14:08,940 upang mag-imbak, baka, hinaharap titik. 337 00:14:08,940 --> 00:14:11,310 At sa partikular, malloc samakatuwid ay bumabalik kung ano? 338 00:14:11,310 --> 00:14:13,114 339 00:14:13,114 --> 00:14:14,851 >> Madla: Bumabalik ang [INAUDIBLE]? 340 00:14:14,851 --> 00:14:15,850 David J. MALAN: Eksaktong. 341 00:14:15,850 --> 00:14:18,850 Bumabalik ang address ng na memorya, kung saan ay isang magarbong paraan ng sinasabi, 342 00:14:18,850 --> 00:14:21,640 Ibinabalik ang address ng unang byte ng memorya na. 343 00:14:21,640 --> 00:14:25,460 Onus Ang ay sa akin na tandaan kung gaano karaming memory ko talaga 344 00:14:25,460 --> 00:14:27,140 inilaan o tinanong malloc para sa. 345 00:14:27,140 --> 00:14:28,384 >> Ngayon kung magkano ay na? 346 00:14:28,384 --> 00:14:30,550 Well, kahit na mayroong ng maraming mga panaklong dito, 347 00:14:30,550 --> 00:14:32,970 malloc tumatagal lamang ng isang solong argumento. 348 00:14:32,970 --> 00:14:37,250 At ako ng pagtukoy ng strlen s, kaya bigyan sa akin ng maraming byte bilang mayroong sa s, 349 00:14:37,250 --> 00:14:37,800 ngunit magdagdag ng isa. 350 00:14:37,800 --> 00:14:38,300 Bakit? 351 00:14:38,300 --> 00:14:39,030 352 00:14:39,030 --> 00:14:39,530 Oo? 353 00:14:39,530 --> 00:14:40,840 >> Madla: Ang backslash 0. 354 00:14:40,840 --> 00:14:41,840 David J. MALAN: Eksaktong. 355 00:14:41,840 --> 00:14:43,423 Mayroon kaming na gawin ang isang maliit na gawaing-bahay. 356 00:14:43,423 --> 00:14:45,970 Kaya dahil mayroong isang backslash 0, nais naming mas mahusay na tandaan na. 357 00:14:45,970 --> 00:14:47,310 Kung hindi man, kami ay pagpunta upang lumikha ng isang string na 358 00:14:47,310 --> 00:14:49,170 Walang espesyal na Terminator. 359 00:14:49,170 --> 00:14:52,640 >> Samantala, upang maging sobrang lamang anal, mayroon akong sizeof (char), 360 00:14:52,640 --> 00:14:55,730 kung sakali isang tao na tumatakbo ang aking code wala sa CS50 appliance, 361 00:14:55,730 --> 00:14:58,220 ngunit siguro ng ibang computer nang sama-sama kung saan char 362 00:14:58,220 --> 00:15:01,470 ay isa byte, sa pamamagitan ng convention, ngunit dalawang bytes, o isang bagay na mas malaki kaysa iyon. 363 00:15:01,470 --> 00:15:04,490 Ito ay upang maging napaka-lamang, sobrang averse sa mga error. 364 00:15:04,490 --> 00:15:06,940 Kahit na, sa katotohanan, ito'y pinaka-malamang na magiging isang 1. 365 00:15:06,940 --> 00:15:11,490 >> Ngayon, samantala, pumunta ako magpatuloy at kopyahin ang mga string, t bracket ay katumbas ng i t bracket s. 366 00:15:11,490 --> 00:15:14,962 At ako ay defer sa huling linggo ng source code upang makita kung ano ang nangyayari sa. 367 00:15:14,962 --> 00:15:17,670 Ngunit ang key takeaway, at ang dahilan ko bang ilagay ang code na ngayon sa berde, 368 00:15:17,670 --> 00:15:22,520 ay dahil na ang pinaka huling linya, t bracket 0 ay katumbas ng toupper, 369 00:15:22,520 --> 00:15:25,230 May mga epekto ng Pag-capitalize na string? 370 00:15:25,230 --> 00:15:26,960 t at / o s? 371 00:15:26,960 --> 00:15:29,280 372 00:15:29,280 --> 00:15:30,580 Iyon huling linya ng code. 373 00:15:30,580 --> 00:15:32,930 374 00:15:32,930 --> 00:15:35,560 >> Hindi na lang, dahil kung ano ang Nangyari oras na ito, 375 00:15:35,560 --> 00:15:41,500 kung bahagyang ko i-undo na huling hakbang, kung ano ang nangyari ay, kapag Tinatawag kong malloc, 376 00:15:41,500 --> 00:15:45,380 Tunay ba akong makakuha ng chunk ng memorya na ay ang kapareho ng sukat tulad ng orihinal, 377 00:15:45,380 --> 00:15:47,020 dahil iyon ang aritmetika ginawa ko. 378 00:15:47,020 --> 00:15:50,920 Ako sa pag-iimbak sa t address ng na chunk ng memorya. 379 00:15:50,920 --> 00:15:53,370 Kahit na ito ay mukhang maganda at kaakit-akit, maganda at blangko, 380 00:15:53,370 --> 00:15:56,882 ang katotohanan ay mayroong, kung ano na aming panatilihin ang pagtawag, mga halaga ng basura in dito. 381 00:15:56,882 --> 00:15:59,340 Na chunk ng memory maaari napaka mahusay mayroon pa nagamit dati, 382 00:15:59,340 --> 00:16:00,940 ng ilang segundo, ng ilang minuto ang nakalipas. 383 00:16:00,940 --> 00:16:04,410 Kaya doon ay maaaring talagang maging numero o titik doon, sa pamamagitan lamang ng aksidente. 384 00:16:04,410 --> 00:16:08,580 Ngunit ang mga ito ay hindi wasto, hanggang sa ako aking sarili populate ito chunk ng memorya 385 00:16:08,580 --> 00:16:12,510 may aktwal na karakter, bilang ako gawin sa na para sa loop doon. 386 00:16:12,510 --> 00:16:13,180 Ang lahat ng mga karapatan? 387 00:16:13,180 --> 00:16:16,180 >> Kaya ngayon, ang rurok ng ang tatlong mga halimbawa 388 00:16:16,180 --> 00:16:20,730 na tila pinaghiwa huling oras, Pagpalitin ang mga ito halimbawa, ang pagpapaganang ito 389 00:16:20,730 --> 00:16:23,670 nagtrabaho sa kamalayan na ito swapped isang at b. 390 00:16:23,670 --> 00:16:25,620 Ngunit hindi ito gumana sa kung ano ang iba pang kahulugan? 391 00:16:25,620 --> 00:16:27,616 392 00:16:27,616 --> 00:16:28,614 Oo? 393 00:16:28,614 --> 00:16:29,612 >> Madla: [INAUDIBLE]. 394 00:16:29,612 --> 00:16:35,600 395 00:16:35,600 --> 00:16:36,700 >> David J. MALAN: Eksaktong. 396 00:16:36,700 --> 00:16:39,530 Kung ako ay upang tawagan ang pagpapaganang ito mula another-- halimbawa, 397 00:16:39,530 --> 00:16:42,870 mula sa isang pag-andar tulad ng pangunahing, kung saan Mayroon akong isang variable, x at y, bilang ako 398 00:16:42,870 --> 00:16:46,160 ginawa noong nakaraang linggo, parehong code, at pumasa ako sa x at y 399 00:16:46,160 --> 00:16:49,860 upang magpalit, at pagkatapos ay tumawag Swap-- ito, siyempre, ay ang tamang bersyon 400 00:16:49,860 --> 00:16:52,220 ay kung ano kami ay tungkol sa see-- hindi ito gumana. 401 00:16:52,220 --> 00:16:53,770 Kaya kung ano ay ang pag-ayos? 402 00:16:53,770 --> 00:16:56,850 >> Well, kaya lang na maging malinaw, hayaan mo akong sige 403 00:16:56,850 --> 00:17:05,450 and-- ninyo ako ng isang pangalawang dito, at tingnan kung maaari kong ipakita sa iyo ang huling isa, na 404 00:17:05,450 --> 00:17:12,464 Magiging in-- sabihin makita kung ang maaari kong makahanap ng ito real fast-- OK, [INAUDIBLE]. 405 00:17:12,464 --> 00:17:18,440 406 00:17:18,440 --> 00:17:19,240 OK, mayroong ito ay. 407 00:17:19,240 --> 00:17:21,000 Kaya huwag pansinin ang mga utos tingin lang ako sa pag-type. 408 00:17:21,000 --> 00:17:23,780 Gusto ko ito upang mabawi sa sa huling minuto ng isang halimbawa 409 00:17:23,780 --> 00:17:27,960 mula sa huling beses, na ay tinatawag na ngayong walang Swap. 410 00:17:27,960 --> 00:17:30,200 >> Kaya walang Pagpalitin ay kung saan iniwanan namin off ang huling panahon, 411 00:17:30,200 --> 00:17:32,930 kung saan, nasimulan ko x sa 1 at y sa 2. 412 00:17:32,930 --> 00:17:35,840 Pagkatapos ay tumawag ako Pagpalitin, pagpasa sa 1 at 2. 413 00:17:35,840 --> 00:17:37,930 At pagkatapos ay ang pagpapaganang ito nagtrabaho sa ilang mga kahulugan, 414 00:17:37,930 --> 00:17:40,750 ngunit ito ay walang permanenteng Epekto sa x at y. 415 00:17:40,750 --> 00:17:45,430 Kaya ang tanong sa kamay ay, kung gaano ngayon huwag talaga naming ayusin ang problemang ito? 416 00:17:45,430 --> 00:17:47,820 Ano ang solusyon sa kamay? 417 00:17:47,820 --> 00:17:53,150 >> Well, sa swap.c, na bagong ngayon, mapansin ng ilang mga pagkakaiba. 418 00:17:53,150 --> 00:17:54,700 x at y ay pareho. 419 00:17:54,700 --> 00:17:57,250 Ngunit ano ay malinaw na iba't ibang tungkol sa 25 linya? 420 00:17:57,250 --> 00:17:58,880 421 00:17:58,880 --> 00:18:01,715 Anong bago doon, kung iyong naaalala kung ano ito ay tumingin tulad ng isang segundo na nakalipas? 422 00:18:01,715 --> 00:18:02,565 >> Madla: [INAUDIBLE]. 423 00:18:02,565 --> 00:18:03,440 >> David J. MALAN: Oo. 424 00:18:03,440 --> 00:18:06,680 Kaya ang mga ampersand ay isang bagong piraso ng syntax hindi lamang sa programang ito, 425 00:18:06,680 --> 00:18:08,560 ngunit din sa mas pangkalahatang sa CS50. 426 00:18:08,560 --> 00:18:10,680 Upang petsa, Hindi sa tingin ko nakakita kami ng anumang mga halimbawa 427 00:18:10,680 --> 00:18:14,070 o talagang usapan tungkol sa mga ito sa anumang detalyado, bukod sa, siguro, preemptively 428 00:18:14,070 --> 00:18:16,467 sa seksyon, isang ampersand tulad nito. 429 00:18:16,467 --> 00:18:19,300 Well, ito ay lumiliko out ampersand ay isa ng huling piraso ng bagong syntax 430 00:18:19,300 --> 00:18:20,174 kami ay pagpunta upang matuto. 431 00:18:20,174 --> 00:18:23,500 Ang lahat ng mga ibig sabihin nito ay ang address ng ilang mga variable. 432 00:18:23,500 --> 00:18:25,070 Sa anong address ay x nakatira? 433 00:18:25,070 --> 00:18:26,510 Ngunit kung ano ang address na iyon ay y nakatira? 434 00:18:26,510 --> 00:18:28,700 Dahil kung ang pangunahing problema bago 435 00:18:28,700 --> 00:18:32,970 ay na x at y ay ini-pumasang bilang ng mga kopya, kung ano ang gusto talaga naming gawin 436 00:18:32,970 --> 00:18:38,780 ay nagbibigay Pagpalitin may tulad ng isang kayamanan mapa na humahantong sa kung saan x at y talaga 437 00:18:38,780 --> 00:18:41,910 ay nasa RAM, upang Maaaring sumunod ang Pagpalitin na mapa 438 00:18:41,910 --> 00:18:47,760 at pumunta sa kung saan man x o y ay minamarkahan ang lugar at baguhin ang mga aktwal na halaga ng 1 at 2 439 00:18:47,760 --> 00:18:48,270 doon. 440 00:18:48,270 --> 00:18:50,710 >> Kaya't kailangang baguhin nang bahagya masyadong Swap. 441 00:18:50,710 --> 00:18:53,760 At sa unang tingin, ito ay maaaring tila isang maliit na katulad ng char star. 442 00:18:53,760 --> 00:18:54,850 At sa katunayan ito ay. 443 00:18:54,850 --> 00:18:59,635 Kaya isang ay isang pointer sa kung anong uri ng data, batay sa naka-highlight na bahagi? 444 00:18:59,635 --> 00:19:00,810 445 00:19:00,810 --> 00:19:01,620 Kaya ito ay isang int. 446 00:19:01,620 --> 00:19:04,880 >> Kaya isang hindi na isang int, ito ay ang address ng isang int. 447 00:19:04,880 --> 00:19:07,910 At katulad, b ay pagpunta ngayon maging ang address ng isang int. 448 00:19:07,910 --> 00:19:12,470 Kaya kapag ako ay tumawag ngayon Pagpalitin mula sa Main, Hindi ako pupunta upang bigyan Swap 1 at 2. 449 00:19:12,470 --> 00:19:15,540 Pupunta ako sa bigyan ito tulad ng Baka-bagay at baka-isang bagay, 450 00:19:15,540 --> 00:19:19,820 dalawang address na humantong Pagpalitin sa kanilang tunay na lokasyon 451 00:19:19,820 --> 00:19:21,310 sa memorya ng aking computer. 452 00:19:21,310 --> 00:19:25,580 >> Kaya ngayon, aking natitirang pagpapatupad Kailangang palitan ang isang tad. 453 00:19:25,580 --> 00:19:28,650 Ano ang iba't ibang mga malinaw naman ngayon sa mga tatlong linya ng code? 454 00:19:28,650 --> 00:19:31,350 Mayroong mga damn bituin lahat sa ibabaw ng lugar, lahat ng karapatan? 455 00:19:31,350 --> 00:19:33,014 Kaya kung ano ang nangyayari sa dito? 456 00:19:33,014 --> 00:19:33,514 Oo? 457 00:19:33,514 --> 00:19:35,055 >> Madla: Ito ay malinaw naman [INAUDIBLE]. 458 00:19:35,055 --> 00:19:36,832 459 00:19:36,832 --> 00:19:37,990 >> David J. MALAN: Eksaktong. 460 00:19:37,990 --> 00:19:41,560 Kaya sa context-- ito at hindi ito ay ang pinakamahusay na desisyon disenyo, admittedly, 461 00:19:41,560 --> 00:19:42,530 taon na ang nakakaraan. 462 00:19:42,530 --> 00:19:45,110 Sa kontekstong ito, kung saan ikaw ay may star, 463 00:19:45,110 --> 00:19:48,240 at wala kang isang uri ng data, tulad ng int, kaagad sa kaliwa, 464 00:19:48,240 --> 00:19:53,146 sa halip mayroon kang isang pantay na lagdaan, malinaw, sa kontekstong ito, kapag sinabi mong lagyan ng star ang isang, 465 00:19:53,146 --> 00:19:56,980 ay nangangahulugan na ang pumunta sa address na nasa isang. 466 00:19:56,980 --> 00:19:58,870 Sundin ang mga kayamanan mapa, kaya na magsalita. 467 00:19:58,870 --> 00:20:01,720 >> At samantala, sa 37 na linya, ito ay nangangahulugan na ang parehong bagay. 468 00:20:01,720 --> 00:20:05,460 Pumunta sa address ng, at ilagay kung ano ang doon? 469 00:20:05,460 --> 00:20:09,520 Anuman ay sa lokasyon na tumutukoy b. 470 00:20:09,520 --> 00:20:10,980 Sa ibang salita, pumunta sa b. 471 00:20:10,980 --> 00:20:12,130 Kumuha ng halagang iyon. 472 00:20:12,130 --> 00:20:15,620 Pumunta sa isang at, ayon sa mga kapantay mag-sign, ang pagtatalaga operator, 473 00:20:15,620 --> 00:20:17,010 maglagay ng halagang iyon doon. 474 00:20:17,010 --> 00:20:19,272 >> Katulad nito, int Temp lamang sa isang int. 475 00:20:19,272 --> 00:20:20,730 Wala kailangang baguhin ang tungkol sa Temp. 476 00:20:20,730 --> 00:20:24,810 Ito ay lamang ng isang ekstrang salamin mula sa Annenberg para sa ilang mga gatas o orange juice. 477 00:20:24,810 --> 00:20:27,630 Ngunit ko na kailangan ko upang sabihin, pumunta sa b. 478 00:20:27,630 --> 00:20:31,449 Pumunta sa na patutunguhan at ilagay ang halaga sa Temp doon. 479 00:20:31,449 --> 00:20:32,490 Kaya kung ano ang nangyayari pagkatapos? 480 00:20:32,490 --> 00:20:36,540 Kailan ko talagang tumawag Pagpalitin ang oras na ito, kung ito unang tray dito ay kumakatawan sa Main, 481 00:20:36,540 --> 00:20:42,270 ang pangalawang tray ay kumakatawan Swap, kapag Pumasa ko ampersand x at y ampersand 482 00:20:42,270 --> 00:20:47,150 mula sa Main upang magpalit, upang maging malinaw lamang, kung ano ito stack frame na tatanggap? 483 00:20:47,150 --> 00:20:48,700 484 00:20:48,700 --> 00:20:49,200 Oo? 485 00:20:49,200 --> 00:20:50,180 >> Madla: [INAUDIBLE]. 486 00:20:50,180 --> 00:20:51,180 David J. MALAN: Eksaktong. 487 00:20:51,180 --> 00:20:53,129 Ang address ng x at ang address ng y. 488 00:20:53,129 --> 00:20:55,170 At maaari mong isipin na ang mga tulad ng postal address. 489 00:20:55,170 --> 00:20:58,772 33 Oxford Street at 35 Oxford Street, at ikaw 490 00:20:58,772 --> 00:21:01,230 Gusto upang ilipat ang dalawang mga gusali na nasa mga lokasyong iyon. 491 00:21:01,230 --> 00:21:04,680 >> Ito ay uri ng isang katawa-tawa ideya, ngunit iyon ang lahat ibig sabihin namin sa pamamagitan ng address. 492 00:21:04,680 --> 00:21:07,000 Saan sa mundo maaari kang makahanap ng mga dalawang ints? 493 00:21:07,000 --> 00:21:09,470 Saan sa mundo maaari kang makahanap ng dalawang mga gusali mga? 494 00:21:09,470 --> 00:21:15,170 Kaya kung sa wakas, pagkatapos ang lahat ng ito oras ako pumunta sa source code ngayong araw at pagsama-samahin 495 00:21:15,170 --> 00:21:22,110 Pagpalitin at run ./swap, sa wakas, para sa unang pagkakataon namin ang aktwal na makita na 496 00:21:22,110 --> 00:21:25,330 ang aking mga halaga mayroon ngang Matagumpay na nai-swapped. 497 00:21:25,330 --> 00:21:30,860 At ngayon, maaari naming kahit na magsagawa ng tala ng ito sa, sabihin nating, gdb. 498 00:21:30,860 --> 00:21:32,740 >> Kaya hayaan mo akong pumunta sa parehong file. 499 00:21:32,740 --> 00:21:35,010 Hayaan akong sige at patakbuhin ang gdb ng ./swap. 500 00:21:35,010 --> 00:21:36,590 501 00:21:36,590 --> 00:21:40,547 At ngayon, sa Swap, pupuntahan ko pumunta Magpatuloy at magtakda ng pahinga point sa Main. 502 00:21:40,547 --> 00:21:42,630 At ngayon pupuntahan ko pumunta magpatuloy at patakbuhin ang program. 503 00:21:42,630 --> 00:21:45,810 At ngayon nakita namin ang aking code naka-pause na sa linya. 504 00:21:45,810 --> 00:21:48,330 >> Kung pumunta ako magpatuloy at pag-print x, ano ang dapat kong makita dito? 505 00:21:48,330 --> 00:21:49,314 506 00:21:49,314 --> 00:21:49,980 Ito ay isang tanong. 507 00:21:49,980 --> 00:21:51,030 508 00:21:51,030 --> 00:21:51,530 Sabihing muli? 509 00:21:51,530 --> 00:21:52,295 >> Madla: [INAUDIBLE]. 510 00:21:52,295 --> 00:21:53,910 >> David J. MALAN: Kaya random na numero, siguro. 511 00:21:53,910 --> 00:21:56,010 Siguro nakukuha ko masuwerteng, at ito ay maganda at simpleng, tulad ng 0. 512 00:21:56,010 --> 00:21:57,230 Pero siguro ito ang ilang mga random na numero. 513 00:21:57,230 --> 00:21:58,090 Sa kasong ito, suwerteng Nakatanggap ako. 514 00:21:58,090 --> 00:21:59,030 Mangyayari lamang ito sa 0. 515 00:21:59,030 --> 00:22:00,780 Ngunit ito ay katunayan swerte, dahil hindi ko hanggang 516 00:22:00,780 --> 00:22:06,280 i-type susunod at pagkatapos ay i-print ang x ay may na linya ng code, 19 linya, na pinaandar. 517 00:22:06,280 --> 00:22:10,942 >> Samantala, kung nagta-type ako sa tabi muli, at ngayong mag-print out y, pupuntahan ko makita 2. 518 00:22:10,942 --> 00:22:13,900 Ngayon, kung nagta-type ako susunod na, ito ay pagpunta sa makakuha ng isang maliit na nakalilito, dahil ngayon, 519 00:22:13,900 --> 00:22:17,250 ang printf ay pagpunta sa lumitaw sa screen, tulad ng ginawa ito. x ay 1. 520 00:22:17,250 --> 00:22:18,606 >> Ni gawin muli ito Hayaan. 521 00:22:18,606 --> 00:22:20,480 At ngayon, narito ang kung saan bagay makakuha ng kawili-wiling. 522 00:22:20,480 --> 00:22:21,580 523 00:22:21,580 --> 00:22:26,580 Bago ko tawagan Swap o kahit na hakbang sa ito, sabihin tumagal ng isang maliit na silip. 524 00:22:26,580 --> 00:22:28,980 x ay, muli, 1. 525 00:22:28,980 --> 00:22:33,240 Y, siyempre, mabilis katinuan suriin, 2, kaya hindi mahirap doon. 526 00:22:33,240 --> 00:22:35,740 Ngunit ano ang ampersand x? 527 00:22:35,740 --> 00:22:36,760 528 00:22:36,760 --> 00:22:39,350 Sagot, uri ng funky ito ay naghahanap. 529 00:22:39,350 --> 00:22:43,500 Subalit ang int bituin na naka-panaklong lamang paraan ng pagsabi na ito GDP ay isang address. 530 00:22:43,500 --> 00:22:48,290 Ito ay hindi isang int, ito ay isang pointer sa isang int, o kung hindi man ay kilala bilang isang address. 531 00:22:48,290 --> 00:22:49,742 >> Ano ito na nakatutuwang bagay? 532 00:22:49,742 --> 00:22:51,825 Hindi kailanman nasaksihan namin ang isang bagay medyo na tulad nang dati. 533 00:22:51,825 --> 00:22:53,650 534 00:22:53,650 --> 00:22:58,120 Kaya ito ay ang address sa computer ang aking memorya ng kung saan ang mangyayari x upang mabuhay. 535 00:22:58,120 --> 00:22:59,040 Ito ay baka-isang bagay. 536 00:22:59,040 --> 00:23:01,290 At ito ay, tapat, bakit Sinimulan ko ang pagguhit ng mga arrow, 537 00:23:01,290 --> 00:23:03,340 sa halip ng mga numero, dahil sino ba talagang pinahahalagahan 538 00:23:03,340 --> 00:23:06,890 na ang iyong int ay nasa isang partikular na address na iyan malaki. 539 00:23:06,890 --> 00:23:12,160 Ngunit bffff0c4, ang mga ito ay lahat sa katunayan hexadecimal digit, 540 00:23:12,160 --> 00:23:13,720 na kung saan ay sa pamamagitan ng 0 f. 541 00:23:13,720 --> 00:23:16,590 >> Kaya kami ay hindi pagpunta sa dwell masyadong matagal sa kung ano ang mga bagay ang. 542 00:23:16,590 --> 00:23:19,400 Ngunit kung i-print out ako y, siyempre, nakikita ko 2. 543 00:23:19,400 --> 00:23:22,440 Ngunit ampersand y, nakikita ko ang address na ito. 544 00:23:22,440 --> 00:23:26,527 At paunawa, para sa mga malaman, paano malayo ay x at y? 545 00:23:26,527 --> 00:23:27,985 Maaari mong huwag pansinin ang karamihan sa mga address. 546 00:23:27,985 --> 00:23:29,330 547 00:23:29,330 --> 00:23:29,920 Apat na bytes. 548 00:23:29,920 --> 00:23:33,510 At iyon ang pare-pareho sa aming mga mas maaga-claim na kung gaano kalaki ang isang int? 549 00:23:33,510 --> 00:23:34,130 Apat na bytes. 550 00:23:34,130 --> 00:23:37,420 Kaya mukhang lining up ang lahat ng bagay ay ng mabuti, dahil maaari mong umaasa, sa memorya. 551 00:23:37,420 --> 00:23:40,010 >> Kaya ngayon, sabihin lamang mabilis pasulong sa dulo ng kuwentong ito. 552 00:23:40,010 --> 00:23:43,290 Sabihin sige at i-type hakbang, upang sumisid sa Swap function. 553 00:23:43,290 --> 00:23:46,880 Ngayon mapansin, kung nagta-type ako ng, ito ay nahahawig sa address ng x. 554 00:23:46,880 --> 00:23:52,130 Kung nagta-type ako b, ito ay magkapareho sa address ng y. 555 00:23:52,130 --> 00:23:57,020 Kaya ano ang dapat kong makita kung ako Sabihing, pumunta sa isang address? 556 00:23:57,020 --> 00:23:58,120 Kaya mag-print ng star ang isang. 557 00:23:58,120 --> 00:24:00,130 Kaya bituin ay nangangahulugan pumunta doon, sa ganitong konteksto. 558 00:24:00,130 --> 00:24:02,730 Ampersand ay nangangahulugang kung ano ang address ng. 559 00:24:02,730 --> 00:24:05,000 Kaya lagyan ng star ang isang paraan 1. 560 00:24:05,000 --> 00:24:09,590 At nagbibigay-print star b akin 2. 561 00:24:09,590 --> 00:24:15,750 >> At ipaalam sa akin ipinapalagay, para sa mga sandali, na na hindi bababa sa ang code 562 00:24:15,750 --> 00:24:18,950 naaayos upang maisagawa ngayon ay maaaring maging reasoned sa pamamagitan ng sa na paraan. 563 00:24:18,950 --> 00:24:21,150 Ngunit kami ay muling bisitahin ang sa ideya na ito bago ang haba. 564 00:24:21,150 --> 00:24:23,850 Kaya ang bersyon na ito ng Pagpalitin ay tama ngayon at pinapayagan 565 00:24:23,850 --> 00:24:26,650 amin upang magpalit sa partikular na uri ng data. 566 00:24:26,650 --> 00:24:29,120 >> Kaya anumang mga katanungan pagkatapos ay sa Swap? 567 00:24:29,120 --> 00:24:29,890 Sa star? 568 00:24:29,890 --> 00:24:30,690 Sa address? 569 00:24:30,690 --> 00:24:33,270 At makikita mo, na may itakda ang problema 4, uri ng, 570 00:24:33,270 --> 00:24:37,310 ngunit nakatakda 5, talagang, kung paano ang mga problema mga bagay na kapaki-pakinabang at makakuha ng higit pang 571 00:24:37,310 --> 00:24:39,584 kumportable sa kanila, bilang isang resulta. 572 00:24:39,584 --> 00:24:40,430 Anumang bagay sa lahat? 573 00:24:40,430 --> 00:24:40,930 Lahat ng karapatan. 574 00:24:40,930 --> 00:24:44,350 Kaya malloc ay, muli, ang function na na lamang ang naglalaan ng memorya, memory 575 00:24:44,350 --> 00:24:45,330 paglalaan. 576 00:24:45,330 --> 00:24:47,024 At kung bakit kapaki-pakinabang na ito ay? 577 00:24:47,024 --> 00:24:48,940 Well, ang lahat ng mga oras na ito, na ginagamit mo malloc. 578 00:24:48,940 --> 00:24:52,230 Kung isinasaalang-alang mo na ngayon kung paano gawa getString, baka, ito ay 579 00:24:52,230 --> 00:24:56,140 Na-pagtatanong sa isang tao para sa isang chunk ng memorya, anumang oras uri ng user isang string 580 00:24:56,140 --> 00:24:59,040 in, dahil kami ay tiyak na Hindi alam, bilang mga tauhan CS50, 581 00:24:59,040 --> 00:25:02,710 kung paano malaki ang mga string na tao ay pumunta i-type ay maaaring maging. 582 00:25:02,710 --> 00:25:07,910 >> Kaya sabihin, sa unang pagkakataon, magsimula sa pabalik sa kung paano gumagana Peel ang CS50 library, 583 00:25:07,910 --> 00:25:10,990 sa pamamagitan ng paraan ng isang pares ng mga halimbawa na humantong sa amin doon. 584 00:25:10,990 --> 00:25:15,300 Kaya kung buksan ko up gedit at magbukas ng mga scanf 0, 585 00:25:15,300 --> 00:25:17,055 kami ay pagpunta upang makita ang sumusunod na code. 586 00:25:17,055 --> 00:25:18,720 587 00:25:18,720 --> 00:25:23,530 Scanf 0, magagamit sa website para sa ngayon, ay may kaugnay sa ilang mga linya ng code 588 00:25:23,530 --> 00:25:25,351 dito, 14 sa pamamagitan ng 20. 589 00:25:25,351 --> 00:25:26,600 At makita ng kung ano ang ginagawa itong ipaalam. 590 00:25:26,600 --> 00:25:28,920 Ito declares isang int, na tinatawag na x. 591 00:25:28,920 --> 00:25:30,850 Sinasabi nito na ang isang bagay tulad, numero ng pakiusap. 592 00:25:30,850 --> 00:25:33,940 At ngayon sinasabi nito, scanf% i, at x. 593 00:25:33,940 --> 00:25:35,620 Kaya mayroong isang bungkos ng mga bagong bagay-bagay doon. 594 00:25:35,620 --> 00:25:38,420 >> Ngunit scanf, maaari mong uri ng tingin ng bilang ng kabaligtaran ng printf. 595 00:25:38,420 --> 00:25:40,090 printf, siyempre, mga print sa screen. 596 00:25:40,090 --> 00:25:44,410 scanf uri ng mga pag-scan mula sa user na ito keyboard isang bagay na siya ay na-type. 597 00:25:44,410 --> 00:25:46,550 >> % I ay tulad ng printf. 598 00:25:46,550 --> 00:25:49,410 Ang ibig sabihin nito inaasahan ang gumagamit na mag-type sa isang int. 599 00:25:49,410 --> 00:25:52,820 At ngayon, bakit sa tingin mo ako Maaaring pagpasa scanf & x? 600 00:25:52,820 --> 00:25:54,030 601 00:25:54,030 --> 00:25:57,770 Kung ang layunin sa buhay ng scanf ay upang makakuha ng isang bagay mula sa user, 602 00:25:57,770 --> 00:26:02,480 ano ang kahulugan ng pagpasa ito, at x, ngayon? 603 00:26:02,480 --> 00:26:02,980 Oo? 604 00:26:02,980 --> 00:26:03,896 >> Madla: [INAUDIBLE]. 605 00:26:03,896 --> 00:26:05,540 606 00:26:05,540 --> 00:26:06,540 David J. MALAN: Eksaktong. 607 00:26:06,540 --> 00:26:12,900 Anuman ko, ang tao, i-type sa, ang aking input Mawawala na mai-save sa lokasyong iyon. 608 00:26:12,900 --> 00:26:17,660 Ito ay hindi sapat, isipin, sa makatarungan pumasa sa x, dahil nasaksihan namin nagagawa, 609 00:26:17,660 --> 00:26:21,630 anumang oras pumasa ka lamang ng isang raw na variable, tulad ng isang int, sa ilang iba pang mga pag-andar, 610 00:26:21,630 --> 00:26:25,640 sigurado, maaari itong baguhin sa na variable, ngunit hindi permanente. 611 00:26:25,640 --> 00:26:27,360 Hindi ito maaaring magkaroon ng epekto sa Main. 612 00:26:27,360 --> 00:26:29,420 Maaari lamang itong baguhin sa sarili nitong lokal na kopya. 613 00:26:29,420 --> 00:26:32,560 Ngunit kung, sa halip, hindi mo gusto bigyan mo ako ng aktwal na int, 614 00:26:32,560 --> 00:26:36,640 ngunit ba ninyo akong bigyan ng mga direksyon sa na int, ako ngayon, pagiging scanf, 615 00:26:36,640 --> 00:26:41,050 tiyak, maaari sundin ko na tugunan at maglagay ng numero doon 616 00:26:41,050 --> 00:26:43,280 kaya mayroon kang pati na rin ng access dito. 617 00:26:43,280 --> 00:26:45,120 >> Kaya kapag nagpatakbo ako ng programang ito, sabihin makita. 618 00:26:45,120 --> 00:26:49,660 Gumawa ng scanf 0 tuldok slash, scanf 0. 619 00:26:49,660 --> 00:26:54,030 At kung ngayon nagta-type ako ng isang numero tulad ng 50, salamat para sa 50. 620 00:26:54,030 --> 00:26:58,150 Kung ngayon nagta-type ako ng isang numero tulad ng negatibong 1, para sa mga negatibong 1. 621 00:26:58,150 --> 00:27:04,200 Ngayon nagta-type ako ng isang numero tulad ng 1.5, Hm. 622 00:27:04,200 --> 00:27:06,030 Bakit ang aking programa huwag pansinin sa akin? 623 00:27:06,030 --> 00:27:07,300 624 00:27:07,300 --> 00:27:09,880 Well, dahil lamang, sinabi ko ito ang aasahan sa isang int lamang. 625 00:27:09,880 --> 00:27:10,380 Lahat ng karapatan. 626 00:27:10,380 --> 00:27:11,630 Kaya na ng isang bersyon ng ito. 627 00:27:11,630 --> 00:27:16,600 Tingnan natin ang isang bingaw mga bagay-bagay at ipanukala na ito ay hindi mabuti. 628 00:27:16,600 --> 00:27:20,530 At dito ay namamalagi isang napaka-simpleng halimbawa ng kung paano namin maaaring magsimula pagsulat code 629 00:27:20,530 --> 00:27:24,450 na ang ibang mga tao ay maaaring samantalahin o ikompromiso pamamagitan ng paggawa ng masamang bagay. 630 00:27:24,450 --> 00:27:28,336 Kaya 16 linya, kaya katulad sa espiritu sa dati, 631 00:27:28,336 --> 00:27:29,960 ngunit hindi ako pagdeklara ito int oras na ito. 632 00:27:29,960 --> 00:27:32,970 Ako pagdeklara ito char bituin, aka string. 633 00:27:32,970 --> 00:27:35,190 >> Ngunit ano ang na talagang ibig sabihin? 634 00:27:35,190 --> 00:27:38,790 Kaya kung hindi ko tukuyin ang isang address-- at Ako pagtawag ito nagkataon, buffer, 635 00:27:38,790 --> 00:27:43,370 ngunit maaari kong tumawag ito s, upang maging simple-- at pagkatapos kong gawin ito, ipaliwanag sa akin, 636 00:27:43,370 --> 00:27:48,630 kung magagawa mo, batay sa mga nakaraang logic, kung ano ang ginagawa scanf sa 18 linya, 637 00:27:48,630 --> 00:27:55,000 kung pass% s at buffer, kung saan ay isang address? 638 00:27:55,000 --> 00:27:58,210 Ano ang scanf, kung inilapat mo ang eksaktong parehong logic bilang bersyon 0, 639 00:27:58,210 --> 00:28:00,640 pagpunta sa subukan na gawin dito, kapag ang isang bagay na uri ng gumagamit in? 640 00:28:00,640 --> 00:28:02,630 641 00:28:02,630 --> 00:28:03,409 Oo? 642 00:28:03,409 --> 00:28:04,407 >> Madla: [INAUDIBLE]. 643 00:28:04,407 --> 00:28:07,401 644 00:28:07,401 --> 00:28:08,890 >> David J. MALAN: Eksaktong. 645 00:28:08,890 --> 00:28:11,577 Scanf, sa pamamagitan ng logic mas maaga, ay pagpunta sa gawin ang mga string 646 00:28:11,577 --> 00:28:13,410 na ang nai-type ng tao in-- ito ay ngayon isang string, 647 00:28:13,410 --> 00:28:15,790 ito ay hindi isang numero, baka, kung siya cooperates-- 648 00:28:15,790 --> 00:28:19,310 at ito ay pagpunta sa subukan upang ilagay na string sa memory sa kahit anong address 649 00:28:19,310 --> 00:28:20,340 Tinutukoy buffer. 650 00:28:20,340 --> 00:28:23,870 At ito ay mahusay na, dahil buffer ay sa katunayan nilalayong maging isang address. 651 00:28:23,870 --> 00:28:30,470 >> Ngunit inaangkin ko ang program na ito ay mayroong bug sa isang napaka-seryoso paraan, dahil kung ano ang halaga ay 652 00:28:30,470 --> 00:28:31,330 buffer sa pamamagitan ng default? 653 00:28:31,330 --> 00:28:33,380 654 00:28:33,380 --> 00:28:34,790 Ano pa nasimulan ko sa? 655 00:28:34,790 --> 00:28:35,770 Ano chunk ng memory? 656 00:28:35,770 --> 00:28:37,480 657 00:28:37,480 --> 00:28:38,620 Mayroon akong hindi, i-right? 658 00:28:38,620 --> 00:28:42,265 >> Kaya kahit na inilaan ko ang isang char star na hindi na tinatawag na s, 659 00:28:42,265 --> 00:28:48,030 sa halip ang tawag dito, kaya buffer-- gumuhit ng pangalan ng variable ay hayaan 660 00:28:48,030 --> 00:28:53,380 ngayon bilang buffer-- kung mayroon akong hindi na tinatawag na getString o malloc dito, 661 00:28:53,380 --> 00:28:56,030 na mabisang ay nangangahulugan na buffer ay lamang ng ilang mga halaga ng basura. 662 00:28:56,030 --> 00:28:57,030 >> Ngayon kung ano ang ibig sabihin na? 663 00:28:57,030 --> 00:29:00,220 Ito ay nangangahulugan na ang sinabi ko scanf aasahan isang string mula sa user. 664 00:29:00,220 --> 00:29:01,300 At alam mo kung ano? 665 00:29:01,300 --> 00:29:03,883 Anuman ang bagay na ito ay tumuturo to-- at gumuhit ako tandang pananong, 666 00:29:03,883 --> 00:29:07,060 ngunit sa katotohanan, ay ito pagpunta sa maging isang bagay tulad ng Ox1, 2, 3, i-right? 667 00:29:07,060 --> 00:29:10,730 Ito ay ilang mga bogus halaga na lamang ang mangyayari sa maging doon mula sa bago. 668 00:29:10,730 --> 00:29:13,440 Kaya maglagay ng isa pang paraan, ito ay na waring buffer lamang 669 00:29:13,440 --> 00:29:16,180 na tumuturo sa isang bagay sa memorya. 670 00:29:16,180 --> 00:29:17,610 Wala akong mga ideya kung ano. 671 00:29:17,610 --> 00:29:24,130 >> Kaya kung nagta-type ako sa Gabe ngayon, ito ay pagpunta subukan upang ilagay ang g-a-b-e / 0 doon. 672 00:29:24,130 --> 00:29:25,530 Ngunit sino ang nakakaalam kung ano na? 673 00:29:25,530 --> 00:29:27,480 At sa nakaraan, anumang oras na sinubukan namin sa pagpindot 674 00:29:27,480 --> 00:29:29,770 memorya na ay hindi nabibilang sa amin, kung ano ang nangyari? 675 00:29:29,770 --> 00:29:31,020 676 00:29:31,020 --> 00:29:32,870 O halos sa tuwing. 677 00:29:32,870 --> 00:29:34,310 Segmentation fault, tama? 678 00:29:34,310 --> 00:29:37,829 >> Arrow na ito, wala akong mga ideya kung saan ito ay pagturo. ito lamang ang ilang mga random na halaga. 679 00:29:37,829 --> 00:29:40,370 At siyempre, kung bigyang-kahulugan sa iyo isang random na halaga bilang isang address, 680 00:29:40,370 --> 00:29:42,610 ka ng pagpunta sa pumunta sa ang ilang mga random na patutunguhan. 681 00:29:42,610 --> 00:29:46,810 Kaya maaari Gabe ng pag-crash sa katunayan ang aking mga programa sa kasong ito dito. 682 00:29:46,810 --> 00:29:50,600 >> Kaya kung ano ang magagawa natin na halos bilang masama? 683 00:29:50,600 --> 00:29:52,660 Isaalang-alang ang mga third at panghuling halimbawa ng scanf. 684 00:29:52,660 --> 00:29:53,890 685 00:29:53,890 --> 00:29:56,870 Ang bersyon na ito ay mas mahusay sa kung ano ang kahulugan? 686 00:29:56,870 --> 00:29:57,990 687 00:29:57,990 --> 00:30:01,400 Kung ikaw ay komportable na sa nakaraang problema, ito ay mas mahusay. 688 00:30:01,400 --> 00:30:02,250 Bakit? 689 00:30:02,250 --> 00:30:03,250 >> Madla: [INAUDIBLE]. 690 00:30:03,250 --> 00:30:06,235 691 00:30:06,235 --> 00:30:07,110 David J. MALAN: Mahusay. 692 00:30:07,110 --> 00:30:09,970 Kaya ito kaso ng 16 na linya ay mas mahusay, sa kamalayan 693 00:30:09,970 --> 00:30:12,030 na kami ay tahasan paglaan ng ilang mga memorya. 694 00:30:12,030 --> 00:30:14,190 Hindi namin ginagamit malloc, ginagamit namin ang 2 linggo 695 00:30:14,190 --> 00:30:16,060 diskarte ng pagdeklara lamang ng isang array. 696 00:30:16,060 --> 00:30:18,130 At ang sinabi namin bago na isang string lamang ang isang array ng mga character, 697 00:30:18,130 --> 00:30:19,690 kaya ito ay lubos na lehitimo. 698 00:30:19,690 --> 00:30:22,910 Pero, siyempre, bilang Tandaan mo, fixed laki, 16. 699 00:30:22,910 --> 00:30:25,440 >> Kaya programang ito ay ganap na ligtas, kung nagta-type ako 700 00:30:25,440 --> 00:30:29,760 sa mga string ng isang character, dalawang character mga string, 15 mga string ng character. 701 00:30:29,760 --> 00:30:34,970 Ngunit sa lalong madaling ako magsisimulang mag-type 16, 17, 18, 1,000 mga string ng character, 702 00:30:34,970 --> 00:30:37,390 kung saan na string ng pagpunta ay upang tapusin up? 703 00:30:37,390 --> 00:30:39,570 Ito ay pagpunta sa mga end up bahagyang dito. 704 00:30:39,570 --> 00:30:42,820 Ngunit pagkatapos na nakakaalam kung ano pa ay lagpas sa mga hangganan 705 00:30:42,820 --> 00:30:44,270 ng partikular na array? 706 00:30:44,270 --> 00:30:48,015 >> Ito ay waring na hindi ko na ipinahayag 16 mga kahon dito. 707 00:30:48,015 --> 00:30:49,300 708 00:30:49,300 --> 00:30:52,690 Kaya sa halip na gumuhit out ang lahat ng 16, ipapakita namin magpanggap lamang na iginuhit ko ang 16. 709 00:30:52,690 --> 00:30:56,540 Ngunit kung pagkatapos ay subukan ko upang basahin ang isang string na mas matagal, tulad ng 50 na character, 710 00:30:56,540 --> 00:31:01,270 Pupunta ako upang simulan ang paglagay a, b, c, d, x, y, z. 711 00:31:01,270 --> 00:31:04,916 At ito ay baka sa ilang ibang mga segment ng memory 712 00:31:04,916 --> 00:31:06,790 na iyon, muli, ay maaaring magsanhi ang aking mga programa ng pag-crash, 713 00:31:06,790 --> 00:31:10,600 dahil hindi ko na tinanong para sa kahit ano higit sa 16 bytes lamang. 714 00:31:10,600 --> 00:31:12,260 >> Kaya sino pinahahalagahan ng? 715 00:31:12,260 --> 00:31:13,880 Well, narito ang CS50 library. 716 00:31:13,880 --> 00:31:17,220 At karamihan sa mga ito ay isa lamang tulad ng mga tagubilin up tuktok. 717 00:31:17,220 --> 00:31:21,670 Ang CS50 library, lahat ng oras na ito, ipinagkaroon ang linyang ito sa 52 linya. 718 00:31:21,670 --> 00:31:23,680 Nasaksihan namin typedef, o makikita mo ang typedef 719 00:31:23,680 --> 00:31:27,930 sa pset 4, na lamang lumilikha ng isang kasingkahulugan kung saan char bituin ay maaaring maging mas 720 00:31:27,930 --> 00:31:29,290 lamang tinutukoy bilang string. 721 00:31:29,290 --> 00:31:31,540 Kaya ito ay isa sa mga ilang mga gulong pagsasanay 722 00:31:31,540 --> 00:31:34,120 na ginamit namin lihim sa ilalim ng hood. 723 00:31:34,120 --> 00:31:36,490 >> Samantala, narito ang pag-andar, getchar. 724 00:31:36,490 --> 00:31:38,190 Ngayon tila, walang katawan dito. 725 00:31:38,190 --> 00:31:40,273 At sa katunayan, kung panatilihing ako scroll, gagawin ko hindi talaga 726 00:31:40,273 --> 00:31:42,080 nakakakita ng anumang mga pagpapatupad ng mga pag-andar. 727 00:31:42,080 --> 00:31:43,140 728 00:31:43,140 --> 00:31:45,516 Bilang isang katinuan check, kung bakit ay na? 729 00:31:45,516 --> 00:31:46,795 >> Madla: [INAUDIBLE]. 730 00:31:46,795 --> 00:31:47,670 David J. MALAN: Oo. 731 00:31:47,670 --> 00:31:48,950 Kaya ito ay ang header ng file. 732 00:31:48,950 --> 00:31:52,520 At header file maglaman ng mga modelo, plus ilang iba pang mga bagay-bagay, ito ay tila, 733 00:31:52,520 --> 00:31:53,780 tulad ng typedefs. 734 00:31:53,780 --> 00:31:56,910 Ngunit sa CS50.c, na hindi namin hindi kailanman nagbigay sa iyo ng tahasan, 735 00:31:56,910 --> 00:32:02,100 ngunit naging sa CS50 appliance lahat oras na ito, malalim sa loob ng mga folder nito, 736 00:32:02,100 --> 00:32:04,990 mapansin na mayroong isang buo bungkos ng mga function in dito. 737 00:32:04,990 --> 00:32:06,720 >> Sa katunayan, ay mag-scroll pababa ipaalam. 738 00:32:06,720 --> 00:32:08,810 Sabihin huwag pansinin karamihan sa mga ito, sa ngayon. 739 00:32:08,810 --> 00:32:12,670 Ngunit mag-scroll pababa upang getInt at makita kung paano gumagana ang getInt. 740 00:32:12,670 --> 00:32:13,890 Kaya dito ay getInt. 741 00:32:13,890 --> 00:32:17,727 At kung ikaw man talaga cared kung paano makakuha ng int gumagana, narito ang dokumentasyon nito. 742 00:32:17,727 --> 00:32:19,560 At bukod sa mga bagay na sinasabi nito ay nagsasabi sa iyo ito 743 00:32:19,560 --> 00:32:21,340 kung ano ang maaari itong ibalik ang mga hanay ng mga halaga. 744 00:32:21,340 --> 00:32:24,400 Ito ay mahalagang mga negatibong 2000000000 sa positibong 2 bilyong, bigyan o tumagal. 745 00:32:24,400 --> 00:32:26,420 >> At ito ay lumiliko out, lahat ng ito oras, kahit na hindi namin kailanman 746 00:32:26,420 --> 00:32:28,570 ay tingnan mo ito, kung ang isang bagay napupunta mali, 747 00:32:28,570 --> 00:32:30,680 ito ay lumiliko out na ang lahat oras na ito, getInt ay 748 00:32:30,680 --> 00:32:33,600 Na-bumabalik isang espesyal na pare-pareho, hindi null, 749 00:32:33,600 --> 00:32:36,760 ngunit sa halip int_max, na convention ng programmer ni lamang. 750 00:32:36,760 --> 00:32:38,846 Ito ay nangangahulugang dito ay isang espesyal na halaga. 751 00:32:38,846 --> 00:32:41,470 Tiyaking upang tingnan ang mga ito, tulad lamang kung sakaling isang bagay napupunta mali. 752 00:32:41,470 --> 00:32:43,261 Ngunit hindi kailanman namin ang bothered may na sa petsa, 753 00:32:43,261 --> 00:32:45,200 dahil muli, ito Nakalaan lamang ito upang gawing simple. 754 00:32:45,200 --> 00:32:46,950 >> Ngunit paano ito getInt makakuha ng ipinatupad? 755 00:32:46,950 --> 00:32:48,450 Well, isa, ito ay tumatagal ng walang mga argumento. 756 00:32:48,450 --> 00:32:49,390 Alam namin na iyon. 757 00:32:49,390 --> 00:32:50,820 Ibinabalik nito ang isang int. 758 00:32:50,820 --> 00:32:51,950 Alam namin na iyon. 759 00:32:51,950 --> 00:32:54,460 Kaya paano ito gumagana sa ilalim ng hood? 760 00:32:54,460 --> 00:32:58,290 >> Kaya mayroong tila isang walang-katapusang loop, hindi bababa sa ang hitsura ng isa. 761 00:32:58,290 --> 00:33:00,290 Pansinin na ginagamit namin getString. 762 00:33:00,290 --> 00:33:04,000 Kaya na ay nakawiwili. getInt tawag ating sariling function, getString. 763 00:33:04,000 --> 00:33:05,645 At ngayon bakit maaaring ito ang kaso? 764 00:33:05,645 --> 00:33:07,400 765 00:33:07,400 --> 00:33:09,842 Bakit ako pagiging nagtatanggol dito sa 165 linya? 766 00:33:09,842 --> 00:33:11,390 767 00:33:11,390 --> 00:33:15,639 Ano ang maaaring mangyari sa linya 164, upang maging malinaw lang? 768 00:33:15,639 --> 00:33:16,930 Ito ay ang parehong sagot tulad ng dati. 769 00:33:16,930 --> 00:33:18,660 770 00:33:18,660 --> 00:33:20,089 Maaari lamang maging out sa memorya. 771 00:33:20,089 --> 00:33:23,130 Isang bagay na napupunta mali sa getString, na kailangan namin upang magawang upang mahawakan ang mga iyon. 772 00:33:23,130 --> 00:33:27,070 At ang dahilan kung hindi ako bumalik null ay iyon, technically, null ay isang pointer. 773 00:33:27,070 --> 00:33:29,120 getInt ay may upang bumalik sa isang int. 774 00:33:29,120 --> 00:33:31,060 Kaya na hindi ko na nagkataon Nagpasya, mahalagang, 775 00:33:31,060 --> 00:33:34,600 na 2000000000, bigyan o tumagal, ay pagpunta upang maging isang espesyal na halaga na maaari kong hindi kailanman 776 00:33:34,600 --> 00:33:35,970 talagang makakuha mula sa user. 777 00:33:35,970 --> 00:33:39,930 Ito ay lamang ng isang halaga pupuntahan ko upang mag-aaksaya ng kinakatawan ang isang error code. 778 00:33:39,930 --> 00:33:41,540 >> Kaya ngayon, mga bagay makakuha ng isang maliit magarbong. 779 00:33:41,540 --> 00:33:44,670 At ito ay hindi masyadong ang parehong pag-andar tulad ng dati, ngunit ito ay halos katulad na. 780 00:33:44,670 --> 00:33:50,120 Kaya mapansin, Dinedeklara ko dito, sa linya 172, parehong isang int n at isang char c. 781 00:33:50,120 --> 00:33:53,600 At pagkatapos kong gamitin ito funky linya, sscanf, kung saan ito ay lumiliko out 782 00:33:53,600 --> 00:33:55,990 ay hindi i-scan ang isang string mula sa keyboard. 783 00:33:55,990 --> 00:33:59,226 Ito ay nakatayo sa isang umiiral na string ang user ay nag-type sa. 784 00:33:59,226 --> 00:34:02,100 Kaya na tinatawag ko getString, na Nangangahulugan ba akong magkaroon ng isang string sa memory. 785 00:34:02,100 --> 00:34:05,020 sscanf ay kung ano ang gusto mo tumawag sa isang pag-parse ng function. 786 00:34:05,020 --> 00:34:07,760 Tinitingnan nito ang string na hindi ko na nai-type sa, ng character sa pamamagitan ng character, 787 00:34:07,760 --> 00:34:09,250 at ang isang bagay na kapaki-pakinabang. 788 00:34:09,250 --> 00:34:10,969 String na naka-imbak sa linya. 789 00:34:10,969 --> 00:34:13,560 At alam ko na lamang sa pamamagitan ng pagpunta i-back up dito at sinasabi, oh, OK, 790 00:34:13,560 --> 00:34:15,143 Tumawag ako ito hindi s oras na ito, ngunit linya. 791 00:34:15,143 --> 00:34:15,989 792 00:34:15,989 --> 00:34:18,080 >> At ngayon ito ay isang maliit na naiiba. 793 00:34:18,080 --> 00:34:22,480 Ngunit ito ay nangangahulugan na epektibo, para sa mga kadahilanang kami ay medyo iwagayway ang aming mga kamay sa ngayon, 794 00:34:22,480 --> 00:34:26,070 na namin ang pagsuri sa makita kung ang gumagamit ay nai-type sa 795 00:34:26,070 --> 00:34:29,909 at int at siguro ay isa pang character. 796 00:34:29,909 --> 00:34:33,610 Kung ang gumagamit na nai-type sa isang int, ito ay pagpunta sa ay naka-imbak sa n, dahil ako 797 00:34:33,610 --> 00:34:36,739 pagpasa ito sa pamamagitan ng address, ang bagong nanlilinlang nakakita kami ngayon. 798 00:34:36,739 --> 00:34:41,570 Kung ang gumagamit na nai-type rin tulad ng sa 123x, na x 799 00:34:41,570 --> 00:34:45,060 Mawawala na upang tapusin up ng isang sulat sa karakter c. 800 00:34:45,060 --> 00:34:48,739 >> Ngayon ito ay lumiliko out na sscanf ay magsasabi sa akin, intelligently, 801 00:34:48,739 --> 00:34:54,750 kung gaano karaming mga variable ay sscanf Matagumpay na magagawang upang punan. 802 00:34:54,750 --> 00:34:58,770 Kaya sa pamamagitan ng logic na ito, kung ang function Ako pagpapatupad ay getInt, 803 00:34:58,770 --> 00:35:00,900 ngunit Lalabas na ako, potensyal na, para sa user 804 00:35:00,900 --> 00:35:04,190 sa na-type sa isang int sinundan ng ibang bagay, 805 00:35:04,190 --> 00:35:08,580 kung ano ang nais kong sscanf ni return halaga tunay na maging? 806 00:35:08,580 --> 00:35:10,950 Kung ang layunin ay upang makakuha ng lamang sa isang int mula sa user? 807 00:35:10,950 --> 00:35:13,980 808 00:35:13,980 --> 00:35:19,300 >> Kaya kung sscanf babalik 2, ano ang ibig sabihin na? 809 00:35:19,300 --> 00:35:21,660 Ang gumagamit na nai-type sa isang bagay tulad ng, literal, 810 00:35:21,660 --> 00:35:24,770 123x, na lamang ang walang katuturang. 811 00:35:24,770 --> 00:35:27,490 Ito ay isang kondisyon na error, at Gusto kong mag-check para sa mga iyon. 812 00:35:27,490 --> 00:35:32,960 >> Kaya kung ang mga uri ng gumagamit na ito sa, sa pamamagitan ng logic na ito, kung ano ang ginagawa sscanf bumalik, 813 00:35:32,960 --> 00:35:33,740 Gusto mo sabihin? 814 00:35:33,740 --> 00:35:35,070 815 00:35:35,070 --> 00:35:39,130 Kaya ito ang nangyayari upang bumalik 2, dahil ang 123 ay pagpunta sa pumunta sa dito, 816 00:35:39,130 --> 00:35:41,580 at ang x ay pagpunta sa mga end up in dito. 817 00:35:41,580 --> 00:35:43,970 Ngunit hindi ko nais ang x upang makakuha ng mga puno. 818 00:35:43,970 --> 00:35:48,580 Gusto kong sscanf upang magtagumpay lamang sa pagpuno ang una sa mga variable nito. 819 00:35:48,580 --> 00:35:52,490 At sa gayon ay ang dahilan kung bakit ako nais sscanf upang bumalik 1. 820 00:35:52,490 --> 00:35:55,750 >> At kung ito ay isang bit sa ibabaw ng ulo para sa sandaling ito, na ganap fine. 821 00:35:55,750 --> 00:36:00,030 Napagtanto bagaman, na isa sa mga mga halaga ng getInt at getString 822 00:36:00,030 --> 00:36:03,630 ay na aming ginagawa isang heck ng isang maraming error pagsuri ganito kaya 823 00:36:03,630 --> 00:36:07,130 na, sa petsa, maaari mong halos i-type ang anumang bagay sa iyong keyboard, 824 00:36:07,130 --> 00:36:08,490 at kami ay mahuli ito. 825 00:36:08,490 --> 00:36:10,592 At kami ay tiyak na, ang kawani, talagang ay hindi 826 00:36:10,592 --> 00:36:13,300 maging ang pinagmulan ng isang bug sa iyong programa, dahil kami defensively 827 00:36:13,300 --> 00:36:16,270 pagsusuri para sa lahat ng mga hangal bagay na maaaring gawin ng isang user, 828 00:36:16,270 --> 00:36:18,900 tulad ng pag-type ng isang string, kapag mo ba talagang gusto int. 829 00:36:18,900 --> 00:36:21,350 Kaya para now-- namin dumating bumalik sa mga ito bago long-- 830 00:36:21,350 --> 00:36:23,710 ngunit sa lahat ng oras na ito, getString at getInt mayroon 831 00:36:23,710 --> 00:36:29,950 naging sa ilalim ng hood ng paggamit na ito pangunahing ideya ng mga address ng memorya. 832 00:36:29,950 --> 00:36:32,580 >> Kaya ngayon, gumawa ng mga bagay na ipaalam sa isang maliit na mas user-friendly. 833 00:36:32,580 --> 00:36:38,740 Bilang maaari mong isipin, mula sa huling Binky time-- kung ang aking mouse ay cooperate-- kaya 834 00:36:38,740 --> 00:36:42,560 nagkaroon kami ang code na ito, na tapat, ay medyo walang saysay. 835 00:36:42,560 --> 00:36:45,330 Ang code na ito ay walang Nakakamit kapaki-pakinabang, ngunit ito ay ang halimbawa 836 00:36:45,330 --> 00:36:48,330 na propesor Parlante ginamit upang kumatawan 837 00:36:48,330 --> 00:36:51,840 kung ano ang nagaganap sa isang programa na kinasasangkutan ng memorya. 838 00:36:51,840 --> 00:36:54,850 >> Kaya sabihin retell ito kuwento super panandalian. 839 00:36:54,850 --> 00:36:58,720 Ang mga unang dalawang linya, sa Ingles, huwag kung ano, gusto mong sabihin? 840 00:36:58,720 --> 00:37:01,230 841 00:37:01,230 --> 00:37:05,430 In lamang makatuwirang tao, ngunit bahagyang teknikal na termino, maglaan ng ulos. 842 00:37:05,430 --> 00:37:06,346 Madla: [INAUDIBLE]. 843 00:37:06,346 --> 00:37:07,705 844 00:37:07,705 --> 00:37:11,080 >> David J. MALAN: OK, na iyong pagtatag address para sa iyong x at y variable. 845 00:37:11,080 --> 00:37:15,520 Hindi masyadong, dahil ang x at y ay hindi variable sa tradisyonal na kahulugan. 846 00:37:15,520 --> 00:37:18,054 x at y ay address o mag-iimbak ang address. 847 00:37:18,054 --> 00:37:19,220 Kaya sabihin subukan ito nang isa pang beses. 848 00:37:19,220 --> 00:37:21,010 Hindi isang masamang simula, bagaman. 849 00:37:21,010 --> 00:37:21,510 Oo? 850 00:37:21,510 --> 00:37:22,426 >> Madla: [INAUDIBLE]. 851 00:37:22,426 --> 00:37:23,966 852 00:37:23,966 --> 00:37:24,840 David J. MALAN: Mahusay. 853 00:37:24,840 --> 00:37:26,173 Sa tingin ko na ang isang ilan mas malinis. 854 00:37:26,173 --> 00:37:28,630 Ang pagdeklara ng dalawang mga payo, dalawang integer. 855 00:37:28,630 --> 00:37:30,150 At kami ay pagtawag sa kanila x at y. 856 00:37:30,150 --> 00:37:32,790 O kung kami ay upang gumuhit ito bilang isang larawan, muli, 857 00:37:32,790 --> 00:37:36,410 isipin nang bahagyang lamang na ang lahat kami ay ginagawa sa na unang linya 858 00:37:36,410 --> 00:37:39,690 ay ang pagguhit ng isang kahon na tulad nito, na may ilang mga halaga ng basura sa loob nito, 859 00:37:39,690 --> 00:37:41,920 at pagtawag ito X, at pagkatapos ay isa pang kahon na tulad nito, 860 00:37:41,920 --> 00:37:43,880 na may ilang mga halaga ng basura nasa loob nito, pagtawag ito y. 861 00:37:43,880 --> 00:37:45,810 Ipinahayag kami ng dalawang mga payo na ganap 862 00:37:45,810 --> 00:37:47,860 mag-iimbak ang address ng isang int. 863 00:37:47,860 --> 00:37:49,170 Kaya na ang lahat doon. 864 00:37:49,170 --> 00:37:53,290 >> Kaya kapag ginawa ito Binky, ang clay lamang mukhang ito. 865 00:37:53,290 --> 00:37:55,350 At Nick lang ang uri ng balot up ang mga arrow, 866 00:37:55,350 --> 00:37:57,590 na waring hindi sila na tumuturo sa kahit saan sa partikular, dahil sila lamang 867 00:37:57,590 --> 00:37:58,250 mga halaga ng basura. 868 00:37:58,250 --> 00:38:01,670 Hindi sila naka tahasang nasimulan kahit saan sa partikular na. 869 00:38:01,670 --> 00:38:03,980 >> Ngayon ang susunod na linya ng code, pagpapabalik, ay ito. 870 00:38:03,980 --> 00:38:07,510 Kaya sa makatwirang user-friendly, pero medyo teknikal na Ingles, 871 00:38:07,510 --> 00:38:09,790 kung ano ito linya ng paggawa code? 872 00:38:09,790 --> 00:38:10,391 Oo? 873 00:38:10,391 --> 00:38:11,333 >> Madla: [INAUDIBLE]. 874 00:38:11,333 --> 00:38:12,746 875 00:38:12,746 --> 00:38:13,950 >> David J. MALAN: Perpekto. 876 00:38:13,950 --> 00:38:17,016 Ito ay naglalaan ng chunk ng memorya na ang laki ng isang int. 877 00:38:17,016 --> 00:38:18,140 At iyon ang kalahati ng mga sagot. 878 00:38:18,140 --> 00:38:20,056 Sinagot kang karapatan kalahati ng expression. 879 00:38:20,056 --> 00:38:22,473 Ano ang nangyayari sa kaliwang bahagi ng katumbas sign? 880 00:38:22,473 --> 00:38:22,972 Oo? 881 00:38:22,972 --> 00:38:24,814 Madla: At pinaglaanan ito sa variable x? 882 00:38:24,814 --> 00:38:27,690 >> David J. MALAN: At pinaglaanan ito sa variable na x. 883 00:38:27,690 --> 00:38:31,650 Kaya sa pagbabalik-tanaw, kanang bahagi naglalaan sapat na memorya upang mag-imbak sa isang int. 884 00:38:31,650 --> 00:38:34,150 Ngunit malloc partikular Ibinabalik ang address 885 00:38:34,150 --> 00:38:37,270 ng na chunk ng memorya, na hindi mo lamang ipinanukalang ay makakakuha ng naka-imbak sa x. 886 00:38:37,270 --> 00:38:42,560 >> Kaya kung ano ang ginawa ni Pedro huling beses na may Binky ay nag-drag siya na pointer out, ang luad, 887 00:38:42,560 --> 00:38:46,820 upang ituro na ngayon sa isang puting chunk ng memorya na katumbas ng laki ng isang int. 888 00:38:46,820 --> 00:38:49,360 At sa katunayan, na nilalayong upang kumatawan sa apat na bytes. 889 00:38:49,360 --> 00:38:55,310 >> Ngayon, ang susunod na linya ng code ginawa ito, bituin x nakakakuha ng 42. 890 00:38:55,310 --> 00:38:58,530 Kaya 42 ay prangka sa ng kanang bahagi, kahulugan ng buhay. 891 00:38:58,530 --> 00:39:00,500 Kaliwa-bahagi, bituin x nangangahulugan kung ano? 892 00:39:00,500 --> 00:39:01,600 893 00:39:01,600 --> 00:39:03,280 Masyadong na maaaring mayroon gone-- na OK lang. 894 00:39:03,280 --> 00:39:04,220 OK. 895 00:39:04,220 --> 00:39:06,875 >> Madla: isa lamang, pumunta sa [INAUDIBLE] 896 00:39:06,875 --> 00:39:07,750 David J. MALAN: Mahusay. 897 00:39:07,750 --> 00:39:08,760 Madla: [INAUDIBLE]. 898 00:39:08,760 --> 00:39:09,760 David J. MALAN: Eksaktong. 899 00:39:09,760 --> 00:39:11,979 Nangangahulugan pumunta sa x kaliwang bahagi. 900 00:39:11,979 --> 00:39:12,520 x ay address. 901 00:39:12,520 --> 00:39:15,520 Ito ay tulad ng 33 Oxford Street, o Ox1. 902 00:39:15,520 --> 00:39:18,690 At star x nangangahulugan pumunta sa na tugunan at ilagay kung ano ang doon? 903 00:39:18,690 --> 00:39:19,520 42. 904 00:39:19,520 --> 00:39:21,290 >> Kaya sa katunayan, iyon mismo kung ano ang ginawa ni Pedro. 905 00:39:21,290 --> 00:39:23,740 Sinimulan niya sa pamamagitan ng, mahalagang, itak 906 00:39:23,740 --> 00:39:26,270 pagturo ng isang daliri sa x, ng pagsunod sa mga arrow 907 00:39:26,270 --> 00:39:30,670 upang ang puting kahon sa kanang-kamay gilid, at paglalagay ng numero ng 42 doon. 908 00:39:30,670 --> 00:39:34,120 Ngunit pagkatapos ng mga bagay Nakakuha ng maliit na mapanganib, i-right? 909 00:39:34,120 --> 00:39:35,860 Binky tungkol sa mawala ang kanyang ulo. 910 00:39:35,860 --> 00:39:39,465 >> Star y ay katumbas ng 13, masamang kapalaran, ang ibig sabihin kung ano? 911 00:39:39,465 --> 00:39:43,620 Kaya star y paraan pumunta sa address sa y. 912 00:39:43,620 --> 00:39:45,630 Ngunit ano ay ang address sa y? 913 00:39:45,630 --> 00:39:47,899 914 00:39:47,899 --> 00:39:49,440 Ang lahat ng mga karapatan, ito ay ang halaga ng basura, tama? 915 00:39:49,440 --> 00:39:50,800 Iginuhit ko ito bilang isang tandang pananong. 916 00:39:50,800 --> 00:39:54,850 Nick iginuhit mo ito bilang isang kulutin up arrow. 917 00:39:54,850 --> 00:39:59,600 At sa lalong madaling mo subukang mag- gawin bituin y, na sinasabi pumunta doon, 918 00:39:59,600 --> 00:40:03,872 ngunit mayroong hindi isang lehitimong address, ito ang ilang bogus lokasyon, 919 00:40:03,872 --> 00:40:05,080 ang programa pupuntahan crash. 920 00:40:05,080 --> 00:40:08,580 At tumuloy Binky ay pagpunta upang lumipad off dito, tulad ng ginawa ito. 921 00:40:08,580 --> 00:40:12,130 >> Kaya sa katapusan, ang program na ito ay isa lamang flat out flaw. 922 00:40:12,130 --> 00:40:13,540 Ito ay isang program na mayroong bug. 923 00:40:13,540 --> 00:40:14,760 At kinakailangan na ito ay naayos na. 924 00:40:14,760 --> 00:40:18,260 At ang tanging paraan, talaga ito, ayusin ito ay magiging, halimbawa, ang linyang ito, 925 00:40:18,260 --> 00:40:21,010 na kung saan hindi namin kahit na ang nakuha sa, dahil Nag-crash ang programa masyadong sa lalong madaling panahon. 926 00:40:21,010 --> 00:40:26,170 Ngunit kung kami ay upang ayusin ito, kung ano ang ang epekto ng paggawa y katumbas x magkaroon? 927 00:40:26,170 --> 00:40:30,010 Well, mahalagang ito tumuturo sa y kahit anong halaga x nakaturo sa. 928 00:40:30,010 --> 00:40:32,430 >> Kaya sa kuwento ni Pedro, o kuwento ni Binky, parehong 929 00:40:32,430 --> 00:40:34,640 x at y ay tumuturo sa ang puting chunk ng memorya, 930 00:40:34,640 --> 00:40:38,300 nang sa gayon, sa wakas, kapag nag- huwag lagyan ng star ang y ay katumbas muli 13, 931 00:40:38,300 --> 00:40:43,080 magtapos ka ng hanggang 13 paglalagay sa ang naaangkop na lokasyon. 932 00:40:43,080 --> 00:40:47,640 Kaya lahat ng mga linyang ito ay perpektong lehitimo, maliban para sa isa, 933 00:40:47,640 --> 00:40:51,730 kapag ito ay nangyari bago mo aktwal na itinalaga y ilang mga halaga. 934 00:40:51,730 --> 00:40:54,290 >> Ngayon thankfully, hindi mo gusto kailangang dahilan sa lahat 935 00:40:54,290 --> 00:40:56,560 ng mga ganitong uri ng mga isyu sa iyong sarili. 936 00:40:56,560 --> 00:40:59,310 Hayaan akong sige at buksan up ng isang terminal na window dito 937 00:40:59,310 --> 00:41:03,050 at buksan up, para sa isang sandali lamang, super maikling programa na 938 00:41:03,050 --> 00:41:04,360 rin ay isang uri ng pointless. 939 00:41:04,360 --> 00:41:05,152 Ito ay pangit. 940 00:41:05,152 --> 00:41:06,610 Hindi nito makamit ang anumang bagay na kapaki-pakinabang. 941 00:41:06,610 --> 00:41:10,180 Ngunit ito ay nagpapakita ng mga isyu ng memorya, kaya tumagal ng isang hitsura ipaalam. 942 00:41:10,180 --> 00:41:11,830 >> Main, sobrang simple. 943 00:41:11,830 --> 00:41:14,830 Ito tila tawag ng isang function, f, at pagkatapos ay bumalik 0. 944 00:41:14,830 --> 00:41:16,310 Ito ay uri ng mahirap na gulo na ito up. 945 00:41:16,310 --> 00:41:18,540 Kaya Main ay medyo mabuti, sa ngayon. 946 00:41:18,540 --> 00:41:20,100 >> Kaya f ay may problemang. 947 00:41:20,100 --> 00:41:22,120 At lamang ay hindi ilagay magkano pagsisikap sa pagbibigay ng pangalan nito 948 00:41:22,120 --> 00:41:23,990 dito, upang panatilihin ang focus sa code. 949 00:41:23,990 --> 00:41:25,740 f ay may dalawang linya. 950 00:41:25,740 --> 00:41:27,610 At sa kung ano ang ngayon ng pagpunta sa ipaalam. 951 00:41:27,610 --> 00:41:29,840 Kaya sa isang banda here-- at ipaalam sa akin gumawa 952 00:41:29,840 --> 00:41:32,680 ito pare-pareho sa nakaraang example-- sa isang banda, 953 00:41:32,680 --> 00:41:35,830 kaliwang panig ay ginagawa kung ano ang, sa Ingles? 954 00:41:35,830 --> 00:41:36,493 Is-- ito 955 00:41:36,493 --> 00:41:37,701 Madla: Paglikha ng isang pointer. 956 00:41:37,701 --> 00:41:40,830 David J. MALAN: Paglikha ng isang pointer papunta sa isang int at pagtawag ito x. 957 00:41:40,830 --> 00:41:43,789 Kaya ito ay ang paglikha ng isa sa mga kahon Ako panatilihing pagguhit ang touch screen. 958 00:41:43,789 --> 00:41:45,913 At ngayon, sa kanang-kamay gilid, malloc, siyempre, 959 00:41:45,913 --> 00:41:47,420 ay naglalaan ng isang chunk ng memorya. 960 00:41:47,420 --> 00:41:49,989 At upang maging malinaw lamang, kung paano maraming memorya ay tila ito 961 00:41:49,989 --> 00:41:52,030 paglalaan, kung ikaw lamang uri ng gawin ang matematika dito? 962 00:41:52,030 --> 00:41:53,200 963 00:41:53,200 --> 00:41:54,040 >> Kaya 40 bytes. 964 00:41:54,040 --> 00:41:57,400 At alam ko na dahil lamang Alam ko ang isang int, sa CS50 appliance, hindi bababa sa, 965 00:41:57,400 --> 00:41:58,060 ay apat na bytes. 966 00:41:58,060 --> 00:41:59,610 Kaya 10 beses 4 ay 40. 967 00:41:59,610 --> 00:42:04,924 Kaya ito ay ang pag-iimbak ng isang x, ang address ng unang out ng 40 ints na 968 00:42:04,924 --> 00:42:07,340 Nai-inilaan na puwang likod, upang i-back, i-back, sa likod. 969 00:42:07,340 --> 00:42:08,470 >> At iyon ang kung ano ang key tungkol sa malloc. 970 00:42:08,470 --> 00:42:11,261 Hindi nito tumagal ng kaunti memory dito, may kaunting panahon dito, ng kaunti dito. 971 00:42:11,261 --> 00:42:14,220 Nagbibigay ito sa iyo ng isang chunk ng memorya, contiguously, mula sa operating 972 00:42:14,220 --> 00:42:15,240 system. 973 00:42:15,240 --> 00:42:18,500 >> Kung ano ang tungkol sa ngayon, x 10 bracket ay katumbas ng 0? 974 00:42:18,500 --> 00:42:19,470 Di-makatwirang linya ng code. 975 00:42:19,470 --> 00:42:21,100 Hindi nito makamit ang anumang bagay na kapaki-pakinabang. 976 00:42:21,100 --> 00:42:26,128 Ngunit ito ay kawili-wili, dahil x bracket 10--? 977 00:42:26,128 --> 00:42:26,628 Oo? 978 00:42:26,628 --> 00:42:27,912 >> Madla: [INAUDIBLE]? 979 00:42:27,912 --> 00:42:30,500 >> David J. MALAN: x bracket 10 ay hindi kailangang maging null. 980 00:42:30,500 --> 00:42:35,070 Nanggagaling lamang ang detalye null sa pag-play sa mga string, sa dulo ng isang string. 981 00:42:35,070 --> 00:42:36,700 Ngunit isang mahusay na pag-iisip. 982 00:42:36,700 --> 00:42:39,615 >> Gaano kalaki ito ay array, kahit na bagaman ilalaan ko ang 40 bytes? 983 00:42:39,615 --> 00:42:42,560 984 00:42:42,560 --> 00:42:43,690 Ito'y 0 sa pamamagitan ng siyam, tama? 985 00:42:43,690 --> 00:42:45,120 Ito ay 10 ints, kabuuang. 986 00:42:45,120 --> 00:42:48,790 40 bytes, ngunit 10 ints, 0-index sa pamamagitan ng 0. 987 00:42:48,790 --> 00:42:50,930 >> Kaya kung ano ay ang x 10 bracket? 988 00:42:50,930 --> 00:42:53,090 Ito ay talagang ilang hindi alam na halaga ng basura. 989 00:42:53,090 --> 00:42:54,780 Ito ay memorya na ay hindi nabibilang sa akin. 990 00:42:54,780 --> 00:42:59,650 Hindi ko dapat na nakadikit na byte numero 41, 42, 43, 44. 991 00:42:59,650 --> 00:43:01,420 Pupunta ako bahagyang Masyadong malayo. 992 00:43:01,420 --> 00:43:04,490 >> At sa katunayan, kung nagpatakbo ako ng ito programa, maaari itong napakahusay crash. 993 00:43:04,490 --> 00:43:05,790 Ngunit minsan, magpapadala kami makakuha ng masuwerteng. 994 00:43:05,790 --> 00:43:07,706 At kaya lamang upang ipakita this-- at tapat, 995 00:43:07,706 --> 00:43:11,000 hindi mo na malaman bago ka ni patakbuhin ang ko it-- ipaalam. 996 00:43:11,000 --> 00:43:12,480 Hindi ito aktwal na pag-crash. 997 00:43:12,480 --> 00:43:15,032 >> Ngunit kung binago ko ito, para Halimbawa, upang maging katulad ng 1,000, 998 00:43:15,032 --> 00:43:16,740 upang gawin ito talaga sinadya, sabihin makita 999 00:43:16,740 --> 00:43:18,710 kung maaari naming makakuha ng mga ito sa pag-crash ng oras na ito. 1000 00:43:18,710 --> 00:43:20,070 OK, hindi ito nagka-crash. 1001 00:43:20,070 --> 00:43:22,600 Paano tungkol sa 100,000? 1002 00:43:22,600 --> 00:43:25,000 Remake ni ito Hayaan, at ngayon muling patakbuhin ito. 1003 00:43:25,000 --> 00:43:25,500 OK. 1004 00:43:25,500 --> 00:43:25,960 Phew. 1005 00:43:25,960 --> 00:43:26,460 Lahat ng karapatan. 1006 00:43:26,460 --> 00:43:29,090 Kaya tila, muli, ang mga segment ng memory, kaya upang makipag-usap, 1007 00:43:29,090 --> 00:43:32,660 ay makatwirang malaki, kaya magagawa namin makakuha ng masuwerteng muli at muli. 1008 00:43:32,660 --> 00:43:36,510 Ngunit kalaunan, sa sandaling makakuha ka ng katawa-tawa at talagang pumunta malayo out sa screen, 1009 00:43:36,510 --> 00:43:39,120 hinawakan mo memory na talaga ito, talaga ay hindi nabibilang sa iyo. 1010 00:43:39,120 --> 00:43:40,870 >> Ngunit tapat, ang mga mga uri ng mga bug ay pagpunta 1011 00:43:40,870 --> 00:43:43,020 upang maging mas mahirap at mas mahirap upang malaman sa inyong sarili. 1012 00:43:43,020 --> 00:43:47,880 Ngunit thankfully, bilang programmer, mayroon kaming mga tool na nagbibigay-daan sa amin upang gawin ito para sa amin. 1013 00:43:47,880 --> 00:43:50,140 Kaya ito ay, marahil, isa ng ugliest mga programa, 1014 00:43:50,140 --> 00:43:52,060 kahit hindi maganda kaysa sa output ng gdb. 1015 00:43:52,060 --> 00:43:55,670 Ngunit ito palaging ay may linya o dalawang na ito ay sukdulang kapaki-pakinabang. 1016 00:43:55,670 --> 00:44:00,310 >> Valgrind ay isang programa na tumutulong sa hindi mo i-debug ng isang program, bawat se, 1017 00:44:00,310 --> 00:44:03,500 ngunit mahanap memory-kaugnay na mga problema, partikular. 1018 00:44:03,500 --> 00:44:07,590 Ito ay awtomatikong tumakbo ang iyong code para sa mo at hanapin para sa hindi bababa sa dalawang bagay. 1019 00:44:07,590 --> 00:44:10,680 Ang isa, ginawa ka ng isang bagay ang hindi sinasadyang tulad ugnay memory 1020 00:44:10,680 --> 00:44:11,980 na hindi nabibilang sa iyo? 1021 00:44:11,980 --> 00:44:13,590 Ito ay makakatulong sa iyo na makahanap ng mga kasong iyon. 1022 00:44:13,590 --> 00:44:15,710 >> At dalawang, makakatulong ito sa nakahanap ka ng bagay na tinatawag na 1023 00:44:15,710 --> 00:44:19,270 memory paglabas, na kung saan mayroon kaming ganap na hindi pinansin, naively, 1024 00:44:19,270 --> 00:44:21,380 para sa ilang mga oras at blissfully. 1025 00:44:21,380 --> 00:44:23,140 Ngunit ito ay lumiliko out, lahat oras na ito, sa tuwing 1026 00:44:23,140 --> 00:44:26,620 mo na tinatawag na getString sa kaya marami sa aming mga programa, 1027 00:44:26,620 --> 00:44:28,930 ka na humihiling sa operating system para sa memorya, 1028 00:44:28,930 --> 00:44:32,070 ngunit mayroon kang anumang mga recollection ng kailanman pagbibigay ito 1029 00:44:32,070 --> 00:44:36,169 pabalik, ang paggawa unalloc, o libre, bilang ang tawag dito. 1030 00:44:36,169 --> 00:44:37,960 Hindi, dahil hindi namin kailanman tinanong mo na gawin ito. 1031 00:44:37,960 --> 00:44:41,250 >> Ngunit ang lahat ng oras na ito, ang mga programa nagsusulat ka sa C 1032 00:44:41,250 --> 00:44:43,800 Nai-leaking memorya, pagtatanong sa operating 1033 00:44:43,800 --> 00:44:46,190 system para sa higit pa at higit pa memory para sa string at whatnot, 1034 00:44:46,190 --> 00:44:47,870 ngunit hindi handing ito pabalik. 1035 00:44:47,870 --> 00:44:50,080 At ngayon ito ay isang bit ng isang oversimplification, 1036 00:44:50,080 --> 00:44:53,550 ngunit kung hindi mo kailanman tumakbo ang iyong Mac o iyong PC para sa masyadong ilang panahon, pambungad na 1037 00:44:53,550 --> 00:44:55,790 ng maraming mga programa, siguro pagsasara ng programa, 1038 00:44:55,790 --> 00:44:57,795 at kahit na ang iyong computer na ay hindi nag-crash, 1039 00:44:57,795 --> 00:45:01,690 nakakakuha ito ng kaya magkano ang mas mabagal, na waring talaga 1040 00:45:01,690 --> 00:45:04,290 paggamit ng maraming memorya o mga mapagkukunan, kahit na, 1041 00:45:04,290 --> 00:45:06,070 kung hindi ka pa kahit na pagpindot sa keyboard, 1042 00:45:06,070 --> 00:45:10,430 na maaaring be-- ngunit hindi always-- ng dati maging ang mga programa na iyong pinapatakbo 1043 00:45:10,430 --> 00:45:11,920 Mayroon kanilang sarili memorya paglabas. 1044 00:45:11,920 --> 00:45:15,645 At panatilihin ang mga ito na humihiling sa mga OS para sa higit pa at higit pang memory, ngunit forgetting tungkol dito, 1045 00:45:15,645 --> 00:45:18,470 hindi tunay na paggamit, subalit samakatuwid pagkuha ng memory layo 1046 00:45:18,470 --> 00:45:20,500 mula sa iba pang mga programa na maaaring gusto. 1047 00:45:20,500 --> 00:45:23,940 Kaya na ang isang karaniwang paliwanag. 1048 00:45:23,940 --> 00:45:25,940 Ngayon narito ang kung saan Valgrind ni output ay lubos na 1049 00:45:25,940 --> 00:45:29,290 atrocious sa mga hindi gaanong at higit pa kumportableng magkamukha. 1050 00:45:29,290 --> 00:45:32,690 Ngunit ang mga kagiliw-giliw bagay-bagay ay tama up dito. 1051 00:45:32,690 --> 00:45:37,060 Ito ay nagsasabi sa akin ng isang di-wastong write ng laki ng apat na mangyayari sa programang ito, 1052 00:45:37,060 --> 00:45:40,640 sa partikular, sa 21 na linya ng memory.c. 1053 00:45:40,640 --> 00:45:45,450 >> Kung pumunta ako sa line 21, Hm, sa katunayan doon ay isang di-wastong write ng laki apat. 1054 00:45:45,450 --> 00:45:46,250 Bakit ang laki ng apat? 1055 00:45:46,250 --> 00:45:49,500 Well, ito number-- at ito ay maaaring anything-- ay isang int. 1056 00:45:49,500 --> 00:45:50,450 Kaya apat na bytes. 1057 00:45:50,450 --> 00:45:52,550 Kaya ako ng paglalagay ng apat na bytes kung saan hindi nila pag-aari. 1058 00:45:52,550 --> 00:45:55,080 Iyon ang dahilan kung ano Valgrind ay aktwal na nagsasabi sa akin. 1059 00:45:55,080 --> 00:45:57,600 Bukod dito, ito ay din sabihin sa akin, dahil kakailanganin namin nakikita, 1060 00:45:57,600 --> 00:46:01,490 bilang patakbuhin mo ito sa isang susunod na pset, kung at kapag iyong na-leaked memory, na sa katunayan 1061 00:46:01,490 --> 00:46:05,300 Mayroon akong, dahil na-Tumawag ako malloc, ngunit mayroon akong hindi tunay 1062 00:46:05,300 --> 00:46:08,010 na tinatawag na, sa kasong ito, libre, kung saan ipapakita namin ay makakita 1063 00:46:08,010 --> 00:46:09,830 ay ang kabaligtaran ng malloc. 1064 00:46:09,830 --> 00:46:10,860 1065 00:46:10,860 --> 00:46:12,930 >> Kaya ngayon, sa palagay ko, isang huling halimbawa. 1066 00:46:12,930 --> 00:46:14,050 1067 00:46:14,050 --> 00:46:16,690 Kaya ang isang ito ay isang kaunti pa arcane, ngunit ito ay marahil 1068 00:46:16,690 --> 00:46:19,180 ang pinakamalaking dahilan upang maging maingat kayo sa memorya, 1069 00:46:19,180 --> 00:46:24,490 at ang dahilan na maraming mga programa at / o mga web server, kahit na sa araw na ito, 1070 00:46:24,490 --> 00:46:28,200 ay kinuha sa paglipas ng sa pamamagitan ng masamang guys sa isang lugar sa internet na kahit papaano 1071 00:46:28,200 --> 00:46:33,390 pagpapadala ng bogus packet sa server mo sinusubukan mong ikompromiso ang iyong mga account, 1072 00:46:33,390 --> 00:46:36,420 o kumuha ng iyong data, o lamang Sa pangkalahatan ay tumagal ng higit sa isang machine. 1073 00:46:36,420 --> 00:46:38,910 Buffer overflow, pati na ang pangalan nagmumungkahi, paraan 1074 00:46:38,910 --> 00:46:40,740 overflowing hindi isang int, ngunit isang buffer. 1075 00:46:40,740 --> 00:46:43,490 At isang buffer lamang magarbong paraan ng sinasabi ito ay isang bungkos ng memorya. 1076 00:46:43,490 --> 00:46:46,710 >> At sa katunayan, tinatawag na ako ng string bago buffer, sa halip na ni. 1077 00:46:46,710 --> 00:46:49,234 Dahil kung ito ay isang buffer, tulad ng sa kamalayan ng YouTube, 1078 00:46:49,234 --> 00:46:52,400 o anumang oras mo ang panonood ka ng video, maaaring nakakita ka ng salitang buffering, 1079 00:46:52,400 --> 00:46:53,040 tuldok, tuldok, tuldok. 1080 00:46:53,040 --> 00:46:54,240 Ito ay hindi kapani-paniwalang nakakainis. 1081 00:46:54,240 --> 00:46:55,990 At na lamang ay nangangahulugang na ang iyong video player 1082 00:46:55,990 --> 00:46:58,710 ay sumusubok na i-download ng maraming ng mga byte, maraming ng mga byte 1083 00:46:58,710 --> 00:47:00,170 mula sa isang video mula sa internet. 1084 00:47:00,170 --> 00:47:02,920 Ngunit ito ay mabagal, kaya sinusubukan mag-download ng isang bungkos ng mga ito 1085 00:47:02,920 --> 00:47:06,430 upang punan ang isang buffer, isang lalagyan, upang mayroon kang sapat na mga byte na ito pagkatapos ay maaari 1086 00:47:06,430 --> 00:47:09,174 ipakita sa iyo ang video, nang walang pag-pause Patuloy. 1087 00:47:09,174 --> 00:47:11,340 Ngunit ito ay lumiliko out, maaari mong magkaroon ng isang buffer upang ito malaki. 1088 00:47:11,340 --> 00:47:15,710 Ngunit subukan upang ilagay ito magkano ang data sa ito, at napaka-masamang bagay na maaaring mangyari. 1089 00:47:15,710 --> 00:47:22,780 Kaya halimbawa, tingnan natin hayaan ito panghuling teaser ng isang halimbawa. 1090 00:47:22,780 --> 00:47:24,720 Ito ay isa pang programa na iyon, sa unang tingin, 1091 00:47:24,720 --> 00:47:26,540 ay hindi gumawa ng anumang bagay sobrang kapaki-pakinabang. 1092 00:47:26,540 --> 00:47:29,590 Ito ay nakuha ng isang Main function na na mga tawag na function, f. 1093 00:47:29,590 --> 00:47:36,640 At na function, f, hanggang dito, may isang char array, na tinatawag c, ng laki 12. 1094 00:47:36,640 --> 00:47:39,340 At pagkatapos ay gumagamit ito ito bagong function na tinatawag na strncpy. 1095 00:47:39,340 --> 00:47:40,430 1096 00:47:40,430 --> 00:47:45,190 >> Ito ay lumiliko out na, na may ito simple, simpleng linya ng code, tulad lamang ng dalawang mga linya, 1097 00:47:45,190 --> 00:47:49,130 nakagawa kami buong aking programa, at samakatuwid, ang aking buong computer, 1098 00:47:49,130 --> 00:47:54,000 at ang aking user account, at ang aking matapang humimok ng potensyal na mahina laban sa sinuman 1099 00:47:54,000 --> 00:47:58,170 na may alam at ay sapat na mahusay na tumakbo ito programa na may isang tiyak na command line 1100 00:47:58,170 --> 00:47:58,900 argumento. 1101 00:47:58,900 --> 00:48:03,400 Sa ibang salita, kung ito masamang tao Inilalagay sa loob ng argvargv [1] sa pamamagitan ng pag-type 1102 00:48:03,400 --> 00:48:08,750 sa keyboard isang napaka-espesyal na ginawa string, hindi abc, 123, ngunit mahalagang, 1103 00:48:08,750 --> 00:48:15,180 binary simbolo na kumakatawan sa mga maipapatupad na code, isang programa na siya ay nagsulat, 1104 00:48:15,180 --> 00:48:19,190 na may ganitong simpleng programa, na kung saan ay kinatawan ng libu-libong mga programang 1105 00:48:19,190 --> 00:48:23,610 na katulad ng kahinaan, daresay, siya o maaari sa huli niyang tanggalin ang lahat 1106 00:48:23,610 --> 00:48:26,680 ang mga file sa aking hard drive, kumuha ng isang kumikislap prompt sa gayon na siya ay maaari 1107 00:48:26,680 --> 00:48:30,170 i-type ang mga utos sa kanilang sariling, mag-email sa lahat ng mga file sa aking sarili. 1108 00:48:30,170 --> 00:48:34,660 Anumang bagay na maaari kong gawin, siya o maaari niyang gawin sa ang code na ito. 1109 00:48:34,660 --> 00:48:36,575 >> Susubukan naming hindi masyadong pa malutas ito. 1110 00:48:36,575 --> 00:48:38,700 At sa katunayan, ay ito ng pagpunta sa may sangkot isang maliit na larawan 1111 00:48:38,700 --> 00:48:41,470 tulad nito, na magpapadala kami sa lalong madaling panahon dumating upang maunawaan ang lahat ng mas mahusay. 1112 00:48:41,470 --> 00:48:44,480 Ngunit para sa araw, na nagtatapos sa ipaalam kung ano ang, sana, ang isang bahagyang higit pa 1113 00:48:44,480 --> 00:48:48,360 nauunawaan ang XKCD Joke, hanggang sa ipagpatuloy namin sa susunod na pagkakataon. 1114 00:48:48,360 --> 00:48:51,100 1115 00:48:51,100 --> 00:48:51,600 Lahat ng karapatan. 1116 00:48:51,600 --> 00:48:53,446 Tingnan mo sa Miyerkules. 1117 00:48:53,446 --> 00:48:54,754 >> [Musika nagpe-play] 1118 00:48:54,754 --> 00:48:57,790 >> Tagapagsalita: At ngayon, malalim mga pananaw, sa pamamagitan ng Daven Farnham. 1119 00:48:57,790 --> 00:49:00,890 1120 00:49:00,890 --> 00:49:04,770 Memory ay tulad ng tumatalon papunta sa isang tumpok ng ginintuang dahon sa isang afternoon Linggo. 1121 00:49:04,770 --> 00:49:09,000 Hangin na Pagbugso, tossing iyong hair-- oh, Hinahanap-hanap ko ang mga araw when-- 1122 00:49:09,000 --> 00:49:11,100 1123 00:49:11,100 --> 00:49:12,650 >> [Tawa] 1124 00:49:12,650 --> 00:49:13,750