[Мусиц плаиинг] Даг Ллоид: ОК, сугестија пре почетка овде. Ако нисте гледали видео на показивачи можда ћете желети да уради прво. Јер, овај видео је још један начин рада са показивачима. Тако да ће причати о неким концептима да покривамо у показивачима видео, и ми смо да сјаја над њима сада, под претпоставком да су већ некако разумео. Дакле, то је само твој фер упозорење да ако видите овај видео а нисте видела показивачи Видео, могло би некако лете изнад главе мало. И тако можда би било боље да га гледају у том циљу. Тако смо већ видели један начин рада са показивачима, која је да прогласи променљива, а онда смо изјавити друго променљиву, показивач променљива, који указује на то. Тако смо створили променљива са именом, ми смо створио другу променљиву са именом, и ми указују да друга променљива ово прво. Ова врста има Проблем међутим, јер захтијева од нас да знамо тачно колико меморије смо Требаће тренутак наш програм је састављен. Зашто је то? Зато морамо да будемо у стању да именује или идентификовали све могућих варијабли можемо наићи. Ми можда има низ који би могао бити у стању да одржи много информација, али и даље није баш довољно прецизна. Шта ако не знамо, шта ако немамо појма колико ћемо морати у компајлирања? Или шта ако наш програм ће кандидује за јако дуго времена, прихватање различитих корисничких података, а ми не можемо баш проценити да ли смо Требаће 1.000 јединица? Није да можемо кажу у командној линији унесите колико ставки мислиш да ћеш требати. Па шта ако је претпоставка није у реду? Динамичка алокација меморије некако нам омогућава пут да се око тог проблема. И начин на који то ради је помоћу савета. Можемо користити путоказе до добити приступ динамички издвојила меморија, меморија која је издвојила као ваш програм ради. То није додељено компилације време. Када динамички додели меморија долази из базена меморије познат као гомиле. Раније све је меморија имамо ради са у току је из базена меморије познат као стека. Добар начин да се генерално имајте у минд-- и овом правилу не увек важи, али прилично скоро Увек држи труе-- је да свака пут када дати име променљиве ит вероватно живи на стек. И сваки пут када не дати променљива име, што можете да урадите са динамичке меморије алокација, да живи на гомили. Сада сам мало представљања ово као ако постоји ова два базена меморије. Али можда сте видели ово дијаграм, који је углавном приказ како меморија изгледа, и нећемо да се брине о свему ствари на врху и на дну. Оно што нам је стало је овај део у средњи овде, гомила и гомила. Као што можете видети по гледајући овај дијаграм, ово заправо нису два одвојена базена меморије. То је један дељени базен меморије где почети, у овом визуелни почнете на дну и почети попуњавања одоздо са гомиле, а ви почети на врху и почне пуњење од врха на доле са гомиле. Али то је заиста Исто базен, то је само различитих места, различите локације у меморији које се додељују. И можете понестане меморија од било која ХЕАП ићи до краја до дна или имају стек иде скроз до врха, или имају гомиле и стека срести једни против других. Све то могу да буду услови да изазову ваш програм да понестаје меморије. Дакле, имајте то на уму. Када говоримо о ХЕАП и стек се ипак ради о исти општи комад меморије, само различити делови тог сећања. Како да се динамички Додељена меморија на првом месту? Како наш програм да меморије како се ради? Па, Ц обезбеђује функцију која се зове маллоц, меморија расподела, која сте упутили позив, и прођете у колико бајтова меморије коју желите. Дакле, ако ваш програм ради и желите целобројну рунтиме, можда Маллоцк четири бајтова меморија, маллоц заградама четири. Маллоцк ће проћи кроз гледајући кроз гомиле, јер ми смо динамички доделе меморије, и да ће се вратити вама показивач на тој меморији. То не ти дати ту мемори-- не му дати име, то вам даје показивач на њега. И то је разлог зашто опет сам рекао да је важно да се можда су гледали показивачи видео пре него што оде предалеко у ово. Дакле, маллоц ће дај те назад показивач. Ако Маллоцк не могу да вам дам меморије јер сте понестане, то ће вам вратити нулл показивач. Да ли се сећате шта се дешава ако покушати да дереференце нулл поинтер? Ми пате сег грешку, зар не? То је вероватно није добро. Дакле, сваки пут када упутите позив да вас Маллоц увек, увек Морам да проверим да ли или не поинтер је дао да си се вратио нулл. Ако јесте, морате да завршите програм јер ако покушаш и дереференце нулта показивач идеш да пате сегментације грешку и ваш програм је ће ионако срушити. Па како то радимо статично добити цео број? инт. Вероватно смо урадили гомила пута, зар не? Ово ствара променљиву названу х која живи на стек. Како да динамички добити цео број? Инт звездице пк једнака маллоц 4. Или прикладније ми кажемо Инт стар пк једнако Маллоц величину инт, само да баци неки мање Магиц Нумберс око нашег програма. Ово ће да добију за нас четири бајта меморије из гомиле, и показивач добијамо назад на њу се зове пк. И онда као имамо учињено раније смо могу дереференце пк до приступити то сећање. Како смо добили цео број од корисника? Можемо рећи инт једнако се инт. То је прилично једноставан. Шта ако желимо да створимо низ од к пловци који живе на стек? флоат стацк_арраи-- то је име наших арраи-- угластим заградама к. То ће створити за нас низ од к пловци који живе на стек. Можемо створити низ сплавова која живи на гомили, превише. Синтакса може изгледати мало незграпно, али можемо рећи флоат звездице хеап_арраи једнако маллоц к пута већа од пловка. Морам довољно простора да држе х флоатинг поинт вредности. Тако да сам треба 100 плута, или 1.000 плута. Дакле, у том случају било би 400 бајтова за 100 сплавова, или 4.000 бајтова за 1.000 сплавова, јер свака пловак заузима четири бајта простора. Након тога радим, могу користити квадрат носач синтакса на хеап_арраи. Баш као и ја на стацк_арраи, ја може индивидуално приступити њене елементе користећи хеап_арраи нула, хеап_арраи један. Али сећам се разлога можемо то да урадимо је зато што је име низа у Ц је заиста показивач на Први елемент који је низа. Дакле, чињеница да смо проглашење низ сплавова на стеку овде заправо помало збуњује. Заиста су у Друга линија кода тамо и стварање показивач на комад меморија која онда да радимо неки посао са. Овде је велики проблем са динамички додељена меморија ипак, и то је разлог зашто је стварно важно развити неке добре навике када радите са њим. За разлику од статички проглашен меморија, ваше сећање није аутоматски вратио до Систем када се ради твоја функција. Дакле, ако имамо главни, и Главни позива функцију Ф, када м заврши како год да се ради и враћа контролу над програма Повратак на главни, сву меморију да је ф користи је враћен. Може се поново користити неки други програм, или неког другог функција која бива позвао касније у главни. То може користити ту исту меморију изнова. Ако вам се динамично доделите меморију иако морате да експлицитно рећи систем који сте завршили са њим. То ће држати за вас, који би могао довести до проблема од вас понестаје меморије. А у ствари смо понекад погледати ово као цурење меморије. А понекад ове меморије цури може заправо бити заиста поражавајуће за перформансе система. Ако сте чест корисник интернета можете користити одређене веб бровсера, а ја не желим да именујем имена овде, али постоје неке веб претраживачи тамо који су познати по заиста има меморија цури да не буду фиксне. А ако оставите ваш прегледач отворен за веома дуг временски период, дана и дана, или недеља, понекад можда ћете приметити да ваш систем је покренут стварно, стварно полако. А разлог за то је да претраживач је издвојила меморије, али онда није рекла систем да се то ради са њим. И тако да оставља мање меморије доступно за све ваше другим програмима морати да деле, јер си леакинг-- да веб бровсер Програм цури меморију. Како дајемо памћење када смо урадили са њим? Па срећом то је Веома једноставан начин да се то уради. Само га ослободили. Постоји функција названа бесплатно, прихвата показивач на меморију, и ми смо добро иде. Рецимо да смо у средњи нашег програма, желимо да маллоц 50 знакова. Желимо да маллоц низ који могу способан да држи 50 знакова. И кад се показивач вратити да, име тог Поинтер је реч. Ми радимо шта год да смо да радим са речју, и онда када смо учињено смо га ослободили. И сада смо се вратили тих 50 бајтова меморије натраг у систему. Неки други функција може да их користи. Ми не морамо да бринемо о трпи цурење меморије јер смо ослободили реч. Ми смо с обзиром на памћење, тако да смо завршили рад са њим. Дакле, постоје три златна правила која треба треба имати на уму када сте динамички доделе меморије са маллоц. Сваки блок меморије који ви маллоц мора бити ослобођен пре него што ваш програм заврши руннинг. Сада опет, у апарату или у ИДЕ ова врста се дешава за тобом када би-- то ће свакако десити када је престао ваш програм, све је меморија ће бити пуштен на слободу. Али то је генерално добро кодирање пракса да увек, када завршите, ослободити оно што сте маллоцд. То је рекао, само ствари које Ви сте маллоцд треба ослободити. Ако статички прогласити цео број, инт полу-дебело црево, која живи на стек, ви не онда желе да ослободе к. Дакле, само ствари које сте маллоцд треба ослободити. И на крају, не бесплатну нешто два пута. То може довести до друга чудна ситуација. Дакле, све што сте маллоцд мора да буде ослобођен. Само ствари које сте маллоц треба ослободити. И не бесплатну нешто два пута. Дакле, идемо кроз пример овде шта су неки динамички издвојено меморија може изгледати као мешовита у неком статичком меморијом. Шта се може десити овде? Видите да ли можете да пратите заједно и погоди шта је ће се догодити док идемо кроз све ове линије кода. Зато ми кажемо инт м. Шта се дешава овде? Па ово је прилично јасан. Ја стварам целобројну променљиву названу м. Ја боје зелена, јер је то боја који ја користим када говорим око интегер променљиве. То је кутија. То се зове м, а можете продавница природних бројева у њему. Шта ако сам тада рекао Инт Стар А? Па то је прилично сличан. Ја сам стварање кутија зове. То је у стању да држи инт старс, показивачи на целе бројеве. Зато сам му бојење зелено-исх као добро. Знам да има нешто везе са целим бројем, али то није себи то цео број. Али то је скоро иста идеја. Направио сам кутију. Оба ова права сада живе на стек. Ја сам им дао оба имена. Инт звездице Б једнак маллоц величину инт. Ово би могло бити мало незгодно. Таке а други и размислите о томе шта очекујем да се деси на овом дијаграму. Инт звездице Б једнак маллоц величину инт. Па ово не само створити једну кутију. То заправо ствара две кутије. И то веже, такође успоставља тачка у вези. Ми смо издвојила један блок меморије на гомили. Обратите пажњу да у горњем десном кутија нема нема име. Маллоцд смо га. Она постоји на гомили. Али Б има име. То је показивач променљива се зове р. То живи на стек. Дакле, то је део меморије који указује на другу. Б садржи адресу од тог блока меморије. То нема другачије име. Али то указује на то. Дакле, када кажемо Инт звездице Б једнак маллоц величина инт, да тамо, да стрелица да појавило на десна страна има да цела ствар, Мораћу да се појави Опет, шта се дешава. Све што се догађа у да једна линија кода. Сада ћемо добити мало више опет једноставно. једнака амперсанд м. Да ли се сећате шта је једнака Амперсанд м је? Па то је добије адресу на м. Или ставите више шематски, а указује на м. једнако б. ОК, ево још једног. Једнако б. Шта ће се десити на дијаграму ово време? Па подсјећају да је Радови задатак оператора додељивањем вредност на Право на вредности са леве стране. Дакле, уместо да се усмеравање м, а сада указује на исто место да Б поена. А не указују на Б, А указује где Б поена. Ако указао на б да би да је био једнако амперсанд б. Али уместо тога једнако Б само значи да и б сада указујући на исту адресу, јер унутар б је само адреса. А сада унутар а је иста адреса. м износи 10, вероватно најједноставнији ствар што смо урадили у мало. Ставите 10 у кутији. Звезда Б једнак М плус 2, сећам из наш показивачи Видео шта стар Б значи. Идемо у Дереференце б и ставити нека вредност у тој меморијској локацији. У овом случају 12. Дакле, када смо дереференце тачка сјећам се само путујемо низ стрелу. Другим речима, ми идите на тој меморијској адреси и ми га манипулишу на неки начин. Ми смо ставили неку вриједност тамо. У овом случају стар б једнако М ПЛУС 2 је само идите у променљиву указује б, идите у меморији указује б, и пут М плус 2 тамо, 12. Сада слободног б. Шта се дешава када слободног б? Запамтите шта сам рекао слободних средстава. Шта ја то говорим када сам слободног б? Завршио сам радим са њим, зар не? Ја у суштини одустати меморију. Ја га вратити у систем. Не треба ми ово више није оно што ја им говорим, у реду? Сада ако кажем Стар А једнака 11 вероватно можете ту нешто лоше већ реци ће се догодити овде, зар не? И заиста, ако сам покушао да вероватно би претрпети сегментације грешку. Зато сада, иако раније да комад меморије је нешто што сам имао приступ, у овом тренутку сада сам приступ меморију која није правно за мене да приступите. И као што смо вероватно ће сећам се, када смо приступили меморији да не би требало на додир, то је најчешћи узрок од сегментације кривица. И тако мој програм би срушити ако сам покушао да урадим. Дакле, опет је добра идеја да се добро праксе и добре навике укорењене када радите са маллоц и фрее, тако да не патите сегментације грешке, и да користе Ваш динамички додељена меморија одговорно. Ја сам Доуг Ллоид ово је ЦС50.