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和使用这些定义是否有效,答案是否定的putc. K&R 中的示例向您展示了编写 stdio 库的一种方法,而不是可以与现有的(可能非常不同的)stdio 实现一起使用的方法。

于 2012-07-02T14:52:28.283 回答
0

其实,我错了。

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

于 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),并且_fillbuf有特殊的代码用于这种fp->base == NULL情况,并设置baseptr到分配的内存。

于 2012-07-02T14:46:53.287 回答