Beste svaret
Jeg antar at du vet at når du kjører et C-program har du 3 åpne filer, to av dem heter STDOUT og STDERR, normale meldinger går inn i stdout, (dvs. Når du ringer til printf), og feilmeldinger til stderr (når du ringer for eksempel fprintf (stderr, …), er disse to (åpne filer faktisk) direkte koblet av operativsystemet ditt til terminalen din, være en Unix-terminal eller en Windows-terminal. Det viktigste ved dem er at de kan omdirigeres, for eksempel i Unix når du gjør det: ls | grep file.txt shell omdirigere stdout i «ls» og nå målet for den utgangen er STDIN i «grep» -prosessen, så grep kan se etter mønstre i den strømmen osv. Dette er kraftige ting, mange Unix-filtre (programmer faktisk) er bygget på denne måten, som er kraftig.
EDIT: legg til et mer meningsfylt eksempel La meg legge til en ny og mer eksplisitt bruk av omdirigering, slik at du kan forstå saken med et mer viktig eksempel, se på denne kommandoen:
krølle http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Her begynner curl å laste ned wget fra GNU-prosjektet, mens curl laster ned data det skriver til STDOUT, men skallet har omdirigert stdout av curl til stdin av xzat, shell gjør samme, omdirigerer stdout av xzcat til stdin av tjære, og tar begynner å pakke ut dataene, utrolig!
Svar
Først et generelt prinsipp: uansett hva du gjør, malloc()
blir aldri påkalt automatisk.
Når du erklærer en struct
, erklærer du en type. En type i seg selv, forbruker ikke noe minne ved kjøretid.
Når du erklærer en variabel av strukturtypen, tildeles minne til den, men ikke bruker malloc()
. Hvis variabelen er lokal til en funksjon, blir minne for den vanligvis tildelt på bunken. Dette er delvis det som gjør rekursivitet mulig i C: hver gang du ringer til funksjonen (selv om den kalles fra seg selv), blir stakkpekeren justert og ny plass er reservert på bunken for loc alle variabler for den funksjonen, og hver gang funksjonen avsluttes, blir stabelen «avviklet», med all den frigjorte plassen.
Når du erklærer en global variabel, blir det gitt en statisk tildeling for den på bunken når programmet starter, og variabelen forblir tilgjengelig under gjennomføringen av programmet. Den nødvendige haugestørrelsen er kjent på kompileringstidspunktet.
I kontrast til dette, når du bruker malloc()
, blir minne dynamisk tildelt ved kjøretid til programmet av operativsystemet og du er ansvarlig for å frigjøre den ved hjelp av free()
, eller programmet ditt (spesielt hvis det er et program som kjører i lang tid uten omstart, f.eks. en tjenesteapplikasjon), vil lide av minnelekkasje, som påvirker ytelsen og i ekstreme tilfeller sulter hele systemet med ressurser. Bruk av malloc()
er mest hensiktsmessig når enten a) den nødvendige mengden minne er mer enn det som kan tildeles på bunken eller bunken, eller b) hvor mye minne som ikke kreves kjent på forhånd.