2012-07-28 3 views
2

나는 O'reilly라는 리눅스 시스템 프로그래밍을 배우고 있었다. "일반적인 실수는 버퍼가 자동 변수로 선언되기 전에 스트림이 닫히기 전에 끝나는 것으로, 특히 main()에 로컬 버퍼를 제공하지 않도록주의하고 스트림을 명시 적으로 닫지 않아야합니다. " ,왜 main()에 로컬 인 버퍼가 있고 버그를 명시 적으로 닫는 데 실패하지 않습니까?

#include <stdio.h> 
int main() 
{ 
    char buf[BUFSIZ]; 

    /*set stdin to block-buffered with a BUFSIZ buffer*/ 
    setvbuf(stdout,buf,_IOFBF,BUFSIZ); 
    printf("Arr!\n"); 
    return 0; 

} 

내가 컴파일하고 코드 ...를 실행하고 정말 이런 종류의 코드가 원인이됩니다 이해하지 않는이 ... 나에게이 개념을 이해하는 데 도움하십시오

은이 버그가 코드의 예를 보여줍니다 다들 감사 해요.

답변

5

stdoutmain이 반환 된 후 플러시됩니다.

그런 경우 buf이 범위를 벗어났습니다. 더 이상 법적으로 사용할 수 없습니다. 따라서 프로그램은 정의되지 않은 동작을 보입니다.

bufstdout이 열려 있어야하며 stdout은 종종 main이 반환 될 때까지 열려 있습니다. 따라서 전역, 정적 또는 힙 할당 버퍼를 사용해야합니다.

+0

예. 즉, * stdout *은'at_exit'을 사용하여 등록 된 것처럼'fflush'됩니다.이 함수는'exit()'-ing과'main'의 보이지 않는 호출자 ('crt0의 시작 코드 .o')는'main'을 리턴 한 후'exit'를 호출합니다. –