Pergunta

Tenho observado que, por vezes, em programas em C, se temos um printf em qualquer lugar do código antes de uma falha de segmentação, ele não imprime. Por que isso acontece?

Foi útil?

Solução

É porque a saída do printf() é tamponado. Você pode adicionar fflush(stdout); imediatamente após a sua printf e seria imprimir.

Além disso, você poderia fazer isso:

fprintf(stderr, "error string");

desde stderr não é tamponada.

Há também uma questão relacionado.

Outras dicas

Se ocorrer a falha de segmentação demasiado cedo após um printf, e o buffer de saída não foi liberado, você não verá o efeito do printf.

A maioria das implementações libc buffer de saída printf. É geralmente suficiente para acrescentar nova linha (\ n) para a cadeia de saída para forçá-lo a liberar os buffers de conteúdo.

Você pode liberar o buffer de saída logo após o printf para garantir que ele vai ocorrer antes uma falha seg. Por exemplo. fflush (stdout)

tip

aleatória: se você está tentando falhas de segmentação de depuração, não deixe de experimentar valgrind . Isso torna muito mais fácil!

Você foi dado um número de respostas apontando buffer do fluxo de saída.

Para melhor ou pior, isso é nada perto para a única possibilidade embora. A falha de segmentação significa que o OS detectou que você tem errado alguma coisa, fora tipicamente escrito memória alocada. Para melhor ou pior (principalmente pior) fazendo quase qualquer em tal situação pode mudar bastante de que o programa faz internamente para evitar que o problema seja detectado, pelo menos no momento / na situação em que foi detectado anteriormente.

Por exemplo, a falha segmento pode ter sido causado por escrito através de um ponteiro não inicializado - que aconteceu para manter um certo valor (talvez algum pequeno inteiro) porque uma função que você tinha chamado anteriormente deixou que o valor no ponto certo em a pilha que quando a função mais tarde foi chamado, e usou esse mesmo valor como um ponteiro, ele (razoavelmente confiável) continha um valor do oS detectado como um lugar que não foram autorizados a gravação. Colocar em uma chamada para printf, no entanto, pode significar que você está deixando algum valor completamente diferente no local na pilha que você está usando sem inicialização. Você ainda está escrevendo algum lugar que você não deve, mas pode agora estar em algum lugar que o OS não sei você não deve ser escrita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top