Cel mai bun răspuns
Presupun că știți că atunci când rulați un program C aveți 3 fișiere deschise, două dintre ele se numesc STDOUT și STDERR, mesajele normale intră în stdout, (adică când apelezi printf) și mesajele de eroare în stderr (când apelezi de exemplu fprintf (stderr, …), aceste două (fișiere deschise de fapt) sunt legate direct de sistemul de operare către terminalul dvs., fiind un terminal Unix sau un terminal Windows. Cea mai importantă caracteristică a acestora este că pot fi redirecționate, de exemplu în Unix atunci când faceți: ls | grep file.txt shell-ul redirecționează stdout în „ls” și acum destinația pentru ieșirea respectivă este STDIN în procesul „grep”, astfel încât grep poate căuta modele în acel flux etc. Acest lucru este puternic, multe filtre Unix (programe de fapt) sunt construite în acest fel, ceea ce este puternic.
EDIT: adăugați un exemplu mai semnificativ Permiteți-mi să adaug o utilizare nouă și mai explicită a redirecționării, astfel încât să puteți înțelege lucrul cu un exemplu mai semnificativ, uitați-vă la această comandă:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Aici curl începe să descarce wget din proiectul GNU, în timp ce curl descarcă datele pe care le scrie în STDOUT, dar shell-ul a redirecționat stdout de curl în stdin de xzat, shell-ul face la fel, redirecționează stdout-ul xzcat în stdin of tar și tar începe să descomprimeze datele, uimitor!
Răspunde
În primul rând, un principiu general: indiferent de ceea ce faci, malloc()
nu este niciodată invocat automat.
Când declarați un struct
, declarați un tip. Un tip, în sine, nu consumă memorie în timpul rulării.
Când declarați o variabilă de tip struct, memoria este alocată pentru aceasta, dar nu utilizând malloc()
. Dacă variabila este locală unei funcții, memoria pentru aceasta este de obicei alocată pe stivă. Aceasta, în parte, este ceea ce face posibilă recursivitatea în C: de fiecare dată când apelați funcția (chiar dacă este apelată din interiorul său), indicatorul stivei este ajustat și spațiu nou este rezervat pe stivă pentru loc toate variabilele acelei funcții și de fiecare dată când funcția este ieșită, stiva este „desfăcută”, cu tot spațiul eliberat.
Când declarați o variabilă globală, se face o alocare statică pentru aceasta pe heap-ul la pornirea programului, iar variabila rămâne disponibilă pe tot parcursul executării programului. Mărimea heap-ului necesar este cunoscută în momentul compilării.
În schimb, atunci când utilizați malloc()
, memoria este alocată dinamic în timp de execuție programului de către sistemul de operare și sunteți responsabil pentru eliberarea acestuia utilizând free()
sau programul dvs. (mai ales dacă este un program care rulează mult timp fără repornire, de exemplu, o aplicație de serviciu) va suferi de o scurgeri de memorie, afectând performanța și, într-un caz extrem, înfometând întregul sistem de resurse. Utilizarea malloc()
este cea mai potrivită atunci când fie a) cantitatea necesară de memorie este mai mare decât poate fi alocată pe heap sau stivă sau b) cantitatea de memorie necesară nu este cunoscut în prealabil.