1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [MUZIKO Ludante] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK do sugesto antaŭ komenci ĉi tie. 5 00:00:07,940 --> 00:00:11,660 Se vi ne spektis la videon sur Montriloj vi volus fari tiel unue. 6 00:00:11,660 --> 00:00:15,860 Ĉar tiu video estas alia labormetodo kun punteros. 7 00:00:15,860 --> 00:00:17,574 >> Do ĝi estas tuj paroli pri iuj konceptoj 8 00:00:17,574 --> 00:00:19,490 ke ni kovras en la Montriloj vídeo, kaj ni estas 9 00:00:19,490 --> 00:00:21,948 tuj forgliti super ilin nun, supozante ke ili estas jam 10 00:00:21,948 --> 00:00:23,090 ia komprenis. 11 00:00:23,090 --> 00:00:25,440 Do tio estas nur via justa averto ke se vi vidas ĉi tiu vídeo 12 00:00:25,440 --> 00:00:27,814 kaj vi ne vidis la punteros vídeo, ĝi eble ia 13 00:00:27,814 --> 00:00:29,610 flugas super via kapo iomete. 14 00:00:29,610 --> 00:00:32,080 Kaj tiel povus esti bona rigardi ĝin en tiu ordo. 15 00:00:32,080 --> 00:00:34,710 >> Do ni jam vidis unu maniero labori kun punteros, 16 00:00:34,710 --> 00:00:37,810 kio estas ni deklari variablo, kaj tiam ni 17 00:00:37,810 --> 00:00:42,160 deklari alia variablo, montrilo variablo, kiu notas al tio. 18 00:00:42,160 --> 00:00:44,870 Do ni kreis variablo kun nomo, ni havas 19 00:00:44,870 --> 00:00:48,480 kreis duan variablo kun nomo, kaj ni atentigi ke dua variablo 20 00:00:48,480 --> 00:00:50,220 en tiu unua. 21 00:00:50,220 --> 00:00:52,370 Tian havas problemo kvankam, ĉar 22 00:00:52,370 --> 00:00:54,650 postulas nin scias ĝuste kiom memoro ni estas 23 00:00:54,650 --> 00:00:57,600 tuj bezonas la momento nia programo estas kompilita. 24 00:00:57,600 --> 00:00:58,220 >> Kial estas tio? 25 00:00:58,220 --> 00:01:03,338 Ĉar ni bezonas por povi citi aŭ identigi ĉiujn eblajn variablojn 26 00:01:03,338 --> 00:01:04,129 Ni eble renkontos. 27 00:01:04,129 --> 00:01:07,910 Ni povus havi tabelo ke povus esti povis teni multajn informojn, 28 00:01:07,910 --> 00:01:10,110 sed ĝi estas ankoraŭ ne ĝuste preciza sufiĉa. 29 00:01:10,110 --> 00:01:12,640 Kio se ni ne scias, kio se ni ne havas ideon 30 00:01:12,640 --> 00:01:14,370 kiom ni bezonos dum la kompilado? 31 00:01:14,370 --> 00:01:17,020 Aŭ kion se nia programo kuri por vere longa tempo, 32 00:01:17,020 --> 00:01:19,810 akcepti diversajn uzanto datumoj, kaj ni ne povas vere 33 00:01:19,810 --> 00:01:23,170 taksi ĉu ni estas tuj bezonas 1.000 ekzemplerojn? 34 00:01:23,170 --> 00:01:26,060 >> Ne estas kiel ni povas diru ĉe la komandlinio 35 00:01:26,060 --> 00:01:28,040 eniri kiomfoje Vi kredas ke vi bezonos. 36 00:01:28,040 --> 00:01:31,100 Nu kion se tiu konjekto malĝustas? 37 00:01:31,100 --> 00:01:34,300 Dinamika memoro atribuo ia permesas al ni la vojon 38 00:01:34,300 --> 00:01:36,867 akiri ĉirkaŭ tiu aparta problemo. 39 00:01:36,867 --> 00:01:38,700 Kaj la vojo ĝi faras estas uzante punteros. 40 00:01:38,700 --> 00:01:42,140 >> Ni povas uzi punteros al ricevas aliron al dinamike 41 00:01:42,140 --> 00:01:45,710 asignita memoro, memoro, kiu estas asignita kiel via programo kuras. 42 00:01:45,710 --> 00:01:48,290 Ĝi ne estas asignitaj dum la kompilado. 43 00:01:48,290 --> 00:01:51,570 Kiam vi dinamike asigni memoro ĝi venas de naĝejo 44 00:01:51,570 --> 00:01:53,795 de memoro konata kiel la amaso. 45 00:01:53,795 --> 00:01:56,420 Antaŭe tutan memoron ni havas estis laborante kun la paso 46 00:01:56,420 --> 00:01:59,920 estis venanta de naĝejo de memoro nomata la pilo. 47 00:01:59,920 --> 00:02:02,470 Bona maniero ĝenerale teni en mind-- kaj tiu regulo 48 00:02:02,470 --> 00:02:04,720 ne ĉiam tenas vera, sed preskaux preskaŭ 49 00:02:04,720 --> 00:02:09,940 ĉiam tenas true-- estas ke ajna tempo vi donas variablo nomo 50 00:02:09,940 --> 00:02:12,090 probable vivas en la stako. 51 00:02:12,090 --> 00:02:14,650 Kaj ajna tempo vi ne doni variablo nomo, 52 00:02:14,650 --> 00:02:19,160 kiun vi povas fari kun dinamika memoro atribuo, vivas sur la monteto. 53 00:02:19,160 --> 00:02:22,190 >> Nun mi specon de prezenti tion kiel se estas tiuj du naĝejoj de memoro. 54 00:02:22,190 --> 00:02:24,740 Sed eble vi vidis tiun diagramo, kiu estas ĝenerale 55 00:02:24,740 --> 00:02:27,290 reprezento de kion memoro similas, 56 00:02:27,290 --> 00:02:30,373 kaj ni ne tuj zorgas pri ĉiuj la frandajxojn cxe la supro kaj la malsupro. 57 00:02:30,373 --> 00:02:33,580 Kion ni zorgas pri estas tiu parto en la mezo tie, havaĵo kaj pilo. 58 00:02:33,580 --> 00:02:35,570 Kiel vi povas vidi per rigardante tiun diagramon, 59 00:02:35,570 --> 00:02:38,390 tiuj vere ne estas du apartaj naĝejoj de memoro. 60 00:02:38,390 --> 00:02:42,757 Ĝi estas unu dividita naĝejo de memoro kie vi komencas, en ĉi vida 61 00:02:42,757 --> 00:02:44,590 vi komenci ĉe la fundo kaj komenci rellenar 62 00:02:44,590 --> 00:02:48,040 el la fundo kun la pilo, kaj vi komencu ĉe la supro kaj komenci rellenar 63 00:02:48,040 --> 00:02:50,072 De la supro malsupren kun la havaĵo. 64 00:02:50,072 --> 00:02:51,780 Sed vere estas la sama lageto, estas nur 65 00:02:51,780 --> 00:02:56,050 malsamaj makuloj, malsamaj lokoj en memoro kiuj estas asignitaj. 66 00:02:56,050 --> 00:02:59,060 Kaj vi povas kuri el memoro fare de aŭ havanta 67 00:02:59,060 --> 00:03:01,240 la havaĵon iri la tutan vojon al la fundo, aŭ havas 68 00:03:01,240 --> 00:03:05,440 la stako iri la tutan vojon al la supro, aŭ havantaj la havaĵon kaj la pilo 69 00:03:05,440 --> 00:03:06,740 renkonti sin reciproke. 70 00:03:06,740 --> 00:03:09,500 Ĉiuj el tiuj povas esti kondiĉoj kiuj kaŭzas vian programon 71 00:03:09,500 --> 00:03:11,030 kuri el memoro. 72 00:03:11,030 --> 00:03:11,952 Observu do, ke en menso. 73 00:03:11,952 --> 00:03:13,660 Kiam ni parolas pri la havaĵon kaj la pilo 74 00:03:13,660 --> 00:03:17,880 ni vere parolas pri la samaj ĝeneralaj eron de memoro, ĵus 75 00:03:17,880 --> 00:03:21,930 malsamaj partoj de tiu memoro. 76 00:03:21,930 --> 00:03:24,910 >> Do kiel ni preni dinamike asignita memoro en la unua loko? 77 00:03:24,910 --> 00:03:27,740 Kiel nia programo akiras memoro kiel ĝi estas kurante? 78 00:03:27,740 --> 00:03:32,660 Nu C provizas funkcio nomita malloc, memoro allocator, kiu 79 00:03:32,660 --> 00:03:36,810 vi faras alvokon al, kaj pasas en kiom da bajtoj de memoro kiun vi volas. 80 00:03:36,810 --> 00:03:39,940 Do se via programo kuras kaj vi volas entjero ekzekuto, 81 00:03:39,940 --> 00:03:46,040 vi eble Mallock kvar bajtoj de memoro, malloc krampoj kvar. 82 00:03:46,040 --> 00:03:48,540 >> Mallock trairos rigardanta tra la amaso, 83 00:03:48,540 --> 00:03:50,750 ĉar ni estas dinamike asignante memoron, 84 00:03:50,750 --> 00:03:53,500 kaj ĝi revenos al vi puntero al tiu memoro. 85 00:03:53,500 --> 00:03:56,180 Ĝi ne donas al vi, ke memory-- ĝi ne donas al li nomon, 86 00:03:56,180 --> 00:03:57,950 ĝi donas vin puntero al ĝi. 87 00:03:57,950 --> 00:04:00,780 Kaj do jen kial mi denove diris ke gravas eble 88 00:04:00,780 --> 00:04:03,770 maldormis la punteros video antaŭ ni ricevas tro multe en tiu. 89 00:04:03,770 --> 00:04:05,940 Do malloc tuj donas vin reen montrilo. 90 00:04:05,940 --> 00:04:08,950 >> Se Mallock ne povas doni al vi neniun memoro ĉar vi ne plu havas, 91 00:04:08,950 --> 00:04:10,645 ĝi donos vin reen nula puntero. 92 00:04:10,645 --> 00:04:15,282 Ĉu vi memoras kio okazas se ni provu dereference nula puntero? 93 00:04:15,282 --> 00:04:17,019 Ni lasu seg kulpo, ĉu ne? 94 00:04:17,019 --> 00:04:18,060 Tio probable ne bona. 95 00:04:18,060 --> 00:04:21,579 >> Do ĉiufoje vi fari alvokon malloc vi ĉiam, ĉiam 96 00:04:21,579 --> 00:04:25,270 bezonas kontroli ĉu la Pointer donis vin reen estas nula. 97 00:04:25,270 --> 00:04:28,800 Se jes, vi devas fini vian programon ĉar se vi provas kaj dereference 98 00:04:28,800 --> 00:04:31,360 la nula puntero vi tuj suferi segmentación kulpo 99 00:04:31,360 --> 00:04:34,380 kaj via programo estas tuj frakasos ĉiuokaze. 100 00:04:34,380 --> 00:04:37,190 Nu do kiel ni statike ricevi entjero? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Ni probable faris ke faskon da fojoj, dekstra? 103 00:04:40,010 --> 00:04:43,480 Tio kreas variablon nomata x ke vivoj sur la stako. 104 00:04:43,480 --> 00:04:46,190 Kiel ni dinamike ricevi entjero? 105 00:04:46,190 --> 00:04:50,010 Mez stelo px egalas malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Aŭ pli taŭge ni dirus int stelo px 107 00:04:53,050 --> 00:04:57,680 egalas malloc grandeco de int, nur ĵeti iom malpli 108 00:04:57,680 --> 00:04:59,740 magio nombroj ĉirkaŭ nia programo. 109 00:04:59,740 --> 00:05:04,140 Tiu tuj akiri por ni kvar bajtoj de memoro de la amaso, 110 00:05:04,140 --> 00:05:06,720 kaj la montrilon ni preni reen al ĝi estas nomita px. 111 00:05:06,720 --> 00:05:08,430 Kaj subite ni havas faris antaŭe ni 112 00:05:08,430 --> 00:05:13,966 povas dereference px al aliri tiu memoro. 113 00:05:13,966 --> 00:05:15,590 Kiel ni akiras entjero de la uzanto? 114 00:05:15,590 --> 00:05:17,970 Ni povas diri int x egalas atingi int. 115 00:05:17,970 --> 00:05:19,930 Tio estas sufiĉe simpla. 116 00:05:19,930 --> 00:05:24,030 Kio se ni volas krei tabelo de X kaleŝegoj kiuj vivas sur la pilo? 117 00:05:24,030 --> 00:05:28,210 flosi stack_array-- jen la nomo de nia tabelo kvadrataj krampoj x. 118 00:05:28,210 --> 00:05:32,419 Kiu kreos por ni tabelo de X kaleŝegoj kiuj vivas sur la stako. 119 00:05:32,419 --> 00:05:34,960 Ni povas krei tabelon de kaleŝegoj kiu vivas sur la havaĵon, tro. 120 00:05:34,960 --> 00:05:37,330 La sintakso povus aspekti iom pli ĝene, 121 00:05:37,330 --> 00:05:41,740 sed ni povas diri kaleŝego stelo heap_array egalas 122 00:05:41,740 --> 00:05:44,360 malloc x fojoj la grandeco de la kaleŝego. 123 00:05:44,360 --> 00:05:48,160 Mi bezonas sufiĉan spacon por teni x glitpunktaj valoroj. 124 00:05:48,160 --> 00:05:51,560 Do diras mi bezonas 100 kaleŝegoj, aŭ 1,000 kaleŝegoj. 125 00:05:51,560 --> 00:05:54,810 Do en tiu kazo ĝi estus 400 bajtoj por 100 flosoj, 126 00:05:54,810 --> 00:05:59,080 aŭ 4.000 bitokoj por 1,000 kaleŝegoj, ĉar ĉiu kaleŝego dissxutas 127 00:05:59,080 --> 00:06:01,230 kvar bajtoj de spaco. 128 00:06:01,230 --> 00:06:05,110 >> Post fari ĉi mi povas uzi la kvadrata krampo sintakso sur heap_array. 129 00:06:05,110 --> 00:06:08,970 Ĝuste kiel mi farus en stack_array mi povas aliri lia elementoj individue 130 00:06:08,970 --> 00:06:11,590 uzante heap_array nulo, heap_array unu. 131 00:06:11,590 --> 00:06:15,800 Sed memoru la kialo ni povas fari tion Estas ĉar la nomo de tabelo en C 132 00:06:15,800 --> 00:06:19,990 estas vere puntero tiu tabelo la unua elemento. 133 00:06:19,990 --> 00:06:23,480 Do la fakto ke ni deklarante tabelo de kaleŝegoj sur la stako tie 134 00:06:23,480 --> 00:06:24,810 Estas efektive iom misgvida. 135 00:06:24,810 --> 00:06:27,600 Ni vere estas en la dua linio de kodo tie 136 00:06:27,600 --> 00:06:32,360 ankaŭ kreante montrilon al eron de memoro kiun ni tiam fari iun laboron kun. 137 00:06:32,360 --> 00:06:35,620 >> Jen la granda problemo kun dinamike asignita memoro kvankam, 138 00:06:35,620 --> 00:06:38,360 kaj tio estas kial ĝi estas vere grave disvolvi kelkajn bonajn kutimojn 139 00:06:38,360 --> 00:06:39,800 kiam vi laboras kun ĝi. 140 00:06:39,800 --> 00:06:43,060 Kontraste statike deklaris memoro, via memoro 141 00:06:43,060 --> 00:06:46,790 ne aŭtomate reiris al la sistemo kiam via funkcio estas farita. 142 00:06:46,790 --> 00:06:49,280 Do se ni havas ĉefan, kaj ĉefa nomas funkcio 143 00:06:49,280 --> 00:06:53,860 f, kiam f finas ajn ĝi estas faranta kaj resendas kontrolon de la programo 144 00:06:53,860 --> 00:06:58,810 reen al ĉefa, ĉiuj la memoro ke f uzita estas redonita. 145 00:06:58,810 --> 00:07:01,250 Ĝi povas esti uzita denove per iu alia programo, 146 00:07:01,250 --> 00:07:04,250 aŭ alian funkcion kiu gets vokis poste sur en ĉefa. 147 00:07:04,250 --> 00:07:06,970 Ĝi povas uzi tiun saman memoron denove. 148 00:07:06,970 --> 00:07:09,620 >> Se vi dinamike rezervi memoron kvankam 149 00:07:09,620 --> 00:07:14,380 vi devas eksplicite informi la sistemo kiu vi faris kun gxi. 150 00:07:14,380 --> 00:07:18,370 Ĝi devos teni al ĝi por vi, kiuj povis konduki al problemo de vi elkuranta 151 00:07:18,370 --> 00:07:19,290 de memoro. 152 00:07:19,290 --> 00:07:22,179 Kaj fakte ni foje rilati al tiu kiel memoro liko. 153 00:07:22,179 --> 00:07:24,970 Kaj kelkfoje tiuj memoro likas povas efektive esti vere devastador 154 00:07:24,970 --> 00:07:27,020 por sistemo elfaro. 155 00:07:27,020 --> 00:07:31,120 >> Se vi estas ofta uzanto de interreto vi povus uzi iujn foliumiloj, 156 00:07:31,120 --> 00:07:35,630 kaj mi ne enoficigis nomojn tie, sed estas iuj foliumiloj tie 157 00:07:35,630 --> 00:07:39,150 kiuj estas konataj por reale havi memoro likas ke ne get fiksita. 158 00:07:39,150 --> 00:07:44,570 Kaj se vi lasas vian retumilon malfermita por tre longa periodo de tempo, tagoj 159 00:07:44,570 --> 00:07:48,060 kaj tagoj, aŭ semajnoj, vi kelkfoje povus rimarki ke via sistemo 160 00:07:48,060 --> 00:07:49,790 estas kurante vere, vere malrapide. 161 00:07:49,790 --> 00:07:54,640 Kaj la kialo por tio estas ke la retumilo destinis memoro, 162 00:07:54,640 --> 00:07:57,320 sed tiam ne rakontis la sistemo ke ĝi estas farita kun ĝi. 163 00:07:57,320 --> 00:08:01,000 Kaj tial lasas malpli memoro disponebla por ĉiuj viaj aliaj programoj 164 00:08:01,000 --> 00:08:04,480 devi dividi, ĉar vi estas leaking-- ke retumilo 165 00:08:04,480 --> 00:08:06,755 programo estas likanta memoro. 166 00:08:06,755 --> 00:08:08,880 Kiel ni donu memoron reen kiam ni el tio? 167 00:08:08,880 --> 00:08:10,838 Nu, feliĉe ĝi estas tre facila maniero por fari ĝin. 168 00:08:10,838 --> 00:08:11,710 Ni nur liberigi ĝin. 169 00:08:11,710 --> 00:08:15,020 Ekzistas funkcio nomita libera, akceptas puntero al memoro, 170 00:08:15,020 --> 00:08:16,010 kaj ni estas bone iri. 171 00:08:16,010 --> 00:08:18,310 >> Do diru ni estas en la mezo de nia programo, 172 00:08:18,310 --> 00:08:21,970 ni volas malloc 50 karakteroj. 173 00:08:21,970 --> 00:08:25,710 Ni volas malloc tabelo kiu povas kapabla je posedo 50 karakteroj. 174 00:08:25,710 --> 00:08:29,109 Kiam ni atingos montrilo reen al ke, ke puntero nomo estas vorto. 175 00:08:29,109 --> 00:08:30,900 Ni faras tion, kion ni estas faros pri vorto, 176 00:08:30,900 --> 00:08:33,440 kaj tiam kiam ni estas faris ni nur liberigi ĝin. 177 00:08:33,440 --> 00:08:37,460 Nun ni revenis tiuj 50 bajtoj de memoro reen al la sistemo. 178 00:08:37,460 --> 00:08:40,147 Iu alia funkcio povas uzi ilin. 179 00:08:40,147 --> 00:08:43,480 Ni ne devas maltrankviligi suferi memoro liko ĉar ni liberigis vorto. 180 00:08:43,480 --> 00:08:46,639 Ni donis la memoron reen, do ni faris laboranta kun ĝi. 181 00:08:46,639 --> 00:08:48,430 Do estas tri oraj reguloj kiu devus 182 00:08:48,430 --> 00:08:51,700 konservigxi en menso kiam vi estas dinamike asignante memoron 183 00:08:51,700 --> 00:08:52,990 kun malloc. 184 00:08:52,990 --> 00:08:56,480 Ĉiu bloko de memoro kiu vi malloc devas esti liberigita 185 00:08:56,480 --> 00:08:58,430 antaŭ via programo finas kurante. 186 00:08:58,430 --> 00:09:02,029 Nun ree, en la aparaton aŭ en la IDE ĉi tia okazas por vi ĉiuokaze 187 00:09:02,029 --> 00:09:04,820 kiam you-- tio okazos ĉiuokaze kiam via programo estas finita, 188 00:09:04,820 --> 00:09:06,880 tuta memoro estos liberigita. 189 00:09:06,880 --> 00:09:10,750 Sed estas ĝenerale bona kodigo praktiko ĉiam, kiam vi faris, 190 00:09:10,750 --> 00:09:13,810 liberigi kion vi mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Dirita, nur tion, kio vi havas mallocd devus esti liberigita. 192 00:09:16,690 --> 00:09:19,880 Se vi statike deklaru entjero, int x duon-dupunkto, 193 00:09:19,880 --> 00:09:23,500 kiu vivas sur la stako, vi ne tiam volis liberiĝi x. 194 00:09:23,500 --> 00:09:25,970 Do nur aferojn kiuj vi havas mallocd devus esti liberigita. 195 00:09:25,970 --> 00:09:28,960 >> Kaj laste, ne libera io dufoje. 196 00:09:28,960 --> 00:09:31,170 Tio povas konduki al alian strangan situacion. 197 00:09:31,170 --> 00:09:33,530 Do ĉio ke vi havas mallocd devas esti liberigitaj. 198 00:09:33,530 --> 00:09:36,000 Nur aferojn kiuj vi havas malloc devus esti liberigita. 199 00:09:36,000 --> 00:09:38,730 Kaj ne faras ion libera dufoje. 200 00:09:38,730 --> 00:09:43,660 >> Do ni iru tra ekzemplo tie de kion iuj dinamike asignitaj 201 00:09:43,660 --> 00:09:46,122 memoro povus aspekti miksita en iuj statika memoro. 202 00:09:46,122 --> 00:09:47,080 Kio povus okazi tie? 203 00:09:47,080 --> 00:09:48,913 Kontrolu cxu vi povas sekvi kune kaj diveni kio estas 204 00:09:48,913 --> 00:09:51,720 okazos dum ni iras tra ĉiuj tiuj linioj de kodo. 205 00:09:51,720 --> 00:09:53,980 >> Do ni diru int m. 206 00:09:53,980 --> 00:09:54,840 Kio okazas ĉi tie? 207 00:09:54,840 --> 00:09:56,339 Nu tiu estas bela simpla. 208 00:09:56,339 --> 00:09:59,650 Mi kreas entjera variablo nomis m. 209 00:09:59,650 --> 00:10:01,400 Mi kolora ĝi verdaj, ĉar tio estas la koloro 210 00:10:01,400 --> 00:10:03,730 ke mi uzas kiam mi parolas pri entjeraj variabloj. 211 00:10:03,730 --> 00:10:05,160 Ĝi estas skatolo. 212 00:10:05,160 --> 00:10:08,400 Ĝi nomiĝas m, kaj vi povas vendejo entjeroj en ĝi. 213 00:10:08,400 --> 00:10:12,400 >> Kio se mi tiam diri int stelo a? 214 00:10:12,400 --> 00:10:13,530 Nu tio estas sufiĉe simila. 215 00:10:13,530 --> 00:10:15,780 Mi kreas skatolon nomita. 216 00:10:15,780 --> 00:10:19,100 Ĝi estas kapabla je posedo int steloj, punteros al entjeroj. 217 00:10:19,100 --> 00:10:21,570 Do mi coloreando ĝi verda-ish tiel. 218 00:10:21,570 --> 00:10:24,140 >> Mi scias ke ĝi havas ion fari kun entjero, 219 00:10:24,140 --> 00:10:25,852 sed ĝi ne estas mem entjero. 220 00:10:25,852 --> 00:10:27,310 Sed estas preskaux la sama ideo. 221 00:10:27,310 --> 00:10:28,101 Mi kreis skatolo. 222 00:10:28,101 --> 00:10:30,070 Ambaŭ pravas nun vivu sur la stako. 223 00:10:30,070 --> 00:10:32,520 Mi donis ilin ambaŭ nomoj. 224 00:10:32,520 --> 00:10:36,750 >> int stelo b egalas malloc grandeco de int. 225 00:10:36,750 --> 00:10:38,560 Ĉi tiu povus esti iom malfacila. 226 00:10:38,560 --> 00:10:44,110 Preni duan kaj pensi pri kio vi atendite okazi sur tiu diagramo. 227 00:10:44,110 --> 00:10:50,210 int stelo b egalas malloc grandeco de int. 228 00:10:50,210 --> 00:10:51,940 >> Nu tio ne nur krei unu skatolo. 229 00:10:51,940 --> 00:10:53,800 Tiu fakte kreas du skatoloj. 230 00:10:53,800 --> 00:10:58,670 Kaj ĝi ligas, ĝi ankaŭ establas punkto en interrilato. 231 00:10:58,670 --> 00:11:02,240 Ni asignitaj unu bloko de memoro sur la havaĵon. 232 00:11:02,240 --> 00:11:05,940 Rimarku ke la pinta dekstra skatolo tie ne havas nomon. 233 00:11:05,940 --> 00:11:06,760 >> Ni mallocd ĝin. 234 00:11:06,760 --> 00:11:08,050 Ekzistas sur la havaĵo. 235 00:11:08,050 --> 00:11:10,090 Sed b havas nomon. 236 00:11:10,090 --> 00:11:11,950 Ĝi estas puntero variablo nomis b. 237 00:11:11,950 --> 00:11:13,910 Kiu vivas sur la stako. 238 00:11:13,910 --> 00:11:18,250 >> Do ĝi estas peco de memoro kiu notas al alia. 239 00:11:18,250 --> 00:11:21,840 b enhavas la adreson de tiu bloko de memoro. 240 00:11:21,840 --> 00:11:23,757 Ĝi ne havas nomon alie. 241 00:11:23,757 --> 00:11:24,590 Sed ĝi montras al ĝi. 242 00:11:24,590 --> 00:11:29,760 Do kiam ni diras int stelo b egalas malloc grandeco de int, ke ĝuste tie, 243 00:11:29,760 --> 00:11:33,490 ke sagon kiu pusxis supren sur la dekstra flanko, ke tuta afero, 244 00:11:33,490 --> 00:11:36,740 Mi devos ĝin aperi denove, estas kio okazas. 245 00:11:36,740 --> 00:11:39,341 Ĉiuj kiuj okazas en ke sola linio de kodo. 246 00:11:39,341 --> 00:11:41,340 Nun ni ricevos iom pli rekta denove. 247 00:11:41,340 --> 00:11:43,330 a egalas ampersand m. 248 00:11:43,330 --> 00:11:46,280 Ĉu vi memoras kia egalas ampersand m estas? 249 00:11:46,280 --> 00:11:48,920 Nu tio estas ricevas M adreso. 250 00:11:48,920 --> 00:11:54,150 Aŭ meti pli diagrammatically, a punktoj al m. 251 00:11:54,150 --> 00:11:56,360 >> a egalas b. 252 00:11:56,360 --> 00:11:57,560 OK Do jen alia. 253 00:11:57,560 --> 00:11:59,230 A egalas b. 254 00:11:59,230 --> 00:12:02,260 Kio okazos al la diagramo tiun tempon? 255 00:12:02,260 --> 00:12:04,330 >> Nu memoras ke la asigno operatoro verkoj 256 00:12:04,330 --> 00:12:08,960 atribuante la valoro sur la rajton la valoro sur la maldekstra. 257 00:12:08,960 --> 00:12:14,820 Do anstataŭ indikus m, nun notas al la sama loko ke b punktoj. 258 00:12:14,820 --> 00:12:18,900 oni ne notas al B, A punktoj kie b punktoj. 259 00:12:18,900 --> 00:12:25,280 >> Se pintan al b kiu volus estinti egalas ampersand b. 260 00:12:25,280 --> 00:12:28,150 Sed anstataŭe egalas b simple signifas ke b estas nun 261 00:12:28,150 --> 00:12:31,770 indikante la sama adreso, ĉar ene de b estas nur adreson. 262 00:12:31,770 --> 00:12:35,004 Kaj nun ene de a estas la sama adreso. 263 00:12:35,004 --> 00:12:37,170 m egalas 10, probable la plej simpla afero 264 00:12:37,170 --> 00:12:38,690 ni jam faris en iomete. 265 00:12:38,690 --> 00:12:40,460 Metu la 10 en la skatolo. 266 00:12:40,460 --> 00:12:45,640 Stelo b egalas m plus 2, memoras de niajn punteros video kia stelo b signifas. 267 00:12:45,640 --> 00:12:50,230 Ni tuj dereference b kaj meto iu valoro en tiu memoro loko. 268 00:12:50,230 --> 00:12:51,860 En tiu kazo 12. 269 00:12:51,860 --> 00:12:55,300 >> Do kiam ni dereference punkton de rememori ni nur vojaĝas malsupren sagoj. 270 00:12:55,300 --> 00:12:58,205 Aŭ alia maniero, ni iri al tiu memoro Adreso 271 00:12:58,205 --> 00:12:59,580 kaj ni manipuli ĝin iel. 272 00:12:59,580 --> 00:13:00,830 Ni metu iu valoro en tie. 273 00:13:00,830 --> 00:13:03,960 Tiukaze stelo b egalas m plus 2 estas simple 274 00:13:03,960 --> 00:13:08,230 iri al la variablo indikis per b, iru al la memoro indikis per b, 275 00:13:08,230 --> 00:13:11,750 kaj metis m plus 2 en tie, 12. 276 00:13:11,750 --> 00:13:14,970 >> Nun liberto b. 277 00:13:14,970 --> 00:13:16,490 Kio okazas kiam liberto b? 278 00:13:16,490 --> 00:13:18,800 Memoru kion mi diris liberaj rimedoj. 279 00:13:18,800 --> 00:13:21,920 Kion mi diris kiam liberto b? 280 00:13:21,920 --> 00:13:23,410 >> Mi faritaj laboranta kun ĝi, ĉu ne? 281 00:13:23,410 --> 00:13:25,702 Mi esence rezigni la memoro. 282 00:13:25,702 --> 00:13:26,910 Mi donas ĝin al la sistemo. 283 00:13:26,910 --> 00:13:33,010 Mi ne bezonas tiun anymore estas kion mi diras ilin, OK? 284 00:13:33,010 --> 00:13:37,390 >> Nun se mi diras al stelo egalas 11 vi povas verŝajne 285 00:13:37,390 --> 00:13:40,460 Jam diri ke io malbona okazos tie, ĉu ne? 286 00:13:40,460 --> 00:13:44,160 Kaj efektive, se mi pretendas ke mi probable suferus segmentación kulpo. 287 00:13:44,160 --> 00:13:47,140 Ĉar nun, kvankam antaŭe ke bloko de memoro 288 00:13:47,140 --> 00:13:50,220 estis iu kiu mi havis aliro al, ĉe tiu punkto 289 00:13:50,220 --> 00:13:54,590 nun mi aliranta memoro kiu ne leĝa por mi aliri. 290 00:13:54,590 --> 00:13:57,330 >> Kaj kiel ni probable memoras, kiam ni aliras memoro 291 00:13:57,330 --> 00:14:00,000 ke ni ne supozis tuŝi, tio estas la plej ofta kaŭzo 292 00:14:00,000 --> 00:14:01,860 de segmentación kulpo. Kaj do mia programo 293 00:14:01,860 --> 00:14:05,170 frakasus se mi provus fari tion. 294 00:14:05,170 --> 00:14:09,910 Do denove estas bona ideo por akiri bonajn praktiko kaj bona kutimoj ekradikitaj 295 00:14:09,910 --> 00:14:12,920 kiam laborante kun malloc kaj libera, por ke vi ne suferas segmentación 296 00:14:12,920 --> 00:14:15,310 kulpoj, kaj ke vi uzas via dinamike asignitaj 297 00:14:15,310 --> 00:14:17,370 memoro respondece. 298 00:14:17,370 --> 00:14:20,300 >> Mi Doug Lloyd tiu estas CS50. 299 00:14:20,300 --> 00:14:21,947