Kdy používáte stderr v C?


Nejlepší odpověď

Předpokládám, že víte, že když spustíte program C, máte 3 otevřené soubory, dva z nich jsou pojmenovány STDOUT a STDERR, normální zprávy jdou do stdout (tj. když voláte printf) a chybové zprávy do stderr (když voláte například fprintf (stderr, …), tyto dvě (vlastně otevřené soubory) jsou přímo propojeny vaším OS k terminálu, který je terminálem Unix nebo terminálem Windows. Nejdůležitější vlastností je, že je lze přesměrovat, například v Unixu, když to uděláte: ls | grep file.txt standardní přesměrování shellu v „ls“ a nyní cílem tohoto výstupu je STDIN v procesu „grep“, takže grep může hledat vzory v tomto proudu atd. Toto je mocná věc, mnoho unixových filtrů (vlastně programů) je postaveno tímto způsobem, což je mocné.

EDIT: přidat smysluplnější příklad Dovolte mi přidat nové a explicitnější použití přesměrování, abyste věc mohli uchopit významnějším příkladem, podívejte se na tento příkaz:

curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat – | tar xvf –

Zde curl začíná stahovat wget z projektu GNU, zatímco curl stahuje data, píše to na STDOUT, ale shell přesměroval stdout curl na stdin xzat, shell dělá stejné, přesměruje standardní výstup xzcat na stdin tar a tar začne dekomprimovat data, úžasné!

Odpovědět

Za prvé, obecný princip: bez ohledu na to, co děláte, malloc() se nikdy nevyvolá automaticky.

Když deklarujete struct, deklarujete typ. Typ sám o sobě, nespotřebovává žádnou paměť za běhu.

Když deklarujete proměnnou typu struktury, je jí přidělena paměť, ale nepoužívá malloc(). Pokud je proměnná lokální funkci, paměť pro ni je obvykle přidělena na zásobníku. To částečně umožňuje rekurzivitu v C: pokaždé, když zavoláte funkci (i když je volána zevnitř sebe), ukazatel zásobníku se upraví a v zásobníku pro místo je vyhrazeno nové místo všechny proměnné této funkce a pokaždé, když je funkce ukončena, je zásobník „odvinut“ a uvolní se veškerý prostor.

Když deklarujete globální proměnnou, provede se pro ni statická alokace halda při spuštění programu a proměnná zůstává k dispozici po celou dobu provádění programu. Požadovaná velikost haldy je známa v době kompilace.

Naproti tomu při použití malloc() je paměť dynamicky přidělena za běhu operačnímu systému a zodpovídáte za jeho uvolnění pomocí free(), jinak bude váš program (zvláště pokud se jedná o program, který běží dlouhou dobu bez restartu, např. aplikace služby) trpět únik paměti, ovlivňující výkon a v extrémním případě hladovění celého systému zdrojů. Použití malloc() je nejvhodnější, když a) požadované množství paměti je více, než kolik je možné alokovat na haldě nebo zásobníku, nebo b) požadované množství paměti není předem známé.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *