2

私はLinuxシステムプログラミングを学んでいました、O'reilly。「よくある間違いは、ストリームが閉じる前に終了するスコープで自動変数としてバッファを宣言することです。特に、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;

}

私はコードをコンパイルして実行します..そしてこの種のコードが何を引き起こすのか本当に理解していません...この概念を理解するのを手伝ってください、ありがとうございます。

4

1 に答える 1

5

その例では、が戻ったstdout後にフラッシュされます。main

それが起こった場合、buf範囲外であり、もはや合法的に使用することはできません。したがって、プログラムは未定義の動作を示します。

bufstdout開いている限り生きる必要があり、多くの場合、戻ってくるstdoutまで開いたままになります。mainしたがって、グローバル、静的、またはヒープに割り当てられたバッファーを使用する必要があります。

于 2012-07-28T07:56:24.210 に答える