【问题标题】:Is the getc and putc implementation of K&R right?K&R的getc和putc实现对吗?
【发布时间】:2012-07-02 23:48:26
【问题描述】:

在 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}
};

【问题讨论】:

  • 您为什么不在问题中发布代码并告诉我们您使用的是什么版本的书?我想这里不是每个人都有一本方便理解你在说什么的书。
  • 如果以后有任何此类问题,请在 cm.bell-labs.com/cm/cs/cbook/2ediffs.html> 找到 K&R2 的勘误页 - 至少有。现在好像下架了。谷歌缓存有它。 (省略大量 URL)如果您发现任何尚未发现的错误,C 编程世界将会震惊。毕竟它被称为我们的圣经。我们已经努力研究过了。
  • cm.bell-labs.com 网站现已备份,但链接仍然无效。又来了:cm.bell-labs.com/cm/cs/cbook/2ediffs.html
  • @AlanCurry 是putc(x, p) 的实现吧?不应该是getc()的“对立面”吗?

标签: c getc


【解决方案1】:

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

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

stdincnt==0 初始化,因此getc 的定义将分支到_fillbuf(不查看(p)->ptr),_fillbuf 具有fp->base == NULL 情况的特殊代码并设置baseptr 都分配给内存。

【讨论】:

  • 谢谢,我在回答中也解释了同样的事情。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    其实我错了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 2016-08-14
      • 2012-11-20
      • 2018-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多