1 00:00:00,000 --> 00:00:11,242 >> [Nagpe-play ng musika] 2 00:00:11,242 --> 00:00:16,630 >> David J. MALAN: Lahat ng mga karapatang ito ay CS50 at ito ang simula ng limang linggo. 3 00:00:16,630 --> 00:00:21,480 Kaya ngayon, sa ilalim ng iyong cushions upuan, hindi ka makakahanap ng kahit ano. 4 00:00:21,480 --> 00:00:24,790 Ngunit sa itaas, dapat mong mahanap ang mga ito, isang maliit na token ng aming pagpapahalaga para sa 5 00:00:24,790 --> 00:00:26,970 lahat ng mga gawa na inilagay mo sa Laro ng labinlimang. 6 00:00:26,970 --> 00:00:30,290 Tanggalin lang ang maliit na bilog sa ibaba upang simulan ang pag-play para sa 7 00:00:30,290 --> 00:00:31,680 natitira sa klase. 8 00:00:31,680 --> 00:00:38,930 >> Kaya isipin ang na, o alam na problema nakatakda apat, na kung saan nagpunta out na ito katapusan ng linggo, 9 00:00:38,930 --> 00:00:40,340 nagsasangkot ng pagsulat ng isa pang laro. 10 00:00:40,340 --> 00:00:43,740 Ngunit oras na ito ito ay nagsasangkot gamit ang isang aktwal na graphical user interface, hindi isang 11 00:00:43,740 --> 00:00:46,310 tekstuwal interface tulad ng Game ng labinlimang noon. 12 00:00:46,310 --> 00:00:50,210 At ang laro ay namamalagi na nangunguna sa iyo, kung hindi mo pa nakikita ito sa tabi, 13 00:00:50,210 --> 00:00:52,310 Mukhang ng kaunti ng isang bagay na katulad nito. 14 00:00:52,310 --> 00:00:55,170 Pupunta ako upang pumunta sa aking terminal window dito sa GDB. 15 00:00:55,170 --> 00:00:58,600 At ako pagpunta sa sige at patakbuhin ang staff solusyon, na maaari mong ma-access ang 16 00:00:58,600 --> 00:01:01,010 pagkatapos tumatakbo update 50 gaya ng dati. 17 00:01:01,010 --> 00:01:04,090 >> Ngunit ako pagpunta sa ilagay ito papunta sa isang maliit na lihim na mode, medyo Easter itlog, 18 00:01:04,090 --> 00:01:08,480 tinatawag nang gayon Diyos mode, sa pamamagitan ng paglalagay ng Diyos sa argv1. 19 00:01:08,480 --> 00:01:12,920 At mayroon akong upang sundin ang aking sariling mga direksyon, tumatakbo ito sa aking sarili 20 00:01:12,920 --> 00:01:14,220 problema itakda direktoryo. 21 00:01:14,220 --> 00:01:19,190 Kaya ngayon mo makita ang isang kumpletong bersyon ng laro ng Breakout. 22 00:01:19,190 --> 00:01:21,090 Sa katunayan, ito ay walang-kamay mode. 23 00:01:21,090 --> 00:01:24,850 Kaya ito ay talagang - 24 00:01:24,850 --> 00:01:26,470 wowed bagaman maaari kang maging - 25 00:01:26,470 --> 00:01:30,850 medyo hindi mahalaga upang ipatupad ang Diyos mode sa Breakout, hindi tulad ng Game ng labinlimang, 26 00:01:30,850 --> 00:01:33,590 kung saan ang ilan sa iyo ay maaaring tackled para sa mga Hacker edisyon. 27 00:01:33,590 --> 00:01:37,890 >> Sa Breakout ito suffices sa Diyos mode na lang gawin kung ano ang, 28 00:01:37,890 --> 00:01:41,220 intuitively may paddle? 29 00:01:41,220 --> 00:01:45,630 Lang gawin itong katumbas ng anumang mga pahalang na posisyon ay sa mga bola. 30 00:01:45,630 --> 00:01:49,220 At kaya hangga't mo gawin ito sa lockstep may mga bola gumagalaw ito laro kalooban 31 00:01:49,220 --> 00:01:53,100 hindi kailanman, kailanman, kailanman mapalampas ang bola at makikita mo manalo sa bawat oras. 32 00:01:53,100 --> 00:01:55,430 >> Ngunit sa Hacker edisyon na ito linggo mayroong higit pa sa Diyos mode. 33 00:01:55,430 --> 00:01:56,720 Mayroong isang bilang ng iba pang mga tampok. 34 00:01:56,720 --> 00:01:58,140 Kabilang sa mga ito, Laser. 35 00:01:58,140 --> 00:02:01,070 Kaya na kung ikaw talaga makakuha ng walang tiyaga mo maaaring magsimula pagbaril down ang bricks 36 00:02:01,070 --> 00:02:02,120 at ilang iba. 37 00:02:02,120 --> 00:02:04,560 At para sa mga ng sa iyo na nais i- i-calibrate standard kumpara sa Hacker 38 00:02:04,560 --> 00:02:08,750 edition, ang maaari kong makita na ito linggo Hacker edisyon sadyang ay isang 39 00:02:08,750 --> 00:02:12,830 kaunti pa maaaring gawin, sabihin nating, kaysa sa Diyos mode ay may Game ng labinlimang. 40 00:02:12,830 --> 00:02:15,300 >> Kaya kung naghahanap ka para sa isang kahabaan at naghahanap ka ng ilang karagdagang masaya 41 00:02:15,300 --> 00:02:18,400 mga tampok gawin dive sa kung ng interes. 42 00:02:18,400 --> 00:02:21,280 Ngayon higit sa kapaki-pakinabang na paraan, hayaan mo akong ituro out isang bagay pati na rin. 43 00:02:21,280 --> 00:02:24,780 GDB, na ang ilan sa iyo ay hindi maaaring magkaroon pa hinawakan personal, na kung saan ay pinong. 44 00:02:24,780 --> 00:02:28,530 Ngunit ngayon ay talagang ng panahon upang masanay upang ito at kumportable ang tool na ito 45 00:02:28,530 --> 00:02:31,510 dahil ito ay gumawa ng iyong buhay lubhang mas madaling, tunay. 46 00:02:31,510 --> 00:02:34,900 >> Bawat ni Rob lecture sa GDB isang pares ng linggo na ang nakaraan, isipin ang 47 00:02:34,900 --> 00:02:36,810 GDB na ay isang debugger. 48 00:02:36,810 --> 00:02:41,230 Ito ay isang tool na hinahayaan kang patakbuhin ang iyong mga programa ngunit patakbuhin ito sa pamamagitan ng hakbang na hakbang, linya 49 00:02:41,230 --> 00:02:45,680 sa pamamagitan ng linya, sa gayon maaari mong sundutin sa paligid, nang sa gayon ay makita mo ang mga bagay na nangyayari, kaya 50 00:02:45,680 --> 00:02:47,310 na maaari mong i-print out mga halaga ng variable. 51 00:02:47,310 --> 00:02:50,580 Sa maikli, ito ay nagbibigay sa iyo kaya magkano ang higit pa lakas kaysa printDef ginagawa nito. 52 00:02:50,580 --> 00:02:52,900 >> Ngayon tinatanggap na, ang interface ay medyo arcane. 53 00:02:52,900 --> 00:02:55,180 Itim at puti tekstuwal interface para sa pinaka-bahagi. 54 00:02:55,180 --> 00:02:57,400 Ang utos ay medyo matigas matandaan sa unang. 55 00:02:57,400 --> 00:03:01,230 Ngunit kahit na maaaring tumagal ng sa iyo kalahati isang oras, isang oras, ang ilalagay na agad 56 00:03:01,230 --> 00:03:02,940 investment ng oras sa ito, nagtitiwala sa akin. 57 00:03:02,940 --> 00:03:06,440 Tiyak sa pamamagitan ng pagtatapos ng semestre ay i-save ito mo ang isang order ng magnitude na mas 58 00:03:06,440 --> 00:03:07,600 oras kaysa sa na. 59 00:03:07,600 --> 00:03:09,200 >> Kaya maaga sa linggo dive in 60 00:03:09,200 --> 00:03:13,200 At sa mga tuntunin ng Breakout, alam mo na Maaari gawin ito kaya hangga't mayroon kang 61 00:03:13,200 --> 00:03:18,230 ang pamamahagi ng code o ang iyong sariling code sa pag-unlad sa iyong Pst4 direktoryo. 62 00:03:18,230 --> 00:03:21,680 Malaman na maaari mong patakbuhin ang gdb. / Breakout. 63 00:03:21,680 --> 00:03:23,490 >> Ito ay pagpunta sa buksan up isang window na tulad nito. 64 00:03:23,490 --> 00:03:25,530 Hayaan akong bigyan ang aking sarili higit pa ng isang terminal na window. 65 00:03:25,530 --> 00:03:27,770 At pagkatapos ay kung ano ang pupuntahan ko sige at gawin, ito ay hindi lamang patakbuhin ito. 66 00:03:27,770 --> 00:03:30,690 Pupunta ako sa unang set ng pahinga point pagkuhang muli, na nagbibigay-daan sa iyo upang i-pause 67 00:03:30,690 --> 00:03:32,500 pagsasagawa sa isang partikular na lugar. 68 00:03:32,500 --> 00:03:35,750 >> Lamang upang panatilihing simple ang mga bagay ako pupunta upang masira sa linya ng isa sa pamamagitan lamang ng pag-type 69 00:03:35,750 --> 00:03:37,000 ang bilang isa. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Hayaan akong aktwal na muling buksan ang window na ito dahil nakakakuha ito ng isang 72 00:03:43,250 --> 00:03:45,700 maliit na maliit doon. 73 00:03:45,700 --> 00:03:53,270 Kaya ano ngayon pupuntahan ko na gawin dito ay kung ko bang buksan up ang aking mga terminal na window. 74 00:03:53,270 --> 00:03:53,910 Halika sa, doon kami pumunta. 75 00:03:53,910 --> 00:03:59,850 >> Kaya ngayon kung pumunta ako pabalik sa dropbox, Pst4 at magpatakbo ng gdb. / breakout magpasok, mapansin 76 00:03:59,850 --> 00:04:02,600 Pupunta ako sa masira ang isa upang i-set ng pahinga punto sa linya ng isa. 77 00:04:02,600 --> 00:04:04,840 At ngayon pupuntahan ko pumunta Magpatuloy at uri tumakbo. 78 00:04:04,840 --> 00:04:07,370 At kapag gagawin ko, mapapansin wala Mukhang mangyari. 79 00:04:07,370 --> 00:04:08,120 >> Walang mga pop up. 80 00:04:08,120 --> 00:04:09,790 Walang graphical user interface pa. 81 00:04:09,790 --> 00:04:13,340 Ngunit iyon dahil naiintindihan ako Literal na sa linya ng isa sa aking mga programa. 82 00:04:13,340 --> 00:04:17,110 At mapapansin na mabilis Naipasa ko na, partikular na ngayon sa 62, dahil ang lahat 83 00:04:17,110 --> 00:04:20,600 ang mga bagay na sa tuktok ng file na ito ay mga bagay tulad ng mga komento at mga constants at 84 00:04:20,600 --> 00:04:22,460 hindi kawili-wili para sa mga bagay-bagay ngayon. 85 00:04:22,460 --> 00:04:25,840 >> Kaya ngayon ako sa loob ng main, parang, sa linya 62. 86 00:04:25,840 --> 00:04:27,960 At ito ay lamang ang pamamahagi code, isipin ang. 87 00:04:27,960 --> 00:04:33,810 Kung ko bang buksan ito up sa pamamagitan ng pagpunta, katulad, sa aking direktoryo ng drop box sa Pst4, 88 00:04:33,810 --> 00:04:35,450 sa breakout.c. 89 00:04:35,450 --> 00:04:40,670 At kung ako mag-scroll pababa at pababa at pababa, at ipaalam sa akin sige at i-on ang 90 00:04:40,670 --> 00:04:44,990 aking mga numero ng linya. 91 00:04:44,990 --> 00:04:50,300 >> Ano ang makikita ko makita, kung ako mag-scroll pababa upang line 62, ay eksaktong linya na 92 00:04:50,300 --> 00:04:50,910 namin nai-pause sa. 93 00:04:50,910 --> 00:04:53,720 Kaya linya na ito dito, 62, ay kung saan kami ay tungkol sa upang maging. 94 00:04:53,720 --> 00:04:57,470 Kaya ngayon sa GDB, kung pumunta ako nang maaga at i-type ngayon susunod, ilagay ito sa pupuntahan 95 00:04:57,470 --> 00:04:58,450 isakatuparan na linya. 96 00:04:58,450 --> 00:05:00,610 At voila, mayroon kaming ang tinatawag nang gayon g window. 97 00:05:00,610 --> 00:05:02,800 Kung pamilyar sa kung ano ang isang GWindow ay, huwag mag-alala. 98 00:05:02,800 --> 00:05:05,740 Ang spec ay kitang ipakilala sa ito, bilang din ang isang bilang ng mga video na walkthrough 99 00:05:05,740 --> 00:05:06,830 naka-embed sa spec. 100 00:05:06,830 --> 00:05:08,610 >> Ngunit ngayon sabihin gawin ang isang kaunti pa kagiliw-giliw. 101 00:05:08,610 --> 00:05:10,960 Hayaan akong ilipat ang window na ito sa paglipas ng sa gilid ng kaunti bit. 102 00:05:10,960 --> 00:05:13,480 Hayaan akong gumawa ng window ng kaunti kaya mas malaki ang maaari kong makita ang higit pa. 103 00:05:13,480 --> 00:05:16,140 >> At ngayon hayaan mo akong sige at ang susunod na gagawin muli. 104 00:05:16,140 --> 00:05:17,550 At doon ang aking mga brick. 105 00:05:17,550 --> 00:05:20,490 Kung ako type susunod muli ngayon ko makita ang bola. 106 00:05:20,490 --> 00:05:23,520 At kung ako type susunod muli ngayon ko makita ang sagwan. 107 00:05:23,520 --> 00:05:26,690 >> At sa kabutihang-palad gedit na ito ay hindi talaga cooperating sa pamamagitan ng pagpapakita sa akin 108 00:05:26,690 --> 00:05:27,660 ang lahat ng bagay na gusto ko. 109 00:05:27,660 --> 00:05:30,820 Ngunit ngayon kung gagawin ko susunod muli, susunod muli, ako lamang 110 00:05:30,820 --> 00:05:32,260 deklarasyon ng ilang mga variable. 111 00:05:32,260 --> 00:05:34,750 At maaari kong i-print ang anumang isa ng mga guys out. 112 00:05:34,750 --> 00:05:37,170 I-print bricks, prints buhay. 113 00:05:37,170 --> 00:05:39,910 >> At ngayon kung patuloy kong gawin susunod, mapapansin na ang kukunin ko na maging 114 00:05:39,910 --> 00:05:40,870 sa loob ng loop na. 115 00:05:40,870 --> 00:05:43,380 Ngunit ang code ay pagpunta sa execute nang eksakto tulad ng inaasahan ko. 116 00:05:43,380 --> 00:05:45,810 Kaya kapag ako pindutin ito function, Maghintay para sa Click, ito ay pagpunta sa gawin 117 00:05:45,810 --> 00:05:46,830 ito literal na. 118 00:05:46,830 --> 00:05:48,870 Kaya ako tila nawala kontrol sa ibabaw ng programa. 119 00:05:48,870 --> 00:05:50,480 >> GDB ay hindi pagbibigay sa akin ng isa pang prompt. 120 00:05:50,480 --> 00:05:51,500 Ngunit huwag mag-alala. 121 00:05:51,500 --> 00:05:53,720 Pumunta sa aking mga laro, i-click sa isang lugar. 122 00:05:53,720 --> 00:05:56,270 >> At voila, ngayon ito naaayos sa line 86. 123 00:05:56,270 --> 00:05:59,460 Kaya muli, ito ay napakahalaga, sa huli, para sa pagde-debug ng mga problema. 124 00:05:59,460 --> 00:06:03,050 Dahil maaari mong literal magbasa-basa ang iyong code, naka-print na mga bagay out at magkano, 125 00:06:03,050 --> 00:06:03,640 magkano, higit pa. 126 00:06:03,640 --> 00:06:07,210 Ngunit para sa ngayon, ang mga tool sa nag-iisa dapat kumuha ka ng medyo malayo. 127 00:06:07,210 --> 00:06:10,050 >> Kaya kami, siyempre, ng pagtingin Graphics sa ngayon, ang lahat ng isang biglaang. 128 00:06:10,050 --> 00:06:12,350 At ngayon ating mundo ay nakakakuha ng kaunti mas kawili-wiling. 129 00:06:12,350 --> 00:06:15,680 At alam mo, marahil, mula sa ilan sa mga mga video online na mayroon kaming mga 130 00:06:15,680 --> 00:06:18,280 shorts na matagal mo nang panoorin bilang bahagi ng mga hanay ng problema. 131 00:06:18,280 --> 00:06:20,460 >> At ito ay nai-kinuhanan, kusa, laban sa isang puting backdrop. 132 00:06:20,460 --> 00:06:23,380 At ang ilan sa mga ito ay ang pagtuturo Fellows pagguhit ng ilang mga teksto sa 133 00:06:23,380 --> 00:06:25,490 screen na naka-overlay sa gilid ng mga ito. 134 00:06:25,490 --> 00:06:27,760 Ngunit siyempre, hindi ito ang lahat na kawili-wili sa tunay na mundo. 135 00:06:27,760 --> 00:06:30,520 Ito ay lamang ng isang silid para sa panayam na may malaki puting screen at isang backdrop. 136 00:06:30,520 --> 00:06:33,330 At ang aming kahanga-hangang produksyon koponan ng pag-uuri Ginagawa ng lahat ng bagay hitsura magandang 137 00:06:33,330 --> 00:06:36,620 pagkatapos ng katotohanan sa pamamagitan ng pag-crop out overlaying o anumang bagay 138 00:06:36,620 --> 00:06:37,840 ginagawa namin o hindi nais. 139 00:06:37,840 --> 00:06:41,560 >> Ngayon lamang upang mag-udyok sa linggong ito at talaga, kung saan maaari kang pumunta, sa huli, 140 00:06:41,560 --> 00:06:42,560 may computer science. 141 00:06:42,560 --> 00:06:44,260 Hindi lamang ang problema pagkatapos ng apat na set. 142 00:06:44,260 --> 00:06:48,240 Ngunit pagkatapos ng isa pang kurso o sa isang buong kurikulum ito ay kahanga-hangang kung ano ang maaari mong 143 00:06:48,240 --> 00:06:51,090 gawin mga araw na ito sa mga tuntunin ng graphics sa partikular na. 144 00:06:51,090 --> 00:06:53,440 >> Ang ilan sa iyo ay maaaring may nakita ito dumadaloy sa buong online. 145 00:06:53,440 --> 00:06:56,240 Ngunit naisip ko na gusto kong ipakita sa iyo, para sa lamang ng isang ilang minuto, isang sulyap sa kung ano ang 146 00:06:56,240 --> 00:07:01,890 computer na teknolohiya at kung ano CGI, graphics computer ay maaaring gawin ang mga araw na ito 147 00:07:01,890 --> 00:07:04,510 may isang pamilyar na kanta at marahil pelikula. 148 00:07:04,510 --> 00:07:05,760 >> [Music - Lana Del Ray, "Young at maganda] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Tagapagsalita 1: Ito ay lamang ng isang maliit na bit kahanga-hangang, marahil, lamang kung paano 151 00:10:52,470 --> 00:10:52,857 nasa lahat ng dako - 152 00:10:52,857 --> 00:10:57,040 >> [Palakpakan] 153 00:10:57,040 --> 00:10:59,230 >> Tagapagsalita 1: ko lang ang nai-download na ito. 154 00:10:59,230 --> 00:11:02,920 Ngunit ito ay talagang kahanga-hangang, sa palagay ko, lamang paano nasa lahat ng dako at software code at 155 00:11:02,920 --> 00:11:04,230 mga tool tulad ng ito ay talagang. 156 00:11:04,230 --> 00:11:07,685 Kaya na ng panlasa ng mga direksyon kung saan maaari kang pumunta. 157 00:11:07,685 --> 00:11:10,620 Oh, wala nang Appliance ngayon. 158 00:11:10,620 --> 00:11:14,640 Well, na talagang timing trahedya na naibigay ang punto ko lang sinubukang gawin. 159 00:11:14,640 --> 00:11:18,670 >> Ang lahat ng mga karapatan, kaya sabihin ilunsad Fusion muli. 160 00:11:18,670 --> 00:11:20,800 Ipaalala sa akin mamaya. 161 00:11:20,800 --> 00:11:24,190 Ang lahat ng mga karapatan, at dapat kang nakakuha ng isang mag-email bilang isang bukod kung ginawa mo makakuha ng isang 162 00:11:24,190 --> 00:11:25,460 mapansin tulad na. 163 00:11:25,460 --> 00:11:29,940 Ang lahat ng mga karapatan, kaya isipin ang na noong nakaraang linggo nagsimula kaming upang mag-alis ng balat pabalik na ito 164 00:11:29,940 --> 00:11:31,380 mamaya na kilala bilang string. 165 00:11:31,380 --> 00:11:34,700 >> string naalala isang uri ng data na ipinahayag sa CS50 library. 166 00:11:34,700 --> 00:11:37,740 At ito ay bahagi ng mga gulong ng pagsasanay na ngayon ay nagsisimula sa tumagal-off. 167 00:11:37,740 --> 00:11:41,280 Ito ay isang kapaki-pakinabang konsepto maaga. 168 00:11:41,280 --> 00:11:43,750 Ngunit ngayon ito ay pagpunta upang makakuha ng higit kawili-wili at higit na malakas sa 169 00:11:43,750 --> 00:11:48,330 talaga makita na sa ilalim ng hood, isang string lamang ang kung ano ang, ay sinabi namin? 170 00:11:48,330 --> 00:11:50,500 >> Oo, sa gayon ito ay isang tinatawag na pansamantalang trabaho *. 171 00:11:50,500 --> 00:11:53,860 At ang doon * Nagpapahiwatig na mayroong ang ilang mga uri ng address kasangkot. 172 00:11:53,860 --> 00:11:58,690 At kaya kapag sinabi mong pansamantalang trabaho * ka lang bang sabihin isang variable na uri ng data ay isang 173 00:11:58,690 --> 00:11:59,290 pointer ngayon. 174 00:11:59,290 --> 00:12:01,770 Ang katotohanan na may mga star doon lamang ay nangangahulugan na ikaw ay isang deklarasyon 175 00:12:01,770 --> 00:12:03,020 tinatawag nang gayon pointer. 176 00:12:03,020 --> 00:12:06,220 At pointer na ay pagpunta sa mukha mag-imbak ng address ng, ng 177 00:12:06,220 --> 00:12:07,810 Siyempre, isang pansamantalang trabaho. 178 00:12:07,810 --> 00:12:08,960 >> Ngayon kung bakit ito ay magkaroon ng kahulugan? 179 00:12:08,960 --> 00:12:11,200 Well, kung ano ay isang string sa ilalim ng hood? 180 00:12:11,200 --> 00:12:15,130 Well, para sa ilang mga oras na aming sinasabi na isang string sa ilalim ng hood ay 181 00:12:15,130 --> 00:12:18,460 lamang h-e-l--l o, halimbawa. 182 00:12:18,460 --> 00:12:21,585 >> Ngunit kami uusapang tungkol sa ito bilang Pansamantala, mahalagang, isang array. 183 00:12:21,585 --> 00:12:25,410 At isang array gusto pagkatapos tumingin ng kaunti higit na tulad nito, na may bawat isa sa mga 184 00:12:25,410 --> 00:12:26,460 pagkuha up ng isang kagat. 185 00:12:26,460 --> 00:12:28,710 At pagkatapos namin sinabi na mayroong isang bagay na espesyal na bumalik dito, ang 186 00:12:28,710 --> 00:12:31,270 backslash 0, o null Terminator. 187 00:12:31,270 --> 00:12:35,230 >> Kaya lahat ng mga oras na ito, ito dito ay naging isang string. 188 00:12:35,230 --> 00:12:38,320 Ngunit talagang, isang string ay talaga ng isang address. 189 00:12:38,320 --> 00:12:43,210 At address, tulad ng ipapakita namin makita, ay madalas may prefix na 0x sa pamamagitan ng convention. 190 00:12:43,210 --> 00:12:44,540 Ano ang ibig 0x magpakilala? 191 00:12:44,540 --> 00:12:45,970 May nakakaalam ba? 192 00:12:45,970 --> 00:12:47,320 >> Kaya ito ay nangangahulugan lamang hexadecimal. 193 00:12:47,320 --> 00:12:52,360 Kaya maaari mong isipin ang, talaga, mula sa PST 1, naniniwala ako, isa sa mga mainit-init-up 194 00:12:52,360 --> 00:12:55,740 mga tanong na aktwal na tinanong tungkol sa hexadecimal notation sa karagdagan sa 195 00:12:55,740 --> 00:12:57,100 binary at decimal. 196 00:12:57,100 --> 00:13:00,460 At ang pag-uudyok dito ay na may hexadecimal mayroon kang 16 197 00:13:00,460 --> 00:13:01,770 digit sa iyong pagtatapon. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, sinundan sa pamamagitan ng a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> At kung ikaw bilangin ang lahat ng mga up, kumuha ka ng isang kabuuan ng 16. 200 00:13:10,430 --> 00:13:13,200 Kaya ito ay sa kabilang banda na may decimal, kung saan mayroon kaming 10 201 00:13:13,200 --> 00:13:14,690 digit, sa pamamagitan ng 0 siyam. 202 00:13:14,690 --> 00:13:17,750 Ito ay sa kaibahan sa binary kung saan namin lamang magkaroon ng 0 at 1. 203 00:13:17,750 --> 00:13:21,450 >> Ngunit sa pagtatapos ng araw na maaari mo lamang Kinakatawan ng parehong numero, ngunit 204 00:13:21,450 --> 00:13:22,500 medyo naiiba. 205 00:13:22,500 --> 00:13:25,840 At hexadecimal ay karaniwan dahil bilang ito lumiliko out - at kami na makita ito 206 00:13:25,840 --> 00:13:28,790 mamaya sa kurso - kahit na kapag makuha namin sa web programming sa konteksto ng 207 00:13:28,790 --> 00:13:32,100 HTML kulay at mga code, hexadecimal ay magaling. 208 00:13:32,100 --> 00:13:36,390 Dahil sa ang bawat digit, lumiliko out, Kinakatawan ng apat na piraso perpektong. 209 00:13:36,390 --> 00:13:39,280 Kaya ito lang ang uri ng mga linya up mabuti dahil kakailanganin namin ay makakita. 210 00:13:39,280 --> 00:13:44,720 Kaya maaaring ito ay Ox123 o isang bagay tulad na, denoting address 123 211 00:13:44,720 --> 00:13:47,050 sa isang lugar sa loob ng aking computer memory. 212 00:13:47,050 --> 00:13:50,600 >> Ngunit siyempre, ang ilang mga problema pumailanglang dahil sa napapailalim na ito 213 00:13:50,600 --> 00:13:51,520 pagpapatupad. 214 00:13:51,520 --> 00:13:55,930 At isipin ang ko na kinuha ng isang ulos sa pagpapatupad ng isang function na ganito - 215 00:13:55,930 --> 00:14:00,260 ihambing gitling 0 tuldok c nakaraang linggo, na kahit na ito ay tumingin tulad ng ito ay 216 00:14:00,260 --> 00:14:04,270 kanan, ito lamang ay hindi ihambing dalawang string ng tama. 217 00:14:04,270 --> 00:14:07,470 >> Ko na itinapon ang layo ng main, at ko na itinapon ang layo ng mga komento lamang mag-focus sa sa 218 00:14:07,470 --> 00:14:08,970 ang code na ng interes dito. 219 00:14:08,970 --> 00:14:10,660 At ito ay nasa pula dahil ito ay maraming surot. 220 00:14:10,660 --> 00:14:11,670 Para sa kung ano ang dahilan? 221 00:14:11,670 --> 00:14:15,890 >> Well, sa tuktok doon kapag ako ay ipinahayag isang string, kung ano ang talagang pagpunta sa 222 00:14:15,890 --> 00:14:17,260 sa ilalim ng hood? 223 00:14:17,260 --> 00:14:19,530 Well, hayaan mo akong pumunta sa ibabaw ng mga screen dito at gumuhit na. 224 00:14:19,530 --> 00:14:23,230 Kaya ko ipinahayag, muli, string s GetString. 225 00:14:23,230 --> 00:14:26,640 >> Kaya pupuntahan ko sige at ngayon gumuhit para sa mga ito kung ano ang talagang ay. 226 00:14:26,640 --> 00:14:28,590 Ito ay pagpunta sa maging isang parisukat na dito. 227 00:14:28,590 --> 00:14:30,490 At ako pagpunta sa i-claim na iyon ang 32 bits. 228 00:14:30,490 --> 00:14:32,890 Hindi bababa sa ito ay karaniwang ay, hindi bababa sa CS50 229 00:14:32,890 --> 00:14:34,520 appliance ng maraming mga computer. 230 00:14:34,520 --> 00:14:35,980 Pupunta ako sa call ito s. 231 00:14:35,980 --> 00:14:39,070 >> Ngunit ngayon na maalala muli namin tinatawag GetString. 232 00:14:39,070 --> 00:14:41,430 Kaya GetString babalik, siyempre, isang string. 233 00:14:41,430 --> 00:14:45,790 Kung ang mga uri ng user sa h-e-l--l o ipasok string ang halo ay makakakuha ng ibinalik. 234 00:14:45,790 --> 00:14:51,010 At string na, bilang lang namin sinabi, nagtatapos up sa isang lugar sa memorya ng iyong computer 235 00:14:51,010 --> 00:14:53,240 sa backslash 0 sa dulo. 236 00:14:53,240 --> 00:14:56,650 Kukunin ko gumuhit ito tulad ng array - o magkadikit bloke ng mga character - 237 00:14:56,650 --> 00:14:58,330 na ito ay tunay. 238 00:14:58,330 --> 00:15:01,790 >> At ngayon, kung ano ang GetString talagang bumabalik? 239 00:15:01,790 --> 00:15:04,340 Ano ay GetString na bumabalik lahat ng oras na ito? 240 00:15:04,340 --> 00:15:07,520 Well, sinasabi namin, sa linggo bago, ito ay nagbabalik ng isang string. 241 00:15:07,520 --> 00:15:10,250 Ngunit mas technically, kung ano ang ibig GetString balik sa malas? 242 00:15:10,250 --> 00:15:11,610 >> Madla: ang isang address. 243 00:15:11,610 --> 00:15:12,600 >> Tagapagsalita 1: ang isang address. 244 00:15:12,600 --> 00:15:16,630 Partikular ito ay magbabalik ng mga address ng ang pinakaunang kagat, kahit anong ito ay. 245 00:15:16,630 --> 00:15:18,830 Katatapos ko lamang panatilihin ang paggamit ng isa, dalawa, tatlo dahil ito ay maginhawa. 246 00:15:18,830 --> 00:15:21,380 >> Ito ay nagbabalik ng address ng unang na character sa string. 247 00:15:21,380 --> 00:15:23,510 At sinabi namin noong nakaraang linggo na iyon ay sapat. 248 00:15:23,510 --> 00:15:26,710 Dahil maaari lagi naming malaman kung saan sa dulo ng string sa pamamagitan lamang ng 249 00:15:26,710 --> 00:15:30,150 iterating sa paglipas ng ito, siguro, may para sa loop o isang habang loop o isang bagay tulad ng 250 00:15:30,150 --> 00:15:34,990 na, lamang naghahanap para sa "backslash 0", ang mga espesyal na character na nagbabantay. 251 00:15:34,990 --> 00:15:37,220 >> At pagkatapos ay alam namin na ang mga string Nagkataong ng haba - 252 00:15:37,220 --> 00:15:37,980 sa kasong ito - 253 00:15:37,980 --> 00:15:38,670 limang. 254 00:15:38,670 --> 00:15:43,800 Kaya technically kung ano ang ibig GetString ito ay nagbabalik Ox123 sa kasong ito. 255 00:15:43,800 --> 00:15:53,670 At technically kung ano ang mangyayari pagkatapos ay mag-imbak na kami, sa loob ng s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Sa pagtatapos ng araw, kahit na ito ay bagong konsepto, payo, ang mga ito ay 257 00:15:56,460 --> 00:15:57,350 lamang ang mga variable. 258 00:15:57,350 --> 00:16:00,440 Ngunit mangyari sila upang mag-imbak na mga piraso sama-sama kumakatawan sa isang address. 259 00:16:00,440 --> 00:16:03,700 Kaya technically lahat sila ay nakakakuha naka-imbak sa s ay Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Ngunit kami bilang mga kawani na tao - 261 00:16:04,680 --> 00:16:06,020 kabilang ngayon pasulong - 262 00:16:06,020 --> 00:16:09,290 ang talagang hindi pagpunta sa pinapahalagahan, karaniwan, kung ano ang aktwal na address ay 263 00:16:09,290 --> 00:16:10,520 ng ilang tipak ng memory. 264 00:16:10,520 --> 00:16:14,040 Ito ay lamang sa mababang antas ng detalye sa maging intellectually kawili-wili. 265 00:16:14,040 --> 00:16:15,440 Kaya ako ng pagpunta sa i-undo ito. 266 00:16:15,440 --> 00:16:19,810 At sa halip, mas mataas na antas, sabihin lamang na kapag pinag-uusapan natin ang tungkol sa mga payo 267 00:16:19,810 --> 00:16:22,170 Pupuntahan ko lang makahatak ng mga madaling magamit na mga arrow na nagbibigay ng 268 00:16:22,170 --> 00:16:26,060 parehong ideya at abstracts ang layo particular ng kung ano ang aktwal na 269 00:16:26,060 --> 00:16:27,700 napapailalim na address ay. 270 00:16:27,700 --> 00:16:33,290 >> Ngayon kung pumunta kami pabalik sa code, kung ano Nangyari ito noong nakaraang linggo kung kami ay may string t 271 00:16:33,290 --> 00:16:34,510 ay katumbas ng GetString? 272 00:16:34,510 --> 00:16:38,630 Well, kung ako muli, uri sa halo oras na ito ako pagpunta upang makakuha ng 273 00:16:38,630 --> 00:16:40,460 isa pang tipak ng memory. 274 00:16:40,460 --> 00:16:44,820 h-e-l--l o backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Ngunit dahil ako tinatawag GetString sa pangalawang pagkakataon - 276 00:16:48,320 --> 00:16:51,100 at alam ko ito mula sa pagtingin sa mga source code para sa GetString - kahit na 277 00:16:51,100 --> 00:16:54,350 bagaman ito ay hindi sinasadya kumusta na noon ay nai-type sa dalawang beses, GetString ay hindi 278 00:16:54,350 --> 00:16:55,890 pagpunta sa subukan upang i-optimize at maging matalino. 279 00:16:55,890 --> 00:16:58,550 Lamang Ito ay pagpunta upang makakuha ng isa pang tipak ng memorya mula sa mga computer, na kung saan ay 280 00:16:58,550 --> 00:16:59,640 pagpunta sa maging sa isa pang address. 281 00:16:59,640 --> 00:17:02,330 Sabihin mang lang nating 456. 282 00:17:02,330 --> 00:17:04,079 >> At pagkatapos ay kung ano ito ay pagpunta sa bumalik? 283 00:17:04,079 --> 00:17:08,030 Ito ay pagpunta sa bumalik 456 at mag-imbak ito sa t. 284 00:17:08,030 --> 00:17:12,010 Kaya kung ano ang talagang pagpunta sa, sa kaliwang bahagi ay mayroon akong isa pang tipak 285 00:17:12,010 --> 00:17:14,260 ng memorya, 32 bits ay karaniwang. 286 00:17:14,260 --> 00:17:16,720 At doon ay pagpunta sa pumunta Ox456. 287 00:17:16,720 --> 00:17:20,140 Ngunit muli, hindi ako interesado sa mga partikular na mga numero na ngayon. 288 00:17:20,140 --> 00:17:23,069 Lamang ako ng pagpunta sa abstractly gumuhit ito bilang isang arrow. 289 00:17:23,069 --> 00:17:25,202 >> Kaya ito ay ngayon ng isang bagong paliwanag. 290 00:17:25,202 --> 00:17:28,735 Ngunit ito ay ang parehong eksaktong ideya na na nangyayari ang lahat ng oras na ito. 291 00:17:28,735 --> 00:17:33,150 At kaya ang dahilan pagkatapos, na ito muna bersyon ng Ihambing noon ay maraming surot 292 00:17:33,150 --> 00:17:34,480 noong nakaraang linggo ang dahilan kung bakit? 293 00:17:34,480 --> 00:17:38,000 Kapag ginawa mo kung s ay katumbas ng katumbas t kung ano ang ikaw ay tunay na 294 00:17:38,000 --> 00:17:40,550 sa ilalim ng hood ng paghahambing? 295 00:17:40,550 --> 00:17:41,910 >> Naghahambing ka ng mga address. 296 00:17:41,910 --> 00:17:47,950 At lamang intuitively, malinaw, Ox123 Hindi pupunta sa pantay na Ox456. 297 00:17:47,950 --> 00:17:49,380 Yaong mga numero, mga bits lamang ang naiiba. 298 00:17:49,380 --> 00:17:53,220 >> At kaya tuloy-tuloy, noong nakaraang linggo ito sinabi type ka iba't ibang mga bagay, kahit na ang 299 00:17:53,220 --> 00:17:55,360 mga salita ay eksaktong kopya ng parehong. 300 00:17:55,360 --> 00:17:58,770 Kaya naming ayusin ito. 301 00:17:58,770 --> 00:18:00,120 Sa mga tuntunin lego, na noon ay kung ano ang fix? 302 00:18:00,120 --> 00:18:02,110 >> Madla: Gumamit ng isang function. 303 00:18:02,110 --> 00:18:02,870 >> Tagapagsalita 1: Gumamit ng isang function. 304 00:18:02,870 --> 00:18:05,190 O kaya, ang mga bituin ay siguradong kasangkot, ngunit gamitin ang isang function upang gawin kung ano? 305 00:18:05,190 --> 00:18:05,962 >> Madla: Upang ihambing ang mga string. 306 00:18:05,962 --> 00:18:07,390 >> Tagapagsalita 1: Upang ihambing ang mga string. 307 00:18:07,390 --> 00:18:11,030 Kaya ang pangunahing problema dito ay na lang ako ay isinasaalang-alang ang 308 00:18:11,030 --> 00:18:15,870 kalidad ng mga string na tinukoy sa pamamagitan ng paghahambing ng kanilang mga address. 309 00:18:15,870 --> 00:18:18,540 At malinaw naman na ito lamang ay pipi ngayon sabay-sabay maunawaan mo kung ano ang nangyayari sa 310 00:18:18,540 --> 00:18:19,510 sa ilalim ng hood. 311 00:18:19,510 --> 00:18:23,270 Upang tunay na ihambing ang mga string upang makita kung ang mga ito ay pantay-pantay sa mga paraan na ang isang tao 312 00:18:23,270 --> 00:18:26,680 Gusto isaalang-alang ang dalawang mga string na maging kapantay kailangan namin upang ihambing ang mga ito ng character para sa 313 00:18:26,680 --> 00:18:28,070 karakter para sa character. 314 00:18:28,070 --> 00:18:30,020 >> Ngayon maaari ba akong magkaroon ng tapos ito napaka tediously. 315 00:18:30,020 --> 00:18:32,240 Ngunit pabihasa, kami ay gamit ang isang para sa loop. 316 00:18:32,240 --> 00:18:36,050 At lamang ihambing ang mga bracket i laban t i bracket. 317 00:18:36,050 --> 00:18:39,590 s bracket i plus 1 laban t bracket i plus 1, at iba pa, sa loob 318 00:18:39,590 --> 00:18:40,580 ang ilang mga uri ng loop. 319 00:18:40,580 --> 00:18:44,950 At kung makita ko ang anumang dalawang character na mag-iba, o kung Napag-alaman kong ooh, s ay 320 00:18:44,950 --> 00:18:48,410 mas maikli sa t o mas mahaba kaysa sa t Maaari ko bang sabihin agad na hindi totoo, 321 00:18:48,410 --> 00:18:49,390 ang mga ito ay hindi ang pareho. 322 00:18:49,390 --> 00:18:55,370 >> Ngunit kung makakuha ako sa pamamagitan ng s at t at sabihin parehong, parehong, parehong, parehong, parehong, dulo ng 323 00:18:55,370 --> 00:18:58,520 parehong mga string, ang maaari kong sabihin totoo, ang mga ito ay pantay. 324 00:18:58,520 --> 00:19:01,040 Well, thankfully, taon na ang nakakaraan ng isang tao Nagsulat na code para sa atin. 325 00:19:01,040 --> 00:19:03,790 >> At sila ay tinatawag na ito StrComp para sa string ihambing. 326 00:19:03,790 --> 00:19:11,900 At kahit na ito ay isang maliit na counter madaling maunawaan, StrComp nagbabalik 0 kung ang mga 327 00:19:11,900 --> 00:19:14,520 dalawang string, s at t ay pareho. 328 00:19:14,520 --> 00:19:18,090 Ngunit ito ay nagbabalik negatibong halaga kung s dapat dumating bago t ayon sa alpabeto o 329 00:19:18,090 --> 00:19:20,610 positibong halaga kung paano ito dapat na dumating pagkatapos t ayon sa alpabeto. 330 00:19:20,610 --> 00:19:24,030 >> Kaya kung sakaling nais upang ayusin ang isang bagay, ito lumiliko out na StrComp ay kapaki-pakinabang. 331 00:19:24,030 --> 00:19:26,660 Dahil ito ay hindi lamang sabihin oo o hindi, katumbas o hindi. 332 00:19:26,660 --> 00:19:30,440 Ito ay nagbibigay sa iyo ng isang pakiramdam ng pag-order i isang diksyunaryo baka. 333 00:19:30,440 --> 00:19:33,770 Kaya StrComp, mga kuwit t ay katumbas ng ay katumbas ng 0 ay nangangahulugan na ang 334 00:19:33,770 --> 00:19:35,200 string ay talagang pantay. 335 00:19:35,200 --> 00:19:38,680 Dahil kung sinuman ang nagsulat function na ito taon na ang nakaraan siguro ay gumamit ng isang para sa loop 336 00:19:38,680 --> 00:19:42,840 o isang habang loop o isang bagay tulad na na isama sa paglipas ng ang mga character na muli 337 00:19:42,840 --> 00:19:45,270 at muli at muli. 338 00:19:45,270 --> 00:19:47,300 >> Ngunit problema dalawang lumitaw dito. 339 00:19:47,300 --> 00:19:48,750 Ito ay copy0.c. 340 00:19:48,750 --> 00:19:51,680 At ang dalawa ay pula dahil ito ay flawed. 341 00:19:51,680 --> 00:19:52,800 At kung ano ang ginagawa namin dito? 342 00:19:52,800 --> 00:19:54,310 Well, una kong tinatawag GetString. 343 00:19:54,310 --> 00:19:56,255 At ako na naka-imbak ang return halaga sa s. 344 00:19:56,255 --> 00:20:00,260 Kaya na medyo magkano ang parehong bilang ito tuktok na bahagi ng larawan. 345 00:20:00,260 --> 00:20:01,490 >> Ngunit kung ano ang nauuna matapos na? 346 00:20:01,490 --> 00:20:04,980 Well, ipaalam sa akin sige at mapupuksa ng isang buong grupo ng mga ito. 347 00:20:04,980 --> 00:20:09,650 Susubukan naming rewind sa oras na kung saan namin lamang may s, na ngayon ay pare-pareho sa 348 00:20:09,650 --> 00:20:10,940 line up ng isa doon. 349 00:20:10,940 --> 00:20:11,400 >> I-check. 350 00:20:11,400 --> 00:20:13,450 Kung s ay katumbas ay katumbas ng 0. 351 00:20:13,450 --> 00:20:18,670 Ngayon, isang mabilis na tandaan gilid, kapag baka GetString bumalik 0? 352 00:20:18,670 --> 00:20:19,580 Walang sapat na memory. 353 00:20:19,580 --> 00:20:19,880 I-right? 354 00:20:19,880 --> 00:20:22,310 >> Ito ay bihira na ito ay pagpunta sa mangyari, tiyak sa isang computer na 355 00:20:22,310 --> 00:20:24,740 Nakakuha ng daan-daang megs o kahit na gig ng RAM. 356 00:20:24,740 --> 00:20:27,080 Ngunit ito ay maaaring, sa teorya, bumalik 0, lalo na kung ang 357 00:20:27,080 --> 00:20:28,080 gumagamit ay hindi makikipagtulungan. 358 00:20:28,080 --> 00:20:31,640 May mga paraan upang magpanggap tulad ng hindi mo pa inputted anumang bagay at bilis ng kamay 359 00:20:31,640 --> 00:20:34,100 GetString sa pagbabalik 0 epektibo. 360 00:20:34,100 --> 00:20:35,470 >> Kaya ito ang nangyayari upang tingnan ang mga iyon. 361 00:20:35,470 --> 00:20:39,430 Dahil kung anuman sa iyo Sinimulan na upang makakuha ng, na, segmentation faults - 362 00:20:39,430 --> 00:20:42,280 na kung saan ay marahil naging isang pinagmulan ng ilang mga pagkabigo - 363 00:20:42,280 --> 00:20:46,150 iyon ay halos palaging ang resulta ng memory-kaugnay na error. 364 00:20:46,150 --> 00:20:50,440 Kahit paano mo messed up na may pagsasaalang-alang sa isang pointer, kahit na hindi mo mapagtanto 365 00:20:50,440 --> 00:20:51,530 nagkaroon ng pointer. 366 00:20:51,530 --> 00:20:55,260 Kaya maaari mo pa sapilitan segmentation faults na mas maaga sa linggo ng isa gamit 367 00:20:55,260 --> 00:21:02,100 isang bagay tulad ng isang para sa loop o isang habang loop at isang array sa pamamagitan ng pagpunta masyadong malayo 368 00:21:02,100 --> 00:21:05,900 lagpas sa mga hangganan ng ilang array na ipinahayag sa iyo, sa dalawang linggo sa 369 00:21:05,900 --> 00:21:06,690 partikular na. 370 00:21:06,690 --> 00:21:09,220 >> Maaaring nagawa mo na ito kahit na sa problema itakda ang apat na may Breakout. 371 00:21:09,220 --> 00:21:12,910 Kahit na ikaw ay malamang na hindi na nakikita anumang mga bituin sa code para sa pamamahagi 372 00:21:12,910 --> 00:21:17,410 Breakout, ito lumiliko out na ang mga GRect at GOval at iba pang mga bagay, 373 00:21:17,410 --> 00:21:19,650 iyon ay aktwal na payo sa ilalim ng hood. 374 00:21:19,650 --> 00:21:23,430 >> Ngunit Stanford, tulad ng sa amin, uri ng Itinatago na detalye ng hindi bababa sa para sa mga aklatan 375 00:21:23,430 --> 00:21:26,540 layunin, tulad ng ginagawa namin para sa string at pansamantalang trabaho *. 376 00:21:26,540 --> 00:21:30,060 Ngunit GRect at GOval at lahat ng mga bagay ka guys ay o ay gumagamit ng 377 00:21:30,060 --> 00:21:32,630 linggo ito ay sa huli memory address. 378 00:21:32,630 --> 00:21:33,650 Ikaw lamang ay hindi alam ito. 379 00:21:33,650 --> 00:21:37,240 >> Kaya ito ay hindi nakakagulat pagkatapos, marahil, na maaari mong paglalakbay sa paglipas ng ilang mga 380 00:21:37,240 --> 00:21:38,580 segmentation faults. 381 00:21:38,580 --> 00:21:41,290 Ngunit kung ano ang kawili-wiling dito ngayon, kung pagkatapos naming suriin para sa 0 ang ginagawa namin 382 00:21:41,290 --> 00:21:43,460 string t nakakakuha s. 383 00:21:43,460 --> 00:21:44,690 Well, hayaan mo akong idedeklara t. 384 00:21:44,690 --> 00:21:47,730 Pupunta ako sa gumuhit ito bilang isang parisukat, 32 bits, tumawag ito t. 385 00:21:47,730 --> 00:21:49,740 At pagkatapos ay ako pagpunta sa gawin ay nakakakuha s. 386 00:21:49,740 --> 00:21:51,130 >> Well, ano ang na ibig sabihin nito? 387 00:21:51,130 --> 00:21:53,280 Well, ito ay isang maliit na mahirap na isipin tungkol sa ang larawan ito matalino. 388 00:21:53,280 --> 00:21:55,025 Ngunit sabihin isipin ang tungkol kung ano ang nasa loob ng x? 389 00:21:55,025 --> 00:21:59,430 Ano ang Literal na ito sa loob ng variable? 390 00:21:59,430 --> 00:22:01,500 Ang halaga Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Kaya kapag sinabi ko string t nakakakuha s, na lamang Literal na nangangahulugan na gawin ang mga numero ng 392 00:22:05,815 --> 00:22:10,070 sa s, na kung saan ay Ox123 at ilagay ito Ox123. 393 00:22:10,070 --> 00:22:13,740 O pictorially, kung ako uri ng abstract ang layo mula sa na detalye nito ay ang 394 00:22:13,740 --> 00:22:16,600 epekto ng literal paggawa ito pati na rin. 395 00:22:16,600 --> 00:22:22,110 >> Kaya ngayon, sa tingin bumalik sa nakaraang linggo kapag kami nagpatuloy sa kapitalistang T. ako 396 00:22:22,110 --> 00:22:23,800 ginawang T bracket 0. 397 00:22:23,800 --> 00:22:27,150 Well, T bracket 0, kahit na ito ay isang pointer, maaari mong ituring ito bilang bagaman 398 00:22:27,150 --> 00:22:29,220 ito ay isang array, na may isang parisukat bracket pagtatanda. 399 00:22:29,220 --> 00:22:31,550 >> Kaya kung saan ay T bracket 0? 400 00:22:31,550 --> 00:22:32,990 Well, ito ay ang h. 401 00:22:32,990 --> 00:22:36,800 At kaya kapag ginagamit namin na linya ng code, dalawang itaas, na kung saan ay nasa c na type.h 402 00:22:36,800 --> 00:22:38,460 header ng file, na kung saan ito ay ipinahayag. 403 00:22:38,460 --> 00:22:44,410 Kang naka-capitalize na ito H. Ngunit ng Siyempre, iyon ang eksaktong parehong h na 404 00:22:44,410 --> 00:22:46,540 sa loob ng s, kaya na magsalita. 405 00:22:46,540 --> 00:22:51,930 At kaya ngayon binago mo na o Isulat sa malaking titik ang parehong orihinal at ang 406 00:22:51,930 --> 00:22:53,120 tinatawag nang gayon kopya. 407 00:22:53,120 --> 00:22:56,620 Dahil hindi ka gumawa ng isang kopya sa paraan na ang isang tao ay gusto mo itong maging. 408 00:22:56,620 --> 00:22:59,710 >> Kaya kung ano ay ang pag-aayos dito, sa copy1.c noong nakaraang linggo? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Pag-andar, sa gayon maaari naming talaga kopyahin ang string. 411 00:23:05,580 --> 00:23:08,700 At sa panimula, ano ang kailangan namin upang gawin upang kopyahin ang string? 412 00:23:08,700 --> 00:23:12,070 >> Well, sa ganitong berde bersyon dito ako pagpunta sa gawin ito nang walang kinikilingan mababang antas. 413 00:23:12,070 --> 00:23:14,260 May mga aktwal na mga function sila ay maaaring makatulong sa ito. 414 00:23:14,260 --> 00:23:17,710 Ngunit ang pinaka-basic ng isa, at ang pinaka- pamilyar ang isa, hindi bababa sa, ay malapit nang maging 415 00:23:17,710 --> 00:23:19,600 pamilyar sa amin, ay ang mga sumusunod - 416 00:23:19,600 --> 00:23:21,910 kaya isa sa unang linya ng code sa berde ngayon. 417 00:23:21,910 --> 00:23:23,970 >> Ko lang rewrote s bilang pansamantalang trabaho *. 418 00:23:23,970 --> 00:23:25,250 Walang functional pagkakaiba doon. 419 00:23:25,250 --> 00:23:28,790 Katatapos ko lamang threw ang layo ng CS50 library at Ako pagtawag ito kung ano ito ay, isang pansamantalang trabaho *. 420 00:23:28,790 --> 00:23:31,640 >> Ngayon tuldok, tuldok, tuldok, dahil mayroong ang ilang mga error checking na hindi 421 00:23:31,640 --> 00:23:33,200 kagiliw-giliw na makipag-usap tungkol sa muli. 422 00:23:33,200 --> 00:23:34,710 Kaya ngayon t ay ipinahayag. 423 00:23:34,710 --> 00:23:35,780 Ito masyadong ay isang pansamantalang trabaho *. 424 00:23:35,780 --> 00:23:38,280 Kaya ako iginuhit ng kaunti sa parisukat ang screen tulad ng dati. 425 00:23:38,280 --> 00:23:41,870 >> Ngunit sa kanang bahagi, malloc, sinabi namin ay magtalaga ng memory. 426 00:23:41,870 --> 00:23:44,130 Kaya maglaan ng ilang tipak ng memory. 427 00:23:44,130 --> 00:23:48,830 At kung gaano karaming bytes ginagawa namin talaga nais upang maglaan, ay mukhang ito? 428 00:23:48,830 --> 00:23:50,340 >> Well, ang string haba ng s. 429 00:23:50,340 --> 00:23:52,310 Kaya kung kumusta na pagpunta sa maging lima. 430 00:23:52,310 --> 00:23:53,950 Susubukan naming sabihin h-e-l--l o. 431 00:23:53,950 --> 00:23:55,090 Kaya limang bytes. 432 00:23:55,090 --> 00:23:57,960 >> Ngunit pagkatapos plus 1, bakit 1? 433 00:23:57,960 --> 00:23:58,830 Ang mga character na 0. 434 00:23:58,830 --> 00:24:03,640 Kung hindi kami iwanan kuwarto para sa tao namin maaaring aksidenteng lumikha ng isang sitwasyon 435 00:24:03,640 --> 00:24:05,600 kung saan ang string ay h-e-l--l o. 436 00:24:05,600 --> 00:24:08,470 At pagkatapos ay ang susunod na panahon GetString ay tinatawag na ako at i-type sa, halimbawa, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, ang computer ay pagpunta mag-isip na ang mga ay ang tunay 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d dahil mayroong hindi masira sa pagitan ng mga salitang iyon. 439 00:24:18,900 --> 00:24:19,810 >> Kaya kailangan namin na bakasyon. 440 00:24:19,810 --> 00:24:20,720 Kaya hindi namin nais limang. 441 00:24:20,720 --> 00:24:22,100 Gusto naming anim bytes. 442 00:24:22,100 --> 00:24:23,110 >> At bytes sinasabi ko. 443 00:24:23,110 --> 00:24:25,220 Ngunit ito ay talagang oras laki ng pansamantalang trabaho. 444 00:24:25,220 --> 00:24:28,040 Technically pansamantalang trabaho ay halos palaging isang solong byte. 445 00:24:28,040 --> 00:24:31,030 >> Ngunit lamang upang gumawa ng aming mga code portable, kaya na magsalita, upang ito ay gumagana sa 446 00:24:31,030 --> 00:24:33,750 iba't ibang mga computer kahit na maaari nilang maging medyo iba sa ilalim ng 447 00:24:33,750 --> 00:24:36,590 hood, pupuntahan ko generically sabihin laki ng pansamantalang trabaho nang sa gayon ay 448 00:24:36,590 --> 00:24:37,660 ang aking code palaging gumagana. 449 00:24:37,660 --> 00:24:40,610 At hindi ko na kailangang mag-recompile ito lamang dahil ko i-upgrade ang aking computer o gamitin 450 00:24:40,610 --> 00:24:42,140 ilang iba't ibang mga platform. 451 00:24:42,140 --> 00:24:45,300 >> Kaya Mayroon akong 6 beses ang laki ng isang pansamantalang trabaho, na ang mangyayari sa maging 1. 452 00:24:45,300 --> 00:24:47,440 Kaya na paraan malloc ng dati bigyan mo ako ng anim na bytes. 453 00:24:47,440 --> 00:24:49,140 Ano ang tunay na ginagawa? 454 00:24:49,140 --> 00:24:52,810 Well, ipaalam sa akin pagulungin pabalik sa panahon dito upang kung saan tayo sa kuwento. 455 00:24:52,810 --> 00:24:57,620 >> Kaya kung pumunta ako pabalik dito, ko na ipinahayag isang pansamantalang trabaho * tinatawag t. 456 00:24:57,620 --> 00:25:00,280 Ngayon ko na tinatawag na malloc para sa anim bytes. 457 00:25:00,280 --> 00:25:06,400 At ngayon pupuntahan ko upang gumuhit ng mga anim na bytes tulad ng array mas maaga. 458 00:25:06,400 --> 00:25:10,570 Ngunit ko talagang hindi alam kung ano ang sa loob ng array. 459 00:25:10,570 --> 00:25:14,640 >> Kung maglaan ka ng memory ito lumiliko out na Hindi mo maaaring pagkatiwalaan na mayroong ilang mga 460 00:25:14,640 --> 00:25:15,810 Kilala halaga doon. 461 00:25:15,810 --> 00:25:18,400 Maaaring ito ay ginamit sa pamamagitan ng isang bagay tao, sa ilang ibang mga pag-andar, ang ilang mga iba pang 462 00:25:18,400 --> 00:25:19,630 linya ng code na sinulat mo. 463 00:25:19,630 --> 00:25:22,870 Kaya makikita namin sa pangkalahatan ay tawagan ang mga basura mga halaga at makahatak ng mga ito, marahil, bilang 464 00:25:22,870 --> 00:25:26,170 tanong mark, lamang na nagpapahiwatig na namin hindi alam kung ano ang talagang doon. 465 00:25:26,170 --> 00:25:30,390 At na hindi sang-ayon kaya hangga't namin ay matalino sapat na upang patungan ang mga 466 00:25:30,390 --> 00:25:34,550 mga halaga ng basura na may mga numero o char na pinapahalagahan namin ang tungkol sa. 467 00:25:34,550 --> 00:25:36,340 >> Kaya sa kasong ito kung ano ako pagpunta sa gawin? 468 00:25:36,340 --> 00:25:38,670 Well, ang aking mga linya ng code susunod, mayroon akong apat. 469 00:25:38,670 --> 00:25:41,350 int makakuha i 0, n nakakakuha ng string haba ng s. 470 00:25:41,350 --> 00:25:42,750 Kaya isang pamilyar para sa loop. 471 00:25:42,750 --> 00:25:45,875 Ako ay mas mababa sa o katumbas ng n, na karaniwang ay sa itaas. 472 00:25:45,875 --> 00:25:47,500 >> Ngunit oras na ito ito ay sinadya. 473 00:25:47,500 --> 00:25:51,890 Ako + +, at pagkatapos ko lang gawin t bracket ay nakakakuha i s. 474 00:25:51,890 --> 00:25:56,320 Dahil ang aking mga larawan ay mukhang ganito sa sandaling ito, na naka-imbak sa t ay ang 475 00:25:56,320 --> 00:25:59,530 address ng random na tipak ng memory kung saan ang mga halaga ay hindi kilala. 476 00:25:59,530 --> 00:26:03,030 Ngunit sa sandaling gawin ko t bracket 0 na naglalagay sa akin dito. 477 00:26:03,030 --> 00:26:07,430 >> At kung ano ay nagtatapos up nagsisimula iginuhit doon? 478 00:26:07,430 --> 00:26:08,740 Tapusin namin ang hanggang paglalagay h. 479 00:26:08,740 --> 00:26:11,170 Dahil iyon ang kung ano ang sa mga bracket 0. 480 00:26:11,170 --> 00:26:14,300 At pagkatapos ay ang parehong bagay para sa e, at l, at l, at o. 481 00:26:14,300 --> 00:26:17,930 >> n, bakit ako pumunta up sa pamamagitan ng isang patas sa n? 482 00:26:17,930 --> 00:26:19,200 Dahil sa 0 karakter. 483 00:26:19,200 --> 00:26:23,580 Kaya lamang maging malinaw, pagkatapos, kung ako talaga burahin ang anumang mga basura 484 00:26:23,580 --> 00:26:28,870 mga halaga ay at pagkatapos ay talagang gumuhit sa kung ano ang inaasahan ko, ito ang mga bracket 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, plus na trailing bagong character. 486 00:26:32,440 --> 00:26:36,080 >> At kaya ngayon kung namin ipinagpatuloy nakalipas na ang tuldok, tuldok, tuldok na ito sa tamang bersyon 487 00:26:36,080 --> 00:26:41,930 at capitalized t bracket 0 gagawin ko, ng Siyempre, i-capitalize lang ito 488 00:26:41,930 --> 00:26:47,050 tao dito, na conceptually, sa huli ay ang layunin. 489 00:26:47,050 --> 00:26:48,040 Kaya na ang lahat ng pointer ay. 490 00:26:48,040 --> 00:26:51,430 >> At na ginagamit mo ang mga ito para sa linggo ngayon sa konteksto ng mga string. 491 00:26:51,430 --> 00:26:53,530 Ngunit sa ilalim ng hood ang mga ito ay medyo mas kumplikado. 492 00:26:53,530 --> 00:26:57,520 Pero kung sa tingin mo tungkol sa mga ito sa ito may mga larawan form na ipanukala ko na ang mga ito ay 493 00:26:57,520 --> 00:27:01,720 Marahil hindi lahat ng nakakatakot na habang ang mga ito baka unang tila sa unang tingin, 494 00:27:01,720 --> 00:27:04,730 lalo na may tulad na bagong syntax. 495 00:27:04,730 --> 00:27:07,290 Ang anumang mga katanungan sa payo, string, o char? 496 00:27:07,290 --> 00:27:07,580 Oo? 497 00:27:07,580 --> 00:27:09,252 >> Madla: Maaari kang bumalik sa [hindi marinig]? 498 00:27:09,252 --> 00:27:10,502 >> Tagapagsalita 1: Oo naman. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> Madla: Kaya kung paano dumating sa iyong napaka-huling linya, hindi mo kailangang magkaroon ng isang linya * t 501 00:27:19,525 --> 00:27:21,513 at isang * s sa linya? 502 00:27:21,513 --> 00:27:23,004 Huwag kang magkaroon ang reference sa - 503 00:27:23,004 --> 00:27:24,640 >> Tagapagsalita 1: Ah, isang talagang mahusay na tanong. 504 00:27:24,640 --> 00:27:26,800 Bakit hindi Mayroon akong * t at isang * s? 505 00:27:26,800 --> 00:27:30,340 Dahil sa madaling sabi, noong nakaraang linggo, tulad ng sa aming swap function, ko sabihin na kapag 506 00:27:30,340 --> 00:27:33,350 mayroon kang pointer ang mga paraan kung saan pumunta ka doon bilang namin ginawa 507 00:27:33,350 --> 00:27:36,590 pisikal na sa entablado, ay talagang gamitin ang star operator. 508 00:27:36,590 --> 00:27:40,570 >> Ito ay lumiliko out na ito square-bracket pagtatanda ay kung ano ang makikita namin tumawag sintaktik 509 00:27:40,570 --> 00:27:44,190 asukal, na kung saan ay lamang ng isang sexy paraan ng sinasabi ito ng shorthand notation para sa 510 00:27:44,190 --> 00:27:45,950 eksakto kung ano ang naglalarawan. 511 00:27:45,950 --> 00:27:49,385 Ngunit ito ay isang maliit na mas madaling maunawaan. 512 00:27:49,385 --> 00:27:53,510 At sa panganib ng paggawa ng ito ay tila higit pa kumplikado kaysa ito ay kailangang maging, 513 00:27:53,510 --> 00:27:56,990 kung ano talaga ang nangyayari dito ay ang mga sumusunod - 514 00:27:56,990 --> 00:28:01,450 Kung sinasabi ko * t nangangahulugan na pumunta sa address ang naka-imbak sa t. 515 00:28:01,450 --> 00:28:04,350 >> Kaya literal, kung t ay pag-iimbak ang address ng na h 516 00:28:04,350 --> 00:28:07,300 sa una, * t paraan pumunta dito. 517 00:28:07,300 --> 00:28:10,730 Ngayon, ano ang nilalaman ng t bracket 0 ibig sabihin nito? 518 00:28:10,730 --> 00:28:11,560 Parehong eksaktong bagay. 519 00:28:11,560 --> 00:28:13,510 Ito ay lamang ng kaunti pa sa gumagamit magiliw na magsulat. 520 00:28:13,510 --> 00:28:14,430 >> Ngunit hindi ko pa tapos. 521 00:28:14,430 --> 00:28:17,800 Hindi lang ko masabi * t ay nakakakuha * s. 522 00:28:17,800 --> 00:28:19,440 Dahil kung ano ang Gusto ko ginagawa pagkatapos? 523 00:28:19,440 --> 00:28:22,950 Gusto ko ma-putting h, h, h, h, h sa buong ang buong bagay. 524 00:28:22,950 --> 00:28:22,995 I-right? 525 00:28:22,995 --> 00:28:26,020 >> Dahil * t ay pumunta sa address sa t. 526 00:28:26,020 --> 00:28:27,580 Ngunit kami ay sa loob ng isang loop. 527 00:28:27,580 --> 00:28:32,150 At ano ang halaga ako incrementing, siyempre, sa bawat pag-ulit? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Subalit mayroong isang pagkakataon dito, tama? 530 00:28:34,590 --> 00:28:37,870 Kahit na ito nararamdaman tulad ng nakakakuha ito ng ang kaunti pa sopistikadong 531 00:28:37,870 --> 00:28:40,730 kaysa sa square bracket-pagtatanda kami na ginagamit para sa ilang oras - 532 00:28:40,730 --> 00:28:43,840 hayaan mo akong i-undo ang aking h pagbabago doon - 533 00:28:43,840 --> 00:28:48,870 kahit na ito ay ngayon sa pagkuha ng kaunti may interes, ang pangunahing ideya, kung * t 534 00:28:48,870 --> 00:28:53,630 Nangangahulugan dito at * t lamang ang pumunta sa address sa t. 535 00:28:53,630 --> 00:28:54,990 >> Ngunit ano ay ang address sa t? 536 00:28:54,990 --> 00:28:56,850 Ang bilang panatilihin namin ang paggamit? 537 00:28:56,850 --> 00:29:00,540 Tulad Ox456, sabihin na magdala pabalik para lamang sa ang kapakanan ng talakayan. 538 00:29:00,540 --> 00:29:05,380 Well, kung gusto ko upang makakuha ng sa e in t string, ko lang nais upang pumunta sa, 539 00:29:05,380 --> 00:29:06,460 talaga, 456. 540 00:29:06,460 --> 00:29:09,230 >> O sa halip, 457. 541 00:29:09,230 --> 00:29:10,590 Ko lang ang kailangan upang magdagdag ng isa. 542 00:29:10,590 --> 00:29:11,790 Ngunit maaari kong gawin na, tama? 543 00:29:11,790 --> 00:29:14,680 Dahil t, kahit na panatilihing ako drawing ito ngayon bilang isang arrow, ito lamang ay isang 544 00:29:14,680 --> 00:29:16,570 numero, Ox456. 545 00:29:16,570 --> 00:29:21,400 At kung ako magdagdag ng isa sa na, o higit pang mga Sa pangkalahatan, kung ako idaragdag ko sa na maaari kong 546 00:29:21,400 --> 00:29:24,350 talagang makakuha ng eksakto kung saan gusto ko. 547 00:29:24,350 --> 00:29:26,260 Kaya kung ko talagang gawin ito - 548 00:29:26,260 --> 00:29:28,970 at ito ay kung ano ang tinatawag na ngayong pointer aritmetika - 549 00:29:28,970 --> 00:29:30,375 Maaari ko bang tanggalin ang linyang ito. 550 00:29:30,375 --> 00:29:33,550 Alin ang, lantaran, tingin ko mas malinaw at ang kaunti pa user friendly na basahin. 551 00:29:33,550 --> 00:29:35,970 Ngunit ito ay hindi gaanong tama. 552 00:29:35,970 --> 00:29:38,570 >> Ang linya ng code ngayon ay gumagamit ng pointer aritmetika. 553 00:29:38,570 --> 00:29:40,920 Ito ay nagsasabi pumunta sa pagsunod address - 554 00:29:40,920 --> 00:29:44,670 ano ang simula ng t ay, na ay t plus i, na una 555 00:29:44,670 --> 00:29:45,730 ay 0, na kung saan ay mahusay. 556 00:29:45,730 --> 00:29:49,280 Dahil ito ay nangangahulugan na ang simula ng t plus 1, 2 plus, plus 3, at iba pa. 557 00:29:49,280 --> 00:29:51,030 At sa parehong pakikitungo na may s. 558 00:29:51,030 --> 00:29:52,750 >> Kaya sintaktik asukal para sa ito. 559 00:29:52,750 --> 00:29:55,900 Ngunit pag-unawa kung ano talaga ang nangyayari sa sa ilalim ng hood, Gusto ko magtaltalan, 560 00:29:55,900 --> 00:29:57,410 ay talagang kapaki-pakinabang sa loob at ng sarili nito. 561 00:29:57,410 --> 00:30:00,620 Dahil ang ibig sabihin nito ngayon ay may hindi marami pang iba magic ng pagpunta sa 562 00:30:00,620 --> 00:30:01,620 sa ilalim ng hood. 563 00:30:01,620 --> 00:30:03,920 May ay hindi pagpunta sa maging marami pa mga layer na maaari naming i-back alisan ng balat para sa iyo. 564 00:30:03,920 --> 00:30:04,810 Ito ay c. 565 00:30:04,810 --> 00:30:06,410 At ito ay mga programa. 566 00:30:06,410 --> 00:30:08,002 Talagang mahusay na tanong. 567 00:30:08,002 --> 00:30:11,570 >> Ang lahat ng mga karapatan, sa gayon ito ay na maraming surot programa ako ay nagre-refer sa mas maaga. 568 00:30:11,570 --> 00:30:12,650 makipagpalitan ay flawed. 569 00:30:12,650 --> 00:30:14,070 Kung ang tila upang gumana. 570 00:30:14,070 --> 00:30:17,390 Pagkuhang muli na lang bang may gatas at ang orange juice - na kung saan ako nagsimula 571 00:30:17,390 --> 00:30:18,660 inom demonstration ngayon. 572 00:30:18,660 --> 00:30:22,220 Kaya lang bilang may orange juice at gatas ang, namin ginawa na kailangang gumamit ng isang 573 00:30:22,220 --> 00:30:26,200 pansamantalang variable, tmp, upang i-hold ang isang Pansamantalang sa gayon ay maaari naming pagkatapos ay 574 00:30:26,200 --> 00:30:28,820 baguhin ang mga halaga at pagkatapos ay i-update b. 575 00:30:28,820 --> 00:30:32,870 >> Ngunit ang function na ito, sinabi namin, o ito programa kung saan ang function na ito ay 576 00:30:32,870 --> 00:30:35,670 nakasulat ay mali at flawed, bakit? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Oo? 579 00:30:39,090 --> 00:30:42,471 >> Madla: [hindi marinig]. 580 00:30:42,471 --> 00:30:44,940 >> Tagapagsalita 1: Mismong, kapag tumawag ka makipagpalitan - 581 00:30:44,940 --> 00:30:47,820 o mas pangkalahatan, kapag nag- tumawag pinaka-anumang function na - 582 00:30:47,820 --> 00:30:51,210 kung ang argumento sa function na iyon ay noong unang panahon, kaya na magsalita, ints at char 583 00:30:51,210 --> 00:30:56,740 at Doubles at sa kamay, mga bagay na walang bituin, ikaw ay pagpasa sa isang kopya ng 584 00:30:56,740 --> 00:30:57,540 ang argumento. 585 00:30:57,540 --> 00:31:01,580 Kaya kung x ay 1 at y ay 2, ang isang ay pagpunta upang maging 1 at b ay magiging 2. 586 00:31:01,580 --> 00:31:05,250 Subalit sila ay pagpunta sa maging iba chunks ng bits, iba't ibang mga chunks ng 587 00:31:05,250 --> 00:31:07,540 memory na nangyari mang-iimbak magkamukha halaga. 588 00:31:07,540 --> 00:31:12,160 >> Kaya code na ito ay sobrang perpekto sa pagpapalit ng isang at b. 589 00:31:12,160 --> 00:31:13,850 Ito ay walang magandang sa pagpapalit - 590 00:31:13,850 --> 00:31:15,290 Halimbawa sa huling linggo - 591 00:31:15,290 --> 00:31:16,390 x at y. 592 00:31:16,390 --> 00:31:18,780 Dahil muli, ang mga ito ay nasa maling saklaw. 593 00:31:18,780 --> 00:31:21,310 >> Ngayon, kung paano namin ay pumunta tungkol sa pag-aayos na ito? 594 00:31:21,310 --> 00:31:23,140 Kinailangan naming gawin ang mga function na tumingin ng kaunti hindi maganda. 595 00:31:23,140 --> 00:31:25,250 Ngunit muli, isaalang-alang kung ano ang ito ay nangangahulugan lamang. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> At talagang, sabihin sa akin, para hindi pabago-bago, baguhin ang isang bagay kaya kapareho 598 00:31:31,500 --> 00:31:33,200 ano pa lang namin ginawa. 599 00:31:33,200 --> 00:31:35,690 Tulad ng nabanggit ko noong nakaraang linggo, hindi mahalaga kung saan ito mapupunta. 600 00:31:35,690 --> 00:31:38,120 Sa katunayan, karaniwan nais mong ilagay ang bituin sa tabi ng pangalan ng variable. 601 00:31:38,120 --> 00:31:40,750 Ngunit sa tingin ko magiging isang maliit na mas madali upang isaalang-alang ang * sa tabi ng 602 00:31:40,750 --> 00:31:44,910 uri ng data bilang ibig sabihin ito ay isang pointer sa isang int sa kasong ito. 603 00:31:44,910 --> 00:31:46,270 >> Kaya kung ano ako ng paggawa dito? 604 00:31:46,270 --> 00:31:49,590 Ako sinasabi huwag magbigay sa akin ng isang int sinundan ng isa pang int, 605 00:31:49,590 --> 00:31:50,810 pagtawag sa kanila ng isang at b. 606 00:31:50,810 --> 00:31:52,460 Bigyan mo ako ng address ng isang int. 607 00:31:52,460 --> 00:31:53,960 Bigyan mo ako ng address ng isa pang int. 608 00:31:53,960 --> 00:31:56,330 Tawagan ang mga address ng isang at b. 609 00:31:56,330 --> 00:32:00,860 >> At pagkatapos ay ang paggamit ng * notation pababa sa ibaba, pumunta sa bawat isa sa mga address na iyon 610 00:32:00,860 --> 00:32:05,290 bilang kinakailangan upang makakuha ng alinman sa o itakda ang halaga nito. 611 00:32:05,290 --> 00:32:07,400 Subalit mayroong isang exception dito. 612 00:32:07,400 --> 00:32:11,130 Bakit hindi ako magkaroon ng isang * sa tabi ng tmp? 613 00:32:11,130 --> 00:32:15,070 Bakit hindi ako gawin ito, halimbawa? 614 00:32:15,070 --> 00:32:19,370 Ito nararamdaman tulad ng dapat kong pumunta lamang lahat out at maitama ang buong bagay. 615 00:32:19,370 --> 00:32:19,752 Oo? 616 00:32:19,752 --> 00:32:21,002 >> Madla: [hindi marinig]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Tagapagsalita 1: Hindi ko pa ipinahayag tmp bilang isang string. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Kaya ito ay ipinapahayag, sa kasong ito, tmp isang upang maging ang address ng isang int. 621 00:32:34,950 --> 00:32:37,380 Ngunit iyon ay hindi pa kung ano ang gusto ko, para sa isang pares ng mga dahilan. 622 00:32:37,380 --> 00:32:38,616 >> Madla: Hindi mo nais na i-swap ang mga ito. 623 00:32:38,616 --> 00:32:41,800 >> Tagapagsalita 1: Mismong, hindi ko nais upang magpalitan anumang bagay na may tmp. tmp lamang ang 624 00:32:41,800 --> 00:32:42,790 linggo-isa bagay-bagay. 625 00:32:42,790 --> 00:32:45,150 Ang lahat ng mga gusto ko ay isang variable mag-imbak ng ilang mga numero. 626 00:32:45,150 --> 00:32:47,330 Hindi ko kahit na nagmamalasakit tungkol sa mga address sa panahon na ito. 627 00:32:47,330 --> 00:32:50,530 >> Ko lang kailangan 32 bits o kaya i-store sa isang int. 628 00:32:50,530 --> 00:32:56,690 At gusto ko ang ilalagay sa mga 32 bit ano ay wala sa, kaya na magsalita, ngunit 629 00:32:56,690 --> 00:33:01,260 kung ano ang nasa isang, lamang na maging mas tumpak. 630 00:33:01,260 --> 00:33:06,420 Dahil kung ang isang ay isang address, * ay nangangahulugang isang pumunta doon at makuha ang halaga 1. 631 00:33:06,420 --> 00:33:10,560 Halimbawa, sa halimbawa huling linggo o sa b ni kaso, makakuha ng halaga ng 2. 632 00:33:10,560 --> 00:33:11,750 >> Kaya kung ano talaga ang nangyari? 633 00:33:11,750 --> 00:33:15,070 Hayaan akong gumuhit ng larawan dito na kalooban mang-ulol lamang apart bahagi ng araw na ito. 634 00:33:15,070 --> 00:33:18,580 Ngunit ito ay patuloy na lumitaw para sa lubos ng ilang oras. 635 00:33:18,580 --> 00:33:22,430 >> Ito, inaangkin ko, ay kung ano ang iyong computer memory Mukhang kapag nagpatakbo ka ng 636 00:33:22,430 --> 00:33:24,060 programa, ang anumang programa. 637 00:33:24,060 --> 00:33:28,340 Kapag nagpatakbo ka ng isang programa sa pinakatuktok ng RAM ng iyong computer - kaya isipin 638 00:33:28,340 --> 00:33:33,530 ito parihaba, tunay, bilang iyong computer RAM o memorya, ang lahat ng 101 639 00:33:33,530 --> 00:33:36,920 bilyong bytes ng ito, ang lahat ng dalawang bilyong bytes, ang lahat ng dalawang gigabytes ng ito, 640 00:33:36,920 --> 00:33:39,910 anuman ang dami mayroon kang ay, sabihin iguhit ito bilang isang parihaba. 641 00:33:39,910 --> 00:33:43,260 At inaangkin ko na kapag nagpatakbo ka ng isang programa tulad ng Microsoft Word o Chrome 642 00:33:43,260 --> 00:33:49,220 o anumang bagay tulad na, ang mga bits na O Microsoft na ang Google ay nagsulat - 643 00:33:49,220 --> 00:33:50,910 sa kaso ng mga programa - 644 00:33:50,910 --> 00:33:54,490 ang malo-load sa memory ng iyong computer kung saan maaari nilang ipatupad ang higit pa 645 00:33:54,490 --> 00:33:57,520 mabilis at fed papunta sa CPU, na ay ang talino ng mga computer. 646 00:33:57,520 --> 00:34:00,940 >> At sa TAM sila ay naka-imbak sa pinakadulo tuktok ng iyong programa, kaya na magsalita. 647 00:34:00,940 --> 00:34:03,300 Sa ibang salita, kung ito ay isang tipak ng memorya, kapag nag-double-click sa 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, ang mga bits ay off ang hard drive. 649 00:34:05,740 --> 00:34:06,680 Sila ay makapag-load sa RAM. 650 00:34:06,680 --> 00:34:10,330 At kami tulak up ang mga ito sa pinakatuktok ito ng parihaba conceptually. 651 00:34:10,330 --> 00:34:13,010 >> Well, ang natitirang bahagi ng iyong memorya ay na ginagamit para sa iba't ibang mga bagay. 652 00:34:13,010 --> 00:34:16,460 Sa pinakatuktok makita mo initialize data at uninitialize data. 653 00:34:16,460 --> 00:34:20,500 Ito ay gawin, para sa pinaka-bahagi, na may constants o pangkalahatang variable 654 00:34:20,500 --> 00:34:21,340 na may halaga. 655 00:34:21,340 --> 00:34:22,980 Ngunit higit pa sa mga ibang oras. 656 00:34:22,980 --> 00:34:25,150 >> Pagkatapos mayroon kang ang kimpal, na kami ay bumalik sa. 657 00:34:25,150 --> 00:34:28,420 Ngunit sa ilalim ay ang bahagi na lalo na dyermeyn sa ngayon. 658 00:34:28,420 --> 00:34:30,210 Ito ay ang tinatawag na stack. 659 00:34:30,210 --> 00:34:33,850 Kaya tulad lamang ng sa karamihan ng anumang D hall dito sa campus, mayroon kang mga trays na 660 00:34:33,850 --> 00:34:37,210 isalansan lamang sa ibabaw ng bawat isa sa kung saan maaari kang maglagay ng pagkain at watnat. 661 00:34:37,210 --> 00:34:40,139 Ang stack sa isang sistema ng computer na ay halos katulad na. 662 00:34:40,139 --> 00:34:42,679 Maliban kung saan ang tray, pati na ginagamit namin sa sa dining hall, siyempre, ay sinadya 663 00:34:42,679 --> 00:34:45,710 upang dalhin ang mga bagay trays o ang mga frame - 664 00:34:45,710 --> 00:34:49,469 dahil kakailanganin naming tawagan ang mga ito - sa isang computer memorya ay ginagamit upang i-hold 665 00:34:49,469 --> 00:34:51,610 variable at halaga. 666 00:34:51,610 --> 00:34:53,929 >> Kaya kung ano ang talagang napupunta sa sa ilalim ng hood? 667 00:34:53,929 --> 00:34:55,820 Well, hayaan mo akong i-flip sa ibabaw sa screen dito. 668 00:34:55,820 --> 00:34:58,370 At sabihin tumuon lamang sa ibabang bahagi para sa isang sandali. 669 00:34:58,370 --> 00:35:02,770 Kung ito ang ibabang bahagi ng aking computer memory ito lumiliko out kapag ako 670 00:35:02,770 --> 00:35:05,350 tawagan ang function pangunahing - na mangyayari, lantaran, 671 00:35:05,350 --> 00:35:06,950 Awtomatikong para sa akin - 672 00:35:06,950 --> 00:35:10,510 Nakakuha ako ng tipak ng memory sa ibaba ng aking RAM kaya na magsalita. 673 00:35:10,510 --> 00:35:13,390 At ito ay kung saan ang pangunahing lokal na mga variable pumunta. 674 00:35:13,390 --> 00:35:16,770 Ito ay kung saan argc at argv siguro pumunta, at anumang mga variable na ako 675 00:35:16,770 --> 00:35:18,170 Ipinahahayag sa loob ng main. 676 00:35:18,170 --> 00:35:20,260 Sila ay nagtatapos up sa ilalim ng RAM ng aking computer. 677 00:35:20,260 --> 00:35:25,040 >> Ngayon ipagpalagay na pangunahing mga tawag sa isang function tulad makipagpalitan ng, tulad ng ito ginawa noong nakaraang linggo? 678 00:35:25,040 --> 00:35:30,620 Well, aming lubos na maglagay ng bagong tray, isang bagong frame, sa aking mga tipak ng memory. 679 00:35:30,620 --> 00:35:34,160 At ako pagpunta sa ilarawan ito bilang kasali sa function na makipagpalitan. 680 00:35:34,160 --> 00:35:35,770 >> Ngayon kung ano ang nasa loob ng makipagpalitan? 681 00:35:35,770 --> 00:35:39,240 Well, batay sa programa noong nakaraang linggo at ang isa pa lang namin nakita ang isang sipi mula sa, 682 00:35:39,240 --> 00:35:46,590 sa loob ng frame makipagpalitan ng, o sa makipagpalitan ng tray, kung ano ang mga variable? 683 00:35:46,590 --> 00:35:47,970 Well, isang at b. 684 00:35:47,970 --> 00:35:51,850 Dahil doon ay nito lokal na mga argumento, plus isang third, tmp. 685 00:35:51,850 --> 00:35:54,470 Kaya talaga, kaya kong iguhit ito ang kaunti pa nang malinis. 686 00:35:54,470 --> 00:35:56,680 Hayaan akong sige at i-undo ang mga label. 687 00:35:56,680 --> 00:35:58,520 At ipaalam sa akin i-claim na alam mo kung ano? 688 00:35:58,520 --> 00:36:00,560 >> isang ay marahil pagpunta sa magtapos up dito. 689 00:36:00,560 --> 00:36:02,160 B ay pagpunta upang tapusin up dito. 690 00:36:02,160 --> 00:36:03,810 At tmp ay pagpunta upang tapusin up dito. 691 00:36:03,810 --> 00:36:05,160 Ngayon, na pagkakasunud-sunod ng kapangyarihan maging isang maliit na naiiba. 692 00:36:05,160 --> 00:36:06,840 Ngunit conceptually ito ay ang ideya. 693 00:36:06,840 --> 00:36:11,490 >> At lamang kapag pinagsama-sama, ito ay kung ano ang Makikita kami tatawag sa frame makipagpalitan ng, o 694 00:36:11,490 --> 00:36:12,136 dining hall-tray. 695 00:36:12,136 --> 00:36:13,150 At sa parehong pakikitungo sa main. 696 00:36:13,150 --> 00:36:14,040 Ngunit hindi ko ay redraw na. 697 00:36:14,040 --> 00:36:17,810 Ngunit iyon kung saan argc at argv at anumang ng kanyang mga lokal na variable tulad ng x at y 698 00:36:17,810 --> 00:36:18,940 maaaring pati na rin. 699 00:36:18,940 --> 00:36:22,170 >> Kaya ngayon isaalang-alang kung ano talaga ang nangyayari kapag tumawag ka makipagpalitan. 700 00:36:22,170 --> 00:36:26,370 Kapag tumawag ka makipagpalitan, e-execute code tulad ng ito, ikaw ay pagpasa sa, sa 701 00:36:26,370 --> 00:36:30,670 maraming surot bersyon, at isang b bilang ng mga kopya ng x at y. 702 00:36:30,670 --> 00:36:34,300 Kaya kung ngayon ko gumuhit ito sa screen - 703 00:36:34,300 --> 00:36:36,700 Nakakuha upang makakuha ng mas mahusay na sa ito - 704 00:36:36,700 --> 00:36:40,850 kaya ang kuwento ko ay nagsasabi sa aking sarili ay ito sa maraming surot bersyon, kapag kami 705 00:36:40,850 --> 00:36:46,130 tumawag magpalit ng pagpasa sa isang literal at b bilang integer, kung ano talaga ang nangyayari? 706 00:36:46,130 --> 00:36:48,250 >> Well, kung ano talaga ang nangyayari ay na ito. 707 00:36:48,250 --> 00:36:52,850 Hayaan akong sige at i-undo lamang upang i-clear ng ilang espasyo dito. 708 00:36:52,850 --> 00:36:54,720 Kaya ito ay ang memorya ng aking computer. 709 00:36:54,720 --> 00:36:57,510 >> Kaya kung mayroon akong, halimbawa - 710 00:36:57,510 --> 00:36:58,910 talagang sabihin gawin ito sa ganitong paraan - 711 00:36:58,910 --> 00:37:02,690 kung i-claim ko na ito ay x, pag-iimbak ang halaga 1 tulad ng nakaraang linggo. 712 00:37:02,690 --> 00:37:05,930 At ito ay y, pag-iimbak ang halaga 2 tulad lamang ng nakaraang linggo. 713 00:37:05,930 --> 00:37:11,370 At ito ay pangunahing, kapag tumawag ako makipagpalitan ng, sa gayong paraan pagbibigay sa sarili ko ng access sa at 714 00:37:11,370 --> 00:37:15,150 b at tmp, pupuntahan ko i-claim na ito ay isang at ito ay 1. 715 00:37:15,150 --> 00:37:16,080 >> Ito ay b. 716 00:37:16,080 --> 00:37:17,010 Ito ay 2. 717 00:37:17,010 --> 00:37:18,370 Ito ay tinatawag na tmp. 718 00:37:18,370 --> 00:37:23,360 >> At sa una, ito ay may ilang mga halaga ng basura hanggang ko talaga mag-imbak sa isang ito, 719 00:37:23,360 --> 00:37:24,450 na kung saan ay 1. 720 00:37:24,450 --> 00:37:28,320 Pagkatapos ko sige at baguhin isang upang maging kung ano? 721 00:37:28,320 --> 00:37:29,720 B. halaga. 722 00:37:29,720 --> 00:37:31,980 >> At kaya ngayon mayroon akong dalawang dito. 723 00:37:31,980 --> 00:37:34,050 At pagkatapos ay sinabi namin ay nakakakuha b tmp. 724 00:37:34,050 --> 00:37:37,670 Muli, tulad ng isang katinuan check, ang mga third linya ng code dito ay simpleng na ito 725 00:37:37,670 --> 00:37:39,440 isa, b nakakakuha tmp. 726 00:37:39,440 --> 00:37:41,730 >> At bilang wakas gayon, ano ang gagawin ko? 727 00:37:41,730 --> 00:37:46,800 Ako sige at baguhin b upang maging anumang ang halaga ng tmp ay, na kung saan ay 1. 728 00:37:46,800 --> 00:37:48,390 Hindi ko pindutin ang tmp muli. 729 00:37:48,390 --> 00:37:54,100 >> Ngunit ngayon, ang problema ay sa lalong madaling makipagpalitan ng babalik, dahil hindi ito handing 730 00:37:54,100 --> 00:37:57,540 i-back ang ilang mga halaga, may return walang tahasang pahayag sa loob nito. 731 00:37:57,540 --> 00:37:59,080 Ano ang tunay na nangyayari? 732 00:37:59,080 --> 00:38:03,480 Well, mahalagang lahat ng mga ito memory - 733 00:38:03,480 --> 00:38:07,410 OK, tila pambura ang may gusto lamang ng isang daliri sa isang pagkakataon - 734 00:38:07,410 --> 00:38:08,180 lamang mawala. 735 00:38:08,180 --> 00:38:10,070 >> Ngayon sa katotohanan hindi ito pagpunta kahit saan. 736 00:38:10,070 --> 00:38:11,810 Ngunit maaari mong isipin na ito ngayon bilang tanong marks. 737 00:38:11,810 --> 00:38:14,040 Dahil hindi na ito talaga sa paggamit. 738 00:38:14,040 --> 00:38:17,470 At wala ay tapos na may mga halagang iyon. 739 00:38:17,470 --> 00:38:21,920 >> Kaya sa kaso ng mga berdeng bersyon ng ang code na ito, kung ano ang sa halip ay ini- 740 00:38:21,920 --> 00:38:24,640 pumasa sa makipagpalitan? 741 00:38:24,640 --> 00:38:25,770 Kaya addresses. 742 00:38:25,770 --> 00:38:28,520 Kaya ang address ng x at ang address ng y. 743 00:38:28,520 --> 00:38:35,790 Kaya kung muli naming sabihin sa kuwentong ito ng isang huling panahon, at ko talagang gumuhit makipagpalitan muli, 744 00:38:35,790 --> 00:38:44,620 ngunit may mga payo, ito sa pagiging isang, ito pagiging b, at ang pagiging tmp, kung ano ang 745 00:38:44,620 --> 00:38:49,080 aktwal na naka-imbak sa isang ito sa berdeng bersyon ng aking code kung saan makakakuha ako ng pagpasa 746 00:38:49,080 --> 00:38:52,110 sa mga address? 747 00:38:52,110 --> 00:38:53,780 >> Ito ay pagpunta sa maging isang pointer sa x. 748 00:38:53,780 --> 00:38:54,890 Kaya maaari kong iguhit ang isang arrow. 749 00:38:54,890 --> 00:38:57,310 Ngunit gamitin natin ang parehong arbitrary Halimbawa tulad ng dati. 750 00:38:57,310 --> 00:39:01,220 Sabihin natin na ito ay isang bagay tulad ng Ox123. 751 00:39:01,220 --> 00:39:04,970 At ito ay magiging Ox127 dahil ito ay apat na bytes ang layo dahil ito ay isang 752 00:39:04,970 --> 00:39:07,370 int, kaya Ox127. 753 00:39:07,370 --> 00:39:09,080 >> At muli, ako pagkuha ng ilang mga kalayaan kasama ang mga numero. 754 00:39:09,080 --> 00:39:11,430 Ang mga ito ay mas maliit kaysa sa gagawin nila talaga at maging sa ibang order. 755 00:39:11,430 --> 00:39:14,350 Ngunit na kung paano ang larawan ngayon ay naiiba. 756 00:39:14,350 --> 00:39:19,060 >> Ngunit kapag ginagamit ko ito berde code at ko int tmp makakuha ng isang *. 757 00:39:19,060 --> 00:39:25,010 * Isang paraan upang gawin ang mga sumusunod, magsasagawa ng tugunan na nasa isang at pumunta sa ito, 758 00:39:25,010 --> 00:39:26,190 na kung saan ay 1. 759 00:39:26,190 --> 00:39:28,480 At ang ginagawa ko pagkatapos ay ilagay sa tmp. 760 00:39:28,480 --> 00:39:32,480 Samantala, sa susunod na linya ng code dito, isang * b nakakakuha, ano ang na ibig sabihin nito? 761 00:39:32,480 --> 00:39:36,910 >> Well, isang *, kaya pumunta dito ay nakakakuha * b, na nangangahulugan na pumunta doon. 762 00:39:36,910 --> 00:39:39,310 At na nangangahulugan na ilagay ang halaga sa mga doon. 763 00:39:39,310 --> 00:39:43,670 Sa wakas, sa huling linya ng code sinabi lang * b nakakakuha tmp. 764 00:39:43,670 --> 00:39:48,900 >> Kaya sabi ni b pumunta doon at patungan ng tmp kung saan, sa kasong ito, ay pagpunta 765 00:39:48,900 --> 00:39:51,520 maging, muli, 1. 766 00:39:51,520 --> 00:39:54,920 At ito ang dahilan kung bakit ang berde na bersyon ng ang aming code ay gumagana, samantalang ang pula 767 00:39:54,920 --> 00:39:56,010 na bersyon ay hindi kailanman ginawa. 768 00:39:56,010 --> 00:39:59,020 Ito lahat lamang kahulihan babagsak sa kung paano ang memorya ay pinamamahalaan at kung saan ito 769 00:39:59,020 --> 00:40:02,580 talaga nailagay sa iyong computer RAM. 770 00:40:02,580 --> 00:40:07,270 At sa ngayon, iyon ang isa sa mga bagay na stack na ang ay ginagamit para sa. 771 00:40:07,270 --> 00:40:09,225 >> Mga Tanong sa layout? 772 00:40:09,225 --> 00:40:10,380 Sa payo? 773 00:40:10,380 --> 00:40:11,630 O kaya sa makipagpalitan? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Ang lahat ng mga karapatan, kaya malloc, isipin ang, ginawang isang bagay na katulad nito. 776 00:40:17,043 --> 00:40:18,260 Ito ay isang napaka-simpleng halimbawa. 777 00:40:18,260 --> 00:40:20,550 At ito ay ang isa na Binky ipinakilala sa amin sa, kahit na medyo 778 00:40:20,550 --> 00:40:21,870 mabilis, sa pagtatapos ng klase. 779 00:40:21,870 --> 00:40:24,480 Dammit, doon kami pumunta muli. 780 00:40:24,480 --> 00:40:28,780 >> Kaya isipin ang na ito ay ang halimbawa na Binky ipinakilala sa amin, kahit na 781 00:40:28,780 --> 00:40:30,360 medyo mabilis sa pagtatapos ng klase. 782 00:40:30,360 --> 00:40:33,640 At dito ginamit namin malloc talaga para sa ikalawang pagkakataon. 783 00:40:33,640 --> 00:40:37,330 Dahil sa unang pagkakataon na ginamit namin ito sa lumikha ng sapat na RAM, maglaan ng sapat na RAM 784 00:40:37,330 --> 00:40:38,340 mag-imbak ng isang string. 785 00:40:38,340 --> 00:40:40,250 >> Oras na ito Binky iningatan itong simple. 786 00:40:40,250 --> 00:40:42,465 Kaya mag-imbak lamang isang int, tila. 787 00:40:42,465 --> 00:40:43,510 At iyon ang lahat-lahat fine. 788 00:40:43,510 --> 00:40:46,560 Ito ay isang maliit na kakaiba, lantaran, upang gamitin ang malloc upang magtalaga ng isang int. 789 00:40:46,560 --> 00:40:50,650 Ngunit ang punto ng ni Pedro noon ay claymation talaga lang sabihin ang kuwento ng kung ano ang 790 00:40:50,650 --> 00:40:53,830 nangyayari o hindi mangyayari kapag abusuhin mo memory. 791 00:40:53,830 --> 00:40:56,520 >> Kaya sa kasong ito, ang program na ito ginawa ang ilang mga bagay. 792 00:40:56,520 --> 00:41:01,580 Sa unang kaso dito, ito declares pointer isang tinatawag na x sa isang int. 793 00:41:01,580 --> 00:41:04,480 Ito pagkatapos declares isang pointer tinatawag y sa isang int. 794 00:41:04,480 --> 00:41:06,150 Ito pagkatapos ay iniimbak sa x, ano? 795 00:41:06,150 --> 00:41:07,110 May ibang ngayon. 796 00:41:07,110 --> 00:41:09,685 Ano ay makakakuha ng naka-imbak sa x ayon sa ang ikatlong linya ng programang ito? 797 00:41:09,685 --> 00:41:12,380 >> Madla: [hindi marinig]. 798 00:41:12,380 --> 00:41:14,130 >> Tagapagsalita 1: Well, hindi masyadong bytes, bawat sasabihin. 799 00:41:14,130 --> 00:41:16,760 Maging mas tumpak na ngayon. 800 00:41:16,760 --> 00:41:18,325 Ano ay makakakuha ng naka-imbak sa x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Ang isang address, sa tingin ko Narinig ko ito. 803 00:41:22,060 --> 00:41:23,570 >> Kaya kung ano ang malloc bumalik? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally allocates isang tipak ng memory. 805 00:41:26,030 --> 00:41:27,850 Ngunit paano ito magbibigay sa iyo ng access sa mga ito? 806 00:41:27,850 --> 00:41:29,460 Ito ay nagbabalik ano? 807 00:41:29,460 --> 00:41:32,000 Ang address ng unang byte sa mga tipak ng memory. 808 00:41:32,000 --> 00:41:33,020 >> Ngayon, ito ay napaka-simple. 809 00:41:33,020 --> 00:41:35,380 Ito ay isa lamang byte, na nangangahulugan na ang tugunan kami pagbalik ay ang 810 00:41:35,380 --> 00:41:37,300 address ng buong bagay. 811 00:41:37,300 --> 00:41:42,070 Kaya naka-imbak sa x pagkatapos, ay ang address ng na tipak ng memory. 812 00:41:42,070 --> 00:41:43,400 Samantala, kung ano ang susunod na mangyayari? 813 00:41:43,400 --> 00:41:45,890 Kaya talaga, sabihin sige at gumuhit ito out real mabilis. 814 00:41:45,890 --> 00:41:52,490 >> Kaya kung pumunta kami sa ibabaw ng mga screen dito at maglaro namin ito out int * x at int * y 815 00:41:52,490 --> 00:41:53,740 ay pagpunta sa gawin kung ano ang para sa akin? 816 00:41:53,740 --> 00:41:58,280 Inaangkin ko na lang ito ng pagpunta sa gawin isang bagay na tulad nito at tumawag ito x, at 817 00:41:58,280 --> 00:42:00,010 ito at tawagan ito y. 818 00:42:00,010 --> 00:42:03,110 Samantala, ang ikatlong linya ng code ay pagpunta sa maglaan ang laki ng isang int, 819 00:42:03,110 --> 00:42:06,160 na kung saan ang mangyayari sa maging - paumanhin kung ako sinabi isa bago ako nilalayong isa int - 820 00:42:06,160 --> 00:42:08,280 apat na bytes sa isang tipikal na computer. 821 00:42:08,280 --> 00:42:09,720 Hindi bababa sa CS50 appliance. 822 00:42:09,720 --> 00:42:11,490 >> Kaya ito ay pagpunta sa maglaan ito, na nakakaalam? 823 00:42:11,490 --> 00:42:12,800 Sa isang lugar out dito. 824 00:42:12,800 --> 00:42:15,780 At ito ay naka-imbak sa ilang mga address kapong baka, na nakakaalam? 825 00:42:15,780 --> 00:42:18,330 Ngunit ano ang nangyayari upang ibinalik ang address na iyon. 826 00:42:18,330 --> 00:42:22,270 Ngunit kailangan naming gumuhit ito pictorially bilang lamang ang isang arrow na tulad ng. 827 00:42:22,270 --> 00:42:25,430 >> Ngayon sa susunod na linya * x ay nakakakuha ng 42. 828 00:42:25,430 --> 00:42:29,400 Ano ang ibig * x ibig sabihin sa mga tuntunin ng karaniwang tao? 829 00:42:29,400 --> 00:42:30,040 Pumunta lamang doon. 830 00:42:30,040 --> 00:42:30,960 Pumunta sa address na iyon. 831 00:42:30,960 --> 00:42:35,900 O sa ibang salita, sundin ang arrow at ilagay 42 doon. 832 00:42:35,900 --> 00:42:38,140 Ngunit pagkatapos ng isang bagay masamang nangyari sa Binky, tama? 833 00:42:38,140 --> 00:42:43,950 >> Isipin ang linya na limang dito, * y ay makakakuha ng 13, sa katunayan isang sawi numero, 834 00:42:43,950 --> 00:42:44,760 ano ginawa para sa amin? 835 00:42:44,760 --> 00:42:47,320 Well, * y nangangahulugan pumunta doon. 836 00:42:47,320 --> 00:42:50,460 Well, ito ay hindi pa naibigay isang halaga pa, tama? 837 00:42:50,460 --> 00:42:54,090 Code ay hindi alam ang pagiging y nasimulan sa anumang bagay. 838 00:42:54,090 --> 00:42:56,120 Kami ay ina-x nasimulan sa isang address. 839 00:42:56,120 --> 00:42:57,640 Ngunit y ay ipinahayag up tuktok. 840 00:42:57,640 --> 00:43:00,250 Ngunit pagkatapos ng isang tuldok-kuwit, walang halaga ay talagang ilagay sa loob nito. 841 00:43:00,250 --> 00:43:02,330 Kaya ito ay patas na tumawag ito isang basura halaga. 842 00:43:02,330 --> 00:43:03,430 Sino ang nakakaalam kung ano ang doon? 843 00:43:03,430 --> 00:43:07,160 Ito ay ang mga labi ng mga bit na ginamit sa pamamagitan ng ilang mga nakaraang mga linya ng code sa 844 00:43:07,160 --> 00:43:08,300 ang aking programa. 845 00:43:08,300 --> 00:43:13,250 >> Kaya kung sasabihin kong pumunta doon, ito ay tulad ng, Wala akong palagay kung saan ang arrow na ito 846 00:43:13,250 --> 00:43:14,490 pagpunta sa mga end up. 847 00:43:14,490 --> 00:43:17,720 At na kapag ikaw ay karaniwang makakuha ng segmentation fault. 848 00:43:17,720 --> 00:43:22,430 Kung hindi mo sinasadyang dereference, kaya upang magsalita, o pumunta sa isang address na hindi 849 00:43:22,430 --> 00:43:25,400 talagang isang lehitimong address, masamang bagay na mangyayari. 850 00:43:25,400 --> 00:43:27,550 >> At iyon mismo kung ano ang nangyari mag-isip Binky. 851 00:43:27,550 --> 00:43:31,060 Kaya isipin ang na ang mga kuwento na Nick noon ay na nagsasabi sa dito ay ang parehong ideya ng kung anong 852 00:43:31,060 --> 00:43:34,050 Ko ang iginuhit na may mga ilusyon ng tisa sa board doon. 853 00:43:34,050 --> 00:43:35,960 X at y ay ipinahayag. 854 00:43:35,960 --> 00:43:39,690 >> Pagkatapos ay inilalaan namin ang laki ng isang int at naka-imbak ito sa x. 855 00:43:39,690 --> 00:43:42,130 Pagkatapos ay sa susunod na linya ginawa namin * x. 856 00:43:42,130 --> 00:43:46,070 Ito ang magic wand ni Pedro ng dereferencing. 857 00:43:46,070 --> 00:43:49,780 Iyon ilagay 42 sa memory may tulis out sa pamamagitan ng x. 858 00:43:49,780 --> 00:43:51,600 >> Ngunit ito ay kung saan bagay nagpunta horribly mali. 859 00:43:51,600 --> 00:43:51,820 I-right? 860 00:43:51,820 --> 00:43:53,550 Sinubukan naming i-dereference y. 861 00:43:53,550 --> 00:43:55,620 Ngunit y ay may ilang hindi tunay na halaga, tama? 862 00:43:55,620 --> 00:43:57,720 >> Na arrow sa ibabang kaliwang sulok, ay hindi 863 00:43:57,720 --> 00:43:58,950 tunay na tumuturo sa kahit ano. 864 00:43:58,950 --> 00:44:01,520 Ito ay uri ng kung ano ang ginagawa ko ginawa dito sa board. 865 00:44:01,520 --> 00:44:05,900 Kaya hindi magandang bagay na mangyayari, segmentation kasalanan, o Binky kasalanan, sa kasong ito. 866 00:44:05,900 --> 00:44:10,800 >> Ngunit kung kami pagkatapos ayusin na sa paggawa x nakakakuha y kung paano ipinapakita ng kuwento pagbabago? 867 00:44:10,800 --> 00:44:15,760 Well, kung gagawin ko x nakakakuha y, na epektibo ang parehong bilang sinasabi 868 00:44:15,760 --> 00:44:19,235 kahit ano ito ay, kapong baka-isang bagay ay magiging ang parehong dito, 869 00:44:19,235 --> 00:44:20,080 Kapong baka-isang bagay. 870 00:44:20,080 --> 00:44:22,970 O pictorially namin gumuhit ng isang arrow. 871 00:44:22,970 --> 00:44:25,530 >> Kaya dito sa board na may Binky, sa mga susunod na linya ng 872 00:44:25,530 --> 00:44:28,350 code, * y nangangahulugan pumunta doon. 873 00:44:28,350 --> 00:44:29,400 Saan ang doon? 874 00:44:29,400 --> 00:44:30,820 Ito ay nangangahulugan na sa paglipas dito. 875 00:44:30,820 --> 00:44:36,050 >> At kapag nag-update namin na maging 13 ito lamang ay nagsasangkot ng pagpunta at 876 00:44:36,050 --> 00:44:39,470 Sumusulat 13 dito ngayon. 877 00:44:39,470 --> 00:44:44,130 Kaya marahil hindi ganap tuwiran sa unang tingin. 878 00:44:44,130 --> 00:44:47,740 Pero sa paglalagom at upang gamitin ang parehong magulong pag-uusap na Binky na ginagamit dito, kaya 879 00:44:47,740 --> 00:44:50,485 ang unang dalawang maglaan ng payo, x at y, ngunit hindi ang pointees. 880 00:44:50,485 --> 00:44:54,750 At pointees ay hindi isang sa pangkalahatan ay ginamit na term. 881 00:44:54,750 --> 00:44:56,120 Ngunit pointer ay talagang. 882 00:44:56,120 --> 00:44:59,200 Ngunit ito ay kung ano ang itinuturo sa sa Binky ng mga katawagan. 883 00:44:59,200 --> 00:45:01,660 >> Ang susunod na linya, siyempre, allocates isang int pointee. 884 00:45:01,660 --> 00:45:04,840 Kaya isang tipak ng memory - bilang ako iginuhit sa ibabaw ang kanang bahagi doon - at itakda ang 885 00:45:04,840 --> 00:45:06,470 x katumbas upang tumuro sa ito. 886 00:45:06,470 --> 00:45:11,350 Ito dereferences x-imbak 42 sa ang memory na ito ay nagtuturo sa. 887 00:45:11,350 --> 00:45:13,380 At pagkatapos na ito, siyempre, ay isang masamang bagay. 888 00:45:13,380 --> 00:45:15,600 Dahil ang y ay hindi pagturo sa kahit ano pa. 889 00:45:15,600 --> 00:45:16,530 Ito Inaayos ito. 890 00:45:16,530 --> 00:45:18,240 Kaya ito ay pa rin maraming surot programa. 891 00:45:18,240 --> 00:45:21,580 Dahil lamang kami ng pamumulaklak sa pamamagitan ng code sa linya sa pamamagitan ng linya at sinasabi, oh well, 892 00:45:21,580 --> 00:45:22,690 ipaalam ito lumagpak doon. 893 00:45:22,690 --> 00:45:23,420 Iyon ay isang masamang bagay. 894 00:45:23,420 --> 00:45:26,790 Logro ay ang programa ay lamang ng pagpunta sa i-abort nang sama-sama sa na linya. 895 00:45:26,790 --> 00:45:30,550 Ngunit kung ikaw ay alisin ang mga nag-crash Linya at palitan ito ng huling dalawang 896 00:45:30,550 --> 00:45:32,470 mga linya doon magtalaga ka - 897 00:45:32,470 --> 00:45:35,310 gamit ang pointer pagtatalaga - y upang tumuro sa x bilang t point. 898 00:45:35,310 --> 00:45:39,280 At pagkatapos mo dereference y sa isang napaka-ligtas na paraan. 899 00:45:39,280 --> 00:45:41,520 >> Kaya kung saan ito ay mag-iwan sa amin? 900 00:45:41,520 --> 00:45:45,350 Well, lumiliko out na sa ilalim ng hood sa CS50 library, mga payo 901 00:45:45,350 --> 00:45:46,320 ginamit sa buong lugar. 902 00:45:46,320 --> 00:45:48,910 At kami ay talagang simulan upang alisan ng balat pabalik na layer bago ang haba. 903 00:45:48,910 --> 00:45:51,740 Ngunit ito ay nagiging masyado, isang expression na ang ilan sa ikaw ay maaaring maging pamilyar sa, 904 00:45:51,740 --> 00:45:54,580 lalo na sa mga mas kumportable, ay ang tunay na ng isang napaka-tanyag 905 00:45:54,580 --> 00:45:56,390 website, o stack overflow, mga araw na ito. 906 00:45:56,390 --> 00:45:58,720 >> Ngunit ito ay talagang napaka teknikal na kahulugan. 907 00:45:58,720 --> 00:46:00,160 Kami ngayon malaman kung ano ang isang stack ay. 908 00:46:00,160 --> 00:46:02,550 Ito ay tulad ng isang stack ng mga trays sa loob ng isang dining hall. 909 00:46:02,550 --> 00:46:05,140 >> O kaya sa loob ng iyong computer memorya nito ang mga frame 910 00:46:05,140 --> 00:46:06,900 na ginagamit sa pamamagitan ng pag-andar. 911 00:46:06,900 --> 00:46:10,760 Well, ito lumiliko out na dahil sa na napaka-simpleng pagpapatupad ng mga 912 00:46:10,760 --> 00:46:14,970 memorya at ang mga frame sa tinaguriang isalansan, maaari mong aktwal na kontrolin 913 00:46:14,970 --> 00:46:17,050 ng isang computer system medyo madali. 914 00:46:17,050 --> 00:46:22,180 Maaari mong sumibak sa isang sistema kung tao hindi katulad sa amin na nakasulat sa aming code 915 00:46:22,180 --> 00:46:23,300 partikular na mahusay. 916 00:46:23,300 --> 00:46:26,670 >> Kung ang mga tao tulad ng sa amin gamitin chunks ng memorya o paggamit array - 917 00:46:26,670 --> 00:46:27,810 kahit na mas karaniwang - 918 00:46:27,810 --> 00:46:31,800 pero minsan kalimutan na suriin ang mga hangganan ng aming mga array bilang maaari mong 919 00:46:31,800 --> 00:46:38,470 Mayroon iyong sarili kung minsan, at iterated paraan masyadong malayo nakaraan sa dulo ng array. 920 00:46:38,470 --> 00:46:40,520 Sa pinakamahusay na kaso, ang iyong mga programa baka lang pag-crash ng. 921 00:46:40,520 --> 00:46:42,280 Segmentation fault, uri ng nakakahiya. 922 00:46:42,280 --> 00:46:45,480 Hindi mahusay, ngunit ito ay hindi kinakailangan isang hugely masamang bagay. 923 00:46:45,480 --> 00:46:49,480 >> Ngunit kung ang iyong programa ay talagang sa real mga gumagamit ng 'computer, kung ito ay tumatakbo 924 00:46:49,480 --> 00:46:53,070 sa isang website na aktwal na random na mga tao sa internet ay pagpindot, pagpapaalam 925 00:46:53,070 --> 00:46:56,690 mga tao magbuod masamang bagay sa iyong code ay sa pangkalahatan ay hindi isang magandang bagay dahil 926 00:46:56,690 --> 00:46:59,930 nangangahulugan ito ng pagkakataon upang gumawa ng kontrol ng mga computer. 927 00:46:59,930 --> 00:47:01,350 At ito ay pagpunta sa hitsura isang maliit na misteriyoso. 928 00:47:01,350 --> 00:47:04,570 Ngunit naisip ko na gusto kong matakot sa iyo ng ang huling halimbawa dito. 929 00:47:04,570 --> 00:47:05,650 >> Narito ang isang halimbawa ng code. 930 00:47:05,650 --> 00:47:07,370 At mayroong isang magandang Wikipedia artikulo na nagtuturo sa pamamagitan ng 931 00:47:07,370 --> 00:47:08,530 ito nang mas detalyado. 932 00:47:08,530 --> 00:47:13,890 Mayroon akong main sa pagtawag sa ibaba foo, pagpasa sa argv ng 1. 933 00:47:13,890 --> 00:47:15,750 At ito lamang sa gayon maaari mong tumakbo ang program at makapasa 934 00:47:15,750 --> 00:47:17,080 isang arbitrary na input. 935 00:47:17,080 --> 00:47:20,180 >> At pagkatapos foo ay ipinahayag up tuktok tanggapin bilang isang string, o higit pang mga 936 00:47:20,180 --> 00:47:21,700 tumpak, isang pansamantalang trabaho *. 937 00:47:21,700 --> 00:47:23,860 Ito pagkatapos declares isang array ng char. 938 00:47:23,860 --> 00:47:27,130 Tumawag ito ng isang buffer, mas pangkalahatang paraan, ng laki 12. 939 00:47:27,130 --> 00:47:30,900 Kaya 12 na karakter ay maaaring magkasya sa loob ng array na tinatawag c. 940 00:47:30,900 --> 00:47:33,510 >> At pagkatapos ay ginagamit nito ang bagong pag-andar, na kung saan ay bagong ngunit hindi mahirap 941 00:47:33,510 --> 00:47:34,930 Nauunawaan, memory kopya. 942 00:47:34,930 --> 00:47:39,290 Ito kinokopya ang memorya mula sa bar, na noon ay ang variable n nakaraan, anuman ang 943 00:47:39,290 --> 00:47:42,080 gumagamit na nai-type sa argv 1 sa c. 944 00:47:42,080 --> 00:47:43,090 Gaano karaming bytes? 945 00:47:43,090 --> 00:47:44,260 Ang string ng haba ng bar. 946 00:47:44,260 --> 00:47:48,380 >> Kaya sa ibang salita, kung ang user ang mga uri sa h-e-l--l o magpasok, ang haba ng string 947 00:47:48,380 --> 00:47:49,260 ng halo ay limang. 948 00:47:49,260 --> 00:47:52,790 Kaya limang ng mga bytes ay pagpunta upang makakuha ng kinopya sa array na tinatawag c, na 949 00:47:52,790 --> 00:47:54,110 ang laki ng 12. 950 00:47:54,110 --> 00:47:58,710 Ngunit ano ang user ang mga uri sa isang mas matagal salita na 13 character o 14 951 00:47:58,710 --> 00:48:01,250 character o 100 mga character o higit pa? 952 00:48:01,250 --> 00:48:02,660 >> Saan nakatago ang mga ito ng pagpunta sa pumunta? 953 00:48:02,660 --> 00:48:06,090 Well, na frame, na tray sa dining hall-stack, 954 00:48:06,090 --> 00:48:06,930 sila ay pagpunta sa pumunta doon. 955 00:48:06,930 --> 00:48:10,080 At lamang ito ng pagpunta sa simulan patungan iba pang mga bagay-bagay na na- 956 00:48:10,080 --> 00:48:12,880 sa na stack, umaapaw stack ang, kaya na magsalita. 957 00:48:12,880 --> 00:48:14,780 >> Kaya pictorially, isipin ito sa ganitong paraan. 958 00:48:14,780 --> 00:48:17,970 Ito ay lamang ng isang makulay na bersyon ng ang larawan na aming pagguhit. 959 00:48:17,970 --> 00:48:20,060 Sa ibaba, sabihin nating, ang pangunahing. 960 00:48:20,060 --> 00:48:24,690 At sa itaas, kung ano ang iyong nakikita ngayon ay ang frame, kulay naka-code na ngayon, para sa isang 961 00:48:24,690 --> 00:48:26,090 function na tinatawag foo. 962 00:48:26,090 --> 00:48:30,170 Ngunit kung ano ang kawili-wiling tungkol dito foo ay na dito ay frame nito. 963 00:48:30,170 --> 00:48:32,860 Kaya ito ay iguguhit tulad ko ginawa ngunit sa mapusyaw na asul. 964 00:48:32,860 --> 00:48:35,220 At ngayon ito ay kung saan c bracket 0 napupunta. 965 00:48:35,220 --> 00:48:37,410 At ito ay kung saan c bracket 11 ay pagpunta upang tapusin up. 966 00:48:37,410 --> 00:48:39,670 >> Sa ibang salita, ito ang mangyayari sa ay kinakatawan bilang isang parisukat. 967 00:48:39,670 --> 00:48:42,320 Ngunit kung ikaw lamang panatilihin plopping bytes pababa - o char - ito ay naka pagpunta sa magtapos 968 00:48:42,320 --> 00:48:46,070 hanggang sa lokasyon 0 ang lahat ng mga paraan up sa 11 dahil na-index 0. 969 00:48:46,070 --> 00:48:49,170 >> Ngunit kung saan ay ang ika-13 na character pagpunta sa mga end up? 970 00:48:49,170 --> 00:48:50,310 Nasaan ang ika-14? 971 00:48:50,310 --> 00:48:52,430 Nasaan ang 50 na character pagpunta sa mga end up? 972 00:48:52,430 --> 00:48:54,070 >> Ito ay pagpunta upang panatilihin ang pagpunta pababa. 973 00:48:54,070 --> 00:48:57,350 Dahil kahit na namin ang iginuhit larawan na may mga stack lumalaking up, ang 974 00:48:57,350 --> 00:48:59,920 address, ito lumiliko out, pumunta mula sa maliit na mga address, maliit 975 00:48:59,920 --> 00:49:01,830 payo, sa malaking address. 976 00:49:01,830 --> 00:49:03,540 Kaya ito lamang mapigil ang pagpunta up at up. 977 00:49:03,540 --> 00:49:05,660 >> Kaya kung ang user ang mga uri sa kumusta, mabuti iyan. 978 00:49:05,660 --> 00:49:08,650 Walang mga bug, walang problema, safe lahat. 979 00:49:08,650 --> 00:49:11,940 Ngunit kung ang user ang mga uri sa kung ano ang aming bibigyan tumawag adversarial code, kinakatawan 980 00:49:11,940 --> 00:49:16,040 generically bilang, pag-atake, pag-atake, pag-atake, pag-atake, kung ano ang maaaring mangyari? 981 00:49:16,040 --> 00:49:19,760 >> Well, kung ang lahat ng pag-input na mga gumagamit nai-type sa ay hindi lamang ang ilang mga magiliw 982 00:49:19,760 --> 00:49:21,540 o nakakasakit na string ng mga character. 983 00:49:21,540 --> 00:49:24,050 Ito ay tunay na isang pagkakasunod-sunod ng mga character na kung pinagsama-sama mo ito, 984 00:49:24,050 --> 00:49:26,050 ito ay aktwal na code. 985 00:49:26,050 --> 00:49:29,570 Siguro ito code na tinatanggal ang lahat ng mga mga file sa iyong hard drive o nagpapadala ng spam 986 00:49:29,570 --> 00:49:30,810 o isang bagay tulad na. 987 00:49:30,810 --> 00:49:35,110 Pansinin na kung ano ang key dito ay na kung ang masamang tao Nakakuha masuwerteng sapat na upang 988 00:49:35,110 --> 00:49:37,830 patungan ang pulang tipak ng memory - 989 00:49:37,830 --> 00:49:41,080 na hindi ko gumuhit sa aking larawan ngunit ito Wikipedia larawan dito ay may - 990 00:49:41,080 --> 00:49:42,890 nito tinatawag na return address. 991 00:49:42,890 --> 00:49:47,470 >> Kapag ang pagkain ay babalik, kapag makipagpalitan ng pagbalik, paano ang computer na malaman upang pumunta mula sa 992 00:49:47,470 --> 00:49:49,790 up dito upang pababa dito? 993 00:49:49,790 --> 00:49:52,920 O kaya sa tech segment up sa itaas, kung paano ay alam ito upang pumunta mula sa makipagpalitan ng 994 00:49:52,920 --> 00:49:54,870 code - ang 0 at 1 ni na sumulat ng mga makipagpalitan - 995 00:49:54,870 --> 00:49:56,020 pabalik sa main? 996 00:49:56,020 --> 00:50:00,450 Mayroong isang tinatawag na return address naka-imbak sa na parehong frame stack, sa 997 00:50:00,450 --> 00:50:02,140 ang parehong tray cafeteria. 998 00:50:02,140 --> 00:50:06,080 >> Kaya kung ang masamang tao ay matalino sapat upang ilagay atake ng code, code atake, pag-atake 999 00:50:06,080 --> 00:50:07,960 code, at makakuha ng masuwerteng sapat - 1000 00:50:07,960 --> 00:50:11,630 madalas sa pamamagitan ng pagsubok at mga error - upang patungan na red return address, 1001 00:50:11,630 --> 00:50:14,360 may address at notice pinakatuktok. 1002 00:50:14,360 --> 00:50:16,830 Pansinin 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Ito ay nakasulat paurong up para sa tuktok dahilan namin marahil bisitahin muli. 1004 00:50:20,650 --> 00:50:22,050 Ito ang numerong iyon. 1005 00:50:22,050 --> 00:50:25,790 >> Kaya kung ang masamang tao ay nakakakuha ng sapat na masuwerteng o ang smart sapat na upang patungan ang pula 1006 00:50:25,790 --> 00:50:29,480 alisan ng memory sa address ng code na siya ay may sa paanuman 1007 00:50:29,480 --> 00:50:34,980 injected papunta sa iyong computer, hulaan kung saan ang code ay pagpunta sa ibabalik sa 1008 00:50:34,980 --> 00:50:38,260 sa lalong madaling foo ay tapos na e-execute? 1009 00:50:38,260 --> 00:50:39,440 >> Ang code masamang tao ni. 1010 00:50:39,440 --> 00:50:43,610 Kaya ang code na atake, AAA, muli, kapangyarihan magpadala ng spam, maaaring tanggalin ang lahat ng mga file 1011 00:50:43,610 --> 00:50:44,500 sa iyong hard drive. 1012 00:50:44,500 --> 00:50:48,740 Ngunit iyon ay kung ano ang tunay na isang stack overflow ay, o isang paglampas sa buffer, o isang 1013 00:50:48,740 --> 00:50:51,060 Buffer overflow atake. 1014 00:50:51,060 --> 00:50:54,400 >> At ito ay hindi mapaniniwalaan o kapani-paniwala, hindi kapani-paniwalang mga karaniwang sa araw na ito na may mga programa na nakasulat sa 1015 00:50:54,400 --> 00:50:58,220 C, C + +, at kahit na ang ilang mga iba pang mga wika. 1016 00:50:58,220 --> 00:51:02,275 Sa nakakatakot na tala, bibigyan namin ng magtapos sa isang biro. 1017 00:51:02,275 --> 00:51:03,230 >> [Tawa] 1018 00:51:03,230 --> 00:51:04,550 >> Tingnan mo sa Miyerkules. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Sa susunod na CS50 - 1021 00:51:10,310 --> 00:51:15,920 Kaya ako lahat out sa lamp disk ngayon pero maghintay, taba-free gatas, kalahati ng telepono 1022 00:51:15,920 --> 00:51:17,850 aklat, ang orange juice na ako drank ngayon. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB cable, isang wrench. 1025 00:51:22,780 --> 00:51:24,800 >> [Nagpe-play ng musika]