Bună și bunvenit.
Acum, când înțelegem alocarea dinamică a memoriei, trebuie să o implementăm.
Trebuie să știm cum să procedăm în codul C.
Așa că vom vorbi despre trei funcții foarte importante: Malik vedeți Alec și Retallack și vedeți că au un fel
de nume sau alocare de memorie.
Vezi Alec și re-alocarea.
Cea mai simplă și cea mai comună modalitate de a aloca memoria este prin intermediul funcției bibliotecii standard numite Malik.
Acest lucru este distractiv alocarea de memorie dinamică la timpul de execuție pentru a apela această funcție trebuie să
includă fișierul header standard lib.
Specificați numărul de octeți de memorie pe care doriți să îi alocați drept argument.
Ceea ce s-a întors din această funcție este adresa primei părți din memorie care este alocată deoarece primiți
o adresă returnată.
Un pointer este singurul loc unde să-l plasați.
Pune-l.
Deci, acesta este motivul pentru care alocarea dinamică a memoriei este posibilă numai prin intermediul acestui concept de pointer,
deoarece returnează adresele.
Puteți pune o adresă numai într-un pointer.
Acesta este un indicator care stochează un indicator care stochează o adresă.
Deci, iată cum faceți asta.
Sintaxă foarte simplă.
Când creați pointerul dvs., de obicei, atunci când creați indicatorul dvs. nu trebuie să faceți acest lucru.
Puteți crea pointerul dvs. și setați deloc.
Și apoi în următoarea linie ați putea.
Ai putea Mallik Dar aici este sintaxa standard care recrutează pointerul tău pointer int la un tip int și
atunci vei observa că îl numești Malic aici spunând Mallik vom merge la noi
vom crea 100 octeți pentru Malic și apoi noi "o să o aruncăm la un pointer int, deoarece Mallik doar
rutina returnează o adresă.
Trebuie să o aruncați la un pointer int pentru că aceasta se adresează memorării în pointer.
Acesta este modul standard de a face acest lucru acum.
Solicitați o sută de octeți de memorie în alocarea acesteia adresei blocului de memorie cu
numerele P care vor indica prima locație de la începutul celor sute octeți care au fost alocate.
Deci, ceea ce înseamnă că este, deoarece numerele întregi sunt 4 octeți o piesă care poate conține 25 de valori.
Și din nou, presupunem că aveți 4 octeți.
Acum, în funcție de sistemul pe care îl conduceți, poate că poate mai mare poate mai mic.
Deci ar trebui să vezi problema cu asta.
Acest cod nu va funcționa pe sisteme diferite, deoarece alocați pe baza unei presupuneri
bazate pe ipoteza inciziei.
Deci, nu este foarte bine să folosiți malloc în acest mod cu un număr constant de sute.
Ceea ce doriți să faceți este să doriți să utilizați dimensiunea operatorului, astfel încât ar fi mai bine
să eliminați presupunerea că în 4 octeți în schimb.
Dacă doriți să alocați o cameră pentru 25 de numere întregi în argumentul malloc, specificați numărul de energii pe care doriți
să le alocați și apoi înmulțiți-le cu dimensiunea întregilor.
Și acest lucru va face mult mai mult codul mult mai portabil.
Acest cod nu va funcționa pe diferite sisteme diferite sisteme de operare diferite arhitecturi.
Încă mai aruncați valoarea de retur a adresei, deoarece trebuie să fie indicată la un tip și astfel veți
vedea în Star.
Singura diferență aici este folosirea mărimii de operare a operatorilor cu adevărat importantă atunci când
alocați memorie folosind Mallik sau folosind C-L pentru a citi.
Utilizați întotdeauna și doriți să utilizați dimensiunea operatorului pentru tipul pe care îl
alocați și apoi să îl multiplicați cu câte numere particulare doriți.
Deci, dacă doriți să stocați 25, faceți 25.
Deci, acest argument pentru Mallik de mai sus indică în mod clar faptul că trebuie să fie disponibile suficiente octeți
pentru a acoperi 25 de valori de tip.
De asemenea, după cum am menționat, observați distribuția.
Aceasta convertește adresa returnată de funcție la indicatorul de tip la int și indicatorul său malloc returnează un pointer
de tip void.
Asta este ceea ce o face atât de utilă.
Returnează o adresă dar este un pointer gol.
Amintiți-vă că am vorbit despre indicii void de ce indicatorii void sunt utile, deoarece acum puteți avea o
funcție care poate lua parametri diferiți și poate reveni evita pointerul.
Acum vedeți puterea de a readuce din nou un pointer gol.
Dar, pentru a le folosi pentru a le atribui de fapt datelor de dereferență, trebuie să o aruncați bine.
Dacă nu am vrut să aruncăm acest lucru, am putea vedea un număr gol pentru stoppie.
Nu o aruncăm, dar atunci ar trebui să o aruncăm odată ce o vom dori să o dereferențeze.
Dar de aceea trebuie să aruncăm pentru o întoarcere dăunătoare o adresă și ați
vrut să îndreptați un tip și să întoarceți un tip gol.
Puteți solicita orice număr de octeți.
Totuși, depinde de sistemul dvs. și de cât de multă memorie aveți în sistemul dvs.
Deci, dacă încercați să creați sau să încercați să solicitați o tona de bytes sau există o anumită limitare, aceasta ar putea eșua și
atunci când aceasta nu reușește, returnează o valoare NULL return Malco nr.
Și acest lucru este bun deoarece indicii când indicatorii indică nul.
Aceasta înseamnă că ei nu indică nici o memorie, astfel încât să nu puteți corupe sau să schimbați memoria care, din neatenție.
Deci, este întotdeauna o idee bună după ce faci un Mallik să verifice imediat pentru null înainte să îl folosești.
La fel ca atunci când atribuiți date sau exact cum este atunci când dereference un pointer.
Vrei să te asiguri că te referi la ceva.
Deci, aici alocăm o memorie pentru numărul sau pointerul și apoi spunem dacă nu este numărul p.
Amintiți-vă că nulul este zero.
Deci, puteți folosi și nu pe ea.
Nu trebuie să o comparați cu nulul.
Puteți să o comparați cu nu.
Îl face mai ușor de citit, poate o face mai explicită.
Dar poti spune doar nu p numarul si asta spune de fapt nu unul in null este 0.
Deci, asta va verifica dacă nu.
Și dacă nu înseamnă că înseamnă că memoria nu a putut fi alocată.
Dacă nu ești, nu pot să aloce memorie în programul tău, ai probleme.
Deci, ceea ce ar trebui să faceți de obicei în acest cod pentru a face față unui eșec de alocare a memoriei ar
trebui să renunțați.
Ar trebui să sunați la X-C.
Ar trebui să ieșiți din programul dvs. pentru că, dacă programul dvs. nu poate aloca memorie, dvs. este găzduit.
Deci, de obicei asta este ceea ce numiți un accident de avort.
Dacă nu puteți aloca memorie, puteți, cel puțin atunci când faceți acest lucru, să afișați un mesaj de
terminare a programului.
Este mult mai bine decât să permiteți programului să continue atunci când nu ați reușit să alocați memorie,
deoarece puteți continua.
Puteți încerca să utilizați acea memorie.
Va fi nul, astfel încât programul se va prăbuși oricum, dar nu veți ști neapărat de ce trebuie
să vă uitați la stackul de apeluri.
Va fi nevoie de o depanare mult mai mare ca eroarea de eliberare a memoriei.
Acum am menționat că, din moment ce sunteți programatorul este responsabil pentru alocarea memoriei, trebuie să scăpați de memorie atunci
când nu o mai folosiți, deoarece memoria este o resursă vitală, în special pe
sistemele încorporate.
Nu trebuie să folosiți memoria dacă nu aveți nevoie de ea.
Deci trebuie să eliberați memoria.
Întotdeauna doriți să eliberați memoria atunci când nu mai este necesară memoria pe care o alocați pe heap va fi
lansată automat atunci când programul dvs. va termina ieșirile, ceea ce este bun pentru că face unele curățări, dar este mult mai bine
să eliberați în mod explicit memoria când sunteți fă-o cu ea.
Chiar dacă este chiar înainte de a ieși, este mai curat.
Întotdeauna faceți o eliberare liberă întotdeauna de memorie după alocați-l pe care doriți să urmați această regulă.
Aceasta este o regulă strictă strictă eliberând întotdeauna memoria dacă îi alocați o scurgere de memorie apare atunci când alocați o anumită memorie în
mod dinamic și nu păstrați referința astfel încât să nu reușiți să o eliberați.
Poate că nu mai ai de unde să te referi la asta.
Tu nu.
Nu îl eliberați.
Se numește o scurgere de memorie, dar memoria este alocată, dar nu mai este folosită.
Acest lucru apare adesea când vă aflați într-o buclă și alocați memoria într-o buclă.
Sunteți în buclă.
Alocați această memorie pe care o folosiți în interiorul bucla și
apoi săriți din bucla și nu mai eliberați fiecare buclă la rație este alocarea ei.
Deci, pentru a elibera memoria pe care ați alocat-o în mod dinamic, trebuie să aveți în continuare acces la acea adresă, de obicei
doriți să eliberați memoria când ați terminat să o utilizați.
Și, de obicei, în metoda pe care ați alocat-o.
Totuși, dacă treceți acea memorie la o altă funcție și apoi că este responsabilitatea acelei funcții.
Dar, de obicei, doriți să eliberați memoria și funcția pe care o alocați
pentru a elibera memoria pentru un bloc de memorie alocată dinamic, a cărui adresă ați stocat
într-un pointer.
Tot ce trebuie să faceți este să apelați funcția liberă.
Acesta nu este standardul live, de asemenea.
Trebuie doar să treceți cursorul la funcția liberă și, de obicei, după ce treceți un indicator pe care doriți să îl
setați.
Deoarece asta spune că nu ai alocat memorie pentru funcția liberă, are un parametru formal de
tip void star.
Deci, puteți trece în orice tip de pointer și va funcționa.
Nu trebuie să arunci în realitate sau așa ceva.
Atâta timp cât numărul conține adresa care a fost returnată atunci când este alocată memoria, întregul bloc de
memorie va fi eliberat pentru utilizare ulterioară.
Alte programe pot folosi acea memorie.
Programul dvs. poate utiliza această memorie semnificativă atunci când sunteți pe un sistem încorporat și apoi, așa cum am
menționat, doriți să setați indicatorul la nu pentru a indica faptul că acest indicator nu
mai indică nimic din memoria care a fost eliberată.
Există o altă funcție frumoasă numită Alic.
Acest lucru are câteva avantaje față de Malkin foarte asemănător cu Mallik. Dar ceea ce face este să aloce
memoria ca un număr de elemente într-o anumită dimensiune.
Și, de asemenea, inițializează memoria.
Aceasta este inițializarea diferenței.
Am vorbit despre importanța inițializării.
De aceea, întotdeauna doriți să inițializați datele pe care doriți să le inițializați, astfel
încât să înțelegeți că există date pe care le așteptați atunci când nu ați inițializat datele.
S-ar putea să existe date despre care nu aveți nicio idee.
Deci, întotdeauna inițializați datele dvs. cu ceva și vedeți că Alec este puțin mai bun pentru că o
face pentru dvs.
Este nevoie de două argumente pentru a avea doi parametri numărul de elemente de date care spațiu este necesar.
Dimensiunea fiecărui element de date este declarat în standardul lib Haueter pe care îl numiți așa cum îl
numiți Mallick.
Arată cam cam același mod în acest exemplu.
Creăm un pointer întreg și alocăm 75 de numere întregi.
Deci este nevoie de doi parametri.
Este un pic mai curat pentru ca nu trebuie sa faci o multiplicare si
rau ca ai trebuit sa faci un eveniment de 75 ori mai mare decat aici, doar 75 crezi 75 de furnici si dimensiunea pentru fiecare este
de 4 octeti sau oricare ar fi sistemul returnat și dimensiunea operatorului.
Dar, din nou, care este semnificația acestui lucru, va iniția toate aceste date.
Valoarea returnată ar putea fi Knol dacă nu este capabilă să aloce acea memorie care, la rândul ei, nu
ar trebui să renunțe.
Dar este foarte asemănător cu utilizarea malloc cu excepția mare plus este această inițializare toate capetele
sunt inițializate la zero.
Și asta eo treabă foarte mare.
Mare avantaj.
Este, de asemenea, un pic mai ușor de utilizat cu cei doi parametri.
Să vorbim despre o altă funcție numită Retallack, funcția realit vă permite să reutilizați sau să extindeți memoria
pe care ați alocat-o anterior utilizând malloc sau CLEC.
Deci, aceasta este o modalitate de a modifica dinamic cât este alocată memoria în timpul funcționării.
Deci, ați putea crea inițial atât de multă memorie și atunci vă dați seama că nu este suficientă memorie.
Ei bine, tot ce poți.
Ce puteți face acolo este că puteți să apelați la realitate.
Și aceasta va realoca memoria așteaptă la valorile argumentului un pointer care conține o adresă care a
fost transformată anterior printr-un apel la malloc.
Deci, aveți un pointer care are o memorie alocată sau C Alak și apoi dimensiunea în octeți din noua
memorie pe care doriți să o alocați.
Deci, acest lucru va aloca cantitatea de memorie SPU dvs. bine, dar al doilea argument care este al doilea argument.
Acesta transferă conținutul memoriei atribuite anterior indicată de pointer, astfel
încât să știe automat numărul de memorie pe care l-ați alocat anterior deoarece transmiteți
pointerul și apoi va adăuga efectiv memoria recent alocată și returnează un pointer gol la memorie nouă.
Deci, trebuie să o reformați când numiți realitate la fel ca celelalte.
Se intoarce.
Dacă nu reușești să faci realitate care din nou este probabil o eroare fatală și ar trebui să întrerupeți cea mai
importantă trăsătură a acestei operațiuni este că realitatea păstrează conținutul memoriei originale.
Îți prelungești memoria.
Poate fi fragmentat, deoarece este posibil să nu reușiți să o faceți în ordine, dar tot aveți toată memoria
pe care o puteți atribui unor date.
Să aruncăm o privire la un exemplu în acest exemplu, vom folosi malloc și apoi
vom reda o memorie și apoi o vom elibera.
Deci, aici creez un pointer de caractere pe care nu il initializam pentru a sti ca ar trebui sa fim,
dar nu arata ca nu are nicio memorie alocata pentru ceea ce se indreapta.
Are memorie alocată pentru a stoca pointerul care este doar o adresă.
Dar dacă încercați să mergeți la acea adresă, programați-vă să fiți gazdă.
Deci, ceea ce faceți este să-l numiți pe Mallik aici spunem că Mallik 15 ar trebui să facem acest lucru va crea 15 octeți
pentru un indicator de caracter.
Am aruncat-o pentru că întoarce un pointer gol.
Deci, STR este un pointer acum care are memorie alocată pentru ceea ce indică.
Apoi, putem folosi copia lor pentru a trece în unele date la ceea ce indică un șir
și vom imprima șirul în adresa bine apoi ne dăm seama că ceea ce am alocat 15 de octeți este acum destul de mare.
Dreapta.
Apoi, numim Retallack și treceți în pointerul care este str și vrem fiecare Alak 25 de octeți mai mulți și apoi se întoarce un
punct gol este că trebuie să aruncăm din nou acest lucru.
Acum o să avem încă în memorie Jason.
Deci, acum putem apela string concatenated și ne concatenăm cu comanda string.
Deci acum vom fi Jason dotcom și apoi vom imprima.
Și apoi, nu în ultimul rând, probabil cel mai important lucru al acestei trăsături, așa că nu avem
pentru acest diapozitiv.
Deci nu avem o scurgere de memorie, suntem liberi.
Întotdeauna sunați gratuit când sunați la malloc.
Deci, să aruncăm o privire la acest exemplu în blocurile de coduri.
Iată exemplul nostru de cod în partea de editorul nostru de blocuri de coduri și primul lucru pe care ar trebui să-l observați este că am fost Kert,
am inclus fișierul standard al antetului lib pentru că acolo funcțiile noastre Mallik pe funcțiile noastre de realitate
nu sunt la fel de bine ca funcția noastră liberă.
De asemenea, pentru că folosim o copiere de concatenare a funcțiilor de amestecare, vom include șiruri de
căutare pe fiecare.
Acum online.
Vom crea pointerul nostru de caractere și nu are nicio memorie alocată pentru acesta.
Ar trebui să inițializăm acest lucru la nu, pentru că nu indică nimic încă.
În 911 numim Mallik drept.
Și ar trebui să spunem, probabil, de 15 ori dimensiunea char în cazul în care dimensiunea octeților de char este diferită.
Apoi l-am aruncat într-un pointer de caractere, deoarece malloc revine gol.
Atunci îl copiem.
Dacă încercăm să copiem acest lucru și nu am făcut nimic pe
linia 11, programul s-ar prăbuși, pentru că nu avem memorie alocată punctelor puternice, atunci vom imprima șirul în adresă.
Acum numim Retallack, trebuie să stocăm mai multe date decât 15 octeți.
Așa că vom reda 25 de puncte și probabil că vom dori să facem din nou o mărime doar pentru a fi consecvenți.
Am aruncat acest lucru și apoi ne concatenăm pe locația noastră de memorie existentă care conține Jason com și vom
merge la Pernod Jason daka.
Și apoi, nu în ultimul rând, 20 eliberăm acea amintire care este cu adevărat importantă.
Deci, să mergem mai departe și să rulați acest lucru în ceea ce veți vedea doar este că atunci când am imprimat pentru
a doua oară avem concatenare.
Deci primul nostru șir avem o memorie alocată și este o adresă 0 0 0 0 6 2 9 1 8.
Apoi vom crea o nouă adresă prin re-alocarea și luarea rezistenței dimensiunii indicelui pe care l-am transmis
ca argument.
Deci, 0 0 0 0 CDA are de fapt mai multe date alocate.
Datele existente și Jason și încă 25 de octeți și deci ceea ce observi este
lucrarea de concatenare, deoarece când am realocat am pus conținutul Jason în acea memorie și l-am extins.
Deci, o mulțime de avantaje pentru a utiliza în aceste Mallik în D. C. Alik în apelurile gratuite și Retallack pe care
doriți să le utilizați doriți să înțelegeți aceste funcții destul de simple care nu le utilizați.
Așa că, în Leslye, să mergem cu niște linii directoare.
Doriți să evitați alocarea unor cantități mici de memorie.
Nu este eficient când alocați memorie pe heap.
Are unele cu ea.
Și dacă alocați mici blocuri de memorie, va avea mult mai mult decît să aloce mai puține
blocuri mai mari.
Așa că alocați memoria de care aveți nevoie, dar nu o faceți la fiecare două afirmații pe care le cunoașteți cu re-alocarea, bucăți mari se
blochează numai în memorie atâta timp cât aveți nevoie de ea.
Memoria este o resursă rară, atunci când pe ea este mai scundă.
Deci, când ați terminat cu un bloc de memorie numit gratuit, asigurați-vă întotdeauna că vă asigurați că ați eliberat memoria
pe care ați alocat-o.
Decideți în cazul în care în codul dvs. veți elibera memoria atunci când scrieți codul care o alocă.
Asigurați-vă că aveți acces la acest indicator dacă aveți nevoie să faceți indicatorul global.
Atunci trebuie să faci asta.
Dar, de obicei, dacă oriunde alocați în această funcție, ar trebui să o eliberați în această funcție.
Dacă aveți alte funcții care vă eliberează memoria, atunci presupunând că funcția nu este bună, există prea
multe cuplări și dependențe acolo.
Persoana care o creează ar trebui să fie persoana care o șterge.
Nu puneți responsabilitatea asupra altor funcții.
Asigurați-vă că nu suprascrieți în mod accidental adresa de memorie alocată pe heap înainte
de ao elibera.
Aceasta va cauza o scurgere de memorie.
Deci, dacă tu faci, dar dacă încerci să scrie prea multe octeți dick prea.
Sau dacă aveți depășiri, este posibil să aveți probleme, astfel încât să fiți deosebit de atenți atunci când
vi se alocă memoria într-o buclă deoarece aceasta poate cauza probleme și depășiri de tampon.
Sper că acest lucru a fost de ajutor.
Alocarea dinamică a memoriei este o afacere mare.
Vă dau o provocare care vă ajută să deveniți mai familiarizați cu acest lucru, dar vă face să
înțelegeți acest concept.
Mulțumesc.