Legjobb válasz
Feltételezem, hogy tudja, hogy amikor C programot futtat, 3 nyitott fájlja van, kettő STDOUT nevet kap és STDERR, a normál üzenetek stdout-ba mennek (azaz amikor a printf-et hívják), és a hibaüzeneteket stderr-be (például fprintf (stderr, …) hívásakor), ezt a kettőt (valójában a megnyitott fájlokat) közvetlenül az operációs rendszer kapcsolja össze a terminálodra, Unix vagy Windows terminálról lévén szó. Ezek legfontosabb jellemzője, hogy átirányíthatók, például a Unixban, amikor ezt teszed: ls | grep file.txt a shell redirect stdout “ls” -ban és most az adott kimenet rendeltetési helye a STDIN a “grep” folyamatban, így a grep mintákat kereshet abban a folyamban, stb. Ez egy erőteljes dolog, sok Unix-szűrőt (valójában a programot) ilyen módon építenek, ami nagy teljesítményű. / p>
SZERKESZTÉS: adjon értelmesebb példát. Hadd adjak hozzá egy új és kifejezettebb átirányítási módot, hogy egy jelentősebb példával fel tudja fogni a dolgot, nézze meg ezt a parancsot:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –
Itt a curl elkezdi letölteni a wget-et a GNU projektből, míg a curl az STDOUT-hoz írt adatokat tölti le, de a shell a curl stdout-ját átirányítja az xzat stdin-be, a shell a ugyanaz, átirányítja az xzcat stdout-ját a kátrányos stdin-be, és a tar megkezdi az adatok tömörítését, csodálatos!
Válasz
Először egy általános elv: nem számít, mit csinálsz, malloc()
soha nem hívódik meg automatikusan.
Amikor kijelent egy struct
-t, deklarál egy típust. A típus önmagában, futás közben nem fogyaszt memóriát.
Amikor deklarál egy változó típusú struktúrát, a memória lefoglalásra kerül, de nem használja a malloc()
parancsot. Ha a változó helyi függvényhez, annak memóriája általában a veremben van elosztva. Ez részben lehetővé teszi a rekurzivitást C-ben: minden alkalommal, amikor meghívja a függvényt (még akkor is, ha önmagából hívják meg), a verem mutatóját beállítja és új hely van fenntartva a veremben a loc számára ennek a függvénynek az összes változója, és minden alkalommal, amikor a függvényből kilép, a verem „letekerésre kerül”, az összes hely felszabadul.
Globális változó deklarálásakor statikus allokáció történik rá a halom, amikor a program elindul, és a változó elérhető marad a program végrehajtása során. A szükséges kupacméret a fordítás idején ismert.
Ezzel szemben a malloc()
használatakor a memóriát futás közben dinamikusan lefoglalja a program az operációs rendszer által, és Ön felelős azért, hogy felszabadítsa a free()
használatával, különben a programja (különösen, ha ez egy olyan program, amely hosszú ideig fut újraindítás nélkül, pl. szolgáltatási alkalmazás) memóriaszivárgás, ami befolyásolja a teljesítményt, és szélsőséges esetben az egész erőforrásrendszert kiéheztetik. A malloc()
használata a legmegfelelőbb, ha a) a szükséges memóriamennyiség meghaladja a halomra vagy a veremre allokálható mennyiséget, vagy b) a szükséges memóriamennyiség nincs előre ismert.