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

时间:2012-07-02 14:34:54

标签: 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}
};

3 个答案:

答案 0 :(得分:1)

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

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

stdin已初始化为cnt==0,因此getc的此定义将分支到_fillbuf(不查看(p)->ptr)和{{1} }具有_fillbuf个案的特殊代码,并将fp->base == NULLbase设置为已分配的内存。

答案 1 :(得分:0)

我很难跟踪被问到的内容,但是在问题中使用“自定义”时,从一个角度来看这是否是用这些替换getcputc现有系统的定义是有效的,答案是否定的。 K& R中的示例向您展示了编写stdio库的一种方法,而不是可以与stdio的现有(可能非常不同)实现一起使用的方法。

答案 2 :(得分:0)

实际上,我错了。

在getc(stdin)的第一次调用中,计数器将为0,因此 - (p) - > cnt将不是> = 0因此将调用_fillbuf。然后fillbuf将分配缓冲区,然后它将使用read命令从stdin读取(fp-> cnt = read(fp-> fd,fp-> ptr,bufsize)。