1 00:00:00,000 --> 00:00:11,242 >> [Музыка Прайграванне] 2 00:00:11,242 --> 00:00:16,630 >> Дэвід Дж. малая: Добра гэта CS50 і гэта пачатак тыдня пяць. 3 00:00:16,630 --> 00:00:21,480 Такім чынам, сёння пад вашым падушкі сядзення, Вы нічога не знойдзеце. 4 00:00:21,480 --> 00:00:24,790 Але перш, вы павінны знайсці іх, маленькі знак нашай удзячнасці за 5 00:00:24,790 --> 00:00:26,970 Усе працы, якія вы паклалі у гульню пятнаццаць. 6 00:00:26,970 --> 00:00:30,290 Проста выдаліце ​​маленькі круг на ніжняй часткі, каб пачаць гуляць на 7 00:00:30,290 --> 00:00:31,680 Астатняя частка класа. 8 00:00:31,680 --> 00:00:38,930 >> Таму нагадаем, што, ці ведаеце, што задачу, пастаўленую чатыры, якія выйшлі ў гэтыя выхадныя, 9 00:00:38,930 --> 00:00:40,340 ўключае ў сябе напісанне іншую гульню. 10 00:00:40,340 --> 00:00:43,740 Але на гэты раз ўключае ў сябе выкарыстанне фактычны графічны інтэрфейс карыстача, не 11 00:00:43,740 --> 00:00:46,310 тэкставы інтэрфейс, як Гульня Пятнаццаць было. 12 00:00:46,310 --> 00:00:50,210 І гульня, якая ляжыць перад вамі, Калі вы яшчэ не бачылі гэта наступны, 13 00:00:50,210 --> 00:00:52,310 выглядае крыху нешта накшталт гэтага. 14 00:00:52,310 --> 00:00:55,170 Я збіраюся ісці ў мой тэрмінал вокны тут, у GDB. 15 00:00:55,170 --> 00:00:58,600 І я збіраюся ісці наперад і запусціце Супрацоўнікі рашэнне, якое вы можаце атрымаць доступ 16 00:00:58,600 --> 00:01:01,010 пасля запуску абнаўлення 50, як звычайна. 17 00:01:01,010 --> 00:01:04,090 >> Але я збіраюся паставіць яго ў маленькую тайнага рэжыму, трохі велікоднае яйка, 18 00:01:04,090 --> 00:01:08,480 так званы рэжым Бога, па ставіць Бога ў argv1. 19 00:01:08,480 --> 00:01:12,920 І я павінен прытрымлівацца сваім уласным кірунках, запусціць яго ў маім ўласным 20 00:01:12,920 --> 00:01:14,220 Праблема ўсталяваць каталог. 21 00:01:14,220 --> 00:01:19,190 Такім чынам, зараз вы бачыце поўную версію ў гульні прарыву. 22 00:01:19,190 --> 00:01:21,090 На самай справе, гэта не рукі-рэжыме. 23 00:01:21,090 --> 00:01:24,850 Так гэта на самай справе - 24 00:01:24,850 --> 00:01:26,470 пабіў, хоць вы маглі б быць - 25 00:01:26,470 --> 00:01:30,850 даволі проста рэалізаваць рэжым Бога ў Breakout, у адрозненне ад гульні пятнаццаці гадоў, 26 00:01:30,850 --> 00:01:33,590 які некаторыя з вас маглі вырашацца для хакера выдання. 27 00:01:33,590 --> 00:01:37,890 >> У Breakout досыць у Бога рэжыме, каб проста рабіць тое, што, 28 00:01:37,890 --> 00:01:41,220 Інтуітыўна з вяслом? 29 00:01:41,220 --> 00:01:45,630 Толькі зрабіце гэта ўсё роўна гарызантальнай пазіцыі шара. 30 00:01:45,630 --> 00:01:49,220 І да тых часоў, як вы робіце гэта ў нагу з мячом перамяшчэння гэтая гульня будзе 31 00:01:49,220 --> 00:01:53,100 ніколі, ніколі, ніколі не прапусціць мяч і вы будзеце выйграваць кожны раз. 32 00:01:53,100 --> 00:01:55,430 >> Але ў хакерам выданне гэтым тыдні ёсць больш, чым проста рэжым Бога. 33 00:01:55,430 --> 00:01:56,720 Там, шэраг іншых магчымасцяў. 34 00:01:56,720 --> 00:01:58,140 Сярод іх, лазераў. 35 00:01:58,140 --> 00:02:01,070 Так што калі вы сапраўды турбуецеся вы можа пачаць збіваць цэглу 36 00:02:01,070 --> 00:02:02,120 і некаторыя іншыя. 37 00:02:02,120 --> 00:02:04,560 А для тых з вас, хто хацеў бы каліброўкі стандартным супраць хакераў 38 00:02:04,560 --> 00:02:08,750 выданні, я бачу, што на гэтым тыдні хакерам выданне свядома з'яўляецца 39 00:02:08,750 --> 00:02:12,830 трохі больш выканальнай, скажам, чым Бог Рэжым гульні быў з пятнаццаці гадоў. 40 00:02:12,830 --> 00:02:15,300 >> Так што калі вы шукаеце расцяжэння і Вы шукаеце некаторыя дадатковыя весела 41 00:02:15,300 --> 00:02:18,400 Асаблівасці робяць апусканне ў калі яны ўяўляюць цікавасць. 42 00:02:18,400 --> 00:02:21,280 Зараз больш практычна, я хацеў бы адзначыць на адну рэч, а таксама. 43 00:02:21,280 --> 00:02:24,780 GDB, які некаторыя з вас, магчыма, яшчэ закранула асабіста, і гэта добра. 44 00:02:24,780 --> 00:02:28,530 Але цяпер сапраўды час, каб прывыкнуць да гэтага і зручна з дапамогай гэтай прылады 45 00:02:28,530 --> 00:02:31,510 таму што гэта зробіць вашу жыццё значна прасцей, па-сапраўднаму. 46 00:02:31,510 --> 00:02:34,900 >> На лекцыі Адзежа на GDB пара тыдняў назад, нагадаем 47 00:02:34,900 --> 00:02:36,810 GDB, што гэта адладчык. 48 00:02:36,810 --> 00:02:41,230 Гэта інструмент, які дазваляе запускаць праграмы, але запусціць яго крок за крокам, лінія 49 00:02:41,230 --> 00:02:45,680 за радком, так што вы можаце капацца, так што вы бачыце, што адбываецца, так што 50 00:02:45,680 --> 00:02:47,310 што вы можаце раздрукаваць Значэнні зменных. 51 00:02:47,310 --> 00:02:50,580 Карацей кажучы, гэта дае вам значна больш, энергіі, чым PRINTDEF робіць. 52 00:02:50,580 --> 00:02:52,900 >> Зараз па агульным прызнанні, інтэрфейс даволі складаных. 53 00:02:52,900 --> 00:02:55,180 Чорна-белы тэкставы інтэрфейс па большай частцы. 54 00:02:55,180 --> 00:02:57,400 Каманды некалькі цвёрдым памятаць у першую чаргу. 55 00:02:57,400 --> 00:03:01,230 Але нават калі гэта можа заняць палову , Гадзіну, каб пакласці, што авансам 56 00:03:01,230 --> 00:03:02,940 выдаткі часу ў яго, паверце мне. 57 00:03:02,940 --> 00:03:06,440 Вядома, да канца семестра яна выратуе Вы на парадак больш 58 00:03:06,440 --> 00:03:07,600 часу, чым гэта. 59 00:03:07,600 --> 00:03:09,200 >> Так што ў пачатку тыдня пачаць цалі 60 00:03:09,200 --> 00:03:13,200 І з пункту гледжання Breakout, ведаю, што вы можа зрабіць гэта пры ўмове, што ў вас ёсць 61 00:03:13,200 --> 00:03:18,230 Код размеркавання або ваш уласны код ў прагрэс у вашай Pst4 каталог. 62 00:03:18,230 --> 00:03:21,680 Ведайце, што вы можаце запусціць GDB. / Прарыве. 63 00:03:21,680 --> 00:03:23,490 >> Гэта збіраецца адкрыць такое акенца. 64 00:03:23,490 --> 00:03:25,530 Дазвольце мне прывесці сябе больш з акна тэрмінала. 65 00:03:25,530 --> 00:03:27,770 І тады тое, што я збіраюся ісці наперад і зрабіць, гэта не проста запусціць яго. 66 00:03:27,770 --> 00:03:30,690 Я буду першым ўсталяваць кропку супыну Нагадаем, якая дазваляе зрабіць паўзу 67 00:03:30,690 --> 00:03:32,500 выкананне ў пэўным месцы. 68 00:03:32,500 --> 00:03:35,750 >> Проста, каб не ўскладняць Я збіраюся разарваць на адной лініі, проста набраўшы 69 00:03:35,750 --> 00:03:37,000 нумар адзін. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Дазвольце мне на самай справе зноў адкрыць гэта акно , Таму што гэта становіцца 72 00:03:43,250 --> 00:03:45,700 трохі маленькія там. 73 00:03:45,700 --> 00:03:53,270 Так што я зараз збіраюся зрабіць тут Калі я адкрываю маё акно тэрмінала. 74 00:03:53,270 --> 00:03:53,910 Давай, там мы ідзем. 75 00:03:53,910 --> 00:03:59,850 >> Дык вось, калі я вярнуся ў Dropbox, Pst4 і запусціць GDB. / прарыву увядзіце, заўважыць 76 00:03:59,850 --> 00:04:02,600 Я збіраюся разбіць адну для ўстаноўкі кропку супыну першай лініі. 77 00:04:02,600 --> 00:04:04,840 А цяпер я пайду наперад і тып запуску. 78 00:04:04,840 --> 00:04:07,370 І калі я раблю, нічога не заўважаюць , Здаецца, здараецца. 79 00:04:07,370 --> 00:04:08,120 >> Там няма ўсплываў. 80 00:04:08,120 --> 00:04:09,790 Там няма графічнай карыстацкі інтэрфейс яшчэ. 81 00:04:09,790 --> 00:04:13,340 Але гэта зразумела, таму што я літаральна на адной лініі ў маёй праграме. 82 00:04:13,340 --> 00:04:17,110 І заўважце, што я хутка перасылаць, адмыслова зараз да 62, так як усе 83 00:04:17,110 --> 00:04:20,600 матэрыял у верхняй часткі гэтага файла рэчы, як каментары і канстант і 84 00:04:20,600 --> 00:04:22,460 нецікавых рэчаў на дадзены момант. 85 00:04:22,460 --> 00:04:25,840 >> Так што цяпер я ўнутры асноўнага, здаецца, у радку 62. 86 00:04:25,840 --> 00:04:27,960 І гэта толькі размеркаванне Код, нагадаем. 87 00:04:27,960 --> 00:04:33,810 Калі я адкрыю гэтую, ідучы, гэтак жа, у маё падзенне ў поле Каталог Pst4, 88 00:04:33,810 --> 00:04:35,450 у breakout.c. 89 00:04:35,450 --> 00:04:40,670 І калі я пракруціць ўніз і ўніз і ўніз, і дазвольце мне ісці наперад і ўключыць 90 00:04:40,670 --> 00:04:44,990 Мае нумары лініі. 91 00:04:44,990 --> 00:04:50,300 >> Што я буду бачыць, калі я пракруціць ўніз да радок 62, дакладна такая лінія, якая 92 00:04:50,300 --> 00:04:50,910 мы спыніліся на. 93 00:04:50,910 --> 00:04:53,720 Так што гэтая лінія тут, 62, з'яўляецца дзе мы збіраемся быць. 94 00:04:53,720 --> 00:04:57,470 Так што цяпер у GDB, калі я іду наперад і ўвядзіце Цяпер наступнае, увядзiце яго збіраецца 95 00:04:57,470 --> 00:04:58,450 выканаць гэтую лінію. 96 00:04:58,450 --> 00:05:00,610 І вуаля, у нас ёсць так званы г акна. 97 00:05:00,610 --> 00:05:02,800 Калі незнаёмыя з тым, што GWindow ёсць, няма пра што турбавацца. 98 00:05:02,800 --> 00:05:05,740 Спецыфікацыі пазнаёміць вас з ёй, як а таксама шэраг праходжанне відэа 99 00:05:05,740 --> 00:05:06,830 убудаваныя ў спец. 100 00:05:06,830 --> 00:05:08,610 >> Але цяпер давайце зробім гэта крыху больш цікавым. 101 00:05:08,610 --> 00:05:10,960 Дазвольце мне перамясціць гэта акно над ў бок няшмат. 102 00:05:10,960 --> 00:05:13,480 Дазвольце мне зрабіць акно трохі больш, такім чынам я магу ўбачыць больш. 103 00:05:13,480 --> 00:05:16,140 >> А цяпер дазвольце мне ісці наперад і зноў рабіць далей. 104 00:05:16,140 --> 00:05:17,550 І ёсць мае цэглу. 105 00:05:17,550 --> 00:05:20,490 Калі я друкую наступны раз цяпер я бачу мяч. 106 00:05:20,490 --> 00:05:23,520 І калі я друкую наступны раз цяпер я бачу, вясло. 107 00:05:23,520 --> 00:05:26,690 >> І на шчасце, гэта не Gedit сапраўды супрацоўнічаюць, паказваючы мне 108 00:05:26,690 --> 00:05:27,660 усё, што захачу. 109 00:05:27,660 --> 00:05:30,820 Але цяпер, калі я раблю наступны раз, Далей яшчэ раз, я проста 110 00:05:30,820 --> 00:05:32,260 Аб'яву некаторых зменных. 111 00:05:32,260 --> 00:05:34,750 І я магу надрукаваць любы з гэтых хлопцаў. 112 00:05:34,750 --> 00:05:37,170 Друк цэглы, адбіткі жыццяў. 113 00:05:37,170 --> 00:05:39,910 >> І цяпер, калі я працягну рабіць Далей звярніце ўвагу, што я буду 114 00:05:39,910 --> 00:05:40,870 Унутры гэтага цыклу. 115 00:05:40,870 --> 00:05:43,380 Але код будзе выконваць дакладна так, як я чакаю. 116 00:05:43,380 --> 00:05:45,810 Таму, калі я ударыў гэтую функцыю, пачакайце для мышы, яна будзе рабіць 117 00:05:45,810 --> 00:05:46,830 што гэта літаральна. 118 00:05:46,830 --> 00:05:48,870 Так што я, здавалася, страціў кантроль на праграму. 119 00:05:48,870 --> 00:05:50,480 >> GDB не дае мне іншую радок. 120 00:05:50,480 --> 00:05:51,500 Але не хвалюйцеся. 121 00:05:51,500 --> 00:05:53,720 Перайсці да маёй гульні, пстрыкніце ў любым месцы. 122 00:05:53,720 --> 00:05:56,270 >> І вуаля, цяпер ён пераходзіць да лініі 86. 123 00:05:56,270 --> 00:05:59,460 Такім чынам, яшчэ раз, гэта неацэнна, у канчатковым рахунку, для адладкі праблем. 124 00:05:59,460 --> 00:06:03,050 Таму што вы можаце літаральна пакрокава кода, друк рэчы і многае, 125 00:06:03,050 --> 00:06:03,640 многае, многае іншае. 126 00:06:03,640 --> 00:06:07,210 Але цяпер, гэтыя інструменты толькі вы павінны атрымаць даволі далёка. 127 00:06:07,210 --> 00:06:10,050 >> Так што мы, вядома, зірнуць Графіка на цяпер, усё раптоўна. 128 00:06:10,050 --> 00:06:12,350 І цяпер наш свет становіцца трохі больш цікавай. 129 00:06:12,350 --> 00:06:15,680 І вы ведаеце, можа быць, ад некаторых з відэа ў Інтэрнэце, што ў нас ёсць гэтыя 130 00:06:15,680 --> 00:06:18,280 шорты, якія Вы глядзелі як частка праблемы мностваў. 131 00:06:18,280 --> 00:06:20,460 >> І яны былі расстраляныя, свядома, на белым фоне. 132 00:06:20,460 --> 00:06:23,380 І некаторыя з іх маюць вучэнне Стыпендыяты зрабіць некаторыя тэксту на 133 00:06:23,380 --> 00:06:25,490 экран, які абклаў на баку іх. 134 00:06:25,490 --> 00:06:27,760 Але, вядома, гэта яшчэ не ўсё, што цікавае ў рэальным свеце. 135 00:06:27,760 --> 00:06:30,520 Гэта ўсяго толькі лекцыйны зала з вялікі белы экран і фон. 136 00:06:30,520 --> 00:06:33,330 І наш дзіўны роду вытворчых каманды з прымушае ўсё выглядаць прыгожай 137 00:06:33,330 --> 00:06:36,620 постфактум, абрэзка з накладанне ці нічога 138 00:06:36,620 --> 00:06:37,840 мы робім ці не хочуць. 139 00:06:37,840 --> 00:06:41,560 >> Цяпер проста матываваць на гэтым тыдні і сапраўды, дзе вы можаце пайсці, у канчатковым рахунку, 140 00:06:41,560 --> 00:06:42,560 з інфарматыкай. 141 00:06:42,560 --> 00:06:44,260 Не толькі пасля таго, як праблема ўсталяваць чатыры. 142 00:06:44,260 --> 00:06:48,240 Але пасля таго, як іншы курс або цэлай вучэбная праграма гэта дзіўна, што вы можаце 143 00:06:48,240 --> 00:06:51,090 зрабіць у гэтыя дні з пункту гледжання графіка ў прыватнасці. 144 00:06:51,090 --> 00:06:53,440 >> Некаторыя з вас, магчыма, бачылі гэтую обцяканьне онлайн. 145 00:06:53,440 --> 00:06:56,240 Але я думаў, што я пакажу вам, усяго за пару хвілін, убачыць тое, што 146 00:06:56,240 --> 00:07:01,890 камп'ютэрныя тэхналогіі і тое, што CGI, камп'ютэрнай графікі можна зрабіць у гэтыя дні 147 00:07:01,890 --> 00:07:04,510 са знаёмай песняй і, магчыма, фільм. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - Лана-дэль-Рэй, "Маладыя і прыгожыя] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> Выступоўца 1: Гэта проста трохі дзіўнае, мабыць, толькі, як 151 00:10:52,470 --> 00:10:52,857 ўсюдыісны - 152 00:10:52,857 --> 00:10:57,040 >> [Апладысменты] 153 00:10:57,040 --> 00:10:59,230 >> Выступоўца 1: Я проста запампаваў яго. 154 00:10:59,230 --> 00:11:02,920 Але гэта сапраўды дзіўна, я думаю, проста як усюдыісная праграмнае забеспячэнне і кода і 155 00:11:02,920 --> 00:11:04,230 інструменты, як гэта на самай справе. 156 00:11:04,230 --> 00:11:07,685 Дык вось густ кірунку у якім вы можаце ісці. 157 00:11:07,685 --> 00:11:10,620 О, не больш бытавой сёння. 158 00:11:10,620 --> 00:11:14,640 Ну, гэта на самай справе трагічная часу дадзены момант я проста паспрабаваў зрабіць. 159 00:11:14,640 --> 00:11:18,670 >> Добра, давайце запусцім Fusion зноў. 160 00:11:18,670 --> 00:11:20,800 Нагадаць пазней. 161 00:11:20,800 --> 00:11:24,190 Усё ў парадку, і вы павінны ёсць электроннай пошты, як у баку, калі вы ўсё ж такі 162 00:11:24,190 --> 00:11:25,460 заўважыце падобнае. 163 00:11:25,460 --> 00:11:29,940 Добра, нагадаем, што на мінулым тыдні мы пачалі гэтую адхіліце 164 00:11:29,940 --> 00:11:31,380 пазней вядомы як радок. 165 00:11:31,380 --> 00:11:34,700 >> радок нагадвае тып дадзеных, што гэта абвешчаны ў CS50 бібліятэкі. 166 00:11:34,700 --> 00:11:37,740 І гэта частка падрыхтоўкі колаў што цяпер пачнуць ўзлятаць. 167 00:11:37,740 --> 00:11:41,280 Гэта была карысная канцэпцыя, на ранніх стадыях. 168 00:11:41,280 --> 00:11:43,750 Але цяпер ён збіраецца атрымаць больш цікавым і больш магутнымі, каб 169 00:11:43,750 --> 00:11:48,330 сапраўды бачым, што пад капотам, радок з'яўляецца толькі тое, што, ці не так сказана? 170 00:11:48,330 --> 00:11:50,500 >> Так, так што гэта так званы сімвал *. 171 00:11:50,500 --> 00:11:53,860 І там * пазначае, што ёсць нейкі адрас удзел. 172 00:11:53,860 --> 00:11:58,690 І таму, калі вы кажаце, сімвал * вы проста азначаць, зменную з тыпам дадзеных 173 00:11:58,690 --> 00:11:59,290 Цяпер паказальнік. 174 00:11:59,290 --> 00:12:01,770 Той факт, што там ёсць зоркі проста азначае, што вы аб'яўляеце 175 00:12:01,770 --> 00:12:03,020 так званы паказальнік. 176 00:12:03,020 --> 00:12:06,220 І, што паказальнік будзе відно захаваць адрас, з 177 00:12:06,220 --> 00:12:07,810 Вядома, голец. 178 00:12:07,810 --> 00:12:08,960 >> Цяпер, чаму гэта мае сэнс? 179 00:12:08,960 --> 00:12:11,200 Ну, што гэта радок пад капотам? 180 00:12:11,200 --> 00:12:15,130 Ну, на працягу некаторага часу мы казалі што радок пад капотам 181 00:12:15,130 --> 00:12:18,460 толькі ч-е-л-л-о, напрыклад. 182 00:12:18,460 --> 00:12:21,585 >> Але мы ўжо казалі пра гэта, як які з'яўляецца, па сутнасці, масіў. 183 00:12:21,585 --> 00:12:25,410 А шэраг будзе выглядаць трохі больш як гэта, з кожнай з гэтых 184 00:12:25,410 --> 00:12:26,460 займаючы ўкусу. 185 00:12:26,460 --> 00:12:28,710 А потым мы ўжо казалі, што ёсць нешта асаблівае сюды, 186 00:12:28,710 --> 00:12:31,270 0 зваротную касую рысу, або нулявы канчатак. 187 00:12:31,270 --> 00:12:35,230 >> Так што ўвесь гэты час, гэта тут была радок. 188 00:12:35,230 --> 00:12:38,320 Але на самай справе, радок фактычна адрасе. 189 00:12:38,320 --> 00:12:43,210 І адрасы, як мы ўбачым, часта прэфікс 0x па пагадненні. 190 00:12:43,210 --> 00:12:44,540 Што абазначаюць 0x? 191 00:12:44,540 --> 00:12:45,970 Хто-небудзь ведае? 192 00:12:45,970 --> 00:12:47,320 >> Так што гэта проста азначае шаснаццатковае. 193 00:12:47,320 --> 00:12:52,360 Такім чынам, вы, магчыма, памятаеце, на самай справе, ад Pst 1, я лічу, адна з размінкі 194 00:12:52,360 --> 00:12:55,740 пытанняў на самай справе пытанне аб шаснаццатковым фармаце ў дадатак да 195 00:12:55,740 --> 00:12:57,100 двайковай і дзесятковай. 196 00:12:57,100 --> 00:13:00,460 І матывацыя тут з'яўляецца тое, што з шаснаццатковым ў вас ёсць 16 197 00:13:00,460 --> 00:13:01,770 лічбы ў вашым распараджэнні. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, а затым на A, B, C, D, E, F. 199 00:13:07,900 --> 00:13:10,430 >> А калі палічыць усіх тых, уверх, Вы атрымліваеце ў агульнай складанасці 16. 200 00:13:10,430 --> 00:13:13,200 Такім чынам, гэта ў адрозненне дзесятковай, дзе ў нас ёсць 10 201 00:13:13,200 --> 00:13:14,690 лічбаў, ад 0 да дзевяці. 202 00:13:14,690 --> 00:13:17,750 Гэта ў адрозненне ад двайковага дзе мы проста 0 і 1. 203 00:13:17,750 --> 00:13:21,450 >> Але ў рэшце рэшт вы можаце проста ўяўляюць сабой тыя ж лічбы, але 204 00:13:21,450 --> 00:13:22,500 некалькі інакш. 205 00:13:22,500 --> 00:13:25,840 І шаснаццаткавыя з'яўляецца агульным, таму што як атрымліваецца - і мы ўбачым, гэта 206 00:13:25,840 --> 00:13:28,790 на больш позніх стадыях - нават тады, калі мы атрымліваем на вэб-праграмавання ў кантэксце 207 00:13:28,790 --> 00:13:32,100 HTML і каляровыя коды, шаснаццатковым добрая. 208 00:13:32,100 --> 00:13:36,390 Таму што кожная лічба, аказваецца, ўяўляе сабой чатыры біта выдатна. 209 00:13:36,390 --> 00:13:39,280 Так што гэта толькі часткова ліній прыгожа як мы ў канчатковым выніку ўбачыць. 210 00:13:39,280 --> 00:13:44,720 Так што гэта можа быць ці нешта Ox123 так, які пазначае адрас 123 211 00:13:44,720 --> 00:13:47,050 дзесьці ўнутры майго памяці кампутара. 212 00:13:47,050 --> 00:13:50,600 >> Але, вядома, узнікаюць некаторыя праблемы з-за гэтага асноўнага 213 00:13:50,600 --> 00:13:51,520 ажыццяўленне. 214 00:13:51,520 --> 00:13:55,930 І памятайце, што я прыняў удар на рэалізацыі функцыі, як гэта - 215 00:13:55,930 --> 00:14:00,260 параўнаць працяжнік 0 кропка C на мінулым тыдні, што хоць здавалася, што было 216 00:14:00,260 --> 00:14:04,270 Правільна, гэта проста не параўнаць два радкі правільна. 217 00:14:04,270 --> 00:14:07,470 >> Я выкінуў асноўных і я кінуў ад каментароў проста сфакусавацца на 218 00:14:07,470 --> 00:14:08,970 код, які ўяўляе цікавасць тут. 219 00:14:08,970 --> 00:14:10,660 І гэта ў чырвоным, таму што ён памылковы. 220 00:14:10,660 --> 00:14:11,670 Па якой прычыне? 221 00:14:11,670 --> 00:14:15,890 >> Ну, у верхняй там, калі я заявіў, радком, тое, што адбываецца на самай справе 222 00:14:15,890 --> 00:14:17,260 пад капотам? 223 00:14:17,260 --> 00:14:19,530 Ну, дазвольце мне перайсці да Прыведзены тут экран і зрабіць гэта. 224 00:14:19,530 --> 00:14:23,230 Такім чынам, я заявіў, зноў жа, Радок з GetString. 225 00:14:23,230 --> 00:14:26,640 >> Так што я збіраюся ісці наперад і цяпер маляваць з такой, якая яна на самай справе. 226 00:14:26,640 --> 00:14:28,590 Гэта збіраецца быць квадратнай тут. 227 00:14:28,590 --> 00:14:30,490 І я збіраюся сцвярджаць, , Што гэта 32-бітнае. 228 00:14:30,490 --> 00:14:32,890 Па крайняй меры, гэта звычайна бывае, па меншай меры, на CS50 229 00:14:32,890 --> 00:14:34,520 Прыбор ў вялікай колькасці кампутараў. 230 00:14:34,520 --> 00:14:35,980 Я буду называць яго з. 231 00:14:35,980 --> 00:14:39,070 >> Але цяпер нагадаем, што мы GetString называецца. 232 00:14:39,070 --> 00:14:41,430 Так GetString вяртаецца, вядома, радок. 233 00:14:41,430 --> 00:14:45,790 Калі карыстальнік ўвядзе ў ч-е-л-л-о, увядзіце Радок прывітанне атрымлівае вярнуўся. 234 00:14:45,790 --> 00:14:51,010 І гэты радок, як мы толькі што сказалі, заканчваецца дзесьці ў памяці кампутара 235 00:14:51,010 --> 00:14:53,240 з зваротнай касой рысы 0 у канцы. 236 00:14:53,240 --> 00:14:56,650 Я намалюю гэта як масіў - ці бесперапынны блок сімвалаў - 237 00:14:56,650 --> 00:14:58,330 што яна на самай справе. 238 00:14:58,330 --> 00:15:01,790 >> І цяпер, што GetString на самай справе вяртанне? 239 00:15:01,790 --> 00:15:04,340 Што GetString вяртаўся ўвесь гэты час? 240 00:15:04,340 --> 00:15:07,520 Ну, скажам так, у тыдні да, яна вяртае радок. 241 00:15:07,520 --> 00:15:10,250 Але больш тэхнічна, тое, што робіць GetString вяртання па-відаць? 242 00:15:10,250 --> 00:15:11,610 >> АЎДЫТОРЫЯ: адрасу. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: адрасу. 244 00:15:12,600 --> 00:15:16,630 У прыватнасці, яна вяртае адрас самы першы ўкус, што гэта такое. 245 00:15:16,630 --> 00:15:18,830 Я проста працягваць выкарыстоўваць адзін, два, тры таму што гэта зручна. 246 00:15:18,830 --> 00:15:21,380 >> Яна вяртае адрас першага знакаў у радку. 247 00:15:21,380 --> 00:15:23,510 І мы на мінулым тыдні заявіў, што якая з'яўляецца дастатковай. 248 00:15:23,510 --> 00:15:26,710 Таму што мы заўсёды можам высветліць, дзе канца радка проста 249 00:15:26,710 --> 00:15:30,150 ітэрацыі гэта, можа быць, з для пятлю або пятлю, ці нешта накшталт 250 00:15:30,150 --> 00:15:34,990 , Што проста шукае "зваротны слэш 0", спецыяльны сімвал дазорцы. 251 00:15:34,990 --> 00:15:37,220 >> І тады мы ведаем, што радкі здараецца, даўжынёй - 252 00:15:37,220 --> 00:15:37,980 у дадзеным выпадку - 253 00:15:37,980 --> 00:15:38,670 пяць. 254 00:15:38,670 --> 00:15:43,800 Так што тэхнічна робіць GetString гэта вяртае Ox123 ў гэтым выпадку. 255 00:15:43,800 --> 00:15:53,670 І тэхнічна, што адбываецца, з'яўляецца тое , Што мы захоўваем, ўнутры з, Ox123. 256 00:15:53,670 --> 00:15:56,460 У рэшце рэшт, нават калі гэта з'яўляецца новай канцэпцыяй, паказальнікі, яны 257 00:15:56,460 --> 00:15:57,350 гэта проста зменныя. 258 00:15:57,350 --> 00:16:00,440 Але яны адбываюцца для захоўвання бітаў, якія разам уяўляюць адрасе. 259 00:16:00,440 --> 00:16:03,700 Так што ўсё, што яны тэхнічна атрымлівае захоўваецца ў ы з'яўляецца Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Але мы, як людзі - 261 00:16:04,680 --> 00:16:06,020 у тым ліку сёння наперад - 262 00:16:06,020 --> 00:16:09,290 сапраўды не будзе клапаціцца, звычайна, што фактычны адрас 263 00:16:09,290 --> 00:16:10,520 некаторых кавалак памяці. 264 00:16:10,520 --> 00:16:14,040 Гэта проста нізкі ўзровень дэталізацыі быць інтэлектуальна цікавым. 265 00:16:14,040 --> 00:16:15,440 Так што я збіраюся адмяніць гэта. 266 00:16:15,440 --> 00:16:19,810 І замест таго, больш высокі ўзровень, проста сказаць , Што, калі мы гаворым аб паказальніках 267 00:16:19,810 --> 00:16:22,170 Я збіраюся проста прыцягнуць больш зручных стрэлку, якая перадае 268 00:16:22,170 --> 00:16:26,060 ж ідэю і абстрагуюцца звесткі аб тым, што фактычная 269 00:16:26,060 --> 00:16:27,700 асноўны адрас. 270 00:16:27,700 --> 00:16:33,290 >> Цяпер, калі мы вернемся да кода, што адбылося на мінулым тыдні, калі ў нас ёсць радок T 271 00:16:33,290 --> 00:16:34,510 GetString роўна? 272 00:16:34,510 --> 00:16:38,630 Ну, калі я яшчэ раз, увядзіце прывітанне на гэты раз я іду, каб атрымаць 273 00:16:38,630 --> 00:16:40,460 іншы ўчастак памяці. 274 00:16:40,460 --> 00:16:44,820 ч-е-л-л-о 0 зваротную касую рысу. 275 00:16:44,820 --> 00:16:48,320 >> Але таму што я тэлефанаваў GetString ў другі раз - 276 00:16:48,320 --> 00:16:51,100 і я ведаю гэта, гледзячы на Зыходны код для GetString - нават 277 00:16:51,100 --> 00:16:54,350 тым, што гэта выпадкова, што прывітанне быў набраў у два разу, не GetString 278 00:16:54,350 --> 00:16:55,890 будзе спрабаваць аптымізаваць і быць разумным. 279 00:16:55,890 --> 00:16:58,550 Гэта проста будзе атрымаць іншы кавалак памяці з кампутара, які 280 00:16:58,550 --> 00:16:59,640 будзе па іншым адрасе. 281 00:16:59,640 --> 00:17:02,330 Давайце проста скажам, адвольна 456. 282 00:17:02,330 --> 00:17:04,079 >> А потым што ён збіраецца вярнуцца? 283 00:17:04,079 --> 00:17:08,030 Гэта збіраецца вярнуць 456 і захоўваць яго ў т. 284 00:17:08,030 --> 00:17:12,010 Так што ж адбываецца на самай справе, на Левы бок у мяне ёсць іншы кавалак 285 00:17:12,010 --> 00:17:14,260 памяці, 32 біт звычайна. 286 00:17:14,260 --> 00:17:16,720 І там будзе ісці Ox456. 287 00:17:16,720 --> 00:17:20,140 Але зноў жа, я не зацікаўлены ў гэтых пэўных лікаў больш. 288 00:17:20,140 --> 00:17:23,069 Я проста хачу, каб абстрактна намаляваць яго, як страла. 289 00:17:23,069 --> 00:17:25,202 >> Так што гэта цяпер новае тлумачэнне. 290 00:17:25,202 --> 00:17:28,735 Але гэта сапраўды такі жа ідэяй, што гэта што адбывалася ўвесь гэты час. 291 00:17:28,735 --> 00:17:33,150 І так прычыне, тое, што гэты першы версія параўнанне было дрэнна, 292 00:17:33,150 --> 00:17:34,480 на мінулым тыдні, чаму? 293 00:17:34,480 --> 00:17:38,000 Калі вы гэта зробіце, калі з роўна роўна т, што ты па-сапраўднаму 294 00:17:38,000 --> 00:17:40,550 пад капотам параўнання? 295 00:17:40,550 --> 00:17:41,910 >> Вы параўноўваеце адрасоў. 296 00:17:41,910 --> 00:17:47,950 І гэтак жа, інтуітыўна, зразумела, Ox123 не збіраецца роўнае Ox456. 297 00:17:47,950 --> 00:17:49,380 Гэтыя лічбы, гэтыя біты проста розныя. 298 00:17:49,380 --> 00:17:53,220 >> І так паслядоўна, на мінулым тыдні ён сказаў ўвесці розныя рэчы, нават калі 299 00:17:53,220 --> 00:17:55,360 Словы былі даслоўна тое ж самае. 300 00:17:55,360 --> 00:17:58,770 Такім чынам, мы гэта выправіць. 301 00:17:58,770 --> 00:18:00,120 З пункту гледжання непрафесіяналы, што было выправіць? 302 00:18:00,120 --> 00:18:02,110 >> АЎДЫТОРЫЯ: Выкарыстоўвайце функцыю. 303 00:18:02,110 --> 00:18:02,870 >> Выступоўца 1: Выкарыстоўвайце функцыю. 304 00:18:02,870 --> 00:18:05,190 Або зоркі вызначана уцягнуты, але выкарыстаць функцыю для чаго? 305 00:18:05,190 --> 00:18:05,962 >> АЎДЫТОРЫЯ: для параўнання радкоў. 306 00:18:05,962 --> 00:18:07,390 >> Выступоўца 1: для параўнання радкоў. 307 00:18:07,390 --> 00:18:11,030 Такім чынам, асноўная праблема тут была што я проста разглядзе 308 00:18:11,030 --> 00:18:15,870 Якасць радкоў, якія будуць вызначаны параўнанне іх адрасамі. 309 00:18:15,870 --> 00:18:18,540 І, відавочна, гэта толькі цяпер яшчэ нямыя Вы разумееце, што адбываецца 310 00:18:18,540 --> 00:18:19,510 пад капотам. 311 00:18:19,510 --> 00:18:23,270 Каб па-сапраўднаму параўноўваць радкі, каб убачыць, калі яны роўныя ў тым, што чалавечы 312 00:18:23,270 --> 00:18:26,680 будзе разглядаць два радкі роўнымі мы павінны параўнаць іх характар ​​для 313 00:18:26,680 --> 00:18:28,070 знак у знак. 314 00:18:28,070 --> 00:18:30,020 >> Цяпер я мог бы зрабіць гэта вельмі стомна. 315 00:18:30,020 --> 00:18:32,240 Але фамільярна, мы выкарыстаннем цыклу. 316 00:18:32,240 --> 00:18:36,050 І проста параўнайце з кранштэйнам Я супраць т кранштэйна я. 317 00:18:36,050 --> 00:18:39,590 з кранштэйнам я плюс 1 т супраць кранштэйны я плюс 1, і гэтак далей, усярэдзіне 318 00:18:39,590 --> 00:18:40,580 нейкі завесы. 319 00:18:40,580 --> 00:18:44,950 І калі я вызначаю любых двух знакаў, якія адрозніваюцца, або калі я разумею, што ох, з з'яўляецца 320 00:18:44,950 --> 00:18:48,410 карацей, чым т або больш, чым т Я магу адразу сказаць, ілжыва, 321 00:18:48,410 --> 00:18:49,390 яны не тое ж самае. 322 00:18:49,390 --> 00:18:55,370 >> Але калі я атрымліваю праз з і т і сказаць жа, тое ж самае, тое ж самае, тое ж самае, тое ж самае, у канцы 323 00:18:55,370 --> 00:18:58,520 абедзве радкі, я магу сказаць, праўда, яны роўныя. 324 00:18:58,520 --> 00:19:01,040 Ну, на шчасце, некалькі гадоў назад нехта пісаў, што код для нас. 325 00:19:01,040 --> 00:19:03,790 >> І яны назвалі гэта StrComp для параўнання радкоў. 326 00:19:03,790 --> 00:19:11,900 І хоць гэта крыху лічыльніка інтуітыўна, StrComp вяртае 0, калі гэтыя 327 00:19:11,900 --> 00:19:14,520 два радкі, з і т аднолькавыя. 328 00:19:14,520 --> 00:19:18,090 Але яна вяртае адмоўнае значэнне, калі з павінны прыйсці да T алфавіце або 329 00:19:18,090 --> 00:19:20,610 станоўчае значэнне, калі ён павінен прыйсці, пасля т у алфавітным парадку. 330 00:19:20,610 --> 00:19:24,030 >> Так што, калі вы хочаце ўладзіць нешта, аказваецца, што StrComp карысна. 331 00:19:24,030 --> 00:19:26,660 Таму што гэта не проста сказаць Так ці не, роўныя ці не. 332 00:19:26,660 --> 00:19:30,440 Гэта дае вам пачуццё заказу як слоўнік моцы. 333 00:19:30,440 --> 00:19:33,770 Так StrComp, з коскі T роўная роўна 0 азначае, што 334 00:19:33,770 --> 00:19:35,200 радкоў сапраўды роўныя. 335 00:19:35,200 --> 00:19:38,680 Таму што той, хто пісаў гэтую функцыю гадоў таму мяркуецца, выкарыстоўвалі для завесы 336 00:19:38,680 --> 00:19:42,840 або пятлю, ці нешта накшталт таго інтэграваць па персанажаў зноў 337 00:19:42,840 --> 00:19:45,270 і зноў і зноў. 338 00:19:45,270 --> 00:19:47,300 >> Але праблема ўзнікла два тут. 339 00:19:47,300 --> 00:19:48,750 Гэта было copy0.c. 340 00:19:48,750 --> 00:19:51,680 І абодва ў чырвоным таму што гэта недахопы. 341 00:19:51,680 --> 00:19:52,800 І што ж мы тут робім? 342 00:19:52,800 --> 00:19:54,310 Ну, па-першае, я патэлефанаваў GetString. 343 00:19:54,310 --> 00:19:56,255 І я захаваў вяртаецца значэння ў с. 344 00:19:56,255 --> 00:20:00,260 Так што гэта ў значнай ступені гэтак жа, як гэта верхняя частка карціны. 345 00:20:00,260 --> 00:20:01,490 >> Але што будзе пасля гэтага? 346 00:20:01,490 --> 00:20:04,980 Ну, дазвольце мне ісці наперад і пазбавіцца цэлай кучай гэтым. 347 00:20:04,980 --> 00:20:09,650 Мы перамоткі ў часе туды, дзе мы толькі што ёсць с, які ў цяперашні час у адпаведнасці з 348 00:20:09,650 --> 00:20:10,940 лініі аднаго там. 349 00:20:10,940 --> 00:20:11,400 >> Я правяраю. 350 00:20:11,400 --> 00:20:13,450 Калі з роўным роўная 0. 351 00:20:13,450 --> 00:20:18,670 Зараз, хуткае нататка боку, калі GetString можа вяртаць 0? 352 00:20:18,670 --> 00:20:19,580 Там не хапае памяці. 353 00:20:19,580 --> 00:20:19,880 Дакладна? 354 00:20:19,880 --> 00:20:22,310 >> Гэта рэдкае, што гэта адбудзецца, вядома, на кампутары, які 355 00:20:22,310 --> 00:20:24,740 ёсць сотні мегабайт або нават гігабайтамі аператыўнай памяці. 356 00:20:24,740 --> 00:20:27,080 Але гэта можа, у тэорыі, вярнуцца 0, асабліва калі 357 00:20:27,080 --> 00:20:28,080 Карыстальнік не супрацоўнічае. 358 00:20:28,080 --> 00:20:31,640 Там у спосабы прыкінуцца, што ў вас няма уведзеных трук і нічога 359 00:20:31,640 --> 00:20:34,100 GetString да вяртання 0 эфектыўна. 360 00:20:34,100 --> 00:20:35,470 >> Так што гэта, каб праверыць гэта. 361 00:20:35,470 --> 00:20:39,430 Таму што, калі любы з вас пачалі атрымаць, ужо, памылкі сегментацыі - 362 00:20:39,430 --> 00:20:42,280 які, верагодна, была крыніца некаторага расчаравання - 363 00:20:42,280 --> 00:20:46,150 тыя амаль заўсёды вынік з пра памылку памяці. 364 00:20:46,150 --> 00:20:50,440 Як-то вы пераблыталіся ў дачыненні да паказальнік, нават калі вы не разумееце, 365 00:20:50,440 --> 00:20:51,530 было паказальнікам. 366 00:20:51,530 --> 00:20:55,260 Такім чынам, вы, магчыма, індукаваных сегментацыі няспраўнасці яшчэ ў адну тыдзень выкарыстання 367 00:20:55,260 --> 00:21:02,100 нешта накшталт цыкла або ў той час як пятлю і масіў, заходзіць занадта далёка 368 00:21:02,100 --> 00:21:05,900 міма межы некаторых масіў, які Вы заявілі ў тыдзень у дзве 369 00:21:05,900 --> 00:21:06,690 прыватнасці. 370 00:21:06,690 --> 00:21:09,220 >> Вы маглі б гэта зрабіла нават у праблемных ўсталяваць чатыры з прарыву. 371 00:21:09,220 --> 00:21:12,910 Хаця вы, верагодна, не бачылі любой зоркі ў размеркаванні код 372 00:21:12,910 --> 00:21:17,410 Breakout, атрымліваецца, што тыя, GRect і GOval і іншыя падобныя рэчы, 373 00:21:17,410 --> 00:21:19,650 тыя фактычна з'яўляюцца паказальнікамі пад капотам. 374 00:21:19,650 --> 00:21:23,430 >> Але Стэнфард, як і мы, як тыя шкуры што падрабязна па меншай меры для бібліятэк 375 00:21:23,430 --> 00:21:26,540 мэтах, гэтак жа, як мы робім для струнных і сімвал *. 376 00:21:26,540 --> 00:21:30,060 Але GRect і GOval і ўсе гэтыя рэчы вы, хлопцы, ці будзе выкарыстоўваць 377 00:21:30,060 --> 00:21:32,630 На гэтым тыдні, у канчатковым рахунку адрасоў памяці. 378 00:21:32,630 --> 00:21:33,650 Вы проста не ведаеце. 379 00:21:33,650 --> 00:21:37,240 >> Так што не дзіўна і тое, мабыць, што вы маглі б спатыкнуцца некаторых 380 00:21:37,240 --> 00:21:38,580 памылкі сегментацыі. 381 00:21:38,580 --> 00:21:41,290 Але што цікава, вось цяпер, Калі пасля праверкі на 0 мы робім 382 00:21:41,290 --> 00:21:43,460 Радок T атрымлівае с. 383 00:21:43,460 --> 00:21:44,690 Ну, дазвольце мне абвясціць T. 384 00:21:44,690 --> 00:21:47,730 Я збіраюся намаляваць яго ў выглядзе квадрата, 32 біт, назавем яго T. 385 00:21:47,730 --> 00:21:49,740 А потым я збіраюся зрабіць атрымлівае с. 386 00:21:49,740 --> 00:21:51,130 >> Ну, што ж гэта значыць? 387 00:21:51,130 --> 00:21:53,280 Ну, гэта трохі цяжка думаць Пра гэта прадставіць мудрым. 388 00:21:53,280 --> 00:21:55,025 Але давайце падумаем аб што ўнутры х? 389 00:21:55,025 --> 00:21:59,430 Што літаральна ў гэтую зменную? 390 00:21:59,430 --> 00:22:01,500 Значэнне Ox123. 391 00:22:01,500 --> 00:22:05,815 >> Таму калі я кажу T атрымлівае радок з, што толькі літаральна азначае ўзяць лік 392 00:22:05,815 --> 00:22:10,070 ў с, што Ox123 і паклаў яго Ox123. 393 00:22:10,070 --> 00:22:13,740 Ці графічна, калі я як бы абстрактным ад якіх падрабязна ён мае 394 00:22:13,740 --> 00:22:16,600 Эфект літаральна робіць гэта таксама. 395 00:22:16,600 --> 00:22:22,110 >> Так што цяпер, узгадайце, калі на мінулым тыдні мы прыступілі да капіталістычнага T. Я 396 00:22:22,110 --> 00:22:23,800 T зрабіў кранштэйны 0. 397 00:22:23,800 --> 00:22:27,150 Ну, T кранштэйны 0, нават калі гэта паказальнік, вы можаце разглядаць яго як быццам 398 00:22:27,150 --> 00:22:29,220 гэта масіў, з квадратным дужкі. 399 00:22:29,220 --> 00:22:31,550 >> Дык дзе T 0 кранштэйны? 400 00:22:31,550 --> 00:22:32,990 Ну, гэта гадзіну. 401 00:22:32,990 --> 00:22:36,800 І таму, калі мы выкарыстоўваем гэты радок кода, Два верхніх, што ў гэтым з type.h 402 00:22:36,800 --> 00:22:38,460 Выява загалоўка, вось дзе яны абвешчаныя. 403 00:22:38,460 --> 00:22:44,410 Вы капіталізацыі гэтай H. Але, Вядома, гэта сапраўды такі ж вось г 404 00:22:44,410 --> 00:22:46,540 Усярэдзіне з, так бы мовіць. 405 00:22:46,540 --> 00:22:51,930 І вось цяпер вы змянілі або капитализируются як арыгінальную і 406 00:22:51,930 --> 00:22:53,120 так званыя копіі. 407 00:22:53,120 --> 00:22:56,620 Таму што вы не зрабіць копію чынам, што чалавеку хацелася б яе бачыць. 408 00:22:56,620 --> 00:22:59,710 >> Дык што ж выпраўленне тут, У copy1.c на мінулым тыдні? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Функцыі, так што мы маглі фактычна скапіяваць радок. 411 00:23:05,580 --> 00:23:08,700 І прынцыпова, што ж нам трэба, каб зрабіць для таго, каб скапіяваць радок? 412 00:23:08,700 --> 00:23:12,070 >> Ну, у гэтым зялёным версію тут я збіраецца зрабіць гэта даволі нізкім узроўні. 413 00:23:12,070 --> 00:23:14,260 Ёсць на самай справе функцыі яны маглі б дапамагчы з гэтым. 414 00:23:14,260 --> 00:23:17,710 Але самае асноўнае, прычым найбольш знаёмая, па меншай меры, у хуткім часе будзе 415 00:23:17,710 --> 00:23:19,600 знаёмы нам, наступны - 416 00:23:19,600 --> 00:23:21,910 так што на першай лініі кода ў зялёны гэтага часу. 417 00:23:21,910 --> 00:23:23,970 >> Я проста перапісаў з, як сімвал *. 418 00:23:23,970 --> 00:23:25,250 Там няма функцыянальнага розніцы няма. 419 00:23:25,250 --> 00:23:28,790 Я проста выкінуў CS50 бібліятэку і Я тэлефаную яго, якое гэта, сімвал *. 420 00:23:28,790 --> 00:23:31,640 >> Цяпер кропка, кропка, кропка, таму што былі апрацоўку памылак, што не 421 00:23:31,640 --> 00:23:33,200 Цікава казаць аб зноў. 422 00:23:33,200 --> 00:23:34,710 Так што цяпер Т абвешчаны. 423 00:23:34,710 --> 00:23:35,780 Гэта таксама сімвал *. 424 00:23:35,780 --> 00:23:38,280 Так што я звярнуў на маленькай плошчы Экран, як раней. 425 00:23:38,280 --> 00:23:41,870 >> Але, з правага боку, Malloc, мы сказалі гэта памяць вылучыць. 426 00:23:41,870 --> 00:23:44,130 Так што вылучыць некалькі кавалак памяці. 427 00:23:44,130 --> 00:23:48,830 І колькі байт мы на самай справе хочам вылучыць, яна здаецца? 428 00:23:48,830 --> 00:23:50,340 >> Ну, даўжыня радка с. 429 00:23:50,340 --> 00:23:52,310 Так што калі гэта прывітанне гэта будзе пяць. 430 00:23:52,310 --> 00:23:53,950 Мы скажам, ч-е-л-л-о. 431 00:23:53,950 --> 00:23:55,090 Так пяць байт. 432 00:23:55,090 --> 00:23:57,960 >> Але тады плюс 1, то чаму 1? 433 00:23:57,960 --> 00:23:58,830 Сімвал 0. 434 00:23:58,830 --> 00:24:03,640 Калі мы не пакідаюць месцы для гэтага хлопца мы можа выпадкова стварыць сітуацыю, 435 00:24:03,640 --> 00:24:05,600 , Дзе знаходзіцца радок ч-е-л-л-о. 436 00:24:05,600 --> 00:24:08,470 А потым наступны GetString час Я патэлефанаваў і ўвесці, напрыклад, 437 00:24:08,470 --> 00:24:14,020 Дэвід, D - V-I-д, кампутар будзе думаць, што ёй на самай справе 438 00:24:14,020 --> 00:24:18,900 ч-е-л-л-о-д-а-у-і-D, таму што ёсць Без перапынку паміж гэтымі словамі. 439 00:24:18,900 --> 00:24:19,810 >> Так што нам трэба, што перапынак. 440 00:24:19,810 --> 00:24:20,720 Такім чынам, мы не хочам, пяць. 441 00:24:20,720 --> 00:24:22,100 Мы хочам шэсць байт. 442 00:24:22,100 --> 00:24:23,110 >> І я кажу байт. 443 00:24:23,110 --> 00:24:25,220 Але гэта сапраўды час памер знакаў. 444 00:24:25,220 --> 00:24:28,040 Тэхнічна сімвал амаль заўсёды адзін байт. 445 00:24:28,040 --> 00:24:31,030 >> Але толькі, каб зрабіць наш код партатыўны, так бы мовіць, так што ён працуе на 446 00:24:31,030 --> 00:24:33,750 розных кампутарах, нават калі яны могуць быць крыху іншай пад 447 00:24:33,750 --> 00:24:36,590 капот, я збіраюся агульным кажуць памер так, каб сімвал 448 00:24:36,590 --> 00:24:37,660 мой код заўсёды працуе. 449 00:24:37,660 --> 00:24:40,610 І я не прыйдзецца перакампіляваць гэта проста таму што я абнавіць мой кампутар або выкарыстоўваць 450 00:24:40,610 --> 00:24:42,140 некалькі розных платформаў. 451 00:24:42,140 --> 00:24:45,300 >> Так што я атрымаў 6 разоў больш сімвал, які бывае 1. 452 00:24:45,300 --> 00:24:47,440 Так, каб сродкі маглі Malloc даць мне шэсць байт. 453 00:24:47,440 --> 00:24:49,140 Што гэта на самай справе рабіць? 454 00:24:49,140 --> 00:24:52,810 Ну, дазвольце мне вярнуцца ў часе тут туды, дзе мы знаходзімся ў гісторыю. 455 00:24:52,810 --> 00:24:57,620 >> Так што, калі я вярнуся сюды, я абвясціў сімвал * званыя Т. 456 00:24:57,620 --> 00:25:00,280 Я цяпер называецца Malloc працягу шасці байтаў. 457 00:25:00,280 --> 00:25:06,400 А цяпер я збіраюся зрабіць гэтыя шэсць байт як масіў раней. 458 00:25:06,400 --> 00:25:10,570 Але я на самой справе не ведаю, што гэта ўнутры гэтага масіва. 459 00:25:10,570 --> 00:25:14,640 >> Калі вы вылучыць памяць аказваецца, што Вы не можаце давяраць, што ёсць некаторыя 460 00:25:14,640 --> 00:25:15,810 Вядомае значэнне там. 461 00:25:15,810 --> 00:25:18,400 Гэта можна было б выкарыстоўваць на нешта інакш, некаторыя іншыя функцыі, некаторыя іншыя 462 00:25:18,400 --> 00:25:19,630 радкі кода, які вы напісалі. 463 00:25:19,630 --> 00:25:22,870 Так што мы звычайна называем гэтым смеццем значэння і прыцягнуць іх, можа быць, як 464 00:25:22,870 --> 00:25:26,170 пытальныя знакі, толькі пра тое, што мы Не ведаю, што на самой справе там. 465 00:25:26,170 --> 00:25:30,390 І гэта не вялікае справа, пакуль мы дастаткова разумныя, каб перазапісаць 466 00:25:30,390 --> 00:25:34,550 смецце значэння з нумарамі або сімвалы, якія нас цікавяць. 467 00:25:34,550 --> 00:25:36,340 >> Таму ў дадзеным выпадку тое, што я збіраюся рабіць? 468 00:25:36,340 --> 00:25:38,670 Ну, мая радок кода Далей, у мяне ёсць чатыры. 469 00:25:38,670 --> 00:25:41,350 Int я атрымліваю 0, п атрымлівае даўжыня радка с. 470 00:25:41,350 --> 00:25:42,750 Так знаёмая цыклу. 471 00:25:42,750 --> 00:25:45,875 Я менш або роўная п, які звычайна вышэй. 472 00:25:45,875 --> 00:25:47,500 >> Але на гэты раз гэта наўмысна. 473 00:25:47,500 --> 00:25:51,890 Я + +, а потым я проста раблю т кранштэйна я атрымлівае с. 474 00:25:51,890 --> 00:25:56,320 Таму што мая карціна выглядае як гэта ў гэты момант захоўваецца ў т з'яўляецца 475 00:25:56,320 --> 00:25:59,530 адрас гэтага выпадковага блок памяці , Значэння якіх невядомыя. 476 00:25:59,530 --> 00:26:03,030 Але як толькі я раблю т кранштэйна 0, які ставіць мяне тут. 477 00:26:03,030 --> 00:26:07,430 >> І тое, што заканчвае тым, што цягне туды? 478 00:26:07,430 --> 00:26:08,740 Мы ў канчатковым выніку пакласці ч. 479 00:26:08,740 --> 00:26:11,170 Таму што гэта тое, што стаіць на кранштэйне з 0. 480 00:26:11,170 --> 00:26:14,300 А потым тое ж самае для е і л і л і а. 481 00:26:14,300 --> 00:26:17,930 >> N, чаму не пайшоў праз роўная п? 482 00:26:17,930 --> 00:26:19,200 З-за 0 характару. 483 00:26:19,200 --> 00:26:23,580 Так проста быць ясна, то, калі я на самой справе сцерці ўсе гэтыя смецця 484 00:26:23,580 --> 00:26:28,870 значэння, а затым фактычна маляваць у тое, што я чакаў, гэта з кранштэйнам 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, плюс які заднім новы характар. 486 00:26:32,440 --> 00:26:36,080 >> І вось цяпер, калі мы працягнем міма кропкі, кропка, кропка ў гэтым правільная версія 487 00:26:36,080 --> 00:26:41,930 і капіталізаваць кранштэйны Т +0 я б, Вядома, быць капіталізацыі толькі ў гэтым 488 00:26:41,930 --> 00:26:47,050 хлопец тут, што ў прынцыпе, у канчатковым рахунку мэта. 489 00:26:47,050 --> 00:26:48,040 Так што ўсё паказальніка. 490 00:26:48,040 --> 00:26:51,430 >> І ты выкарыстаў іх на працягу тыдня Цяпер у кантэксце радкоў. 491 00:26:51,430 --> 00:26:53,530 Але пад капотам яны трохі больш складанай. 492 00:26:53,530 --> 00:26:57,520 Але калі вы думаеце пра іх у гэтым нагляднай форме я прапаную, каб яны 493 00:26:57,520 --> 00:27:01,720 верагодна, не ўсё так страшна, як яны можа здацца на першы погляд, 494 00:27:01,720 --> 00:27:04,730 Асабліва з такой новы сінтаксіс. 495 00:27:04,730 --> 00:27:07,290 Любыя пытанні па паказальніках, радкоў або знакаў? 496 00:27:07,290 --> 00:27:07,580 Да? 497 00:27:07,580 --> 00:27:09,252 >> Залы: Ці можна вярнуцца назад у [неразборліва]? 498 00:27:09,252 --> 00:27:10,502 >> Выступоўца 1: Вядома. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> АЎДЫТОРЫЯ: Так як жа ў вашай самай апошняй лініі, у вас няма лініі T * 501 00:27:19,525 --> 00:27:21,513 і A * S ў лініі? 502 00:27:21,513 --> 00:27:23,004 Ці няма ў вас спасылкі на - 503 00:27:23,004 --> 00:27:24,640 >> Выступоўца 1: Ах, вельмі добрае пытанне. 504 00:27:24,640 --> 00:27:26,800 Чаму ў мяне няма і Т * A * S? 505 00:27:26,800 --> 00:27:30,340 Так коратка, на мінулым тыдні, як і ў нашай памяняць функцыі, я сапраўды казаў, што, калі 506 00:27:30,340 --> 00:27:33,350 ў вас ёсць паказальнік сродак, з дапамогай які Вы ідзяце туды, як мы зрабілі 507 00:27:33,350 --> 00:27:36,590 фізічна на сцэне, быў на самай справе выкарыстоўваць зорку аператара. 508 00:27:36,590 --> 00:27:40,570 >> Аказваецца, што гэтая квадратных дужак абазначэння, што мы назавем сінтаксічных 509 00:27:40,570 --> 00:27:44,190 цукар, які знаходзіцца ўсяго ў сэксуальны спосаб кажуць, што гэта скарочаная запіс 510 00:27:44,190 --> 00:27:45,950 менавіта тое, што вы апісваеце. 511 00:27:45,950 --> 00:27:49,385 Але гэта крыху больш інтуітыўным. 512 00:27:49,385 --> 00:27:53,510 І ў той рызыка прыняцця гэтага здаюцца больш складаней, чым яна павінна быць, 513 00:27:53,510 --> 00:27:56,990 тое, што адбываецца на самай справе тут з'яўляецца наступнае - 514 00:27:56,990 --> 00:28:01,450 Калі я скажу, што T * азначае пайсці ў адрасе, захаванне ў т. 515 00:28:01,450 --> 00:28:04,350 >> Так літаральна, калі Т захоўвання адрас гэтай г 516 00:28:04,350 --> 00:28:07,300 Першапачаткова * T сродкі ідуць сюды. 517 00:28:07,300 --> 00:28:10,730 Такім чынам, што ж т кранштэйна 0 азначае? 518 00:28:10,730 --> 00:28:11,560 Сапраўды такі ж рэчы. 519 00:28:11,560 --> 00:28:13,510 Гэта проста трохі больш карыстальнікаў дружалюбны пісаць. 520 00:28:13,510 --> 00:28:14,430 >> Але я яшчэ не скончыў. 521 00:28:14,430 --> 00:28:17,800 Я не магу проста сказаць * T * атрымлівае с. 522 00:28:17,800 --> 00:28:19,440 Таму што тое, што я буду рабіць тады? 523 00:28:19,440 --> 00:28:22,950 Я б пакласці Н, Н, Н, Н, Н на працягу ўсяго гэтага. 524 00:28:22,950 --> 00:28:22,995 Дакладна? 525 00:28:22,995 --> 00:28:26,020 >> Таму што Т * перайсці па адрасе ў т. 526 00:28:26,020 --> 00:28:27,580 Аднак мы ўнутры цыклу. 527 00:28:27,580 --> 00:28:32,150 І якое значэнне я прырашчэння, Вядома, на кожнай ітэрацыі? 528 00:28:32,150 --> 00:28:32,690 я. 529 00:28:32,690 --> 00:28:34,590 >> Але ёсць магчымасць Тут, праўда? 530 00:28:34,590 --> 00:28:37,870 Нават калі гэта адчувае, як яна становіцца трохі больш складанай 531 00:28:37,870 --> 00:28:40,730 чым квадратных дужак мы выкарыстоўвалі на працягу некаторага часу - 532 00:28:40,730 --> 00:28:43,840 дазвольце мне адмяніць мой г змена там - 533 00:28:43,840 --> 00:28:48,870 хоць гэта цяпер становіцца трохі аматар, асноўная ідэя, калі T * 534 00:28:48,870 --> 00:28:53,630 азначае тут і * т толькі перайсці па адрасе ў т. 535 00:28:53,630 --> 00:28:54,990 >> Але тое, што адрас у т? 536 00:28:54,990 --> 00:28:56,850 Чысла мы працягваць выкарыстоўваць? 537 00:28:56,850 --> 00:29:00,540 Як Ox456, давайце вярнуць гэта толькі дзеля абмеркавання. 538 00:29:00,540 --> 00:29:05,380 Ну, калі я хачу атрымаць на е ў T радкоў, я проста хачу ісці, 539 00:29:05,380 --> 00:29:06,460 Па сутнасці, 456. 540 00:29:06,460 --> 00:29:09,230 >> Ці, хутчэй, 457. 541 00:29:09,230 --> 00:29:10,590 Мне проста трэба, дадайце адзін. 542 00:29:10,590 --> 00:29:11,790 Але я магу зрабіць гэта, ці не так? 543 00:29:11,790 --> 00:29:14,680 Паколькі т, хоць я захаваць малюнак яго цяпер, як страла, гэта проста 544 00:29:14,680 --> 00:29:16,570 лік, Ox456. 545 00:29:16,570 --> 00:29:21,400 І калі я дадам, што адзін або больш Як правіла, калі я дадам я да таго, я магу 546 00:29:21,400 --> 00:29:24,350 на самой справе атрымаць менавіта там, дзе я хачу. 547 00:29:24,350 --> 00:29:26,260 Так што, калі я на самой справе зрабіць гэта - 548 00:29:26,260 --> 00:29:28,970 і гэта тое, што цяпер называецца арыфметыка паказальнікаў - 549 00:29:28,970 --> 00:29:30,375 Я магу выдаліць гэтую лінію. 550 00:29:30,375 --> 00:29:33,550 Што, шчыра кажучы, я думаю, што ясней і больш зразумелым карыстачу чытаць. 551 00:29:33,550 --> 00:29:35,970 Але гэта не менш правільна. 552 00:29:35,970 --> 00:29:38,570 >> Гэты радок кода зараз выкарыстоўвае арыфметыкі паказальнікаў. 553 00:29:38,570 --> 00:29:40,920 Гэта кажа пайсці ў пасля выступу - 554 00:29:40,920 --> 00:29:44,670 незалежна ад пачатку т у тым, які з'яўляецца T Plus I, які першапачаткова 555 00:29:44,670 --> 00:29:45,730 роўна 0, і гэта выдатна. 556 00:29:45,730 --> 00:29:49,280 Паколькі гэта азначае пачатак т плюс адзін, плюс два, плюс 3, і так далей. 557 00:29:49,280 --> 00:29:51,030 І тое ж самае справу з с. 558 00:29:51,030 --> 00:29:52,750 >> Так сінтаксічны цукар для гэтага. 559 00:29:52,750 --> 00:29:55,900 Але разуменне таго, што адбываецца на самай справе пад капотам, я б сказаў, 560 00:29:55,900 --> 00:29:57,410 на самай справе карысна само па сабе. 561 00:29:57,410 --> 00:30:00,620 Таму што гэта азначае цяпер значыць не значна больш магіі адбываецца 562 00:30:00,620 --> 00:30:01,620 пад капотам. 563 00:30:01,620 --> 00:30:03,920 Там не будзе шмат больш пласты, якія мы можам адхіліце для вас. 564 00:30:03,920 --> 00:30:04,810 Гэта с. 565 00:30:04,810 --> 00:30:06,410 І гэта праграмаванне. 566 00:30:06,410 --> 00:30:08,002 Вельмі добрае пытанне. 567 00:30:08,002 --> 00:30:11,570 >> Добра, так што гэта было тое, што дзіцячая калыска праграма, якую я меў на ўвазе раней. 568 00:30:11,570 --> 00:30:12,650 своп быў сапсаваны. 569 00:30:12,650 --> 00:30:14,070 Калі сапраўды падобна на працу. 570 00:30:14,070 --> 00:30:17,390 Нагадаем, што гэтак жа, як з малаком і Апельсінавы сок - які я пачаў 571 00:30:17,390 --> 00:30:18,660 пітной сённяшняй дэманстрацыі. 572 00:30:18,660 --> 00:30:22,220 Гэтак жа, як з апельсінавым сокам і малако, мы павінны выкарыстоўваць 573 00:30:22,220 --> 00:30:26,200 часовую зменную TMP, правесці часова, так што мы маглі тады 574 00:30:26,200 --> 00:30:28,820 змяніць яго значэнне, а затым абнавіць б. 575 00:30:28,820 --> 00:30:32,870 >> Але гэтая функцыя, мы сказалі, ці гэта Праграма, у якой гэтая функцыя была 576 00:30:32,870 --> 00:30:35,670 напісана было няправільна, і недахопы, то чаму? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Да? 579 00:30:39,090 --> 00:30:42,471 >> АЎДЫТОРЫЯ: [неразборліва]. 580 00:30:42,471 --> 00:30:44,940 >> Выступоўца 1: Сапраўды, калі вы называеце своп - 581 00:30:44,940 --> 00:30:47,820 ці, больш абагульнена, калі называюць самым любую функцыю - 582 00:30:47,820 --> 00:30:51,210 калі аргументы для гэтай функцыі з'яўляюцца прымітыўных, так бы мовіць, цэлыя і сімвалы 583 00:30:51,210 --> 00:30:56,740 і парным разрадах і плавае, то, без зоркі, вы праходзіце ў копію 584 00:30:56,740 --> 00:30:57,540 аргумент. 585 00:30:57,540 --> 00:31:01,580 Так што калі х быў 1 і ў 2 было, збіраецца быць 1 і B будзе 2. 586 00:31:01,580 --> 00:31:05,250 Але яны збіраюцца быць рознымі кавалкамі бітаў, розныя порцыі 587 00:31:05,250 --> 00:31:07,540 памяці, якія, здараецца, захоўванне аднолькавыя значэння. 588 00:31:07,540 --> 00:31:12,160 >> Так што гэты код з'яўляецца супер дасканалы пры перапампоўванню і б. 589 00:31:12,160 --> 00:31:13,850 Гэта нікуды не падыходзіць пры перапампоўванню - 590 00:31:13,850 --> 00:31:15,290 у прыкладзе на мінулым тыдні - 591 00:31:15,290 --> 00:31:16,390 х і у. 592 00:31:16,390 --> 00:31:18,780 Таму што зноў жа, яны у няправільнай вобласці. 593 00:31:18,780 --> 00:31:21,310 >> Цяпер, як мы ісці аб фіксацыі гэтага? 594 00:31:21,310 --> 00:31:23,140 Мы павінны былі зрабіць функцыю выглядаць трохі больш гідкі. 595 00:31:23,140 --> 00:31:25,250 Але, зноў жа, разгледзім, што гэта проста азначае. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> А на самай справе, дазвольце мне, для паслядоўнасці, змяніць адну рэч так што гэта ідэнтычна 598 00:31:31,500 --> 00:31:33,200 тое, што мы толькі што зрабілі. 599 00:31:33,200 --> 00:31:35,690 Як я ўжо казаў на мінулым тыдні, ён не мае значэння, дзе ён ідзе. 600 00:31:35,690 --> 00:31:38,120 На самай справе, Вам трэба будзе паставіць зорачку побач з імем зменнай. 601 00:31:38,120 --> 00:31:40,750 Але я думаю, было б крыху лягчэй разгледзець * побач 602 00:31:40,750 --> 00:31:44,910 Тып дадзеных у тым сэнсе, што гэта паказальнік да цэлалікавай ў гэтым выпадку. 603 00:31:44,910 --> 00:31:46,270 >> Так што я тут раблю? 604 00:31:46,270 --> 00:31:49,590 Я кажу, што мне не даюць цэлалікавай рушыў услед яшчэ адзін Інтэлект, 605 00:31:49,590 --> 00:31:50,810 называючы іх А і Б. 606 00:31:50,810 --> 00:31:52,460 Дайце мне адрас Int. 607 00:31:52,460 --> 00:31:53,960 Дайце мне адрас іншага Int. 608 00:31:53,960 --> 00:31:56,330 Патэлефануйце гэтыя адрасы А і В. 609 00:31:56,330 --> 00:32:00,860 >> А затым з дапамогай абазначэння ўніз * ніжэй, перайдзіце да кожнага з гэтых адрасоў 610 00:32:00,860 --> 00:32:05,290 па меры неабходнасці або атрымаць ці ўсталюйце яго значэнне. 611 00:32:05,290 --> 00:32:07,400 Але ёсць выключэнне. 612 00:32:07,400 --> 00:32:11,130 Чаму я не * побач з TMP? 613 00:32:11,130 --> 00:32:15,070 Чаму я не рабіў гэтага, напрыклад? 614 00:32:15,070 --> 00:32:19,370 Такое пачуццё, што я б проста ісці ўсё , І выправіць усё гэта. 615 00:32:19,370 --> 00:32:19,752 Да? 616 00:32:19,752 --> 00:32:21,002 >> АЎДЫТОРЫЯ: [неразборліва]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> Выступоўца 1: Я не заявілі TMP ў выглядзе радка. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Так што гэта будзе аб'явіць, у дадзеным выпадку, TMP быць адрас Int. 621 00:32:34,950 --> 00:32:37,380 Але гэта не зусім тое, што я хачу, па некалькіх прычынах. 622 00:32:37,380 --> 00:32:38,616 >> Залы: Вы не хочаце, каб памяняць іх месцамі. 623 00:32:38,616 --> 00:32:41,800 >> Выступоўца 1: Сапраўды, я не хачу, каб памяняць нічога з TMP. TMP проста 624 00:32:41,800 --> 00:32:42,790 тыдзень-адзін матэрыял. 625 00:32:42,790 --> 00:32:45,150 Усё, што я хачу, з'яўляецца зменнай захоўваць некаторы лік. 626 00:32:45,150 --> 00:32:47,330 Я нават не клапоцяцца пра адрасы у гэты момант. 627 00:32:47,330 --> 00:32:50,530 >> Мне проста трэба 32 біт або таму для захоўвання Int. 628 00:32:50,530 --> 00:32:56,690 І я хачу паставіць у гэтых 32 біт ўсё, што не ў, так бы мовіць, але 629 00:32:56,690 --> 00:33:01,260 пра што ідзе, проста каб быць больш дакладным. 630 00:33:01,260 --> 00:33:06,420 Таму што, калі гэта адрас, * азначае, пайсці туды і атрымаць значэнне 1. 631 00:33:06,420 --> 00:33:10,560 Напрыклад, у прыкладзе на мінулым тыдні або ў выпадку Б, атрымаем значэнне 2. 632 00:33:10,560 --> 00:33:11,750 >> Так што ж адбываецца на самай справе? 633 00:33:11,750 --> 00:33:15,070 Дазвольце мне намаляваць карціну тут, што толькі дражніць адзін ад аднаго часткі сёння. 634 00:33:15,070 --> 00:33:18,580 Але гэта будуць працягваць з'яўляцца на працягу досыць доўгага часу. 635 00:33:18,580 --> 00:33:22,430 >> Гэта, я сцвярджаю, тое, што ваш кампутар памяці выглядае, калі вы запускаеце 636 00:33:22,430 --> 00:33:24,060 праграмы, любой праграмы. 637 00:33:24,060 --> 00:33:28,340 Калі вы запускаеце праграму на самым версе аператыўнай памяці кампутара - так што думаю 638 00:33:28,340 --> 00:33:33,530 гэтага прамавугольніка, па-сапраўднаму, так як ваш кампутара аператыўная памяць ці памяць, усе 101 639 00:33:33,530 --> 00:33:36,920 мільярд байт зь яе ўсе два мільярды байт, усе два гігабайта гэта, 640 00:33:36,920 --> 00:33:39,910 незалежна ад колькасці ў вас ёсць, намалюем яго ў выглядзе прамавугольніка. 641 00:33:39,910 --> 00:33:43,260 І я сцвярджаю, што, калі вы запускаеце праграму як Microsoft Word або Chrome 642 00:33:43,260 --> 00:33:49,220 або што-небудзь падобнае, біты, Microsoft або Google, што напісаў - 643 00:33:49,220 --> 00:33:50,910 у выпадках гэтых праграм - 644 00:33:50,910 --> 00:33:54,490 загружаюцца ў памяць кампутара дзе яны могуць быць выкананы больш 645 00:33:54,490 --> 00:33:57,520 хутка і падаецца ў працэсар, які з'яўляецца мозгам кампутара. 646 00:33:57,520 --> 00:34:00,940 >> І ТАМ яны захоўваюцца ў самым версе вашай праграмы, так бы мовіць. 647 00:34:00,940 --> 00:34:03,300 Іншымі словамі, калі гэта кавалак памяці, калі вы двойчы пстрыкніце на 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, біты прыходзяць з жорсткага дыска. 649 00:34:05,740 --> 00:34:06,680 Яны загружаюцца ў аператыўную памяць. 650 00:34:06,680 --> 00:34:10,330 І мы будзем штурхаць іх на самым версе гэтага прамавугольніка канцэптуальна. 651 00:34:10,330 --> 00:34:13,010 >> Ну, астатняе ваша памяць выкарыстоўваць для розных рэчаў. 652 00:34:13,010 --> 00:34:16,460 На самым версе вы бачыце ініцыялізацыі дадзеных і ініцыялізацыі дадзеных. 653 00:34:16,460 --> 00:34:20,500 Гэта звязана, па большай частцы, пры канстантамі або глабальныя зменныя 654 00:34:20,500 --> 00:34:21,340 якія маюць значэння. 655 00:34:21,340 --> 00:34:22,980 Але больш на тых у іншы раз. 656 00:34:22,980 --> 00:34:25,150 >> Тады ў вас ёсць куча, якая мы будзем вяртацца. 657 00:34:25,150 --> 00:34:28,420 Але на дне часткі, якая Асабліва дарэчныя прама цяпер. 658 00:34:28,420 --> 00:34:30,210 Гэта так званы стэк. 659 00:34:30,210 --> 00:34:33,850 Гэтак жа, як у большасці любых D зала тут, на кампуса, у вас ёсць тыя латкі, якія 660 00:34:33,850 --> 00:34:37,210 проста стэк-над адзін аднаго на якім Вы можаце пакласці ежу і яшчэ шмат чаго. 661 00:34:37,210 --> 00:34:40,139 Стэк ў кампутарнай сістэме вельмі падобныя. 662 00:34:40,139 --> 00:34:42,679 За выключэннем у той час як латок, як мы выкарыстоўваем у сталовай, вядома, маецца на ўвазе 663 00:34:42,679 --> 00:34:45,710 несці рэчы латкоў або кадры - 664 00:34:45,710 --> 00:34:49,469 як мы будзем называць іх - у кампутары памяці выкарыстоўваецца для захоўвання 665 00:34:49,469 --> 00:34:51,610 зменных і іх значэнняў. 666 00:34:51,610 --> 00:34:53,929 >> Так што ж на самай справе адбываецца пад капотам? 667 00:34:53,929 --> 00:34:55,820 Ну, дазвольце мне перавярнуцца на экран тут. 668 00:34:55,820 --> 00:34:58,370 І давайце засяродзімся толькі на Ніжняя частка на імгненне. 669 00:34:58,370 --> 00:35:02,770 Калі гэта ніжняя частка мой памяці кампутара аказваецца, калі я 670 00:35:02,770 --> 00:35:05,350 выклікаць функцыю асноўнага - што адбываецца, шчыра кажучы, 671 00:35:05,350 --> 00:35:06,950 аўтаматычна для мяне - 672 00:35:06,950 --> 00:35:10,510 Я атрымліваю кавалак памяці ў глыбіні маёй памяці, так бы мовіць. 673 00:35:10,510 --> 00:35:13,390 І тут гэта асноўны лакальныя зменныя ісці. 674 00:35:13,390 --> 00:35:16,770 Гэта месца, дзе ARGC ARGV і, можа быць, ісці, і я ўсё зменныя 675 00:35:16,770 --> 00:35:18,170 абвясціць ўнутры асноўнага. 676 00:35:18,170 --> 00:35:20,260 Яны ў канчатковым выніку на дне аператыўнай памяці майго кампутара. 677 00:35:20,260 --> 00:35:25,040 >> Зараз выкажам здагадку, што асноўным выклікае функцыю як своп, як гэта было на мінулым тыдні? 678 00:35:25,040 --> 00:35:30,620 Ну, мы, па сутнасці паставіў новы латок, Новы кадр, на мой кавалак памяці. 679 00:35:30,620 --> 00:35:34,160 І я збіраюся апісаць гэта як якія належаць своп функцыі. 680 00:35:34,160 --> 00:35:35,770 >> Цяпер, што ўнутры своп? 681 00:35:35,770 --> 00:35:39,240 Таксама, на аснове праграмы на мінулым тыдні і той, які мы толькі што бачылі ўрывак з, 682 00:35:39,240 --> 00:35:46,590 ўсярэдзіне фрэйма свопу, або свопу Латок, гэта тое, што зменныя? 683 00:35:46,590 --> 00:35:47,970 Ну, а, б. 684 00:35:47,970 --> 00:35:51,850 Таму што тыя былі свае мясцовыя аргументы, а таксама трэці, TMP. 685 00:35:51,850 --> 00:35:54,470 Так на самай справе, я мог бы звярнуць на гэта трохі больш акуратна. 686 00:35:54,470 --> 00:35:56,680 Дазвольце мне пайсці далей і адмяніць этыкетцы. 687 00:35:56,680 --> 00:35:58,520 І дазвольце мне сцвярджаць, што вы ведаеце, што? 688 00:35:58,520 --> 00:36:00,560 >> , Верагодна, будзе ў канчатковым выніку тут. 689 00:36:00,560 --> 00:36:02,160 B скончыцца тут. 690 00:36:02,160 --> 00:36:03,810 І TMP скончыцца тут. 691 00:36:03,810 --> 00:36:05,160 Цяпер, упарадкаванне можа будзе трохі адрознівацца. 692 00:36:05,160 --> 00:36:06,840 Але канцэптуальна гэта ідэя. 693 00:36:06,840 --> 00:36:11,490 >> І толькі калектыўна, гэта тое, што мы будзем называць кадр свопу, або 694 00:36:11,490 --> 00:36:12,136 сталовай латок. 695 00:36:12,136 --> 00:36:13,150 І тое ж самае справу з асноўным. 696 00:36:13,150 --> 00:36:14,040 Але я не буду, што перамаляваць. 697 00:36:14,040 --> 00:36:17,810 Але вось дзе і ARGC ARGV і любыя сваіх лакальных зменных, як х і ў 698 00:36:17,810 --> 00:36:18,940 можа быць таксама. 699 00:36:18,940 --> 00:36:22,170 >> Такім чынам, цяпер разгледзім, што адбываецца на самай справе пры выкліку swap. 700 00:36:22,170 --> 00:36:26,370 Пры выкліку своп, як выкананне кода гэта, вы перадаеце, у 701 00:36:26,370 --> 00:36:30,670 версію з памылкамі, а і б таксама копіі х і у. 702 00:36:30,670 --> 00:36:34,300 Таму, калі я цяпер раблю такі на экране - 703 00:36:34,300 --> 00:36:36,700 павінен лепш на гэта - 704 00:36:36,700 --> 00:36:40,850 так што гісторыя, якую я распавядаў пра сябе быў у гэтай версіі багі, калі мы 705 00:36:40,850 --> 00:36:46,130 патэлефануеце памяняць які праходзіць у літаральным А і В як цэлыя лікі, што на самой справе адбываецца? 706 00:36:46,130 --> 00:36:48,250 >> Ну, тое, што адбываецца на самай справе складаецца ў наступным. 707 00:36:48,250 --> 00:36:52,850 Дазвольце мне ісці наперад і проста адмяніць растлумачыць некаторыя месцы тут. 708 00:36:52,850 --> 00:36:54,720 Так што гэта мая памяць кампутара. 709 00:36:54,720 --> 00:36:57,510 >> Так што, калі ў мяне, напрыклад, - 710 00:36:57,510 --> 00:36:58,910 на самай справе давайце зробім гэта такім чынам - 711 00:36:58,910 --> 00:37:02,690 Калі я сцвярджаю, што гэта X, захоўвання значэнне 1, як і на мінулым тыдні. 712 00:37:02,690 --> 00:37:05,930 І гэта ў, захоўвання значэнні 2 так жа, як на мінулым тыдні. 713 00:37:05,930 --> 00:37:11,370 І гэта з'яўляецца галоўным, калі я тэлефаную свопу, тым самым даючы сабе доступ да і 714 00:37:11,370 --> 00:37:15,150 B і TMP, я збіраюся сцвярджаць, што гэта і гэта 1. 715 00:37:15,150 --> 00:37:16,080 >> Гэта б. 716 00:37:16,080 --> 00:37:17,010 Гэта два. 717 00:37:17,010 --> 00:37:18,370 Гэта называецца TMP. 718 00:37:18,370 --> 00:37:23,360 >> А першапачаткова, яна мае некаторыя смецця значэнне пакуль я фактычна не захоўваеце ў ім, 719 00:37:23,360 --> 00:37:24,450 якой роўная 1. 720 00:37:24,450 --> 00:37:28,320 Тады я іду наперад і змяніць тое, што? 721 00:37:28,320 --> 00:37:29,720 Б значэння. 722 00:37:29,720 --> 00:37:31,980 >> І вось зараз у мяне ёсць два тут. 723 00:37:31,980 --> 00:37:34,050 І тады мы сказалі б атрымлівае TMP. 724 00:37:34,050 --> 00:37:37,670 Зноў жа, як і санітарнай праверкі, трэці радок кода тут проста гэта 725 00:37:37,670 --> 00:37:39,440 Адзін з іх, B атрымлівае TMP. 726 00:37:39,440 --> 00:37:41,730 >> І вось, нарэшце, што мне рабіць? 727 00:37:41,730 --> 00:37:46,800 Я іду наперад і змяніць б быць усё, што Значэнне TMP з'яўляецца, што 1. 728 00:37:46,800 --> 00:37:48,390 Я не дакранаюся TMP зноў. 729 00:37:48,390 --> 00:37:54,100 >> Але цяпер, праблема ў тым, як толькі своп вяртаецца, таму што гэта не ўручаць 730 00:37:54,100 --> 00:37:57,540 вярнуць частку кошту, няма вяртання каманда відавочна ў ім. 731 00:37:57,540 --> 00:37:59,080 Што на самай справе адбываецца? 732 00:37:59,080 --> 00:38:03,480 Ну, па сутнасці, уся гэтая памяць - 733 00:38:03,480 --> 00:38:07,410 ОК, па-відаць любіць гумка толькі адзін палец за адзін раз - 734 00:38:07,410 --> 00:38:08,180 проста знікае. 735 00:38:08,180 --> 00:38:10,070 >> Зараз на самай справе гэта не нікуды не дзенешся. 736 00:38:10,070 --> 00:38:11,810 Але вы можаце думаць пра гэта Цяпер ў выглядзе знакаў пытання. 737 00:38:11,810 --> 00:38:14,040 Таму што гэта ўжо не фактычна выкарыстоўваецца. 738 00:38:14,040 --> 00:38:17,470 І нічога не робіцца з гэтымі значэннямі. 739 00:38:17,470 --> 00:38:21,920 >> Такім чынам, у выпадку з зялёным версіі гэты код, а не тое, што ў цяперашні час 740 00:38:21,920 --> 00:38:24,640 перайшла ў своп? 741 00:38:24,640 --> 00:38:25,770 Так адрасы. 742 00:38:25,770 --> 00:38:28,520 Такім чынам, адрас х і адрас у. 743 00:38:28,520 --> 00:38:35,790 Таму, калі мы пераказаць гэтую гісторыю адзін апошні час, і я на самой справе зрабіць своп зноў, 744 00:38:35,790 --> 00:38:44,620 але з паказальнікамі, што з'яўляецца, гэта быццё B, і гэты які з'яўляецца TMP, што 745 00:38:44,620 --> 00:38:49,080 на самай справе захоўваецца ў у гэтым зялёным версія майго кода, дзе я перадаю 746 00:38:49,080 --> 00:38:52,110 у адрасах? 747 00:38:52,110 --> 00:38:53,780 >> Гэта збіраецца быць паказальнікам на х. 748 00:38:53,780 --> 00:38:54,890 Так што я мог намаляваць стрэлку. 749 00:38:54,890 --> 00:38:57,310 Але давайце выкарыстоўваць той жа адвольны Напрыклад, як раней. 750 00:38:57,310 --> 00:39:01,220 Давайце казаць, што гэта нешта накшталт Ox123. 751 00:39:01,220 --> 00:39:04,970 І гэта будзе, таму што Ox127 гэта чатыры байта далёка, таму што гэта 752 00:39:04,970 --> 00:39:07,370 Інтэлект, такім Ox127. 753 00:39:07,370 --> 00:39:09,080 >> І зноў жа, я бяру некаторыя вольнасці з нумарамі. 754 00:39:09,080 --> 00:39:11,430 Яны нашмат менш, чым яны былі б сапраўды можа быць і ў іншым парадку. 755 00:39:11,430 --> 00:39:14,350 Але гэта, як карціна Зараз іншае. 756 00:39:14,350 --> 00:39:19,060 >> Але калі я выкарыстоўваю гэтую зялёную код і я дзесятковага TMP атрымаць *. 757 00:39:19,060 --> 00:39:25,010 * Сродак зрабіць наступнае, вазьмі -Адрас, у і ісці да яе, 758 00:39:25,010 --> 00:39:26,190 якой роўная 1. 759 00:39:26,190 --> 00:39:28,480 І вось што я пасля гэтага пакласці ў TMP. 760 00:39:28,480 --> 00:39:32,480 Між тым, у наступным радку кода Тут * атрымлівае B, што гэта значыць? 761 00:39:32,480 --> 00:39:36,910 >> Ну, *, так што ісці тут атрымлівае * B, што азначае пайсці туды. 762 00:39:36,910 --> 00:39:39,310 А гэта значыць, паставіць значэнне там. 763 00:39:39,310 --> 00:39:43,670 Нарэшце, апошняя радок кода проста сказаў * B атрымлівае TMP. 764 00:39:43,670 --> 00:39:48,900 >> Так Б кажа пайсці туды і перазапісаць яго з TMP, які ў гэтым выпадку будзе 765 00:39:48,900 --> 00:39:51,520 быць зноў 1. 766 00:39:51,520 --> 00:39:54,920 І вось чаму зялёная версія Нашы працы кода, у той час як чырвоныя 767 00:39:54,920 --> 00:39:56,010 версія ніколі не рабіў. 768 00:39:56,010 --> 00:39:59,020 Усё гэта проста зводзіцца да таго, памяць кіруецца і, дзе гэта 769 00:39:59,020 --> 00:40:02,580 фактычна размешчаных у вашай аператыўнай памяці кампутара. 770 00:40:02,580 --> 00:40:07,270 І на дадзены момант, гэта адна з рэчаў, што стэк выкарыстоўваецца для. 771 00:40:07,270 --> 00:40:09,225 >> Пытанні па фармаце? 772 00:40:09,225 --> 00:40:10,380 На паказальнікі? 773 00:40:10,380 --> 00:40:11,630 Або на своп? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Добра, Malloc, нагадаем, зрабіў нешта накшталт гэтага. 776 00:40:17,043 --> 00:40:18,260 Гэта было вельмі просты прыклад. 777 00:40:18,260 --> 00:40:20,550 І гэта быў той, які Binky прадставіў нас, хоць і даволі 778 00:40:20,550 --> 00:40:21,870 хутка, у канцы класе. 779 00:40:21,870 --> 00:40:24,480 Чорт вазьмі, там мы ідзем зноў. 780 00:40:24,480 --> 00:40:28,780 >> Такім чынам нагадаць, што гэта быў прыклад Бинки прадставіў нас, хоць і 781 00:40:28,780 --> 00:40:30,360 некалькі хутчэй у канцы класе. 782 00:40:30,360 --> 00:40:33,640 І тут мы выкарыстоўвалі сапраўды Malloc ў другі раз. 783 00:40:33,640 --> 00:40:37,330 Таму што першы раз, калі мы выкарыстоўвалі яго для стварыць дастатковы аб'ём аператыўнай памяці, вылучыць дастатковы аб'ём аператыўнай памяці 784 00:40:37,330 --> 00:40:38,340 для захоўвання радка. 785 00:40:38,340 --> 00:40:40,250 >> На гэты раз Binky трымалі яго простым. 786 00:40:40,250 --> 00:40:42,465 Так што гэта толькі для захоўвання Інтэлект, па-відаць. 787 00:40:42,465 --> 00:40:43,510 І гэта цалкам нармальна. 788 00:40:43,510 --> 00:40:46,560 Гэта крыху дзіўна, шчыра кажучы, для выкарыстоўваць Malloc вылучыць адну Int. 789 00:40:46,560 --> 00:40:50,650 Але сутнасць Claymation Ніка была на самай справе проста распавесці гісторыю пра тое, што 790 00:40:50,650 --> 00:40:53,830 адбываецца ці не адбываецца пры Вы дрэнна звяртацца з памяццю. 791 00:40:53,830 --> 00:40:56,520 >> Такім чынам, у гэтым выпадку гэтая праграма зрабіў некалькі рэчаў. 792 00:40:56,520 --> 00:41:01,580 У першым выпадку тут, ён аб'яўляе паказальнік на X называецца Int. 793 00:41:01,580 --> 00:41:04,480 Затым ён аб'яўляе паказальнік называецца г да Int. 794 00:41:04,480 --> 00:41:06,150 Затым ён захоўвае ў X, то якія? 795 00:41:06,150 --> 00:41:07,110 Нехта зараз. 796 00:41:07,110 --> 00:41:09,685 Што захоўваецца ў X у адпаведнасці з Трэцяя радок гэтай праграмы? 797 00:41:09,685 --> 00:41:12,380 >> АЎДЫТОРЫЯ: [неразборліва]. 798 00:41:12,380 --> 00:41:14,130 >> Выступоўца 1: Ну, не зусім байт, за, кажуць. 799 00:41:14,130 --> 00:41:16,760 Дакладней цяпер. 800 00:41:16,760 --> 00:41:18,325 Што захоўваецца ў X? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Адрас, я думаю, што я чуў. 803 00:41:22,060 --> 00:41:23,570 >> Такім чынам, што ж Malloc вярнуцца? 804 00:41:23,570 --> 00:41:26,030 Malloc паводніцкіх вылучае кавалак памяці. 805 00:41:26,030 --> 00:41:27,850 Але як гэта дасць вам доступ да яго? 806 00:41:27,850 --> 00:41:29,460 Яна вяртае што? 807 00:41:29,460 --> 00:41:32,000 Адрас першага байта у блок памяці. 808 00:41:32,000 --> 00:41:33,020 >> Цяпер, гэта супер проста. 809 00:41:33,020 --> 00:41:35,380 Гэта ўсяго толькі адзін байт, што азначае, рашэння мы вяртаемся з'яўляецца 810 00:41:35,380 --> 00:41:37,300 адрас цалкам. 811 00:41:37,300 --> 00:41:42,070 Так што захоўваць у х, то, гэта адрас гэтага блока памяці. 812 00:41:42,070 --> 00:41:43,400 Між тым, што адбываецца далей? 813 00:41:43,400 --> 00:41:45,890 Таму на самай справе, давайце ісці наперад і адзначыць гэта вельмі хутка. 814 00:41:45,890 --> 00:41:52,490 >> Так што калі мы ідзем да экрана тут і мы гуляем на гэта дзесятковага * X і Y дзесятковага * 815 00:41:52,490 --> 00:41:53,740 збіраецца рабіць тое, што для мяне? 816 00:41:53,740 --> 00:41:58,280 Я сцвярджаю, што гэта толькі збіраецца зрабіць нешта накшталт гэтага і назавем яго X, і 817 00:41:58,280 --> 00:42:00,010 гэта і называюць яго у. 818 00:42:00,010 --> 00:42:03,110 Між тым, у трэцяй радку кода збіраецца вылучыць памер Інтэлект, 819 00:42:03,110 --> 00:42:06,160 які, аказваецца, - шкада, калі я сказаў, аднаго да Я меў на ўвазе адну Int - 820 00:42:06,160 --> 00:42:08,280 чатыры байта на тыповым кампутары. 821 00:42:08,280 --> 00:42:09,720 Па крайняй меры, з CS50 прыбора. 822 00:42:09,720 --> 00:42:11,490 >> Так што гэта збіраецца вылучыць ён, хто ведае? 823 00:42:11,490 --> 00:42:12,800 Дзе-то тут. 824 00:42:12,800 --> 00:42:15,780 І гэта захоўваецца на некаторай Адрас Ox, хто ведае? 825 00:42:15,780 --> 00:42:18,330 Але тое, што збіраецца атрымаць вярнуўся у тым, што адрасы. 826 00:42:18,330 --> 00:42:22,270 Але мы будзем маляваць гэтым наглядна як толькі стрэлка падобнае. 827 00:42:22,270 --> 00:42:25,430 >> Зараз у наступным радку * X атрымлівае 42. 828 00:42:25,430 --> 00:42:29,400 Што азначае х * з пункту гледжання непрафесіяналы? 829 00:42:29,400 --> 00:42:30,040 Проста ідзеце туды. 830 00:42:30,040 --> 00:42:30,960 Перайсці на гэты адрас. 831 00:42:30,960 --> 00:42:35,900 Ці, іншымі словамі, прытрымлівайцеся стрэлкамі і пакласці 42 там. 832 00:42:35,900 --> 00:42:38,140 Але потым здарылася нешта дрэннае да Бинки, ці не так? 833 00:42:38,140 --> 00:42:43,950 >> Нагадаем, што лінія тут пяць, * Y атрымлівае 13, сапраўды нешчаслівым лікам, 834 00:42:43,950 --> 00:42:44,760 зрабіў тое, што для нас? 835 00:42:44,760 --> 00:42:47,320 Ну, у * сродкі ідуць туды. 836 00:42:47,320 --> 00:42:50,460 Ну, гэта не было дадзена Значэнне ж, ці не так? 837 00:42:50,460 --> 00:42:54,090 Код не можа ў быцця ініцыялізаваць ні да чаго. 838 00:42:54,090 --> 00:42:56,120 Мы х ініцыялізацыі ў адрас. 839 00:42:56,120 --> 00:42:57,640 Але ў быў абвешчаны наверсе. 840 00:42:57,640 --> 00:43:00,250 Але тое кропка з коскі, ніякай каштоўнасці быў на самай справе пакласці ў яго. 841 00:43:00,250 --> 00:43:02,330 Так што гэта справядліва назваць гэты смецце значэння. 842 00:43:02,330 --> 00:43:03,430 Хто ведае, што там? 843 00:43:03,430 --> 00:43:07,160 Гэта рэшткі біты, якія былі выкарыстаныя некаторымі папярэднімі радок кода ў 844 00:43:07,160 --> 00:43:08,300 маёй праграме. 845 00:43:08,300 --> 00:43:13,250 >> Так што, калі я кажу, ідуць там, гэта як, Я паняцця не маю, дзе гэтая стрэлка 846 00:43:13,250 --> 00:43:14,490 будзе ў канчатковым выніку. 847 00:43:14,490 --> 00:43:17,720 І вось, калі вы звычайна атрымаеце памылку сегментацыі. 848 00:43:17,720 --> 00:43:22,430 Калі вы выпадкова разнаймення, так кажуць, або перайдзіце на адрас, які ня 849 00:43:22,430 --> 00:43:25,400 на самай справе законны адрас, дрэнныя рэчы здараюцца. 850 00:43:25,400 --> 00:43:27,550 >> І гэта менавіта тое, што адбылося думаць Бинки. 851 00:43:27,550 --> 00:43:31,060 Таму нагадаем, што гісторыя, якую Нік быў кажу тут была тая ж ідэя, што 852 00:43:31,060 --> 00:43:34,050 Я намаляваў з ілюзіяй мелам на дошцы там. 853 00:43:34,050 --> 00:43:35,960 X і Y былі абвешчаныя. 854 00:43:35,960 --> 00:43:39,690 >> Затым выдзелена памер Цэлалікавых і захоўваць яго ў х. 855 00:43:39,690 --> 00:43:42,130 А ў наступным радку мы зрабілі * х. 856 00:43:42,130 --> 00:43:46,070 Гэта была чароўная палачка Ніка разнаймення. 857 00:43:46,070 --> 00:43:49,780 Пасля гэтага ўсе 42 у памяці паказаў на х. 858 00:43:49,780 --> 00:43:51,600 >> Але гэта тое, дзе рэчы пайшло жудасна няправільна. 859 00:43:51,600 --> 00:43:51,820 Дакладна? 860 00:43:51,820 --> 00:43:53,550 Мы паспрабавалі разнаймення у. 861 00:43:53,550 --> 00:43:55,620 Але ў некаторых было няправільнае значэнне, ці не так? 862 00:43:55,620 --> 00:43:57,720 >> Гэта стрэлку ў левым ніжнім куток, не 863 00:43:57,720 --> 00:43:58,950 паказваючы на ​​самай справе ні да чаго. 864 00:43:58,950 --> 00:44:01,520 Гэта накшталт таго, што я раблю зрабіў тут на дошцы. 865 00:44:01,520 --> 00:44:05,900 Так што дрэнныя рэчы здараюцца, сегментацыя віна, або Binky віна, у гэтым выпадку. 866 00:44:05,900 --> 00:44:10,800 >> Але калі мы затым выправіць, што, робячы х атрымлівае ў як жа гісторыя зменаў? 867 00:44:10,800 --> 00:44:15,760 Ну, калі я раблю X атрымлівае Y, гэта фактычна тое ж самае, як кажуць 868 00:44:15,760 --> 00:44:19,235 б гэта ні было, нешта Ox- будзе тое ж самае тут, 869 00:44:19,235 --> 00:44:20,080 Ox-то. 870 00:44:20,080 --> 00:44:22,970 Ці вобразна мы будзем маляваць стрэлкі. 871 00:44:22,970 --> 00:44:25,530 >> Дык вось на дошцы з Бинки, з наступнага радка з 872 00:44:25,530 --> 00:44:28,350 кода, * У азначае пайсці туды. 873 00:44:28,350 --> 00:44:29,400 Дзе там? 874 00:44:29,400 --> 00:44:30,820 Гэта значыць, тут. 875 00:44:30,820 --> 00:44:36,050 >> І калі мы абнаўляем, што быць 13 ён проста залучае рух і 876 00:44:36,050 --> 00:44:39,470 напісанне 13 тут і цяпер. 877 00:44:39,470 --> 00:44:44,130 Таму, магчыма, не цалкам простая на першы погляд. 878 00:44:44,130 --> 00:44:47,740 Але каб успомніць і выкарыстоўваць той жа жаргон Бинки, што выкарыстаў тут, так што 879 00:44:47,740 --> 00:44:50,485 Першыя дзве вылучыць паказальнікі х і у, але не pointees. 880 00:44:50,485 --> 00:44:54,750 І не pointees як правіла, выкарыстоўваецца тэрмін. 881 00:44:54,750 --> 00:44:56,120 Але паказальнік зусім. 882 00:44:56,120 --> 00:44:59,200 Але гэта тое, што на які паказвае У наменклатуры на Бинки. 883 00:44:59,200 --> 00:45:01,660 >> У наступным радку, вядома, вылучае цэлалікавай pointee. 884 00:45:01,660 --> 00:45:04,840 Так што частка памяці - як я прыцягнуў больш за на Правая частка там - і набор 885 00:45:04,840 --> 00:45:06,470 х роўна кропцы да яго. 886 00:45:06,470 --> 00:45:11,350 Гэта разыменовывает х для захоўвання 42 у памяці, якія ён паказвае ў. 887 00:45:11,350 --> 00:45:13,380 І тады гэта, вядома, было дрэнна. 888 00:45:13,380 --> 00:45:15,600 Таму што у не паказваючы нічога яшчэ. 889 00:45:15,600 --> 00:45:16,530 Гэта фіксуе гэта. 890 00:45:16,530 --> 00:45:18,240 Так што гэта яшчэ багі праграмы. 891 00:45:18,240 --> 00:45:21,580 Проста таму, што мы, што дзьме праз код радок за радком і кажуць, ды добра, 892 00:45:21,580 --> 00:45:22,690 хай гэта крах там. 893 00:45:22,690 --> 00:45:23,420 Гэта дрэнная рэч. 894 00:45:23,420 --> 00:45:26,790 Рознагалоссі праграма проста будзе перапыніць наогул на гэты радок. 895 00:45:26,790 --> 00:45:30,550 Але калі вы выдалілі разбіўся лініі і замяніць яго з апошнімі двума 896 00:45:30,550 --> 00:45:32,470 лініі ёсць вы прызначаеце - 897 00:45:32,470 --> 00:45:35,310 выкарыстаннем прысвойвання паказальніка - Y каб яна паказвала на X як кропка т. 898 00:45:35,310 --> 00:45:39,280 І тады вы разнаймення у ў вельмі бяспечны спосаб. 899 00:45:39,280 --> 00:45:41,520 >> Дык дзе ж гэта нам дае? 900 00:45:41,520 --> 00:45:45,350 Ну, атрымліваецца, што пад капотам CS50 ў бібліятэцы, паказальнікі 901 00:45:45,350 --> 00:45:46,320 выкарыстоўваюцца ва ўсім. 902 00:45:46,320 --> 00:45:48,910 І мы на самай справе пачаць чысціць таму, што пласт у хуткім часе. 903 00:45:48,910 --> 00:45:51,740 Але аказваецца, таксама выраз, Некаторыя з вас могуць быць знаёмыя з, 904 00:45:51,740 --> 00:45:54,580 асабліва больш камфортным, на самай справе, што з вельмі папулярнай 905 00:45:54,580 --> 00:45:56,390 вэб-сайт, або перапаўненне стэка, у гэтыя дні. 906 00:45:56,390 --> 00:45:58,720 >> Але гэта на самай справе мае вельмі тэхнічнае значэнне. 907 00:45:58,720 --> 00:46:00,160 Цяпер мы ведаем, што стэк. 908 00:46:00,160 --> 00:46:02,550 Гэта як чаркі латкоў Усярэдзіне сталовай. 909 00:46:02,550 --> 00:46:05,140 >> Або ўнутры вашага кампутара сваёй памяці тыя кадры 910 00:46:05,140 --> 00:46:06,900 , Якія выкарыстоўваюцца функцый. 911 00:46:06,900 --> 00:46:10,760 Ну, атрымліваецца, што з-за таго, што вельмі просты рэалізацыі 912 00:46:10,760 --> 00:46:14,970 памяць і кадраў на так званым стэк, вы можаце ўзяць пад свой кантроль 913 00:46:14,970 --> 00:46:17,050 вылічальнай сістэмы даволі лёгка. 914 00:46:17,050 --> 00:46:22,180 Вы можаце ўзламаць сістэмы, калі людзі як мы не напісалі наш код 915 00:46:22,180 --> 00:46:23,300 асабліва добра. 916 00:46:23,300 --> 00:46:26,670 >> Калі такія людзі, як нам выкарыстоўваць кавалкі памяці або выкарыстоўваць масівы - 917 00:46:26,670 --> 00:46:27,810 Яшчэ часцей - 918 00:46:27,810 --> 00:46:31,800 але часам забудзьцеся праверыць Межы нашага масіва, як Вы маглі 919 00:46:31,800 --> 00:46:38,470 у сябе часам, і паўторным занадта далёка за межы масіва. 920 00:46:38,470 --> 00:46:40,520 У лепшым выпадку, ваша праграма можа проста пацярпець крах. 921 00:46:40,520 --> 00:46:42,280 Памылка сегментацыі, добры няёмка. 922 00:46:42,280 --> 00:46:45,480 Ня выдатны, але гэта не абавязкова вельмі дрэнна. 923 00:46:45,480 --> 00:46:49,480 >> Але калі ваша праграма на самай справе на рэальным кампутарах карыстальнікаў, калі ён працуе 924 00:46:49,480 --> 00:46:53,070 на сайт, які фактычна выпадковыя людзі ў інтэрнэце б'юць, дазваляючы 925 00:46:53,070 --> 00:46:56,690 людзі ініцыююць дрэнныя рэчы на ​​ваш код як правіла, не вельмі добра, паколькі 926 00:46:56,690 --> 00:46:59,930 гэта азначае, што магчымасць прыняць кантроль над кампутарам. 927 00:46:59,930 --> 00:47:01,350 І гэта будзе выглядаць трохі загадкавым. 928 00:47:01,350 --> 00:47:04,570 Але я думаў, што я з вас палохаць апошні прыклад. 929 00:47:04,570 --> 00:47:05,650 >> Вось прыклад кода. 930 00:47:05,650 --> 00:47:07,370 І ёсць добры Вікіпедыі артыкул, якая ідзе праз 931 00:47:07,370 --> 00:47:08,530 гэта больш падрабязна. 932 00:47:08,530 --> 00:47:13,890 У мяне ёсць асноўная на ніжняй пакліканне Foo, перадаючы агду 1. 933 00:47:13,890 --> 00:47:15,750 І гэта менавіта так, што вы можаце запусціць праграму і прайсці 934 00:47:15,750 --> 00:47:17,080 адвольны ўвод. 935 00:47:17,080 --> 00:47:20,180 >> А потым Foo абвешчаны наверсе як прыняцце радком, або больш 936 00:47:20,180 --> 00:47:21,700 Дакладней, сімвал *. 937 00:47:21,700 --> 00:47:23,860 Затым ён аб'яўляе масіў знакаў. 938 00:47:23,860 --> 00:47:27,130 Назавем гэта буфер, у цэлым, памер 12. 939 00:47:27,130 --> 00:47:30,900 Так 12 знакаў можа змясціцца ўнутры гэтага масіва называецца C. 940 00:47:30,900 --> 00:47:33,510 >> І тады ён выкарыстоўвае гэтую новую функцыю, , Якое з'яўляецца новым, але не цяжка 941 00:47:33,510 --> 00:47:34,930 разумею, памяць копію. 942 00:47:34,930 --> 00:47:39,290 Ён капіюе памяць, з бара, які быў пераменная н мінулым, незалежна ад 943 00:47:39,290 --> 00:47:42,080 карыстач увёў у ARGV 1 у с. 944 00:47:42,080 --> 00:47:43,090 Колькі байтаў? 945 00:47:43,090 --> 00:47:44,260 Даўжыня радкі з бара. 946 00:47:44,260 --> 00:47:48,380 >> Такім чынам, іншымі словамі, калі карыстальнік ўводзіць ч-е-л-л-о Enter, даўжыня радка 947 00:47:48,380 --> 00:47:49,260 прывітанне з раўняецца пяці. 948 00:47:49,260 --> 00:47:52,790 Так што пяць з гэтых байт збіраецца атрымаць капіюецца ў масіў з імем С, што 949 00:47:52,790 --> 00:47:54,110 мае памер 12. 950 00:47:54,110 --> 00:47:58,710 Але тое, што карыстальнік ўводзіць у значна даўжэй слова, якое 13 сімвалаў ці 14 951 00:47:58,710 --> 00:48:01,250 знакаў або 100 знакаў ці больш? 952 00:48:01,250 --> 00:48:02,660 >> Дзе яны будуць ісці? 953 00:48:02,660 --> 00:48:06,090 Ну, гэта кадр, то гэты латок У сталовай стэку, 954 00:48:06,090 --> 00:48:06,930 яны збіраюцца, каб пайсці туды. 955 00:48:06,930 --> 00:48:10,080 І гэта толькі збіраецца пачаць перазапіс іншыя рэчы, якія ўжо 956 00:48:10,080 --> 00:48:12,880 ў стэк, перапоўненыя стэк, так бы мовіць. 957 00:48:12,880 --> 00:48:14,780 >> Так графічна, думаць пра гэта такім чынам. 958 00:48:14,780 --> 00:48:17,970 Гэта ўсяго толькі маляўнічая версія карціну мы малюю. 959 00:48:17,970 --> 00:48:20,060 У ніжняй частцы, скажам, з'яўляецца асноўным. 960 00:48:20,060 --> 00:48:24,690 І на вяршыні, што вы бачыце зараз ў кадры колерам цяпер, 961 00:48:24,690 --> 00:48:26,090 Функцыя называецца Foo. 962 00:48:26,090 --> 00:48:30,170 Але што цікава, вось пра Foo з'яўляецца тое, што вось яго рамкі. 963 00:48:30,170 --> 00:48:32,860 Так ён малюецца гэтак жа, як я зрабіў, але ў светла-блакітных. 964 00:48:32,860 --> 00:48:35,220 А цяпер гэта, дзе З кранштэйнам 0 ідзе. 965 00:48:35,220 --> 00:48:37,410 І гэта дзе з кранштэйнам 11 будзе ў канчатковым выніку. 966 00:48:37,410 --> 00:48:39,670 >> Іншымі словамі, гэта здараецца быць прадстаўлены ў выглядзе квадрата. 967 00:48:39,670 --> 00:48:42,320 Але калі вы проста трымаць шлёп байт ўніз - або сімвалы - яны збіраюцца ў канец 968 00:48:42,320 --> 00:48:46,070 па месцы знаходжання да 0 усё, аж да да 11, таму што гэта 0 індэксавацца. 969 00:48:46,070 --> 00:48:49,170 >> Але дзе ж 13. Характару будзе ў канчатковым выніку? 970 00:48:49,170 --> 00:48:50,310 Дзе 14-й? 971 00:48:50,310 --> 00:48:52,430 Дзе 50-й сімвал будзе ў канчатковым выніку? 972 00:48:52,430 --> 00:48:54,070 >> Гэта будзе працягваць ісці ўніз. 973 00:48:54,070 --> 00:48:57,350 Таму што нават калі мы намалявалі карцінкі з стэк рос, 974 00:48:57,350 --> 00:48:59,920 адрасы, аказваецца, ідуць ад невялікі адрасы, невялікія 975 00:48:59,920 --> 00:49:01,830 паказальнікаў, на вялікі адрасоў. 976 00:49:01,830 --> 00:49:03,540 Так што проста працягвае ісці ўверх і ўверх. 977 00:49:03,540 --> 00:49:05,660 >> Такім чынам, калі карыстальнік ўводзіць прывітанне, гэта выдатна. 978 00:49:05,660 --> 00:49:08,650 Не памылка, не праблема, бяспечнай для ўсіх. 979 00:49:08,650 --> 00:49:11,940 Але калі карыстальнік ўводзіць у тым, што мы будзем называюць спаборнасць код, намаляваны 980 00:49:11,940 --> 00:49:16,040 увогуле як, атака, атака, атака, атака, што можа адбыцца? 981 00:49:16,040 --> 00:49:19,760 >> Добра, калі ўсе ўваходныя што карыстач набраў у гэта не проста сяброўскі 982 00:49:19,760 --> 00:49:21,540 або абразлівыя радкі знакаў. 983 00:49:21,540 --> 00:49:24,050 На самай справе гэта паслядоўнасць сімвалаў што калі ён быў скампіляваны, 984 00:49:24,050 --> 00:49:26,050 на самай справе гэта код. 985 00:49:26,050 --> 00:49:29,570 Можа быць, гэта код, які выдаляе ўсе файлы на вашым цвёрдым дыску або рассылае спам 986 00:49:29,570 --> 00:49:30,810 ці нешта накшталт гэтага. 987 00:49:30,810 --> 00:49:35,110 Звярніце ўвагу, што тое, што ключавым тут з'яўляецца тое, што Калі дрэнны хлопец пашанцавала дастаткова, каб 988 00:49:35,110 --> 00:49:37,830 перазапісаць чырвоным кавалак памяці - 989 00:49:37,830 --> 00:49:41,080 якія я не абапірацца на маю карціну, але гэтая карціна Вікіпедыі тут ёсць - 990 00:49:41,080 --> 00:49:42,890 яго так званы зваротны адрас. 991 00:49:42,890 --> 00:49:47,470 >> Калі ежа вяртаецца, калі вяртаецца абмен, якім кампутарам ведаць, каб перайсці ад 992 00:49:47,470 --> 00:49:49,790 сюды, каб тут? 993 00:49:49,790 --> 00:49:52,920 Ці ў тэхнічным сегменце наверсе, як ён ведае, каб перайсці ад свопу 994 00:49:52,920 --> 00:49:54,870 код - 0 і 1 у , Якія складаюць своп - 995 00:49:54,870 --> 00:49:56,020 Вярнуцца на галоўную? 996 00:49:56,020 --> 00:50:00,450 Там у так званым зваротным адрасам захоўваецца ў тым жа кадры стэка, на 997 00:50:00,450 --> 00:50:02,140 той жа латок кафетэрыі. 998 00:50:02,140 --> 00:50:06,080 >> Так што калі дрэнны хлопец досыць разумны, каб пакласці атакуючы код, код атакі, атакі 999 00:50:06,080 --> 00:50:07,960 код, і вам абавязкова пашанцуе дастаткова - 1000 00:50:07,960 --> 00:50:11,630 часта метадам спроб і памылак - да перазапісу, што чырвоны зваротны адрас, 1001 00:50:11,630 --> 00:50:14,360 з адрасам і апавяшчэння на самым версе. 1002 00:50:14,360 --> 00:50:16,830 Звярніце ўвагу 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Яна напісана наверсе таму для Прычыны мы, магчыма, перагледзець. 1004 00:50:20,650 --> 00:50:22,050 Гэта гэта лік. 1005 00:50:22,050 --> 00:50:25,790 >> Так што калі дрэнны хлопец атрымлівае пашанцавала ці досыць разумны, каб перазапісаць чырвоным 1006 00:50:25,790 --> 00:50:29,480 паласа памяці з адрасам код, які ён ці яна нейкім чынам 1007 00:50:29,480 --> 00:50:34,980 ўводзіцца ў кампутар, адгадайце, чые Код збіраецца быць вернутыя 1008 00:50:34,980 --> 00:50:38,260 як толькі Foo робіцца выканання? 1009 00:50:38,260 --> 00:50:39,440 >> Дрэннага хлопца кода. 1010 00:50:39,440 --> 00:50:43,610 Так што гэта шкоднасны код, AAA, зноў жа, можа рассылаць спам, можа выдаліць усе файлы 1011 00:50:43,610 --> 00:50:44,500 на вашым цвёрдым дыску. 1012 00:50:44,500 --> 00:50:48,740 Але гэта тое, што сапраўды перапаўненне стэка ёсць, ці перапаўненне буфера або 1013 00:50:48,740 --> 00:50:51,060 перапаўнення буфера атакі. 1014 00:50:51,060 --> 00:50:54,400 >> І гэта неверагодна, неверагодна часта па гэтай дзень з праграмамі, напісанымі на 1015 00:50:54,400 --> 00:50:58,220 C, C + +, і нават некаторыя іншыя мовы. 1016 00:50:58,220 --> 00:51:02,275 У той страшны ўвагу, мы заканчвацца жарты. 1017 00:51:02,275 --> 00:51:03,230 >> [Смяецца] 1018 00:51:03,230 --> 00:51:04,550 >> Убачымся ў сераду. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 На наступным CS50 - 1021 00:51:10,310 --> 00:51:15,920 Так што я ўвесь вольны дыскавая лямпаў сёння, але пачакай, абястлушчанага малака, палова тэлефонаў 1022 00:51:15,920 --> 00:51:17,850 Кніга, апельсінавы сок што я піў сёння. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 USB кабель, гаечным ключом. 1025 00:51:22,780 --> 00:51:24,800 >> [Музыка Прайграванне]