K&R的getc和putc实现是对的吗?

Gti*_*iou 5 c getc

在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}
};
Run Code Online (Sandbox Code Playgroud)

Chr*_*zig 1

假设我们面前有相同的代码,答案是否定的。

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

stdin是用 初始化的cnt==0,因此 的这个定义getc将分支到_fillbuf(不查看(p)->ptr),并且_fillbuf具有针对这种情况的特殊代码fp->base == NULL,并将base和 都设置ptr为分配的内存。