1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Musik spiller] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK, så et forslag før du starter her. 5 00:00:07,940 --> 00:00:11,660 Hvis du ikke har set videoen på pointere du måske ønsker at gøre det først. 6 00:00:11,660 --> 00:00:15,860 Da dette er en anden video måde at arbejde med pointere. 7 00:00:15,860 --> 00:00:17,574 >> Så det kommer til at tale om nogle begreber 8 00:00:17,574 --> 00:00:19,490 som vi dækker i pointere video, og vi er 9 00:00:19,490 --> 00:00:21,948 kommer til at glans over dem nu, under forudsætning af, at de er allerede 10 00:00:21,948 --> 00:00:23,090 slags forstået. 11 00:00:23,090 --> 00:00:25,440 Så det er bare din retfærdig advarsel at hvis du ser denne video 12 00:00:25,440 --> 00:00:27,814 og du har ikke set den pointers video, kan det slags 13 00:00:27,814 --> 00:00:29,610 flyve over dit hoved en lille smule. 14 00:00:29,610 --> 00:00:32,080 Og så kan det være bedre at se det i nævnte rækkefølge. 15 00:00:32,080 --> 00:00:34,710 >> Så vi har allerede set en måde at arbejde med pointere, 16 00:00:34,710 --> 00:00:37,810 som vi erklærer en variabel, og så vi 17 00:00:37,810 --> 00:00:42,160 Det fastslås en anden variabel, en pointer variabel, der peger på det. 18 00:00:42,160 --> 00:00:44,870 Så vi har oprettet en variabel med et navn, vi har 19 00:00:44,870 --> 00:00:48,480 skabt en anden variabel med et navn, og vi peger denne anden variabel 20 00:00:48,480 --> 00:00:50,220 på det første. 21 00:00:50,220 --> 00:00:52,370 Denne slags har en problem selv, fordi det 22 00:00:52,370 --> 00:00:54,650 kræver, at vi vide præcis hvor meget hukommelse er vi 23 00:00:54,650 --> 00:00:57,600 vil få brug for i øjeblikket vores program er kompileret. 24 00:00:57,600 --> 00:00:58,220 >> Hvorfor det? 25 00:00:58,220 --> 00:01:03,338 Fordi vi skal være i stand til at navngive eller identificere alle de mulige variabler 26 00:01:03,338 --> 00:01:04,129 vi kan støde på. 27 00:01:04,129 --> 00:01:07,910 Vi har måske et array, der kunne være stand til at holde en masse oplysninger, 28 00:01:07,910 --> 00:01:10,110 men det er stadig ikke præcis præcise nok. 29 00:01:10,110 --> 00:01:12,640 Hvad hvis vi ikke kender, hvad nu hvis vi ikke har nogen idé 30 00:01:12,640 --> 00:01:14,370 hvor meget vi har brug påkompileringstidspunktet? 31 00:01:14,370 --> 00:01:17,020 Eller hvad hvis vores program vil køre for en virkelig lang tid, 32 00:01:17,020 --> 00:01:19,810 acceptere forskellige bruger data, og vi kan ikke rigtig 33 00:01:19,810 --> 00:01:23,170 vurdere, om vi er vil få brug for 1.000 enheder? 34 00:01:23,170 --> 00:01:26,060 >> Det er ikke ligesom vi kan sige på kommandolinjen 35 00:01:26,060 --> 00:01:28,040 indtaste hvor mange elementer du tror, ​​du har brug for. 36 00:01:28,040 --> 00:01:31,100 Nå, hvad hvis det gæt er forkert? 37 00:01:31,100 --> 00:01:34,300 Dynamisk hukommelse tildeling slags giver os vej 38 00:01:34,300 --> 00:01:36,867 at omgå dette problem. 39 00:01:36,867 --> 00:01:38,700 Og den måde, det gør det er ved hjælp af pegepinde. 40 00:01:38,700 --> 00:01:42,140 >> Vi kan bruge pegepinde til få adgang til dynamisk 41 00:01:42,140 --> 00:01:45,710 allokeret hukommelse, hukommelse, der er fordelt som dit program kører. 42 00:01:45,710 --> 00:01:48,290 Det er ikke allokeret påkompileringstidspunktet. 43 00:01:48,290 --> 00:01:51,570 Når du dynamisk allokere hukommelse det kommer fra en pulje 44 00:01:51,570 --> 00:01:53,795 hukommelse kaldet dyngen. 45 00:01:53,795 --> 00:01:56,420 Tidligere al den hukommelse vi har arbejdet med i løbet 46 00:01:56,420 --> 00:01:59,920 har været kommer fra en pulje hukommelse kaldet stablen. 47 00:01:59,920 --> 00:02:02,470 En god måde at generelt holde mind-- og denne regel 48 00:02:02,470 --> 00:02:04,720 ikke altid holder stik, men temmelig meget næsten 49 00:02:04,720 --> 00:02:09,940 altid holder true-- er, at enhver gang du giver et variabelnavn det 50 00:02:09,940 --> 00:02:12,090 sandsynligvis bor på stakken. 51 00:02:12,090 --> 00:02:14,650 Og hver gang du ikke gør give en variabel et navn, 52 00:02:14,650 --> 00:02:19,160 som du kan gøre med dynamisk hukommelse tildeling, den lever på den bunke. 53 00:02:19,160 --> 00:02:22,190 >> Nu er jeg slags præsentere dette som hvis der er disse to puljer af hukommelse. 54 00:02:22,190 --> 00:02:24,740 Men du måske har set denne diagram, som generelt er 55 00:02:24,740 --> 00:02:27,290 en repræsentation af hvad hukommelse ser ud, 56 00:02:27,290 --> 00:02:30,373 og vi kommer ikke til at bekymre sig om alle stuff foroven og forneden. 57 00:02:30,373 --> 00:02:33,580 Hvad vi interesserer os, er denne del i midten her, dynge og stakken. 58 00:02:33,580 --> 00:02:35,570 Som du kan se ved ser på dette diagram, 59 00:02:35,570 --> 00:02:38,390 disse rent faktisk ikke er to separate puljer af hukommelse. 60 00:02:38,390 --> 00:02:42,757 Det er en fælles pool hukommelse hvor du starter, i denne visuelle 61 00:02:42,757 --> 00:02:44,590 du starter i bunden og begynde at fylde op 62 00:02:44,590 --> 00:02:48,040 fra bunden med stakken, og du starte øverst og begynde at fylde 63 00:02:48,040 --> 00:02:50,072 oppefra og ned med bunke. 64 00:02:50,072 --> 00:02:51,780 Men det er virkelig det samme pulje, det er bare 65 00:02:51,780 --> 00:02:56,050 forskellige steder, forskellige steder i hukommelsen, der bliver fordelt. 66 00:02:56,050 --> 00:02:59,060 Og du kan køre ud af hukommelse ved enten at have 67 00:02:59,060 --> 00:03:01,240 dyngen gå hele vejen til bunden, eller har 68 00:03:01,240 --> 00:03:05,440 stakken gå hele vejen til toppen, eller har dyngen og stakken 69 00:03:05,440 --> 00:03:06,740 mødes mod hinanden. 70 00:03:06,740 --> 00:03:09,500 Alle dem kan være betingelser der forårsager dit program 71 00:03:09,500 --> 00:03:11,030 at løbe tør for hukommelse. 72 00:03:11,030 --> 00:03:11,952 Så holder det i tankerne. 73 00:03:11,952 --> 00:03:13,660 Når vi taler om dyngen og stakken 74 00:03:13,660 --> 00:03:17,880 vi virkelig taler om samme generelle chunk hukommelse, lige 75 00:03:17,880 --> 00:03:21,930 forskellige dele af denne hukommelse. 76 00:03:21,930 --> 00:03:24,910 >> Så hvordan får vi dynamisk allokeret hukommelse i første omgang? 77 00:03:24,910 --> 00:03:27,740 Hvordan vores program får hukommelse som det kører? 78 00:03:27,740 --> 00:03:32,660 Nå C indeholder en funktion kaldet malloc, hukommelse fordelingsnøgle, som 79 00:03:32,660 --> 00:03:36,810 du foretage et opkald til, og du passere i hvor mange bytes af hukommelse, som du ønsker. 80 00:03:36,810 --> 00:03:39,940 Så hvis dit program kører og du vil have et heltal runtime, 81 00:03:39,940 --> 00:03:46,040 du måske Mallock fire byte hukommelse, malloc parenteser fire. 82 00:03:46,040 --> 00:03:48,540 >> Mallock vil gå gennem kigge gennem bunke, 83 00:03:48,540 --> 00:03:50,750 fordi vi er dynamisk tildeling af hukommelse, 84 00:03:50,750 --> 00:03:53,500 og det vil vende tilbage til dig en pointer til denne hukommelse. 85 00:03:53,500 --> 00:03:56,180 Det giver dig ikke at memory-- det ikke giver den et navn, 86 00:03:56,180 --> 00:03:57,950 det giver dig en pointer til det. 87 00:03:57,950 --> 00:04:00,780 Og så det er derfor igen sagde jeg at det er vigtigt at måske 88 00:04:00,780 --> 00:04:03,770 har set pejlemærker video før vi kommer for langt ind i dette. 89 00:04:03,770 --> 00:04:05,940 Så malloc kommer til at give dig tilbage en pegepind. 90 00:04:05,940 --> 00:04:08,950 >> Hvis Mallock ikke kan give dig nogen hukommelse, fordi du har kørt ud, 91 00:04:08,950 --> 00:04:10,645 det vil give dig tilbage en null-pointer. 92 00:04:10,645 --> 00:04:15,282 Kan du huske, hvad der sker, hvis vi Prøv og dereference en null pointer? 93 00:04:15,282 --> 00:04:17,019 Vi lider et seg fejl, ikke? 94 00:04:17,019 --> 00:04:18,060 Det er nok ikke godt. 95 00:04:18,060 --> 00:04:21,579 >> Så hver gang du foretager et opkald at malloc du altid, altid 96 00:04:21,579 --> 00:04:25,270 nødt til at tjekke, om den pointer det gav dig tilbage er null. 97 00:04:25,270 --> 00:04:28,800 Hvis det er, du skal ende dit program fordi hvis du prøver og dereference 98 00:04:28,800 --> 00:04:31,360 null pointer du vil til at lide en segmentering fejl 99 00:04:31,360 --> 00:04:34,380 og dit program er kommer til at gå ned alligevel. 100 00:04:34,380 --> 00:04:37,190 Så hvordan gør vi statisk opnå et heltal? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Vi har sikkert gjort, at en masse gange, ikke? 103 00:04:40,010 --> 00:04:43,480 Dette skaber en variabel kaldet x, der bor på stakken. 104 00:04:43,480 --> 00:04:46,190 Hvordan kan vi dynamisk at modtage et heltal? 105 00:04:46,190 --> 00:04:50,010 Int stjerne px lig malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Eller mere hensigtsmæssigt vi ville sige int stjerne px 107 00:04:53,050 --> 00:04:57,680 lig malloc størrelse int, bare at smide nogle færre 108 00:04:57,680 --> 00:04:59,740 magiske tal omkring vores program. 109 00:04:59,740 --> 00:05:04,140 Dette kommer til at opnå for os fire bytes hukommelse fra bunke, 110 00:05:04,140 --> 00:05:06,720 og pointeren vi får tilbage til det kaldes px. 111 00:05:06,720 --> 00:05:08,430 Og så ligesom vi har gjort tidligere vi 112 00:05:08,430 --> 00:05:13,966 kan dereference px til adgang til denne hukommelse. 113 00:05:13,966 --> 00:05:15,590 Hvordan får vi et heltal fra brugeren? 114 00:05:15,590 --> 00:05:17,970 Vi kan sige int x er lig få int. 115 00:05:17,970 --> 00:05:19,930 Det er temmelig ligetil. 116 00:05:19,930 --> 00:05:24,030 Hvad nu, hvis vi ønsker at skabe et array af x flåd, der lever på stakken? 117 00:05:24,030 --> 00:05:28,210 flyde stack_array-- det er navnet af vores array-- firkantede parentes x. 118 00:05:28,210 --> 00:05:32,419 Det vil skabe for os et array af x flåd, der lever på stakken. 119 00:05:32,419 --> 00:05:34,960 Vi kan skabe en række flydere der lever på den bunke, også. 120 00:05:34,960 --> 00:05:37,330 Syntaksen ser måske lidt mere besværligt, 121 00:05:37,330 --> 00:05:41,740 men vi kan sige float stjerne heap_array lig 122 00:05:41,740 --> 00:05:44,360 malloc x gange størrelsen af ​​flyderen. 123 00:05:44,360 --> 00:05:48,160 Jeg har brug for plads nok til at holde x floating point-værdier. 124 00:05:48,160 --> 00:05:51,560 Så siger jeg har brug for 100 flåd, eller 1.000 flåd. 125 00:05:51,560 --> 00:05:54,810 Så i dette tilfælde ville det være 400 bytes for 100 flåd, 126 00:05:54,810 --> 00:05:59,080 eller 4.000 bytes for 1.000 flåd, fordi hver float tager op 127 00:05:59,080 --> 00:06:01,230 fire bytes af plads. 128 00:06:01,230 --> 00:06:05,110 >> Efter at gøre dette, jeg kan bruge firkantede beslag syntaks på heap_array. 129 00:06:05,110 --> 00:06:08,970 Ligesom jeg ville på stack_array, jeg kan få adgang til individuelt dens elementer 130 00:06:08,970 --> 00:06:11,590 ved hjælp heap_array nul, heap_array én. 131 00:06:11,590 --> 00:06:15,800 Men huske årsagen til at vi kan gøre det skyldes, at navnet på et array i C 132 00:06:15,800 --> 00:06:19,990 er virkelig en pegepind til den opstilling første element. 133 00:06:19,990 --> 00:06:23,480 Så det faktum, at vi erklærer en vifte af svømmere på stakken her 134 00:06:23,480 --> 00:06:24,810 er faktisk en smule misvisende. 135 00:06:24,810 --> 00:06:27,600 Vi er virkelig i anden linje kode der 136 00:06:27,600 --> 00:06:32,360 skaber også en pointer til en bid af hukommelse, som vi så gøre noget arbejde med. 137 00:06:32,360 --> 00:06:35,620 >> Her er det store problem med dynamisk allokeret hukommelse selv, 138 00:06:35,620 --> 00:06:38,360 og det er derfor, det er virkelig vigtigt at udvikle nogle gode vaner 139 00:06:38,360 --> 00:06:39,800 når du arbejder med det. 140 00:06:39,800 --> 00:06:43,060 I modsætning til statisk erklæret hukommelse, din hukommelse 141 00:06:43,060 --> 00:06:46,790 ikke automatisk tilbage til system, når din funktion er færdig. 142 00:06:46,790 --> 00:06:49,280 Så hvis vi har vigtigste, og vigtigste kalder en funktion 143 00:06:49,280 --> 00:06:53,860 f, når f finish uanset hvad den gør og returnerer kontrol af programmet 144 00:06:53,860 --> 00:06:58,810 tilbage til main, alle af hukommelsen at f anvendt gives tilbage. 145 00:06:58,810 --> 00:07:01,250 Det kan bruges igen af et andet program, 146 00:07:01,250 --> 00:07:04,250 eller en anden funktion, bliver kaldt senere i main. 147 00:07:04,250 --> 00:07:06,970 Det kan bruge den samme hukommelse igen. 148 00:07:06,970 --> 00:07:09,620 >> Hvis du dynamisk allokere hukommelse selv 149 00:07:09,620 --> 00:07:14,380 du er nødt til eksplicit at fortælle system, som du er færdig med det. 150 00:07:14,380 --> 00:07:18,370 Det vil holde på det for dig, som kunne føre til et problem af jer løbe ud 151 00:07:18,370 --> 00:07:19,290 hukommelse. 152 00:07:19,290 --> 00:07:22,179 Og i virkeligheden vi nogle gange henvise til dette som en hukommelsesfejl. 153 00:07:22,179 --> 00:07:24,970 Og undertiden disse hukommelseslækager kan faktisk være virkelig ødelæggende 154 00:07:24,970 --> 00:07:27,020 for systemydelse. 155 00:07:27,020 --> 00:07:31,120 >> Hvis du er en hyppig internetbruger du kan bruge visse webbrowsere, 156 00:07:31,120 --> 00:07:35,630 og jeg vil ikke nævne navne her, men der er nogle webbrowsere derude 157 00:07:35,630 --> 00:07:39,150 der er berygtet for faktisk at have memory leaks, der ikke få fast. 158 00:07:39,150 --> 00:07:44,570 Og hvis du lader din browser åben for en meget lang periode, dage 159 00:07:44,570 --> 00:07:48,060 og dage, eller uger, du nogle gange måske bemærke, at dit system 160 00:07:48,060 --> 00:07:49,790 kører virkelig, virkelig langsomt. 161 00:07:49,790 --> 00:07:54,640 Og grunden til det er, at browseren har afsat hukommelse, 162 00:07:54,640 --> 00:07:57,320 men så ikke fortalt systemet at det er gjort med det. 163 00:07:57,320 --> 00:08:01,000 Og så efterlader mindre hukommelse tilgængelig for alle dine andre programmer 164 00:08:01,000 --> 00:08:04,480 at skulle dele, fordi du er leaking-- at web browser 165 00:08:04,480 --> 00:08:06,755 Programmet er utæt hukommelse. 166 00:08:06,755 --> 00:08:08,880 Hvordan giver vi hukommelse tilbage når vi er færdig med den? 167 00:08:08,880 --> 00:08:10,838 Nå heldigvis er det en meget let måde at gøre det. 168 00:08:10,838 --> 00:08:11,710 Vi har lige frigøre det. 169 00:08:11,710 --> 00:08:15,020 Der er en funktion kaldet fri, den accepterer en pegepind til hukommelsen, 170 00:08:15,020 --> 00:08:16,010 og vi er gode til at gå. 171 00:08:16,010 --> 00:08:18,310 >> Så lad os sige, vi er i midt i vores program, 172 00:08:18,310 --> 00:08:21,970 vi ønsker at malloc 50 tegn. 173 00:08:21,970 --> 00:08:25,710 Vi ønsker at allokere et array, der kan stand til at holde 50 tegn. 174 00:08:25,710 --> 00:08:29,109 Og når vi får en pointer tilbage til at, det pointer navn er ord. 175 00:08:29,109 --> 00:08:30,900 Vi gør, hvad vi er vil gøre med ord, 176 00:08:30,900 --> 00:08:33,440 og så når vi er gjort vi bare frigøre det. 177 00:08:33,440 --> 00:08:37,460 Og nu har vi vendt tilbage dem 50 bytes hukommelse tilbage til systemet. 178 00:08:37,460 --> 00:08:40,147 En anden funktion kan bruge dem. 179 00:08:40,147 --> 00:08:43,480 Vi behøver ikke at bekymre dig om at lide et hukommelsesfejl fordi vi har befriet ord. 180 00:08:43,480 --> 00:08:46,639 Vi har givet hukommelsen tilbage, så vi er færdig at arbejde med det. 181 00:08:46,639 --> 00:08:48,430 Så der er tre gyldne regler, der bør 182 00:08:48,430 --> 00:08:51,700 holdes for øje, når du er dynamisk allokering hukommelse 183 00:08:51,700 --> 00:08:52,990 med malloc. 184 00:08:52,990 --> 00:08:56,480 Hver blok af hukommelse, du malloc skal frigøres 185 00:08:56,480 --> 00:08:58,430 før dit program er færdig kører. 186 00:08:58,430 --> 00:09:02,029 Nu igen, i apparatet eller i IDE denne slags sker for dig alligevel 187 00:09:02,029 --> 00:09:04,820 når du-- dette vil ske alligevel når dit program er afsluttet, 188 00:09:04,820 --> 00:09:06,880 alle hukommelsen vil blive frigivet. 189 00:09:06,880 --> 00:09:10,750 Men det er generelt god kodning praksis altid, når du er færdig, 190 00:09:10,750 --> 00:09:13,810 frigøre hvad du har mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Det er sagt, eneste ting, du har mallocd bør befries. 192 00:09:16,690 --> 00:09:19,880 Hvis du statisk erklære en heltal, int x semikolon, 193 00:09:19,880 --> 00:09:23,500 der lever på stakken, du ikke så ønsker at frigøre x. 194 00:09:23,500 --> 00:09:25,970 Så eneste ting, som du har mallocd bør befries. 195 00:09:25,970 --> 00:09:28,960 >> Og endelig, ikke gratis noget to gange. 196 00:09:28,960 --> 00:09:31,170 Der kan føre til anden underlig situation. 197 00:09:31,170 --> 00:09:33,530 Så alt, hvad du har mallocd skal frigøres. 198 00:09:33,530 --> 00:09:36,000 Kun ting, som du har malloc bør befries. 199 00:09:36,000 --> 00:09:38,730 Og gør ikke gratis noget to gange. 200 00:09:38,730 --> 00:09:43,660 >> Så lad os gå gennem et eksempel her af, hvad nogle dynamisk allokeret 201 00:09:43,660 --> 00:09:46,122 hukommelse kunne ligne blandet i med nogle statisk hukommelse. 202 00:09:46,122 --> 00:09:47,080 Hvad der kan ske her? 203 00:09:47,080 --> 00:09:48,913 Se om du kan følge sammen og gæt, hvad der er 204 00:09:48,913 --> 00:09:51,720 kommer til at ske, når vi går gennem alle disse linjer kode. 205 00:09:51,720 --> 00:09:53,980 >> Så vi siger int m. 206 00:09:53,980 --> 00:09:54,840 Hvad sker der her? 207 00:09:54,840 --> 00:09:56,339 Nå det er temmelig ligetil. 208 00:09:56,339 --> 00:09:59,650 Jeg skaber et heltal variabel kaldet m. 209 00:09:59,650 --> 00:10:01,400 Jeg farve det grønne, fordi det er den farve 210 00:10:01,400 --> 00:10:03,730 at jeg bruger, når jeg taler om heltalsvariabler. 211 00:10:03,730 --> 00:10:05,160 Det er en kasse. 212 00:10:05,160 --> 00:10:08,400 Det kaldes m, og du kan gemme heltal inde i den. 213 00:10:08,400 --> 00:10:12,400 >> Hvad hvis jeg så sige int stjerne en? 214 00:10:12,400 --> 00:10:13,530 Nå det er temmelig ens. 215 00:10:13,530 --> 00:10:15,780 Jeg skaber en kasse kaldes en. 216 00:10:15,780 --> 00:10:19,100 Det er stand til at holde int stjerner, pegepinde til heltal. 217 00:10:19,100 --> 00:10:21,570 Så jeg farve det grønne-ish så godt. 218 00:10:21,570 --> 00:10:24,140 >> Jeg ved, det har noget at gøre med et heltal, 219 00:10:24,140 --> 00:10:25,852 men det er ikke i sig selv et heltal. 220 00:10:25,852 --> 00:10:27,310 Men det er stort set den samme idé. 221 00:10:27,310 --> 00:10:28,101 Jeg har oprettet en kasse. 222 00:10:28,101 --> 00:10:30,070 Begge disse ret nu bor på stakken. 223 00:10:30,070 --> 00:10:32,520 Jeg har givet dem begge navne. 224 00:10:32,520 --> 00:10:36,750 >> int stjerne b lig malloc størrelse int. 225 00:10:36,750 --> 00:10:38,560 Denne ene kan være lidt tricky. 226 00:10:38,560 --> 00:10:44,110 Tag en anden og tænke over, hvad du ville forvente at ske på dette diagram. 227 00:10:44,110 --> 00:10:50,210 int stjerne b lig malloc størrelse int. 228 00:10:50,210 --> 00:10:51,940 >> Nå dette ikke bare oprette en boks. 229 00:10:51,940 --> 00:10:53,800 Dette faktisk opretter to bokse. 230 00:10:53,800 --> 00:10:58,670 Og det binder det også etablerer et punkt i et forhold. 231 00:10:58,670 --> 00:11:02,240 Vi har afsat en blok hukommelse på bunke. 232 00:11:02,240 --> 00:11:05,940 Bemærk at det øverste højre boks der ikke har et navn. 233 00:11:05,940 --> 00:11:06,760 >> Vi mallocd det. 234 00:11:06,760 --> 00:11:08,050 Det findes på den bunke. 235 00:11:08,050 --> 00:11:10,090 Men b har et navn. 236 00:11:10,090 --> 00:11:11,950 Det er en pointer variabel kaldet b. 237 00:11:11,950 --> 00:11:13,910 Der lever på stakken. 238 00:11:13,910 --> 00:11:18,250 >> Så det er et stykke af hukommelse der peger på en anden. 239 00:11:18,250 --> 00:11:21,840 b indeholder adressen af denne blok hukommelse. 240 00:11:21,840 --> 00:11:23,757 Det har ikke et navn andet. 241 00:11:23,757 --> 00:11:24,590 Men den peger på den. 242 00:11:24,590 --> 00:11:29,760 Så når vi siger int stjerne b lig malloc størrelse int, at lige der, 243 00:11:29,760 --> 00:11:33,490 at pil, der dukkede op på højre side er der, det hele, 244 00:11:33,490 --> 00:11:36,740 Jeg vil gerne have det ud igen, er, hvad der sker. 245 00:11:36,740 --> 00:11:39,341 Alt dette sker i at eneste linje kode. 246 00:11:39,341 --> 00:11:41,340 Nu får vi lidt mere ligetil igen. 247 00:11:41,340 --> 00:11:43,330 et lig tegnet m. 248 00:11:43,330 --> 00:11:46,280 Kan du huske, hvad en lig tegnet m er? 249 00:11:46,280 --> 00:11:48,920 Tja, der er en får m adresse. 250 00:11:48,920 --> 00:11:54,150 Eller sagt mere skematisk, a peger på m. 251 00:11:54,150 --> 00:11:56,360 >> a er lig med b. 252 00:11:56,360 --> 00:11:57,560 OK, så her er en anden. 253 00:11:57,560 --> 00:11:59,230 A er lig med b. 254 00:11:59,230 --> 00:12:02,260 Hvad kommer til at ske til diagrammet denne gang? 255 00:12:02,260 --> 00:12:04,330 >> Nå minde om, at tildelingsoperatoren værker 256 00:12:04,330 --> 00:12:08,960 ved at tildele værdien på ret til værdien til venstre. 257 00:12:08,960 --> 00:12:14,820 Så i stedet for en pegende til m, en nu peger på det samme sted, b point. 258 00:12:14,820 --> 00:12:18,900 en ikke pege på B, A peger hvor b point. 259 00:12:18,900 --> 00:12:25,280 >> Hvis en spids til b, som ville har været en lig tegnet b. 260 00:12:25,280 --> 00:12:28,150 Men i stedet en lig b bare betyder, at og b er nu 261 00:12:28,150 --> 00:12:31,770 peger på den samme adresse, fordi indersiden af ​​b er blot en adresse. 262 00:12:31,770 --> 00:12:35,004 Og nu inde i en er den samme adresse. 263 00:12:35,004 --> 00:12:37,170 m er lig med 10, formentlig den mest ligefremme ting 264 00:12:37,170 --> 00:12:38,690 vi har gjort i en lille smule. 265 00:12:38,690 --> 00:12:40,460 Sæt 10 i boksen. 266 00:12:40,460 --> 00:12:45,640 Stjerne b er lig m plus 2, husker fra vores pejlemærker video hvad stjerne b betyder. 267 00:12:45,640 --> 00:12:50,230 Vi kommer til at dereference b og put vis værdi i at hukommelsesplads. 268 00:12:50,230 --> 00:12:51,860 I dette tilfælde 12. 269 00:12:51,860 --> 00:12:55,300 >> Så når vi dereference et punkt husker vi bare rejse ned pilen. 270 00:12:55,300 --> 00:12:58,205 Eller sagt på en anden måde, vi gå til at hukommelsen adresse 271 00:12:58,205 --> 00:12:59,580 og vi manipulere den på en eller anden måde. 272 00:12:59,580 --> 00:13:00,830 Vi sætter en vis værdi derinde. 273 00:13:00,830 --> 00:13:03,960 I dette tilfælde stjerne b lig m plus 2 er lige 274 00:13:03,960 --> 00:13:08,230 gå til den variable peget på af b, gå til hukommelsen peget på af b, 275 00:13:08,230 --> 00:13:11,750 og sætte m plus 2 derinde, 12. 276 00:13:11,750 --> 00:13:14,970 >> Nu jeg fri b. 277 00:13:14,970 --> 00:13:16,490 Hvad sker der, når jeg fri b? 278 00:13:16,490 --> 00:13:18,800 Husk, hvad jeg sagde frie midler. 279 00:13:18,800 --> 00:13:21,920 Hvad skal jeg sige, når jeg fri b? 280 00:13:21,920 --> 00:13:23,410 >> Jeg er færdig at arbejde med det, ikke? 281 00:13:23,410 --> 00:13:25,702 Jeg hovedsagelig opgive hukommelsen. 282 00:13:25,702 --> 00:13:26,910 Jeg giver den tilbage til systemet. 283 00:13:26,910 --> 00:13:33,010 Jeg har ikke brug for dette længere er hvad jeg fortæller dem, OK? 284 00:13:33,010 --> 00:13:37,390 >> Nu, hvis jeg siger stjerne en lig 11 kan du sikkert 285 00:13:37,390 --> 00:13:40,460 allerede fortælle, at noget slemt kommer til at ske her, ikke? 286 00:13:40,460 --> 00:13:44,160 Og faktisk, hvis jeg forsøgte at jeg nok ville lide en segmentering fejl. 287 00:13:44,160 --> 00:13:47,140 Fordi nu, selv om tidligere, at bid af hukommelse 288 00:13:47,140 --> 00:13:50,220 var noget, som jeg havde adgang til, på dette tidspunkt 289 00:13:50,220 --> 00:13:54,590 nu er jeg adgang til hukommelse, er ikke lovligt for mig at få adgang til. 290 00:13:54,590 --> 00:13:57,330 >> Og som vi vil sandsynligvis husker, når vi adgang hukommelse 291 00:13:57,330 --> 00:14:00,000 at vi ikke er formodes at røre, det er den mest almindelige årsag 292 00:14:00,000 --> 00:14:01,860 af en segmentering fejl. Og så mit program 293 00:14:01,860 --> 00:14:05,170 ville gå ned, hvis jeg forsøgte at gøre dette. 294 00:14:05,170 --> 00:14:09,910 Så igen er det en god idé at få god praksis og gode vaner indgroet 295 00:14:09,910 --> 00:14:12,920 når du arbejder med malloc og fri, så du ikke lider segmentering 296 00:14:12,920 --> 00:14:15,310 fejl, og at du bruger din dynamisk allokeret 297 00:14:15,310 --> 00:14:17,370 hukommelse ansvarligt. 298 00:14:17,370 --> 00:14:20,300 >> Jeg er Doug Lloyd dette er CS50. 299 00:14:20,300 --> 00:14:21,947