Domanda

Ho osservato che a volte nei programmi C, se abbiamo un printf nel codice da nessuna parte prima un errore di segmentazione, ma non stampa. Perché è così?

È stato utile?

Soluzione

E 'perché l'uscita dal printf() viene tamponata. Si potrebbe aggiungere fflush(stdout); immediatamente dopo l'printf e sarebbe stampare.

Inoltre si potrebbe fare questo:

fprintf(stderr, "error string");

poiché stderr non viene tamponata.

C'è anche una questione connessa .

Altri suggerimenti

Se l'errore di segmentazione si verifica troppo presto dopo un printf, e il buffer di uscita non è stata lavata, non sarà possibile vedere l'effetto della printf.

La maggior parte delle implementazioni libc uscita del buffer printf. Di solito è sufficiente aggiungere nuova riga (\ n) alla stringa di output per forzarlo svuotare il contenuto buffer.

È possibile svuotare il buffer di uscita a destra dopo il printf per far sì che si verificherà prima di un guasto seg. Per esempio. fflush (stdout)

punta a caso: se si sta cercando di difetti di segmentazione di debug, assicuratevi di provare valgrind . Rende molto più facile!

È stato dato un certo numero di risposte sottolineando il buffering del flusso di uscita.

Per meglio o peggio, che è in nessun posto vicino alla unica possibilità però. Un errore di segmentazione significa che il sistema operativo ha rilevato che hai fatto qualcosa di sbagliato, di solito scritta fuori la memoria allocata. Nel bene e nel male (soprattutto nel male) fare quasi niente in una situazione del genere può cambiare abbastanza di ciò che il programma fa internamente per evitare che il problema venga rilevato, almeno al momento / nella situazione in cui si è stato rilevato precedentemente.

Ad esempio, la colpa segmento potrebbe essere stato causato da scrittura attraverso un puntatore non inizializzato - che è accaduto a tenere un certo valore (forse qualche piccolo intero) a causa di una funzione che si aveva chiamato in precedenza lasciato che il valore al punto giusto su lo stack che quando la funzione è stata chiamata in seguito, e utilizzato lo stesso valore di un puntatore, esso (ragionevolmente affidabile) conteneva un valore del sistema operativo rilevato come un luogo non era permesso di scrivere. Mettere in una chiamata a printf, tuttavia, potrebbe significare che si sta lasciando un certo valore completamente diverso nel punto sullo stack che si sta utilizzando senza inizializzazione. Stai ancora scrivendo da qualche parte non si dovrebbe, ma potrebbe ora essere da qualche parte che il sistema operativo non so non si dovrebbe essere la scrittura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top