5

K&R の第 8 章では、putc および getc 関数のカスタム実装があります。getc の最初の定義で、パラメーターが stdin の場合、_iob の定義に従って、関数はアドレス 0 に書き込もうとします。これは、_iob[0].ptr と _iob[0].base があった値だからです。割り当てられます。これは合法ですか?

コード: http://ideone.com/AIkCA

_iob の定義:

FILE _iob[20] = {
 {0, (char *) 0, (char *) 0, _READ, 0},
 {0, (char *) 0, (char *) 0, _WRITE, 0},
 {0, (char *) 0, (char *) 0, _WRITE, 0}
};
4

3 に答える 3

0

実は、私は間違っていました。

getc(stdin) の最初の呼び出しでは、カウンターは 0 になるため、--(p)->cnt は >= 0 にならず、_fillbuf が呼び出されます。その後、fillbuf はバッファを割り当て、read コマンド (fp->cnt = read(fp->fd, fp->ptr, bufsize)) で stdin から読み込みます。

于 2012-07-02T15:06:05.290 に答える
0

目の前に同じコードがあると仮定すると、答えはノーです。

#define getc(p)  (--(p)->cnt >= 0 \
  ? (unsigned char) *(p)->ptr++ : _fillbuf(p))

stdinは で初期化されるcnt==0ため、 のこの定義は( を見ずに) にgetc分岐し、ケース用の特別なコードを持ち、 と の両方を割り当てられたメモリに設定します。_fillbuf(p)->ptr_fillbuffp->base == NULLbaseptr

于 2012-07-02T14:46:53.287 に答える
0

質問の内容を理解するのに苦労していますが、質問で「カスタム」を使用していることから、既存のシステムでgetcputcをこれらの定義に置き換えることが有効かどうかを 1 つの角度から見ると、答えはノーです。 . K&R の例は、標準入出力ライブラリーを作成する 1 つの方法を示しています。標準入出力の既存の (おそらく非常に異なる) 実装で機能するものではありません。

于 2012-07-02T14:52:28.283 に答える