문제

나는 때때로 C 프로그램에서 printf 분할 오류 이전의 코드에서는 인쇄되지 않습니다.왜 그럴까요?

도움이 되었습니까?

해결책

출력 때문입니다 printf() 버퍼링됩니다. 당신은 추가 할 수 있습니다 fflush(stdout); 당신의 직후 printf 그리고 그것은 인쇄 할 것입니다.

또한 다음을 수행 할 수 있습니다.

fprintf(stderr, "error string");

~부터 stderr 버퍼링되지 않습니다.

관련 질문도 있습니다.

다른 팁

printf 후에 세분화 오류가 너무 빨리 발생하고 출력 버퍼가 플러시되지 않으면 printf의 효과가 표시되지 않습니다.

대부분의 LIBC 구현 버퍼 Printf 출력. 일반적으로 출력 문자열에 Newline ( n)을 추가하여 버퍼 내용을 플러시하도록 강제하는 것으로 충분합니다.

Printf 바로 다음에 출력 버퍼를 플러시하여 SEG 오류 전에 발생하는지 확인할 수 있습니다. 예를 들어. fflush (stdout)

랜덤 팁 : 세분화 결함을 디버그하려는 경우 시도하십시오. Valgrind. 훨씬 쉬워집니다!

출력 스트림의 버퍼링을 지적하는 여러 가지 답변이 제공되었습니다.

좋든 나쁘든, 그것은 유일한 가능성에 가깝지 않습니다.분할 오류는 일반적으로 할당된 메모리 외부에 기록되는 잘못된 작업을 OS가 감지했음을 의미합니다.더 좋든 나쁘든(대부분 더 나쁘게) 거의 일을 하고 있습니다. 아무것 이러한 상황에서는 적어도 이전에 문제가 감지된 시점/상황에서 문제가 감지되는 것을 방지하기 위해 프로그램이 내부적으로 수행하는 작업을 충분히 변경할 수 있습니다.

예를 들어, 세그먼트 오류는 초기화되지 않은 포인터를 통해 쓰기 때문에 발생했을 수 있습니다. 이전에 호출한 함수가 해당 값을 스택의 올바른 지점에 남겨두었기 때문에 특정 값(아마도 작은 정수)을 보유하게 되었습니다. 나중에 함수가 호출되어 동일한 값을 포인터로 사용하면 OS가 쓰기가 허용되지 않는 위치로 감지한 값이 (합리적으로 신뢰할 수 있게) 포함되었습니다.그러나 printf를 호출하면 초기화 없이 사용 중인 스택 지점에 완전히 다른 값이 남게 될 수도 있습니다.당신은 여전히 ​​쓰지 말아야 할 곳에 쓰고 있지만 이제는 OS가 쓰지 않는 곳에 있을 수도 있습니다. 알다 글을 쓰면 안 됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top