Bedste svar
Jeg antager, at du ved, at når du kører et C-program, har du 3 åbne filer, to af dem hedder STDOUT og STDERR, normale meddelelser går ind i stdout, (dvs. Når du ringer til printf), og fejlmeddelelser i stderr (når du f.eks. ringer til fprintf (stderr, …), er disse to (åbne filer faktisk) direkte forbundet med dit operativsystem til din terminal, være en Unix-terminal eller en Windows-terminal. Det vigtigste ved dem er, at de kan omdirigeres, for eksempel i Unix, når du gør det: ls | grep file.txt shell omdirigere stdout i “ls” og nu destinationen for det output er STDIN i “grep” -processen, så grep kan se efter mønstre i den strøm osv. Dette er stærke ting, mange Unix-filtre (faktisk programmer) er bygget på denne måde, hvilket er stærkt.
REDIGER: tilføj et mere meningsfuldt eksempel Lad mig tilføje en ny og mere eksplicit anvendelse af omdirigering, så du kan forstå tingene med et mere betydningsfuldt eksempel, se på denne kommando:
krølle http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Her begynder curl at downloade wget fra GNU-projektet, mens curl downloader data, det skriver til STDOUT, men skallen har omdirigeret stdout af curl til stdin af xzat, shell gør samme omdirigerer stdout af xzcat til stdin af tjære, og tjære begynder at komprimere dataene, forbløffende!
Svar
Først et generelt princip: uanset hvad du laver, malloc()
påberåbes aldrig automatisk.
Når du erklærer en struct
, erklærer du en type. En type i sig selv, bruger ikke hukommelse ved kørsel.
Når du erklærer en variabel af strukturtypen, tildeles hukommelse til den, men bruger ikke malloc()
. Hvis variablen er lokal til en funktion tildeles hukommelse til den normalt på stakken. Dette er delvist det, der muliggør rekursivitet i C: hver gang du kalder på funktionen (selvom den kaldes indefra), justeres stakmarkøren og nyt sted er reserveret på stakken til loc alle variabler for denne funktion, og hver gang funktionen afsluttes, er stakken “udrullet”, med al den plads frigivet.
Når du erklærer en global variabel, foretages en statisk allokering til den på bunken, når programmet starter, og variablen forbliver tilgængelig under hele udførelsen af programmet. Den krævede bunke størrelse er kendt på kompileringstidspunktet.
I modsætning hertil, når du bruger malloc()
, tildeles hukommelsen dynamisk ved kørsel til programmet af operativsystemet og du er ansvarlig for at frigøre det ved hjælp af free()
, eller dit program (især hvis det er et program, der kører i lang tid uden genstart, f.eks. en serviceapplikation), vil lide af en hukommelseslækage, der påvirker ydeevnen og i ekstreme tilfælde sulter hele systemet med ressourcer. Brug af malloc()
er mest passende, når enten a) den krævede mængde hukommelse er mere, end der kan tildeles på bunken eller stakken, eller b) den nødvendige mængde hukommelse ikke er kendt på forhånd.