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

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

最佳答案

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

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

stdin 是用 cnt==0 初始化的,所以这个 getc 的定义将分支到 _fillbuf (无需查看 (p)->ptr),并且 _fillbuf 具有针对 fp->base == NULL 情况的特殊代码并设置两者baseptr 到分配的内存。

关于c - K&R的getc和putc实现对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295784/

相关文章:

c - C 中的这两个简单代码是相同的,但我得到不同的输出。会喜欢一些内省(introspection)

c - %(limit)[^\n] 在 scanf 中的行为是什么?溢出安全吗?

c - 仅当所有字节数组可用时如何组装多个字节数组

c - C 中的函数参数在函数调用后未修改

c - c中的文件处理代码有什么问题?

c - 为什么我的循环会创建额外的链表节点?

c - fgetc 总是返回值 1

计算一个字符串在另一个字符串中出现的次数

c - 用户输入以创建链接列表

c - 为什么 rewind() 在这个简单的程序中没有按预期工作?