1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [Muziek] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: OK dus een suggestie voordat ik hier beginnen. 5 00:00:07,940 --> 00:00:11,660 Als je de video op niet hebben bekeken pointers je zou willen dat eerst doen. 6 00:00:11,660 --> 00:00:15,860 Omdat deze video is een ander manier van werken met pointers. 7 00:00:15,860 --> 00:00:17,574 >> Dus het gaat om te praten over enkele concepten 8 00:00:17,574 --> 00:00:19,490 dat we gaan in de pointers video, en we zijn 9 00:00:19,490 --> 00:00:21,948 ga verdoezelen hen nu, in de veronderstelling dat ze al 10 00:00:21,948 --> 00:00:23,090 soort van begreep. 11 00:00:23,090 --> 00:00:25,440 Dus dat is gewoon je eerlijke waarschuwing dat als je ziet je deze video 12 00:00:25,440 --> 00:00:27,814 en je hebt niet gezien de pointers video, is het misschien een soort van 13 00:00:27,814 --> 00:00:29,610 vliegen over je hoofd een beetje. 14 00:00:29,610 --> 00:00:32,080 En zo zou het beter zijn om hem te bekijken in die volgorde. 15 00:00:32,080 --> 00:00:34,710 >> Dus we hebben al gezien een manier om te werken met pointers, 16 00:00:34,710 --> 00:00:37,810 die verklaren wij een variabele, en dan hebben we 17 00:00:37,810 --> 00:00:42,160 verklaart een andere variabele, een pointer variabele die verwijst naar het. 18 00:00:42,160 --> 00:00:44,870 Dus we hebben gemaakt een variabele met een naam, we hebben 19 00:00:44,870 --> 00:00:48,480 creëerde een tweede variabele met een naam, en wij wijzen dat tweede variabele 20 00:00:48,480 --> 00:00:50,220 op die eerste. 21 00:00:50,220 --> 00:00:52,370 Deze soort heeft een probleem, omdat het 22 00:00:52,370 --> 00:00:54,650 moeten we precies weten hoeveel geheugen we 23 00:00:54,650 --> 00:00:57,600 gaan naar het moment nodig ons programma is samengesteld. 24 00:00:57,600 --> 00:00:58,220 >> Waarom is dat? 25 00:00:58,220 --> 00:01:03,338 Want we moeten in staat zijn om een ​​naam of identificeren van alle mogelijke variabelen 26 00:01:03,338 --> 00:01:04,129 we zouden kunnen tegenkomen. 27 00:01:04,129 --> 00:01:07,910 We kunnen een array die mogelijk zijn in staat om veel informatie te houden, 28 00:01:07,910 --> 00:01:10,110 maar het is nog steeds niet precies nauwkeurig genoeg. 29 00:01:10,110 --> 00:01:12,640 Wat als we niet weten, wat als we hebben geen idee 30 00:01:12,640 --> 00:01:14,370 hoeveel we nodig hebt tijdens het compileren? 31 00:01:14,370 --> 00:01:17,020 Of wat als ons programma lopen voor een heel lange tijd, 32 00:01:17,020 --> 00:01:19,810 aanvaarden van verschillende gebruikersgroepen data, en we kunnen niet echt 33 00:01:19,810 --> 00:01:23,170 schatten of we zijn naar 1.000 eenheden moeten? 34 00:01:23,170 --> 00:01:26,060 >> Het is niet alsof we kunnen zeggen op de opdrachtregel 35 00:01:26,060 --> 00:01:28,040 voer hoeveel items je denkt dat je nodig hebt. 36 00:01:28,040 --> 00:01:31,100 Nou wat als die gok is verkeerd? 37 00:01:31,100 --> 00:01:34,300 Dynamische toewijzing van geheugen soort laat ons de weg 38 00:01:34,300 --> 00:01:36,867 om rond dit specifieke probleem. 39 00:01:36,867 --> 00:01:38,700 En de manier waarop het doet het is met behulp van pointers. 40 00:01:38,700 --> 00:01:42,140 >> We kunnen pointers te gebruiken krijg toegang tot dynamisch 41 00:01:42,140 --> 00:01:45,710 toegewezen geheugen, geheugen dat als je programma toegewezen wordt uitgevoerd. 42 00:01:45,710 --> 00:01:48,290 Het is tijdens het compileren niet toegewezen. 43 00:01:48,290 --> 00:01:51,570 Wanneer u dynamisch toewijzen geheugen het komt uit een pool 44 00:01:51,570 --> 00:01:53,795 geheugen zogenaamde heap. 45 00:01:53,795 --> 00:01:56,420 Eerder al het geheugen we hebben gewerkt met in de loop 46 00:01:56,420 --> 00:01:59,920 is afkomstig van een pool geheugen zogenaamde stack. 47 00:01:59,920 --> 00:02:02,470 Een goede manier om in het algemeen in mind-- en deze regel houden 48 00:02:02,470 --> 00:02:04,720 niet altijd opgaat, maar vrij veel bijna 49 00:02:04,720 --> 00:02:09,940 altijd geldt true-- is dat keer dat u een variabele naam geven 50 00:02:09,940 --> 00:02:12,090 Waarschijnlijk woont op de stapel. 51 00:02:12,090 --> 00:02:14,650 En elke keer dat je niet geven een variabele een naam, 52 00:02:14,650 --> 00:02:19,160 die je kunt doen met dynamisch geheugen toewijzing, het leeft op de heap. 53 00:02:19,160 --> 00:02:22,190 >> Nu ben ik soort presenteren dit als als er deze twee pools geheugen. 54 00:02:22,190 --> 00:02:24,740 Maar u kunt dit hebt gezien diagram, die over het algemeen 55 00:02:24,740 --> 00:02:27,290 een representatie van wat geheugen eruit ziet, 56 00:02:27,290 --> 00:02:30,373 en we zijn niet van plan om over alle zorg het materiaal aan de bovenkant en de onderkant. 57 00:02:30,373 --> 00:02:33,580 Wat we zorg over is dit deel in het midden hier, hoop en stack. 58 00:02:33,580 --> 00:02:35,570 Zoals je kunt zien door bekijken dit diagram, 59 00:02:35,570 --> 00:02:38,390 deze eigenlijk niet twee afzonderlijke pools van het geheugen. 60 00:02:38,390 --> 00:02:42,757 Het is een gemeenschappelijk zwembad van het geheugen waar je begint, in deze visuele 61 00:02:42,757 --> 00:02:44,590 je begint aan de onderkant en start vullen 62 00:02:44,590 --> 00:02:48,040 vanaf de bodem van de stapel, en u beginnen bovenaan start opvullen 63 00:02:48,040 --> 00:02:50,072 van boven naar beneden met de heap. 64 00:02:50,072 --> 00:02:51,780 Maar het is echt de hetzelfde zwembad, het is gewoon 65 00:02:51,780 --> 00:02:56,050 verschillende vlekken, verschillende locaties geheugen dat wordt toegewezen. 66 00:02:56,050 --> 00:02:59,060 En je kunt uit te voeren geheugen door een van beide het hebben 67 00:02:59,060 --> 00:03:01,240 de hoop de hele weg naar de bodem, of 68 00:03:01,240 --> 00:03:05,440 de stapel gaan de hele weg naar de top, of het hebben van de hoop en de stapel 69 00:03:05,440 --> 00:03:06,740 ontmoeten tegen elkaar. 70 00:03:06,740 --> 00:03:09,500 Al deze voorwaarden kunnen worden dat je programma veroorzaken 71 00:03:09,500 --> 00:03:11,030 uit het geheugen te lopen. 72 00:03:11,030 --> 00:03:11,952 Dus hou dat in gedachten. 73 00:03:11,952 --> 00:03:13,660 Wanneer we praten over de hoop en de stapel 74 00:03:13,660 --> 00:03:17,880 we echt praten over het dezelfde algemene brok van geheugen, 75 00:03:17,880 --> 00:03:21,930 verschillende delen van dat geheugen. 76 00:03:21,930 --> 00:03:24,910 >> Dus hoe krijgen we dynamisch geheugen toegewezen in de eerste plaats? 77 00:03:24,910 --> 00:03:27,740 Hoe werkt ons programma te krijgen geheugen als het draait? 78 00:03:27,740 --> 00:03:32,660 Goed C bevat een functie genaamd malloc, geheugen allocator, die 79 00:03:32,660 --> 00:03:36,810 u een gesprek te maken, en je passeert in hoeveel bytes van het geheugen dat u wilt. 80 00:03:36,810 --> 00:03:39,940 Dus als je programma draait en u wilt een integer runtime, 81 00:03:39,940 --> 00:03:46,040 je zou Mallock vier bytes geheugen, malloc haakjes vier. 82 00:03:46,040 --> 00:03:48,540 >> Mallock zal gaan door kijken door de hoop, 83 00:03:48,540 --> 00:03:50,750 omdat we dynamisch toewijzen van geheugen, 84 00:03:50,750 --> 00:03:53,500 en het zal aan u terug een pointer naar dat geheugen. 85 00:03:53,500 --> 00:03:56,180 Het geeft je niet dat memory-- het niet geef het een naam, 86 00:03:56,180 --> 00:03:57,950 het geeft je een verwijzing naar het. 87 00:03:57,950 --> 00:04:00,780 En dus dat is waarom weer zei ik dat het belangrijk is om misschien 88 00:04:00,780 --> 00:04:03,770 de pointers video hebben bekeken voordat we te ver in dit. 89 00:04:03,770 --> 00:04:05,940 Dus malloc gaat geef je terug een pointer. 90 00:04:05,940 --> 00:04:08,950 >> Als Mallock u geen kunt geven geheugen omdat je uit hebt draaien, 91 00:04:08,950 --> 00:04:10,645 het zal u terug een null pointer. 92 00:04:10,645 --> 00:04:15,282 Weet je nog wat er gebeurt als we proberen en dereference een null pointer? 93 00:04:15,282 --> 00:04:17,019 We lijden aan een seg fout, toch? 94 00:04:17,019 --> 00:04:18,060 Dat is waarschijnlijk niet goed. 95 00:04:18,060 --> 00:04:21,579 >> Dus elke keer dat u belt u altijd malloc, altijd 96 00:04:21,579 --> 00:04:25,270 moet controleren of de pointer gaf je terug null. 97 00:04:25,270 --> 00:04:28,800 Als het is, moet u uw programma te beëindigen want als je probeert en dereferentie 98 00:04:28,800 --> 00:04:31,360 de null pointer je gaat een segmentation fault lijden 99 00:04:31,360 --> 00:04:34,380 en uw programma is ga toch crashen. 100 00:04:34,380 --> 00:04:37,190 Dus hoe kunnen we statisch krijgen een geheel getal? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 We hebben waarschijnlijk gedaan een paar keer, toch? 103 00:04:40,010 --> 00:04:43,480 Dit creëert een variabele genaamd x die leeft op de stapel. 104 00:04:43,480 --> 00:04:46,190 Hoe kunnen we dynamisch een integer te krijgen? 105 00:04:46,190 --> 00:04:50,010 Int ster px gelijk aan malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Of meer naar behoren we zouden zeggen int ster px 107 00:04:53,050 --> 00:04:57,680 gelijk aan malloc grootte van int, gewoon om wat minder te gooien 108 00:04:57,680 --> 00:04:59,740 magische getallen rond ons programma. 109 00:04:59,740 --> 00:05:04,140 Dit gaat te verkrijgen voor ons vier bytes van het geheugen van de hoop, 110 00:05:04,140 --> 00:05:06,720 en de wijzer krijgen we terug naar het heet px. 111 00:05:06,720 --> 00:05:08,430 En dan gewoon zoals we hebben eerder gedaan wij 112 00:05:08,430 --> 00:05:13,966 kan dereferentie px aan toegang tot die herinnering. 113 00:05:13,966 --> 00:05:15,590 Hoe krijgen we een geheel getal van de gebruiker? 114 00:05:15,590 --> 00:05:17,970 We kunnen zeggen int x gelijk krijgen int. 115 00:05:17,970 --> 00:05:19,930 Dat is vrij eenvoudig. 116 00:05:19,930 --> 00:05:24,030 Wat als we willen een array x van praalwagens die leven op de stapel? 117 00:05:24,030 --> 00:05:28,210 zweven stack_array-- dat is de naam van onze array-- vierkante haken x. 118 00:05:28,210 --> 00:05:32,419 Dat zal creëren voor ons een array x van praalwagens die leven op de stapel. 119 00:05:32,419 --> 00:05:34,960 We kunnen een scala van praalwagens creëren die leeft op de hoop, ook. 120 00:05:34,960 --> 00:05:37,330 De syntaxis ziet er misschien een beetje meer omslachtig, 121 00:05:37,330 --> 00:05:41,740 maar we kunnen zeggen float ster heap_array gelijk 122 00:05:41,740 --> 00:05:44,360 malloc x keer de grootte van de vlotter. 123 00:05:44,360 --> 00:05:48,160 Ik moet genoeg ruimte om vast te houden x floating point waarden. 124 00:05:48,160 --> 00:05:51,560 Dus zeg ik moet 100 drijvers, of 1000 praalwagens. 125 00:05:51,560 --> 00:05:54,810 Dus in dat geval zou zijn 400 bytes 100 drijvers, 126 00:05:54,810 --> 00:05:59,080 of 4000 bytes 1000 floats, omdat elke vlotter neemt 127 00:05:59,080 --> 00:06:01,230 vier bytes van de ruimte. 128 00:06:01,230 --> 00:06:05,110 >> Na dit te doen kan ik gebruik maken van de square bracket syntax op heap_array. 129 00:06:05,110 --> 00:06:08,970 Net zoals ik zou doen op stack_array, I kunnen de elementen individueel toegang 130 00:06:08,970 --> 00:06:11,590 gebruik heap_array nul heap_array één. 131 00:06:11,590 --> 00:06:15,800 Maar herinneren aan de reden kunnen we dat doen is omdat de naam van een array in C 132 00:06:15,800 --> 00:06:19,990 is echt een verwijzing naar van die array eerste element. 133 00:06:19,990 --> 00:06:23,480 Dus het feit dat we verklaren een scala van praalwagens op de stapel hier 134 00:06:23,480 --> 00:06:24,810 is eigenlijk een beetje misleidend. 135 00:06:24,810 --> 00:06:27,600 We zijn echt in de tweede regel code er 136 00:06:27,600 --> 00:06:32,360 Ook het creëren van een verwijzing naar een stuk van geheugen dat we nog wat werk aan te doen. 137 00:06:32,360 --> 00:06:35,620 >> Hier is het grote probleem met dynamisch toegewezen geheugen hoewel, 138 00:06:35,620 --> 00:06:38,360 en dit is waarom het is echt het belangrijk om een ​​aantal goede gewoonten te ontwikkelen 139 00:06:38,360 --> 00:06:39,800 wanneer u werkt met het. 140 00:06:39,800 --> 00:06:43,060 In tegenstelling tot statisch verklaard geheugen, uw geheugen 141 00:06:43,060 --> 00:06:46,790 niet automatisch terugkeren naar de systeem wanneer uw functie wordt gedaan. 142 00:06:46,790 --> 00:06:49,280 Dus als we de belangrijkste, en belangrijkste noemt een functie 143 00:06:49,280 --> 00:06:53,860 f, wanneer f afwerking wat het doet en geeft de controle van het programma 144 00:06:53,860 --> 00:06:58,810 terug naar de belangrijkste, al het geheugen dat f gebruikt wordt terug gegeven. 145 00:06:58,810 --> 00:07:01,250 Het kan weer worden gebruikt door een ander programma, 146 00:07:01,250 --> 00:07:04,250 of een andere functie die wordt aangeroepen later op in de belangrijkste. 147 00:07:04,250 --> 00:07:06,970 Het kan dat hetzelfde geheugen opnieuw gebruiken voorbij. 148 00:07:06,970 --> 00:07:09,620 >> Als u dynamisch geheugen toewijzen al 149 00:07:09,620 --> 00:07:14,380 moet u expliciet zeggen de systeem dat je klaar bent met het. 150 00:07:14,380 --> 00:07:18,370 Het zal vast te houden voor u, die kan leiden tot een probleem van je opraken 151 00:07:18,370 --> 00:07:19,290 geheugen. 152 00:07:19,290 --> 00:07:22,179 En in feite we soms verwijzen om dit als een geheugenlek. 153 00:07:22,179 --> 00:07:24,970 En soms zijn deze geheugenlekken eigenlijk kan echt verwoestende 154 00:07:24,970 --> 00:07:27,020 voor de systeemprestaties. 155 00:07:27,020 --> 00:07:31,120 >> Als u een frequente gebruiker van internet je zou het gebruik van bepaalde webbrowsers, 156 00:07:31,120 --> 00:07:35,630 en ik zal hier niet de namen noemen, maar er zijn een aantal webbrowsers die er zijn 157 00:07:35,630 --> 00:07:39,150 die berucht voor het daadwerkelijk te hebben zijn geheugenlekken die niet opgelost. 158 00:07:39,150 --> 00:07:44,570 En als u uw browser geopend voor een zeer lange tijd, dag 159 00:07:44,570 --> 00:07:48,060 en dagen of weken, je soms misschien merken dat uw systeem 160 00:07:48,060 --> 00:07:49,790 is het uitvoeren van heel, heel langzaam. 161 00:07:49,790 --> 00:07:54,640 De reden daarvoor is dat de browser heeft geheugen toegewezen, 162 00:07:54,640 --> 00:07:57,320 maar dan niet het systeem te horen dat het is gedaan met het. 163 00:07:57,320 --> 00:08:01,000 En zo dat minder geheugen verlaat beschikbaar voor al uw andere programma's 164 00:08:01,000 --> 00:08:04,480 te hebben om te delen, omdat je leaking-- dat webbrowser 165 00:08:04,480 --> 00:08:06,755 programma lekt geheugen. 166 00:08:06,755 --> 00:08:08,880 Hoe geven we het geheugen terug als we klaar zijn met het? 167 00:08:08,880 --> 00:08:10,838 Nou gelukkig is het een zeer eenvoudige manier om het te doen. 168 00:08:10,838 --> 00:08:11,710 We bevrijden het gewoon. 169 00:08:11,710 --> 00:08:15,020 Er is een gratis functie genaamd, het een pointer accepteert naar het geheugen, 170 00:08:15,020 --> 00:08:16,010 en we zijn goed om te gaan. 171 00:08:16,010 --> 00:08:18,310 >> Dus laten we zeggen dat we in de midden van ons programma, 172 00:08:18,310 --> 00:08:21,970 we willen 50 tekens malloc. 173 00:08:21,970 --> 00:08:25,710 We willen een array die kunnen malloc staat van het bedrijf 50 tekens. 174 00:08:25,710 --> 00:08:29,109 En als we een pointer terug naar dat de naam van die wijzer woord. 175 00:08:29,109 --> 00:08:30,900 We doen wat we zijn gaan doen met woord, 176 00:08:30,900 --> 00:08:33,440 en toen we doen we vrij het gewoon. 177 00:08:33,440 --> 00:08:37,460 En nu hebben we terug die 50 bytes geheugen naar het systeem. 178 00:08:37,460 --> 00:08:40,147 Enkele andere functie kunt gebruiken. 179 00:08:40,147 --> 00:08:43,480 We hebben geen zorgen te maken over het lijden van een geheugenlek omdat we hebben woord bevrijd. 180 00:08:43,480 --> 00:08:46,639 We hebben het geheugen teruggegeven, dus we zijn klaar ermee werken. 181 00:08:46,639 --> 00:08:48,430 Er zijn dus drie gouden regels die moeten 182 00:08:48,430 --> 00:08:51,700 in het achterhoofd worden gehouden wanneer u bent dynamisch toewijzen van geheugen 183 00:08:51,700 --> 00:08:52,990 met malloc. 184 00:08:52,990 --> 00:08:56,480 Elk blok van het geheugen dat je moet malloc worden bevrijd 185 00:08:56,480 --> 00:08:58,430 voordat het programma klaar is uitgevoerd. 186 00:08:58,430 --> 00:09:02,029 Nu weer in het toestel of in de IDE dit soort gebeurt je toch 187 00:09:02,029 --> 00:09:04,820 wanneer u-- dit toch zal gebeuren wanneer het programma wordt beëindigd, 188 00:09:04,820 --> 00:09:06,880 al het geheugen zal worden vrijgegeven. 189 00:09:06,880 --> 00:09:10,750 Maar het is over het algemeen goed codering gewoonte om altijd, als je klaar bent, 190 00:09:10,750 --> 00:09:13,810 bevrijden wat je hebt mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Dat gezegd hebbende, enige dingen die je hebt mallocd moet worden bevrijd. 192 00:09:16,690 --> 00:09:19,880 Als u statisch verklaart een integer, int x puntkomma, 193 00:09:19,880 --> 00:09:23,500 die leeft op de stapel, u niet dan willen bevrijden x. 194 00:09:23,500 --> 00:09:25,970 Dus alleen de dingen die je hebt mallocd moeten worden bevrijd. 195 00:09:25,970 --> 00:09:28,960 >> En tot slot, niet vrij iets tweemaal. 196 00:09:28,960 --> 00:09:31,170 Dat kan leiden tot andere rare situatie. 197 00:09:31,170 --> 00:09:33,530 Dus alles wat je hebt mallocd moet worden bevrijd. 198 00:09:33,530 --> 00:09:36,000 Enige dingen die je hebt malloc moeten worden bevrijd. 199 00:09:36,000 --> 00:09:38,730 En doe niet vrij iets tweemaal. 200 00:09:38,730 --> 00:09:43,660 >> Dus laten we gaan door middel van een voorbeeld hier van wat sommige dynamisch toegewezen 201 00:09:43,660 --> 00:09:46,122 geheugen eruit zou kunnen zien gemengde in enkele statisch geheugen. 202 00:09:46,122 --> 00:09:47,080 Wat kan hier gebeuren? 203 00:09:47,080 --> 00:09:48,913 Kijk of je kunt volgen langs en wat denk je is 204 00:09:48,913 --> 00:09:51,720 gaat gebeuren als we gaan door al deze regels code. 205 00:09:51,720 --> 00:09:53,980 >> Dus zeggen wij int m. 206 00:09:53,980 --> 00:09:54,840 Wat gebeurt hier? 207 00:09:54,840 --> 00:09:56,339 Nou, dit is vrij eenvoudig. 208 00:09:56,339 --> 00:09:59,650 Ik maak een integer variabele genaamd m. 209 00:09:59,650 --> 00:10:01,400 Ik kleur het groen, want dat is de kleur 210 00:10:01,400 --> 00:10:03,730 die ik gebruik als ik praat over integer variabelen. 211 00:10:03,730 --> 00:10:05,160 Het is een doos. 212 00:10:05,160 --> 00:10:08,400 Het heet m, en u kunt integers winkel binnen van het. 213 00:10:08,400 --> 00:10:12,400 >> Wat als ik dan zeggen int een ster? 214 00:10:12,400 --> 00:10:13,530 Nou dat is redelijk vergelijkbaar. 215 00:10:13,530 --> 00:10:15,780 Ik ben het creëren van een doos genoemd. 216 00:10:15,780 --> 00:10:19,100 Het is in staat van het bedrijf int sterren, verwijzingen naar gehele getallen. 217 00:10:19,100 --> 00:10:21,570 Dus ik ben te kleuren groen-ish ook. 218 00:10:21,570 --> 00:10:24,140 >> Ik weet dat het iets te maken met een integer, 219 00:10:24,140 --> 00:10:25,852 maar het is niet zelf een integer. 220 00:10:25,852 --> 00:10:27,310 Maar het is vrijwel hetzelfde idee. 221 00:10:27,310 --> 00:10:28,101 Ik heb een doos gemaakt. 222 00:10:28,101 --> 00:10:30,070 Beide recht wonen nu op de stapel. 223 00:10:30,070 --> 00:10:32,520 Ik heb ze gezien beide namen. 224 00:10:32,520 --> 00:10:36,750 >> int ster b gelijk aan malloc grootte van int. 225 00:10:36,750 --> 00:10:38,560 Dit misschien een beetje lastig. 226 00:10:38,560 --> 00:10:44,110 Neem een ​​tweede en nadenken over wat je zou verwachten dat er gebeurt op dit diagram. 227 00:10:44,110 --> 00:10:50,210 int ster b gelijk aan malloc grootte van int. 228 00:10:50,210 --> 00:10:51,940 >> Nou, dit is niet alleen te maken een doos. 229 00:10:51,940 --> 00:10:53,800 Dit creëert in feite twee dozen. 230 00:10:53,800 --> 00:10:58,670 En het stropdassen, maar stelt ook een punt in een relatie. 231 00:10:58,670 --> 00:11:02,240 We hebben een blok toegewezen geheugen in de heap. 232 00:11:02,240 --> 00:11:05,940 Merk op dat de rechter box er heeft geen naam. 233 00:11:05,940 --> 00:11:06,760 >> We mallocd het. 234 00:11:06,760 --> 00:11:08,050 Deze zich op de heap. 235 00:11:08,050 --> 00:11:10,090 Maar b heeft een naam. 236 00:11:10,090 --> 00:11:11,950 Het is een pointer variabele genaamd b. 237 00:11:11,950 --> 00:11:13,910 Die woont op de stapel. 238 00:11:13,910 --> 00:11:18,250 >> Dus het is een stuk van het geheugen die verwijst naar een andere. 239 00:11:18,250 --> 00:11:21,840 b bevat het adres van dat geheugenblok. 240 00:11:21,840 --> 00:11:23,757 Het heeft geen naam anders. 241 00:11:23,757 --> 00:11:24,590 Maar het wijst op het. 242 00:11:24,590 --> 00:11:29,760 Dus als we zeggen int ster b gelijk malloc grootte van int, dat daar, 243 00:11:29,760 --> 00:11:33,490 dat de pijl die dook op de rechterkant is er, dat de hele zaak, 244 00:11:33,490 --> 00:11:36,740 Ik zal het lijken weer, is wat er gebeurt. 245 00:11:36,740 --> 00:11:39,341 Dat alles gebeurt in dat enkele regel code. 246 00:11:39,341 --> 00:11:41,340 Nu zullen we weinig meer te halen ongecompliceerd weer. 247 00:11:41,340 --> 00:11:43,330 een gelijk ampersand m. 248 00:11:43,330 --> 00:11:46,280 Herinnert u zich wat een evenaart ampersand m is? 249 00:11:46,280 --> 00:11:48,920 Nou dat is een krijgt adres m's. 250 00:11:48,920 --> 00:11:54,150 Of zet meer schematisch een punten meter. 251 00:11:54,150 --> 00:11:56,360 >> a is gelijk aan b. 252 00:11:56,360 --> 00:11:57,560 OK dus hier is een andere. 253 00:11:57,560 --> 00:11:59,230 A gelijk is aan b. 254 00:11:59,230 --> 00:12:02,260 Wat gaat er gebeuren het schema ditmaal? 255 00:12:02,260 --> 00:12:04,330 >> Goed herinneren dat de toewijzingsoperator werken 256 00:12:04,330 --> 00:12:08,960 door aan de waarde op de recht op de waarde links. 257 00:12:08,960 --> 00:12:14,820 Dus in plaats van te wijzen op m, een nu wijst op dezelfde plaats die b punten. 258 00:12:14,820 --> 00:12:18,900 een niet wijzen op B, A wijst waarbij b punten. 259 00:12:18,900 --> 00:12:25,280 >> Als een puntig naar b, dat zou hebben een gelijk ampersand b. 260 00:12:25,280 --> 00:12:28,150 Maar in plaats daarvan een gelijk b net betekent dat en b nu 261 00:12:28,150 --> 00:12:31,770 wijzend naar hetzelfde adres, omdat binnenkant van b is slechts een adres. 262 00:12:31,770 --> 00:12:35,004 Nu binnenkant van hetzelfde adres. 263 00:12:35,004 --> 00:12:37,170 m gelijk is aan 10, waarschijnlijk meest eenvoudige ding 264 00:12:37,170 --> 00:12:38,690 we hebben gedaan in een klein beetje. 265 00:12:38,690 --> 00:12:40,460 Zet de 10 in de doos. 266 00:12:40,460 --> 00:12:45,640 Star b gelijk aan m plus 2, herinnert uit onze pointers video wat ster b betekent. 267 00:12:45,640 --> 00:12:50,230 We gaan dereferentie b en put enige waarde in dat het geheugen locatie. 268 00:12:50,230 --> 00:12:51,860 In dit geval 12. 269 00:12:51,860 --> 00:12:55,300 >> Dus toen we dereference een punt van herinneren we reizen naar beneden de pijl. 270 00:12:55,300 --> 00:12:58,205 Of anders gezegd, we naar die geheugenadres 271 00:12:58,205 --> 00:12:59,580 en we manipuleren op een bepaalde manier. 272 00:12:59,580 --> 00:13:00,830 We zetten enkele waarde in. 273 00:13:00,830 --> 00:13:03,960 In dit geval ster b evenaart m plus 2 is gewoon 274 00:13:03,960 --> 00:13:08,230 naar de variabele gewezen door b, naar het geheugen wordt gewezen door b, 275 00:13:08,230 --> 00:13:11,750 en zet m plus 2 daar, 12. 276 00:13:11,750 --> 00:13:14,970 >> Nu vrij ik b. 277 00:13:14,970 --> 00:13:16,490 Wat gebeurt er als ik vrij B? 278 00:13:16,490 --> 00:13:18,800 Vergeet niet wat ik zei vrije middelen. 279 00:13:18,800 --> 00:13:21,920 Wat zeg ik als ik vrij B? 280 00:13:21,920 --> 00:13:23,410 >> Ik ben klaar met werken, toch? 281 00:13:23,410 --> 00:13:25,702 Ik wezen geven het geheugen. 282 00:13:25,702 --> 00:13:26,910 Ik geef het terug naar het systeem. 283 00:13:26,910 --> 00:13:33,010 Ik hoef niet dit niet meer is wat ik te vertellen, oké? 284 00:13:33,010 --> 00:13:37,390 >> Nu als ik zeg een ster gelijk aan 11 kunt u waarschijnlijk 285 00:13:37,390 --> 00:13:40,460 al zeggen dat er iets ergs gaat hier gebeuren, toch? 286 00:13:40,460 --> 00:13:44,160 En inderdaad, als ik probeerde dat ik waarschijnlijk zou een segmentation fault lijden. 287 00:13:44,160 --> 00:13:47,140 Omdat nu, hoewel eerder dat stuk van het geheugen 288 00:13:47,140 --> 00:13:50,220 was iets dat ik had toegang tot op dit punt 289 00:13:50,220 --> 00:13:54,590 nu ben ik de toegang tot het geheugen dat is niet legaal voor mij om toegang te krijgen. 290 00:13:54,590 --> 00:13:57,330 >> En zoals we zullen waarschijnlijk herinneren, wanneer we toegang tot het geheugen 291 00:13:57,330 --> 00:14:00,000 dat we niet verondersteld te raken, dat is de meest voorkomende oorzaak 292 00:14:00,000 --> 00:14:01,860 van een segmentatie fout. En dus mijn programma 293 00:14:01,860 --> 00:14:05,170 zou crashen als ik probeerde om dit te doen. 294 00:14:05,170 --> 00:14:09,910 Dus nogmaals, het is een goed idee om goed te krijgen praktijk en goede gewoonten ingesleten 295 00:14:09,910 --> 00:14:12,920 bij het werken met malloc en gratis, zodat u geen last heeft segmentatie 296 00:14:12,920 --> 00:14:15,310 fouten, en dat je gebruikt je dynamisch toegewezen 297 00:14:15,310 --> 00:14:17,370 geheugen op verantwoorde wijze. 298 00:14:17,370 --> 00:14:20,300 >> Ik ben Doug Lloyd is CS50. 299 00:14:20,300 --> 00:14:21,947