printf()
とmalloc()
呼び出しは、Cランタイムライブラリ(libcの)を呼び出します。 Cランタイムライブラリはカーネルの上にあるレイヤーで、場合によってはカーネルを呼び出すことになります。
カーネルは、brk()
(データセグメントの拡張/縮小)とmmap()
(プロセスの仮想アドレス空間へのメモリのマップページ)を介していくらか基本的なメモリ割り当てを提供します。 Libcのmalloc()
は、カーネルから取得したメモリを内部的に管理し、システムコールを最小限に抑えようとします(特に過度の断片化を防ぎ、マルチスレッドプログラムで良好なパフォーマンスを発揮しようとします) 。
stdio
入力/出力(*printf()/*scanf()
経由)はバッファリングされ、カーネルのwrite()/read()
システムコールを呼び出すことになります。デフォルトではstderr
(エラーストリーム)はバッファリングされていないか、またはラインバッファされています(ISO C§7.19.3¶7)。 stdin
およびstdout
は、インタラクティブデバイスに接続されていないと判断できない限り、ラインバッファリングまたはバッファリングされないため、入力用のインタラクティブプロンプトが正しく動作します。 stdin
およびstdout
は、ディスクファイルまたは他の非インタラクティブストリームを参照する場合、完全にバッファリング(ブロックバッファリング)できます。
つまり、エラー出力は、setbuf()/setvbuf()
を使用しない限り、'\n'
(改行)文字を出力するとすぐに表示されることが保証されています。通常の出力は、その保証を提供するために、端末または他の対話型装置に接続する必要があります。
フラッシュが行われていない場合はどうなりますか? – cnicutar
@cnicutar:デフォルトでは 'stderr'はバッファされていない/ラインバッファされています。 – ninjalj
@ninjalj opは、元の質問に 'stderr'を言及していませんでした。デフォルト!=常に。だから "* will *"は "* might *"です。 – cnicutar