在 K&R 的第 8 章中,它有 putc 和 getc 函数的自定义实现。在 getc 的第一个定义中,如果参数是 stdin,根据 _iob 的定义,函数将尝试写入地址 0,因为这是 _iob[0].ptr 和 _iob[0].base 的值分配。这合法吗?
_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
情况的特殊代码并设置两者base
和 ptr
到分配的内存。
关于c - K&R的getc和putc实现对吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11295784/