[MUSIC PLAYING] DOUG LLOYD: OK, belə bir təklif burada başlamazdan əvvəl. Siz video seyr əgər Siz ilk etmək istəyirəm bilər göstəricilər. Bu video Çünki başqa göstəricilər ilə iş yolu. Belə ki, danışmaq olacaq bəzi anlayışlar haqqında biz əhatə ki, video göstəricilərinə, və biz istəyirik indi onların üzərində parıltı üçün gedir, onlar artıq olduğunu fərz etsək sort aydın. Belə ki, yalnız ədalətli xəbərdarlıq var ki, bu video gördükdə əgər və siz görmədim göstəricilərinə video, güc sort baş üzərində bir az uçmaq. Və belə ki, daha yaxşı ola bilər ki, onu izləmək. Beləliklə, biz artıq bir gördük yol, göstəricilər ilə işləmək üçün olan bir elan edir dəyişən və sonra bir göstərici bir dəyişən elan dəyişən, ki, göstərir. Beləliklə, biz yaratdıq bir adı ilə dəyişən, biz bir adı ilə ikinci dəyişən yaradılmışdır və biz ikinci dəyişən ki, qeyd ki, ilk. Bu növ bir problem olsa da, çünki dəqiq bilmək tələb edir nə qədər yaddaş biz istəyirik an ehtiyac olacaq proqram tərtib edilir. Niyə ki? Biz ad etmək lazımdır, çünki ya mümkün dəyişənlərin bütün müəyyən biz qarşılaşa bilər. Biz ola bilər ki, bir sıra ola bilər bir çox informasiya keçirməyə qadir, lakin hələ deyil kifayət qədər dəqiq dəqiq. Biz bilirik yoxsa, biz heç bir fikrim yoxdur, əgər nə qədər biz tərtib zamanda lazımdır? Yoxsa nə proqram istəsə həqiqətən uzun müddət run, Müxtəlif istifadəçi qəbul məlumat və biz bilməz, həqiqətən, biz olsanız qiymətləndirmək 1000 ədəd lazımdır gedir? Bu biz kimi deyil command line demək neçə maddələr daxil Siz lazımdır düşünürəm. Yaxşı ki, tahmin yanlış nə olur? Dinamik yaddaş ayrılması sort bizə yol verir bu problem ətrafında almaq üçün. Və yol yoxdur göstəricilərinə istifadə edir. Biz göstəricilərinə istifadə edə bilərsiniz dinamik əldə edir ayrılmış yaddaş, yaddaş Sizin proqram kimi təsis çalışır. Bu ayrılır dəfə tərtib deyil. Zaman dinamik ayrılması yaddaş bir hovuz gəlir yaddaş yığın kimi tanınır. Biz əvvəllər bütün yaddaş Əlbəttə ilə işləyir bir hovuz gələn edilmişdir yaddaş yığını kimi tanınır. Yaxşı yol ümumiyyətlə mind və bu qayda saxlamaq həmişə doğru tutmadığını lakin olduqca çox demək olar ki, həmişə true-- hər hansı ki, keçirir dəfə bir dəyişən adı vermək yəqin ki, yığını yaşayır. Və heç bir zaman siz deyil dəyişən bir ad vermək, dinamik yaddaş edə bilər ki, ayrılması, bu yığın yaşayır. İndi növ kimi bu təqdim edirəm Yaddaş bu iki hovuz var, əgər. Amma bu görmüşəm bilər ümumiyyətlə diagram, nümayəndəlik nə yaddaş kimi görünür və biz bütün qayğı fikrində deyilik üst və alt stuff. Nə biz qayğı bu hissəsi Burada orta yığın və yığını. Siz gördüyünüz kimi bu diaqram baxaraq, Bu əslində iki deyil yaddaş ayrı hovuz. Bu yaddaş biri paylaşılan hovuz var burada bu vizual başlamaq Siz altındakı başlamaq və doldurulması başlamaq yığını ilə alt və sizdən üst başlamaq və doldurulması başlamaq yığın üst aşağı. Amma həqiqətən deyil Eyni hovuz, yalnız var müxtəlif ləkələr, müxtəlif yerlərdə yaddaş təsis olunur ki. Və həyata çalıştırabilirsiniz ya olan yaddaş yığın bütün yol getmək aşağı, və ya yığını üst bütün yol getmək və ya yığın və yığını olan bir-birinə qarşı cavab verir. O bütün şərait ola bilər ki, proqram səbəb yaddaş tökülmək üçün. Belə ki, nəzərə ki, saxlamaq. Biz haqqında danışmaq zaman yığın və stack Biz, həqiqətən, söhbət yaddaş eyni ümumi yığın, yalnız ki, yaddaş müxtəlif hissələri. Beləliklə, biz dinamik necə əldə edirsiniz ilk növbədə yaddaş ayrılan? Proqram almaq necə Bu çalışan kimi yaddaş? Yaxşı C adlı funksiyası təmin edir malloc, yaddaş allocator olan Siz zəng etmək, və siz keçmək neçə istədiyiniz yaddaş bytes. Proqram çalışan əgər Belə ki, və bir tam uzunluğu istəyirəm, Siz dörd bayt Mallock bilər yaddaş, malloc dörd parantez. Mallock keçəcəyi yığın vasitəsilə axtarır, biz dinamik istəyirik, çünki yaddaş ayrılması, və bu qayıdacaq ki xatirəsinə bir göstərici. Bu ki, yaddaş vermir bu bir ad vermək deyil, siz onu bir göstərici verir. Daha dedim niyə belə ki bəlkə vacibdir ki, göstəricilərinə video izlədi biz bu çox almaq əvvəl. Belə ki, malloc olacaq Bir göstərici geri verir. Mallock hər hansı bir verə bilməz yaddaş tökülmək etdik, çünki, bir null göstərici geri verəcəyik. Siz biz əgər nə yadınızdadırmı cəhd və bir null göstərici dereference? Biz doğru bir seg günah əziyyət? Yəqin ki, yaxşı deyil. Belə ki, hər dəfə zəng həmişə həmişə malloc yoxlamaq lazımdır və ya Bu geri null verdi göstərici. Əgər, sizin proqram başa lazımdır Siz dereference cəhd və əgər çünki Siz davam olduğunuz null pointer bir seqmentasiya günah əziyyət və proqram onsuz da qəza gedir. Belə ki, necə statik biz nə tam almaq? int x. Biz yəqin ki etdik dəfə bir dəstə, sağ? Bu adlı dəyişən yaradır yığını yaşayır x. Necə ki, biz dinamik bir tam almaq olar? Int star px malloc 4 bərabərdir. Və ya daha uyğun biz int ulduz px demək istədiyiniz , int malloc ölçüsü bərabərdir yalnız bir az atmaq Bizim proqramı ətrafında sehrli nömrələri. Bu, bizim üçün əldə etmək niyyətindədir yığın yaddaş dörd bytes, və pointer biz almaq geri px adlanır. Və sonra biz kimi Daha əvvəl həyata can px dereference üçün ki, yaddaş daxil. Necə ki, biz istifadəçi bir tam alıram? Biz int x int almaq bərabərdir demək olar. Bu olduqca sadə. Biz bir sıra yaratmaq istəyirsinizsə nə yığını yaşayır üzüb gedirdi x? ki, adı stack_array-- sal Bizim array kvadrat mötərizədə x. Bu, bizim bir sıra yaradacaq yığını yaşayır üzüb gedirdi x. Biz üzüb gedirdi bir sıra yarada ki, çox, yığın yaşayır. syntax bir ola bilər daha çətin az lakin biz float demək olar star heap_array bərabərdir malloc x dəfə float ölçüsü. Mən keçirilməsi üçün kifayət qədər otaq lazımdır x point dəyərləri üzən. Belə ki, 100 ehtiyac demək üzüb gedirdi, və ya 1000 üzüb gedirdi. Belə ki, halda olardı 100 üzüb gedirdi 400 bytes, və ya 1000 üzüb gedirdi üçün 4000 bytes, Hər float tutur, çünki kosmik dörd bytes. Bundan sonra mən istifadə edə bilərsiniz heap_array kvadrat mötərizə sintaksis. Mən stack_array olduğu kimi, mən fərdi onun elementləri əldə edə bilərsiniz istifadə heap_array sıfır heap_array biridir. Amma biz bunu edə bilərsiniz səbəb geri çünki C bir sıra adı həqiqətən bir göstəricisidir ki, serialın ilk element. Biz elan edirik ki, belə burada yığını üzüb gedirdi array əslində bir az yanlışdır. Biz, həqiqətən, var orada kodu ikinci xətt də bir yığın bir pointer yaratmaq biz sonra bəzi iş yaddaş. Burada böyük problem ilə var dinamik olsa yaddaş ayrılmış, Bu, həqiqətən, nə və bu yaxşı vərdişləri inkişaf üçün vacibdir zaman siz çalışırıq. Statik elan fərqli olaraq yaddaş, yaddaş avtomatik geri deyil Sizin funksiyası edilir sistemi. Biz əsas var və əgər belə Əsas funksiyası çağırır f, başa f bunu nə və proqram nəzarət qaytarır geri, əsas bütün yaddaş istifadə f geri verilir. Bu yenidən istifadə edilə bilər bir sıra digər proqram, və ya digər funksiyası Əsas sonra çağırıb olur. Bu daha eyni yaddaş üzərində istifadə edə bilərsiniz. Əgər dinamik baxmayaraq yaddaş ayrılması Siz açıq-aydın demək lazımdır Siz bu tamamlayın sistemi. Bu, ola bilər, sizin üçün üzərinə keçirilməsi lazımdır Siz həyata çalışan bir problem gətirib çıxara yaddaş. Və əslində biz bəzən müraciət bir yaddaş sızıntısı kimi bu. Və bəzən bu yaddaş sızması həqiqətən, həqiqətən dağıdıcı ola bilər sistem performansını üçün. Siz tez-tez internet istifadəçi əgər Siz müəyyən web browser istifadə edə bilər və mən burada adları, lakin bir web browser orada var həqiqətən olan bədnam edir ki, Sabit deyil yaddaş sızıntıları. Və sizin browser açıq tərk əgər zaman çox uzun müddət, gün və gün və ya həftə, bəzən sistem fark bilər həqiqətən yavaş-yavaş, həqiqətən çalışır. Və səbəbi ki, browser, yaddaş ayırıb lakin sonra sistemi izah ki, onunla həyata. Və belə ki, az yaddaş yarpaqları digər proqramları bütün mövcud Siz istəyirik, çünki, bölüşmək üçün ki, web browser leaking-- proqram yaddaşı sızan. Biz geri yaddaş vermək necə biz onunla Bitirdiğinizde? Yaxşı xoşbəxtlikdən bir var bunu çox asan bir yoldur. Biz yalnız azad. Pulsuz adlı funksiyası var, Bu, yaddaş bir pointer qəbul və biz getmək iyi. Belə ki, biz istəyirik deyək Bizim proqram orta, 50 simvol malloc istəyirəm. Biz bir sıra malloc istəyirəm 50 simvol keçirilməsi qadir. Və biz geri bir göstərici almaq zaman ki, ki, göstərici adı söz. Biz istəyirik nə sözü ilə edəcəyimiz, sonra biz olduğunuzda biz yalnız azad edilir. İndi biz o 50 qayıdıb geri sisteminə yaddaş bytes. Bəzi digər funksiyası istifadə edə bilərsiniz. Biz əziyyət narahat yoxdur yaddaş sızıntısı biz söz azad çünki. Biz geri yaddaş təqdim etdik, belə ki, biz bu iş tamamlayın. Belə ki, üç var ki, olmalıdır qızıl qaydaları Siz etdiyiniz zaman nəzərə saxlanılmalıdır dinamik yaddaş ayrılması malloc ilə. Yaddaş Hər blok ki, Siz malloc azad edilməlidir Proqram əvvəl çalışan başa. İndi yenə cihaz və ya IDE bu növ hər halda sizin üçün olur səni bu halda baş verəcək Proqram sona çatdıqda, bütün yaddaş azad olunacaq. Amma bu ümumiyyətlə yaxşı kodlaşdırma var təcrübə həmişə, Bitirdiğinizde, Siz mallocd nə pulsuz. Bildirib ki, yalnız şeylər Siz mallocd azad olunmalıdır var. Siz statik bəyan əgər tam, int x yarı colon, ki yığını yaşayır, siz sonra x pulsuz istəmirəm. Siz var belə ki, yalnız şey mallocd azad edilməlidir. Və nəhayət, iki dəfə azad bir şey yoxdur. Ki, gətirib çıxara bilər başqa qəribə bir vəziyyət. Siz var hər şey mallocd azad edilməlidir. Siz var təkcə malloc azad edilməlidir. Və iki dəfə azad bir şey yoxdur. Belə ki, burada bir nümunə ilə gedək bəzi dinamik ayrılmış nə yaddaş qarışıq kimi baxmaq bilər bir statik yaddaş ilə. Burada nə baş verə bilər? Təqib edə bilərsiniz əgər baxın birlikdə və nə tahmin biz getmək kimi baş verəcək kodu bütün bu xətlər vasitəsilə. Beləliklə, biz int m deyirlər. Burada olur? Yaxşı bu olduqca sadə deyil. I m adlı tam dəyişən yaradır. Mən yaşıl rəng ki, rəng, çünki Mən söhbət alıram mən istifadə haqqında tam dəyişənlər. Bu qutusu var. Bu siz m deyirlər və daxilində mağaza integers. Mən sonra int ulduz nə deyə əgər? Yaxşı ki, olduqca oxşar. Mən bir qutusu adlı yaradılması alıram. Bu holdinq int qadir ulduz, integers üçün göstəricilər. Belə ki, mən də bu yaşıl-ish boyayıcı alıram. Mən bir şey var bilirəm bir tam ilə, lakin bu tam deyil özü var. Lakin bu olduqca çox eyni fikirdir. Mən bir qutusu yaratdıq. Bu hüququ, həm də İndi yığını yaşayır. Mən onlara həm adları təqdim etdik. int ulduz b int malloc ölçüsü bərabərdir. Bu bir az çətin ola bilər. Ikinci almaq və nə haqqında düşünmək bu diaqram baş gözləmək olardı. int ulduz b int malloc ölçüsü bərabərdir. Yaxşı bu yalnız bir qutusu yaratmaq deyil. Bu, həqiqətən, iki qutu yaradır. Və bu da müəyyən, əlaqələri bir əlaqələr bir nöqtə. Biz bir blok təsis etdik yığın yaddaş. Qeyd edək yuxarı sağ qutusu ki bir ad var deyil. Biz bunu mallocd. Bu yığın mövcuddur. Amma b bir adı var. Bu b adlı göstərici dəyişən var. Bu yığını yaşayır. Belə ki, yaddaş bir parça var başqa bir işarə. b ünvan ehtiva yaddaş ki, blok. Bu başqa bir adı yoxdur. Amma bu göstərir. Beləliklə, biz int ulduz b bərabərdir deyəndə int malloc ölçüsü, orada ki, popped ki arrow orada sağ, ki, bütün şey, Mən görünür lazımdır yenə nə edir. Ki, bütün baş verir kodu ki, vahid xətt. İndi biz az daha almaq lazımdır daha sadə. bir işareti m bərabərdir. Siz nə bir geri etməyin işareti m bərabərdir? Yaxşı ki, bir M ünvanını alır var. Və ya, daha diagrammatically qoymaq m bir xal. bir b bərabərdir. OK, belə ki, burada başqa biri. A b bərabərdir. Nə olacaq diaqram bu dəfə? Yaxşı ki, geri tapşırıq operator işləri on dəyər təyin sağ sol dəyəri. M Belə ki, əvəzinə bir işarə, indi b bal eyni yerdə göstərir. a, b bir işarə etmir b xal göstərir. Bir guşəli ki b Əgər olardı bir işareti b bərabərdir olmuşdur. Lakin əvəzinə yalnız b bərabərdir o deməkdir ki, və b indi eyni ünvana çünki işarə b daxilində yalnız bir ünvanı. İndi daxilində eyni ünvanı. m yəqin ki, 10 bərabərdir ən sadə şey biz bir az etdik. Qutusuna 10 qoyun. Star b m bərabərdir plus 2, geri Bizim göstəricilərinə video nə star b deməkdir. Biz dereference b və qoymaq olacaq ki, yaddaş yeri bəzi dəyəri. Bu halda 12. Belə ki, biz bir nöqtəyə dereference biz yalnız arrow aşağı səyahət xatırlayıram. Və ya başqa bir yol qoymaq, biz ki, yaddaş ünvan getmək və biz bir şəkildə manipulyasiya. Biz orada bəzi dəyəri qoymaq. Bu halda star b m bərabərdir plus 2 yalnız dəyişən gedin b ilə işarə xatirəsinə getmək, b ilə işarə 12, orada m plus 2 qoydu. İndi b pulsuz. Mən b pulsuz ne olur? Pulsuz vasitələri dediklərini xatırlayıram. Mən b pulsuz zaman mən nə deyirəm? Mən bu iş görülən alıram, sağ? Mən mahiyyətcə yaddaş verir. Mən sistem geri verir. Mən bu artıq ehtiyac yoxdur Mən OK, onları deyirəm? İndi deyirlər ki, əgər ulduz 11 yəqin ki, bilər bərabərdir Artıq pis bir şey demək sağ, burada baş verəcək? Mən yəqin ki, cəhd həqiqətən əgər bir seqmentasiya günah əziyyət olardı. İndi Çünki, baxmayaraq ki, yaddaş əvvəl ki, yığın Mən idi, bir şey bu nöqtədə giriş, indi yaddaş daxil edirəm ki, Mənə daxil olmaq üçün qanuni deyil. Və biz yəqin ki, olacaq biz yaddaş daxil zaman, geri biz toxunmaq ehtimal deyilik ki, ən ümumi səbəb var bir seqmentasiya günah. Və mənim proqram Mən bunu cəhd əgər qəza olardı. Belə ki, daha yaxşı almaq üçün yaxşı bir fikirdir təcrübə və yaxşı vərdişlər kök salmış malloc və pulsuz ilə iş zaman, belə ki, seqmentasiya əziyyət deyil ki, istifadə ki, çatışmazlıqlar Sizin dinamik ayrılmış yaddaş məsuliyyətlə. Mən Doug Lloyd edirəm bu CS50 edir.