1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Гуляе музыка] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> Даг Lloyd: Добра, такім чынам прапанову перад пачаткам тут. 5 00:00:07,940 --> 00:00:11,660 Калі вы не глядзелі відэа на паказальнікі вы можаце зрабіць так у першую чаргу. 6 00:00:11,660 --> 00:00:15,860 Таму што гэта відэа з'яўляецца яшчэ адным спосаб працы з паказальнікамі. 7 00:00:15,860 --> 00:00:17,574 >> Такім чынам, гэта будзе казаць аб некаторых паняццяў 8 00:00:17,574 --> 00:00:19,490 што мы разгледзім у Паказальнікі відэа, і мы 9 00:00:19,490 --> 00:00:21,948 збіраецца замоўчваць іх цяпер, мяркуючы, што яны ўжо 10 00:00:21,948 --> 00:00:23,090 накшталт зразумеў. 11 00:00:23,090 --> 00:00:25,440 Так што гэта проста ваш справядлівае папярэджанне што калі вы бачыце гэта відэа 12 00:00:25,440 --> 00:00:27,814 і вы яшчэ не бачылі паказальнікі відэа, гэта магло б свайго роду 13 00:00:27,814 --> 00:00:29,610 лётаць над вашай галавой няшмат. 14 00:00:29,610 --> 00:00:32,080 І так было б лепш каб паглядзець яго ў такім парадку. 15 00:00:32,080 --> 00:00:34,710 >> Такім чынам, мы ўжо бачылі адзін спосаб працы з паказальнікамі, 16 00:00:34,710 --> 00:00:37,810 што мы аб'явіць Пераменная, а затым мы 17 00:00:37,810 --> 00:00:42,160 абвясціць яшчэ адну зменную, паказальнік Пераменная, якая паказвае на яго. 18 00:00:42,160 --> 00:00:44,870 Такім чынам, мы стварылі Пераменная з імем, мы 19 00:00:44,870 --> 00:00:48,480 стварыў другую зменную з імем, і мы паказваем, што другая пераменная 20 00:00:48,480 --> 00:00:50,220 на што ў першую чаргу. 21 00:00:50,220 --> 00:00:52,370 Гэты выгляд мае Праблема, хоць, таму што гэта 22 00:00:52,370 --> 00:00:54,650 патрабуе ад нас, каб дакладна ведаць, колькі памяці мы 23 00:00:54,650 --> 00:00:57,600 спатрэбіцца ў той момант, наша праграма будзе скампіляваць. 24 00:00:57,600 --> 00:00:58,220 >> Чаму так? 25 00:00:58,220 --> 00:01:03,338 Таму што мы павінны быць у стане назваць або вызначыць усе магчымыя пераменныя 26 00:01:03,338 --> 00:01:04,129 мы маглі б сутыкнуцца. 27 00:01:04,129 --> 00:01:07,910 Мы маглі б мець масіў, што можа быць ў стане трымаць шмат інфармацыі, 28 00:01:07,910 --> 00:01:10,110 але гэта яшчэ не дакладна досыць дакладным. 29 00:01:10,110 --> 00:01:12,640 Што рабіць, калі мы не ведаем, што, калі ў нас няма ні найменшага падання 30 00:01:12,640 --> 00:01:14,370 колькі нам трэба падчас кампіляцыі? 31 00:01:14,370 --> 00:01:17,020 Ці што, калі наша праграма будзе запусціць на працягу сапраўды доўгага часу, 32 00:01:17,020 --> 00:01:19,810 прымаючы розныя карыстальніка дадзеных і мы не можам на самай справе 33 00:01:19,810 --> 00:01:23,170 ацаніць Ці мы спатрэбіцца 1000 адзінак? 34 00:01:23,170 --> 00:01:26,060 >> Гэта не тое, мы можам кажуць у камандным радку 35 00:01:26,060 --> 00:01:28,040 увядзіце колькі прадметаў Вы думаеце, што вы будзеце мець патрэбу. 36 00:01:28,040 --> 00:01:31,100 Ну што, калі гэта здагадка няслушна? 37 00:01:31,100 --> 00:01:34,300 Дынамічнае вылучэнне памяці роду дазваляе нам шлях 38 00:01:34,300 --> 00:01:36,867 каб абыйсці гэтай канкрэтнай праблемы. 39 00:01:36,867 --> 00:01:38,700 І тое, як ён гэта робіць з'яўляецца выкарыстанне паказальнікаў. 40 00:01:38,700 --> 00:01:42,140 >> Мы можам выкарыстоўваць паказальнікі на атрымаць доступ да дынамічна 41 00:01:42,140 --> 00:01:45,710 выдзеленая памяць, памяць, выдзелена ў якасці праграмы. 42 00:01:45,710 --> 00:01:48,290 Гэта не вылучаецца падчас кампіляцыі. 43 00:01:48,290 --> 00:01:51,570 Калі вы дынамічна вылучаць памяці яна зыходзіць ад басейна 44 00:01:51,570 --> 00:01:53,795 памяці вядомы як кучы. 45 00:01:53,795 --> 00:01:56,420 Раней усе мы ў памяці працуе з у ходзе 46 00:01:56,420 --> 00:01:59,920 быў зыходзячы з пула памяці вядомы як стэк. 47 00:01:59,920 --> 00:02:02,470 Добры спосаб, як правіла трымаць у mind-- і з гэтага правіла 48 00:02:02,470 --> 00:02:04,720 не заўсёды справядлівыя, але ў значнай ступені амаль 49 00:02:04,720 --> 00:02:09,940 заўсёды трымае true--, што любы раз вы даць імя зменнай яго 50 00:02:09,940 --> 00:02:12,090 верагодна, жыве ў стэку. 51 00:02:12,090 --> 00:02:14,650 І ў любы час вы не даць зменнай імя, 52 00:02:14,650 --> 00:02:19,160 якія вы можаце зрабіць з дынамічнай памяццю размеркаванне, яна жыве ў кучы. 53 00:02:19,160 --> 00:02:22,190 >> Цяпер я накшталт прадстаўлення, як гэта калі ёсць гэтыя два басейна памяці. 54 00:02:22,190 --> 00:02:24,740 Але вы, магчыма, бачылі гэта Дыяграма, якая, як правіла 55 00:02:24,740 --> 00:02:27,290 прадстаўленне тое, што памяць выглядае, 56 00:02:27,290 --> 00:02:30,373 і мы не збіраемся, каб клапаціцца пра ўсё матэрыял у верхняй і ніжняй часткі. 57 00:02:30,373 --> 00:02:33,580 Тое, што мы клапоцімся пра тое, гэтая частка ў сярэдні тут, куча і стэк. 58 00:02:33,580 --> 00:02:35,570 Як вы можаце бачыць, гледзячы на ​​гэтую дыяграму, 59 00:02:35,570 --> 00:02:38,390 гэта на самай справе не два асобныя басейны памяці. 60 00:02:38,390 --> 00:02:42,757 Гэта адна агульная пул памяці дзе вы пачынаеце ў гэта візуальная 61 00:02:42,757 --> 00:02:44,590 Вы пачынаеце ў ніжняй і пачаць запаўненне 62 00:02:44,590 --> 00:02:48,040 са дна стэка, і вы пачаць у верхняй і пачаць запаўненне 63 00:02:48,040 --> 00:02:50,072 зверху ўніз з кучы. 64 00:02:50,072 --> 00:02:51,780 Але на самой справе гэта той жа пул, гэта проста 65 00:02:51,780 --> 00:02:56,050 розныя плямы, розных месцах у памяці, якія вылучаюцца. 66 00:02:56,050 --> 00:02:59,060 І вы можаце працаваць з памяці, альбо якія маюць 67 00:02:59,060 --> 00:03:01,240 куча прайсці ўвесь шлях на дно, або 68 00:03:01,240 --> 00:03:05,440 стэк прайсці ўвесь шлях да вяршыні, або якія маюць кучу і стэк 69 00:03:05,440 --> 00:03:06,740 сустрэцца адзін з адным. 70 00:03:06,740 --> 00:03:09,500 Усе тыя, можа быць ўмовы якія выклікаюць вашу праграму 71 00:03:09,500 --> 00:03:11,030 бегчы з памяці. 72 00:03:11,030 --> 00:03:11,952 Так што майце гэта на ўвазе. 73 00:03:11,952 --> 00:03:13,660 Калі мы гаворым пра куча і стэк 74 00:03:13,660 --> 00:03:17,880 мы на самай справе гаворым пра Наогул жа кавалак памяці, проста 75 00:03:17,880 --> 00:03:21,930 розныя часткі гэтай памяці. 76 00:03:21,930 --> 00:03:24,910 >> Так як жа нам атрымаць дынамічна размеркаванай памяці ў першую чаргу? 77 00:03:24,910 --> 00:03:27,740 Як атрымаць нашу праграму памяці, як ён працуе? 78 00:03:27,740 --> 00:03:32,660 Ну З прадугледжана функцыя Таноса, памяць размеркавальнік, які 79 00:03:32,660 --> 00:03:36,810 Вы робіце выклік, і вы праходзіце ў колькі байт памяці, якія вы хочаце. 80 00:03:36,810 --> 00:03:39,940 Так што, калі ваша праграма працуе і вы хочаце цэлае выканання, 81 00:03:39,940 --> 00:03:46,040 Вы маглі б Mallock чатыры байта памяці, Таноса дужкі чатыры. 82 00:03:46,040 --> 00:03:48,540 >> Mallock будзе прайсці гледзячы праз кучу, 83 00:03:48,540 --> 00:03:50,750 таму што мы дынамічна выдзялення памяці, 84 00:03:50,750 --> 00:03:53,500 і ён вернецца да вас паказальнік на гэтую памяць. 85 00:03:53,500 --> 00:03:56,180 Гэта не дае вам, што memory-- гэта не дае яму імя, 86 00:03:56,180 --> 00:03:57,950 гэта дае вам паказальнік на яго. 87 00:03:57,950 --> 00:04:00,780 І вось чаму я зноў сказаў што важна, можа быць, 88 00:04:00,780 --> 00:04:03,770 прагледзелі відэа паказальнікі перш чым мы атрымаем занадта далёка ў гэтым. 89 00:04:03,770 --> 00:04:05,940 Так Таноса збіраецца даць вам назад паказальнік. 90 00:04:05,940 --> 00:04:08,950 >> Калі Mallock не магу даць вам якой-небудзь памяці, таму што вы запусціце з, 91 00:04:08,950 --> 00:04:10,645 гэта дасць Вам нулявы паказальнік. 92 00:04:10,645 --> 00:04:15,282 Вы памятаеце, што адбудзецца, калі мы паспрабаваць разнаймення нулявога паказальніка? 93 00:04:15,282 --> 00:04:17,019 Мы пакутуем няспраўнасць SEG, ці не так? 94 00:04:17,019 --> 00:04:18,060 Гэта, верагодна, не вельмі добра. 95 00:04:18,060 --> 00:04:21,579 >> Такім чынам, кожны раз, калі вы зрабіць званок каб Таноса вас заўсёды, заўсёды 96 00:04:21,579 --> 00:04:25,270 неабходна праверыць, ці з'яўляецца паказальнік ён даў вам назад пустым. 97 00:04:25,270 --> 00:04:28,800 Калі гэта так, вы павінны скончыць вашу праграму таму што, калі вы паспрабуеце і разнаймення 98 00:04:28,800 --> 00:04:31,360 нулявы паказальнік вы збіраецеся пакутаваць памылку сегментацыі 99 00:04:31,360 --> 00:04:34,380 і ваша праграма ўрэжацца ў любым выпадку. 100 00:04:34,380 --> 00:04:37,190 Так, як мы статычна атрымаць цэлы лік? 101 00:04:37,190 --> 00:04:37,730 >> INT х. 102 00:04:37,730 --> 00:04:40,010 Мы, верагодна, зрабілі што кучу раз, праўда? 103 00:04:40,010 --> 00:04:43,480 Гэта стварае зменную з імем х, які жыве ў стэку. 104 00:04:43,480 --> 00:04:46,190 Як мы дынамічна атрымліваем лік? 105 00:04:46,190 --> 00:04:50,010 Int зорка ПВ роўная Таноса 4. 106 00:04:50,010 --> 00:04:53,050 >> Або больш дарэчы мы б сказалі, INT зорак кропак 107 00:04:53,050 --> 00:04:57,680 роўная выдзялення памяці памер Int, проста кінуць некаторыя менш 108 00:04:57,680 --> 00:04:59,740 магічныя колькасці вакол нашай праграмы. 109 00:04:59,740 --> 00:05:04,140 Гэта будзе для нас атрымаць чатыры байта памяці з кучы, 110 00:05:04,140 --> 00:05:06,720 і паказальнік мы атрымліваем вярнуцца да яе называецца пікс. 111 00:05:06,720 --> 00:05:08,430 А потым проста, як мы зроблена раней мы 112 00:05:08,430 --> 00:05:13,966 можа разыменовать пікселяў на доступ да гэтай памяці. 113 00:05:13,966 --> 00:05:15,590 Як мы можам атрымаць цэлы лік ад карыстальніка? 114 00:05:15,590 --> 00:05:17,970 Мы можам сказаць, INT х роўны атрымаць Int. 115 00:05:17,970 --> 00:05:19,930 Гэта даволі проста. 116 00:05:19,930 --> 00:05:24,030 Што рабіць, калі мы хочам стварыць масіў х паплаўкоў, якія жывуць у стэку? 117 00:05:24,030 --> 00:05:28,210 плаваць stack_array-- гэтае імя нашых array-- квадратных дужках х. 118 00:05:28,210 --> 00:05:32,419 Гэта створыць для нас масіў х паплаўкоў, якія жывуць у стэку. 119 00:05:32,419 --> 00:05:34,960 Мы можам стварыць масіў паплаўкоў што жыве ў кучы, таксама. 120 00:05:34,960 --> 00:05:37,330 Сінтаксіс можа выглядаць трохі больш грувасткім, 121 00:05:37,330 --> 00:05:41,740 але мы можам сказаць, паплавок зоркавы heap_array роўная 122 00:05:41,740 --> 00:05:44,360 Таноса х разоў памер паплаўка. 123 00:05:44,360 --> 00:05:48,160 Мне трэба досыць месцы, каб правесці х з якая плавае коскі. 124 00:05:48,160 --> 00:05:51,560 Так бы мовіць, мне трэба 100 паплаўкі, або 1000 паплаўкі. 125 00:05:51,560 --> 00:05:54,810 Так што ў гэтым выпадку было б 400 байт на 100 паплаўкоў, 126 00:05:54,810 --> 00:05:59,080 ці 4000 байт на 1000 паплаўкоў, таму што кожны паплавок займае 127 00:05:59,080 --> 00:06:01,230 чатыры байта прасторы. 128 00:06:01,230 --> 00:06:05,110 >> Пасля гэтага я магу выкарыстоўваць квадрат сінтаксіс кранштэйн heap_array. 129 00:06:05,110 --> 00:06:08,970 Гэтак жа, як я б на stack_array, я можа атрымаць доступ да яго элементы паасобку 130 00:06:08,970 --> 00:06:11,590 выкарыстоўваючы heap_array нуля, heap_array адным. 131 00:06:11,590 --> 00:06:15,800 Але ўспомніць прычыну мы можам зрабіць, што гэта таму, што імя масіва ў C 132 00:06:15,800 --> 00:06:19,990 сапраўды паказальнік на Першы элемент гэтага масіва. 133 00:06:19,990 --> 00:06:23,480 Так на тое, што мы аб'яўленні масіў плавае ў стэку тут 134 00:06:23,480 --> 00:06:24,810 на самай справе трохі ўводзіць у зман. 135 00:06:24,810 --> 00:06:27,600 Мы сапраўды ў Другая радок кода ёсць 136 00:06:27,600 --> 00:06:32,360 Таксама стварэнне паказальнік на кавалак памяці, што мы тады рабіць нейкую працу з. 137 00:06:32,360 --> 00:06:35,620 >> Вось вялікая праблема з дынамічнай памяццю, хоць, 138 00:06:35,620 --> 00:06:38,360 і менавіта таму гэта сапраўды Важна распрацаваць некаторыя добрыя звычкі 139 00:06:38,360 --> 00:06:39,800 калі вы працуеце з ім. 140 00:06:39,800 --> 00:06:43,060 У адрозненне ад статычна аб'яўлена памяці, ваша памяць 141 00:06:43,060 --> 00:06:46,790 аўтаматычна не вяртаецца ў Сістэма, калі ваша функцыя зрабіць. 142 00:06:46,790 --> 00:06:49,280 Так што, калі ў нас ёсць галоўны, і Асноўны выклікае функцыю 143 00:06:49,280 --> 00:06:53,860 е, калі F аздаблення ўсё, што робіць і вяртае кіраванне праграмай 144 00:06:53,860 --> 00:06:58,810 на галоўную, уся памяць што F выкарыстоўваецца даецца таму. 145 00:06:58,810 --> 00:07:01,250 Ён можа быць выкарыстаны зноў іншай праграмай, 146 00:07:01,250 --> 00:07:04,250 ці некаторыя іншыя функцыі, якія выклікаецца пазней у асноўным. 147 00:07:04,250 --> 00:07:06,970 Ён можа выкарыстоўваць гэтую ж памяць зноў і зноў. 148 00:07:06,970 --> 00:07:09,620 >> Калі вы дынамічна вылучыць памяць, хоць 149 00:07:09,620 --> 00:07:14,380 Вы павінны відавочна паказаць Сістэма, што вы зрабілі з ім. 150 00:07:14,380 --> 00:07:18,370 Гэта будзе трымаць на яго для вас, якія маглі б прывесці да праблемы з вас сыходзіць 151 00:07:18,370 --> 00:07:19,290 памяці. 152 00:07:19,290 --> 00:07:22,179 І на самай справе, мы часам называем на гэта як ўцечка памяці. 153 00:07:22,179 --> 00:07:24,970 І часам гэтыя ўцечкі памяці можа на самай справе быць сапраўды разбуральным 154 00:07:24,970 --> 00:07:27,020 для прадукцыйнасці сістэмы. 155 00:07:27,020 --> 00:07:31,120 >> Калі вы часта інтэрнэт-карыстальнік Вы маглі б выкарыстоўваць некаторыя вэб-браўзэры, 156 00:07:31,120 --> 00:07:35,630 і я не буду называць імёнаў тут, але Ёсць некаторыя вэб-браўзэры там 157 00:07:35,630 --> 00:07:39,150 што сумна вядомыя фактычна не маючы уцечкі памяці, якія не атрымліваюць фіксаваныя. 158 00:07:39,150 --> 00:07:44,570 І калі вы выходзіце ваш браўзэр з адкрытым для вельмі доўгага перыяду часу, дзён 159 00:07:44,570 --> 00:07:48,060 і дзён, ці тыдняў, часам Можна заўважыць, што ў вашай сістэме 160 00:07:48,060 --> 00:07:49,790 гэта працуе насамрэч, вельмі павольна. 161 00:07:49,790 --> 00:07:54,640 І прычына для гэтага з'яўляецца тое, што браўзэр вылучыў памяць, 162 00:07:54,640 --> 00:07:57,320 але тады не паведаміў сістэму што гэта зроблена з ім. 163 00:07:57,320 --> 00:08:01,000 І так, што пакідае менш памяці даступныя для ўсіх вашых іншых праграм 164 00:08:01,000 --> 00:08:04,480 каб падзяліцца, таму што вы leaking-- што вэб-браўзэр 165 00:08:04,480 --> 00:08:06,755 Праграма ўцечка памяці. 166 00:08:06,755 --> 00:08:08,880 Як мы даем памяць назад калі мы зрабілі з ім? 167 00:08:08,880 --> 00:08:10,838 Ну, на шчасце, гэта вельмі просты спосаб зрабіць гэта. 168 00:08:10,838 --> 00:08:11,710 Мы проста вызваліць яго. 169 00:08:11,710 --> 00:08:15,020 Там гэта функцыя называецца свабодным, ён прымае паказальнік на памяць, 170 00:08:15,020 --> 00:08:16,010 і мы добра ісці. 171 00:08:16,010 --> 00:08:18,310 >> Такім чынам, давайце казаць, што мы ў сярэдзіна нашай праграмы, 172 00:08:18,310 --> 00:08:21,970 мы хочам, каб Таноса 50 знакаў. 173 00:08:21,970 --> 00:08:25,710 Мы хочам, каб Таноса масіў, які можа здольная ўтрымліваць 50 знакаў. 174 00:08:25,710 --> 00:08:29,109 І калі мы атрымліваем паказальнік назад што імя гэтага паказальніка з'яўляецца слова. 175 00:08:29,109 --> 00:08:30,900 Мы робім усё, што мы збіраецца рабіць са словам, 176 00:08:30,900 --> 00:08:33,440 а затым, калі мы зроблена, мы проста вызваліць яго. 177 00:08:33,440 --> 00:08:37,460 А зараз мы вярнуліся тыя 50 байт памяці назад у сістэму. 178 00:08:37,460 --> 00:08:40,147 Некаторыя іншыя функцыі могуць іх выкарыстоўваць. 179 00:08:40,147 --> 00:08:43,480 Мы не павінны турбавацца аб пераносячы ўцечка памяці, таму што мы вызвалілі слова. 180 00:08:43,480 --> 00:08:46,639 Мы далі памяць назад, так, што мы скончылі працаваць з ім. 181 00:08:46,639 --> 00:08:48,430 Такім чынам, ёсць тры Залатыя правілы, якія павінны 182 00:08:48,430 --> 00:08:51,700 мець на ўвазе, калі вы дынамічнага размеркавання памяці 183 00:08:51,700 --> 00:08:52,990 з Таноса. 184 00:08:52,990 --> 00:08:56,480 Кожны блок памяці, Вы Таноса павінны быць вызваленыя 185 00:08:56,480 --> 00:08:58,430 Перад вашай праграмы завяршэння працы. 186 00:08:58,430 --> 00:09:02,029 Цяпер зноў, ў прыладзе або ў IDE такога роду адбываецца для вас у любым выпадку 187 00:09:02,029 --> 00:09:04,820 калі you-- гэта адбудзецца ў любым выпадку калі ваша праграма завяршаецца, 188 00:09:04,820 --> 00:09:06,880 уся памяць будзе выпушчаны. 189 00:09:06,880 --> 00:09:10,750 Але гэта ў цэлым добры кадаваньне Практыка заўсёды, калі вы скончыце, 190 00:09:10,750 --> 00:09:13,810 вызваліць тое, што вы mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Гэта сказала, толькі тое, што Вы маеце mallocd павінны быць вызваленыя. 192 00:09:16,690 --> 00:09:19,880 Калі вы статычна абвясціць лік, INT х коскі, 193 00:09:19,880 --> 00:09:23,500 што жыве ў стэку, вы не тое хачу, каб вызваліць х. 194 00:09:23,500 --> 00:09:25,970 Так толькі тое, што вы mallocd павінны быць вызваленыя. 195 00:09:25,970 --> 00:09:28,960 >> І, нарэшце, ня бясплатна нешта ў два разы. 196 00:09:28,960 --> 00:09:31,170 Гэта можа прывесці да іншы дзіўная сітуацыя. 197 00:09:31,170 --> 00:09:33,530 Так што ўсё, што вы маеце mallocd павінен быць вызвалены. 198 00:09:33,530 --> 00:09:36,000 Толькі тое, што вы Таноса павінны быць вызваленыя. 199 00:09:36,000 --> 00:09:38,730 І не бясплатна нешта ў два разы. 200 00:09:38,730 --> 00:09:43,660 >> Такім чынам, давайце разгледзім прыклад тут што некаторыя дынамічна размяркоўваецца 201 00:09:43,660 --> 00:09:46,122 памяці можа выглядаць змяшанай у з некаторай статычнай памяці. 202 00:09:46,122 --> 00:09:47,080 Што можа здарыцца тут? 203 00:09:47,080 --> 00:09:48,913 Глядзіце, калі вы можаце прытрымлівацца ўздоўж і думаю, што 204 00:09:48,913 --> 00:09:51,720 адбудзецца, як мы ідзем усе гэтыя радкоў кода. 205 00:09:51,720 --> 00:09:53,980 >> Таму мы кажам, INT м. 206 00:09:53,980 --> 00:09:54,840 Што тут адбываецца? 207 00:09:54,840 --> 00:09:56,339 Ну гэта даволі проста. 208 00:09:56,339 --> 00:09:59,650 Я ствараю цэлае зменную м. 209 00:09:59,650 --> 00:10:01,400 Я пафарбаваць яго зялёным, таму што гэта колер 210 00:10:01,400 --> 00:10:03,730 што я выкарыстоўваю, калі я кажу аб цэлалікавых зменныя. 211 00:10:03,730 --> 00:10:05,160 Гэта скрынка. 212 00:10:05,160 --> 00:10:08,400 Гэта называецца м, і вы можаце магазін цэлыя ўнутры яго. 213 00:10:08,400 --> 00:10:12,400 >> Што рабіць, калі я тады сказаць INT зорцы? 214 00:10:12,400 --> 00:10:13,530 Ну, што гэта даволі падобныя. 215 00:10:13,530 --> 00:10:15,780 Я ствараю акно называецца. 216 00:10:15,780 --> 00:10:19,100 Ён здольны холдынгу Int зоркі, паказальнікі на цэлыя лікі. 217 00:10:19,100 --> 00:10:21,570 Так што я афарбоўкі гэта зялёны-иш, а таксама. 218 00:10:21,570 --> 00:10:24,140 >> Я ведаю, што ёсць нешта зрабіць з цэлым лікам, 219 00:10:24,140 --> 00:10:25,852 але гэта само па сабе не з'яўляецца цэлым лікам. 220 00:10:25,852 --> 00:10:27,310 Але гэта ў значнай ступені тая ж ідэя. 221 00:10:27,310 --> 00:10:28,101 Я стварыў акно. 222 00:10:28,101 --> 00:10:30,070 Абодва гэтыя правы у цяперашні час жывуць у стэку. 223 00:10:30,070 --> 00:10:32,520 Я даў ім імёны абодвух. 224 00:10:32,520 --> 00:10:36,750 >> INT зорка б роўная выдзялення памяці памер Int. 225 00:10:36,750 --> 00:10:38,560 Гэты можа быць крыху больш складана. 226 00:10:38,560 --> 00:10:44,110 Вазьміце другой і падумайце, што вы было б чакаць, каб гэта адбылося на гэтай дыяграме. 227 00:10:44,110 --> 00:10:50,210 INT зорка б роўная выдзялення памяці памер Int. 228 00:10:50,210 --> 00:10:51,940 >> Ну гэта не проста стварыць адну скрынку. 229 00:10:51,940 --> 00:10:53,800 Гэта на самай справе стварае дзве скрынкі. 230 00:10:53,800 --> 00:10:58,670 І гэта прывязвае, ён таксама ўстанаўлівае кропка ў адносінах. 231 00:10:58,670 --> 00:11:02,240 Мы выдзелена адзін блок памяці ў кучы. 232 00:11:02,240 --> 00:11:05,940 Звярніце ўвагу, што верхні правы скрыню значыць не ёсць імя. 233 00:11:05,940 --> 00:11:06,760 >> Мы mallocd яго. 234 00:11:06,760 --> 00:11:08,050 Яна існуе на кучы. 235 00:11:08,050 --> 00:11:10,090 Але Ь мае імя. 236 00:11:10,090 --> 00:11:11,950 Гэта пераменная паказальнік называецца б. 237 00:11:11,950 --> 00:11:13,910 Гэта жыве ў стэку. 238 00:11:13,910 --> 00:11:18,250 >> Так што гэта частка памяці што паказвае на іншы. 239 00:11:18,250 --> 00:11:21,840 б ўтрымлівае адрас гэтага блока памяці. 240 00:11:21,840 --> 00:11:23,757 Гэта не ёсць імя інакш. 241 00:11:23,757 --> 00:11:24,590 Але ён паказвае на яго. 242 00:11:24,590 --> 00:11:29,760 Таму калі мы гаворым INT зорка б роўная Памер Таноса ИНТ, што тут, 243 00:11:29,760 --> 00:11:33,490 што стрэлка, якая выскачыў на правая бок ёсць, што ўся рэч, 244 00:11:33,490 --> 00:11:36,740 Я ён з'явіцца зноў жа, тое, што адбываецца. 245 00:11:36,740 --> 00:11:39,341 Усё, што адбываецца ў што адна радок кода. 246 00:11:39,341 --> 00:11:41,340 Цяпер мы атрымаем трохі больш проста яшчэ раз. 247 00:11:41,340 --> 00:11:43,330 А роўна Ампэрсанд м. 248 00:11:43,330 --> 00:11:46,280 Памятаеш вам, што роўная Ампэрсанд м ёсць? 249 00:11:46,280 --> 00:11:48,920 Ну, гэта атрымлівае адрас M'S. 250 00:11:48,920 --> 00:11:54,150 Або, больш схематычна, а паказвае на м. 251 00:11:54,150 --> 00:11:56,360 >> А роўна б. 252 00:11:56,360 --> 00:11:57,560 ТАКІМ ЧЫНАМ, вось яшчэ адзін. 253 00:11:57,560 --> 00:11:59,230 А роўна б. 254 00:11:59,230 --> 00:12:02,260 Што адбудзецца дыяграме гэты час? 255 00:12:02,260 --> 00:12:04,330 >> Ну нагадаць, што Аператар прысвойвання працы 256 00:12:04,330 --> 00:12:08,960 шляхам прысваення значэння на Права на кошце злева. 257 00:12:08,960 --> 00:12:14,820 Такім чынам, замест паказваў м, А цяпер паказвае на тое ж месца, што б кропак. 258 00:12:14,820 --> 00:12:18,900 а, не паказваюць на B, A паказвае, дзе б балаў. 259 00:12:18,900 --> 00:12:25,280 >> Калі востры б, што б былі роўна Ампэрсанд б. 260 00:12:25,280 --> 00:12:28,150 Але замест гэтага роўная б толькі азначае, што б цяпер 261 00:12:28,150 --> 00:12:31,770 паказваючы на ​​той жа адрас, таму што ўнутры б толькі адрас. 262 00:12:31,770 --> 00:12:35,004 А цяпер ўнутры гэта той жа адрас. 263 00:12:35,004 --> 00:12:37,170 м роўная 10, верагодна, Найбольш простая справа 264 00:12:37,170 --> 00:12:38,690 мы зрабілі ў няшмат. 265 00:12:38,690 --> 00:12:40,460 Змесціце 10 у скрынцы. 266 00:12:40,460 --> 00:12:45,640 Зорка б роўная м плюс 2, нагадаем, з наш паказальнікі відэа, што зорка б азначае. 267 00:12:45,640 --> 00:12:50,230 Мы збіраемся разыменовывания б і пакласці некаторы значэнне ў гэтым месцы памяці. 268 00:12:50,230 --> 00:12:51,860 У гэтым выпадку 12. 269 00:12:51,860 --> 00:12:55,300 >> Таму, калі мы разыменовывать пункту Нагадаем, мы проста рухацца ўніз стрэлку. 270 00:12:55,300 --> 00:12:58,205 Або іншымі словамі, мы перайсці на гэты адрас памяці 271 00:12:58,205 --> 00:12:59,580 і мы маніпуляваць нейкім чынам. 272 00:12:59,580 --> 00:13:00,830 Мы ставім некаторы значэнне ў там. 273 00:13:00,830 --> 00:13:03,960 У гэтым выпадку зоркі У роўны т плюс 2 проста 274 00:13:03,960 --> 00:13:08,230 перайсці да зменнай, на якую паказвае б, перайсці да памяці, на якую паказвае б, 275 00:13:08,230 --> 00:13:11,750 і паклаў м плюс 2 там, 12. 276 00:13:11,750 --> 00:13:14,970 >> Цяпер я свабодна б. 277 00:13:14,970 --> 00:13:16,490 Што адбываецца, калі я вызваляю б? 278 00:13:16,490 --> 00:13:18,800 Памятаеце, што я сказаў, бясплатныя сродкі. 279 00:13:18,800 --> 00:13:21,920 Што я кажу, калі я вызваліцца б? 280 00:13:21,920 --> 00:13:23,410 >> Я зрабіў з ім працаваць, ці не так? 281 00:13:23,410 --> 00:13:25,702 Я па сутнасці адмовіцца ад памяці. 282 00:13:25,702 --> 00:13:26,910 Я даю яго назад у сістэму. 283 00:13:26,910 --> 00:13:33,010 Мне не трэба гэта больш з'яўляецца тое, што я кажу ім, ОК? 284 00:13:33,010 --> 00:13:37,390 >> Цяпер, калі я кажу зорцы роўная 11, верагодна, можна 285 00:13:37,390 --> 00:13:40,460 ўжо сказаць, што нешта дрэннае адбудзецца тут, прама? 286 00:13:40,460 --> 00:13:44,160 І на самай справе, калі я спрабаваў, што я, верагодна, будзе пакутаваць памылку сегментацыі. 287 00:13:44,160 --> 00:13:47,140 Таму што цяпер, хоць раней, што частка памяці 288 00:13:47,140 --> 00:13:50,220 было нешта, што я меў доступ да, у гэтай кропцы 289 00:13:50,220 --> 00:13:54,590 цяпер я доступу да памяці, што не з'яўляецца законным для мяне, каб атрымаць доступ. 290 00:13:54,590 --> 00:13:57,330 >> І, як мы, верагодна, Нагадаем, што, калі мы атрымліваем доступ да памяці 291 00:13:57,330 --> 00:14:00,000 што мы не павінны чапаць, гэта самая распаўсюджаная прычына 292 00:14:00,000 --> 00:14:01,860 з сегментацыі віна. І так мая праграма 293 00:14:01,860 --> 00:14:05,170 будзе катастрофа, калі я спрабаваў зрабіць гэта. 294 00:14:05,170 --> 00:14:09,910 Такім чынам, яшчэ раз, што гэта добрая ідэя, каб атрымаць добры практыка і добрыя звычкі ўкараніліся 295 00:14:09,910 --> 00:14:12,920 пры працы з Таноса і бясплатна, так што вы не пакутуеце сегментацыі 296 00:14:12,920 --> 00:14:15,310 памылкі, і што вы карыстаецеся Ваш вылучаецца дынамічна 297 00:14:15,310 --> 00:14:17,370 памяці адказна. 298 00:14:17,370 --> 00:14:20,300 >> Я Дуг Лойда гэта CS50. 299 00:14:20,300 --> 00:14:21,947