Wanneer gebruik je stderr in C?


Beste antwoord

Ik neem aan dat je weet dat wanneer je een C-programma draait, je 3 open bestanden hebt, waarvan er twee STDOUT heten en STDERR, gaan normale berichten naar stdout, (dat wil zeggen wanneer je printf aanroept), en foutmeldingen naar stderr (wanneer je bijvoorbeeld fprintf (stderr, …) aanroept, zijn deze twee (open bestanden eigenlijk) direct gekoppeld door je OS naar uw terminal, zijnde een Unix-terminal of een Windows-terminal. Het belangrijkste kenmerk ervan is dat ze kunnen worden omgeleid, bijvoorbeeld in Unix wanneer u dit doet: ls | grep file.txt de shell leidt stdout om in “ls” en nu de bestemming voor die uitvoer is STDIN in het “grep” -proces, dus grep kan zoeken naar patronen in die stream, enz. Dit is krachtig spul, veel Unix-filters (eigenlijk programmas) zijn op deze manier gebouwd, wat krachtig is. / p>

EDIT: voeg een zinvoller voorbeeld toe Laat me een nieuw en explicieter gebruik van omleiding toevoegen, zodat je het ding kunt begrijpen met een belangrijker voorbeeld, kijk naar dit commando:

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

Hier begint curl wget te downloaden van het GNU-project, terwijl curl gegevens downloadt die het naar STDOUT schrijft, maar de shell heeft stdout van curl omgeleid naar stdin van xzat, de shell doet de same, leidt de stdout van xzcat om naar stdin van tar, en tar begint de gegevens uit te pakken, verbazingwekkend!

Antwoord

Ten eerste, een algemeen principe: wat je ook doet, malloc() wordt nooit automagisch aangeroepen.

Wanneer je een struct declareert, declareer je een type. Een type op zichzelf verbruikt geen geheugen tijdens runtime.

Wanneer u een variabele van het struct-type declareert, wordt er geheugen voor toegewezen, maar niet met malloc(). Als de variabele lokaal is aan een functie, geheugen ervoor wordt meestal toegewezen op de stapel. Dit is gedeeltelijk wat recursiviteit mogelijk maakt in C: elke keer dat je de functie aanroept (zelfs als deze vanuit zichzelf wordt aangeroepen), wordt de stapelaanwijzer aangepast en nieuwe ruimte is gereserveerd op de stapel voor de locomotief alle variabelen van die functie, en elke keer dat de functie wordt verlaten, wordt de stapel “afgewikkeld”, waarbij al die ruimte wordt vrijgemaakt.

Wanneer je een globale variabele declareert, wordt er een statische toewijzing voor gemaakt op de heap wanneer het programma start, en de variabele blijft beschikbaar tijdens de uitvoering van het programma. De vereiste heapgrootte is bekend tijdens het compileren.

Wanneer u daarentegen malloc() gebruikt, wordt geheugen dynamisch toegewezen tijdens runtime aan het programma door het besturingssysteem en u bent verantwoordelijk voor het vrijmaken ervan met free(), of uw programma (vooral als het een programma is dat lange tijd draait zonder opnieuw op te starten, bijv. een servicetoepassing) zal lijden aan een geheugenlek, wat de prestaties nadelig beïnvloedt en, in een extreem geval, het hele systeem van bronnen uithongert. Het gebruik van malloc() is het meest geschikt wanneer a) de vereiste hoeveelheid geheugen meer is dan kan worden toegewezen op de heap of de stapel, of b) de vereiste hoeveelheid geheugen niet is vooraf bekend.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *