Quando usi stderr in C?


Migliore risposta

Suppongo che tu sappia che quando esegui un programma C hai 3 file aperti, due di questi sono chiamati STDOUT e STDERR, i messaggi normali vanno in stdout, (cioè quando chiami printf) e i messaggi di errore in stderr (quando chiami ad esempio fprintf (stderr, …), questi due (file aperti in realtà) sono collegati direttamente dal tuo sistema operativo al tuo terminale, che sia un terminale Unix o un terminale Windows. La caratteristica più importante è che possono essere reindirizzati, per esempio in Unix quando fai: ls | grep file.txt la shell reindirizza stdout in “ls” e ora la destinazione per quelloutput è STDIN nel processo “grep”, quindi grep può cercare pattern in quel flusso, ecc. Questa è roba potente, molti filtri Unix (programmi in realtà) sono costruiti in questo modo, il che è potente.

MODIFICA: aggiungi un esempio più significativo Permettimi di aggiungere un nuovo e più esplicito uso del reindirizzamento in modo da poter comprendere la cosa con un esempio più significativo, guarda questo comando:

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

Qui curl inizia a scaricare wget dal progetto GNU, mentre curl sta scaricando i dati che sta scrivendo su STDOUT, ma la shell ha reindirizzato lo stdout di curl allo stdin di xzat, la shell fa il stesso, reindirizza lo stdout di xzcat nello stdin di tar e tar inizia a decomprimere i dati, fantastico!

Risposta

Primo, un principio generale: non importa quello che fai, malloc() non viene mai invocato automaticamente.

Quando dichiari un struct, dichiari un tipo. Un tipo, da solo, non consuma memoria in fase di esecuzione.

Quando dichiari una variabile di tipo struct, la memoria viene allocata per essa, ma non utilizzando malloc(). Se la variabile è locale a una funzione, la memoria per essa è solitamente allocata nello stack. Questo, in parte, è ciò che rende possibile la ricorsività in C: ogni volta che chiamate la funzione (anche se viene chiamata dallinterno di se stessa), il puntatore allo stack viene regolato e nuovo spazio in catasta per la loc tutte le variabili di quella funzione, e ogni volta che si esce dalla funzione, lo stack viene “srotolato”, con tutto lo spazio liberato.

Quando si dichiara una variabile globale, viene eseguita unallocazione statica su di essa lheap allavvio del programma e la variabile rimane disponibile durante lesecuzione del programma. La dimensione dellheap richiesta è nota in fase di compilazione.

Al contrario, quando si utilizza malloc(), la memoria viene allocata dinamicamente in fase di esecuzione al programma dal sistema operativo e sei responsabile di liberarlo utilizzando free(), oppure il tuo programma (specialmente se si tratta di un programma che funziona a lungo senza riavvio, ad esempio unapplicazione di servizio) soffrirà di un perdita di memoria, compromettendo le prestazioni e, in casi estremi, affamando lintero sistema di risorse. Luso di malloc() è più appropriato quando a) la quantità di memoria richiesta è maggiore di quella che può essere allocata nellheap o nello stack, oppure b) la quantità di memoria richiesta non lo è noto in anticipo.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *