为什么以下C代码在最终导致分段错误之前允许输入流大于缓冲区的大小?使用大小为1的字符数组作为very_bad
的参数,不会只允许1个字符的输入吗?
此外,将c
初始化为int
而不是char
会产生什么影响?声明while ((c = getchar()) != '\n' && c != EOF)
是否会以4个字符为增量从getchar()
读取?或者字符的二进制表示是4个字节?
注意:这是来自类的文本,但不是HW。
#include <stdio.h>
void very_bad(char* buffer) {
int c; /* NB: int rather than char because the system I/O function
getchar() returns the int value 0xffffffff on end-of-file */
char* dest = buffer;
/* read until newline or end-of-file (Control-Z for the standard input) */
while ((c = getchar()) != '\n' && c != EOF)
*dest++ = c; /* store next character in buffer and move pointer */
printf("%s\n", buffer);
}
int main() {
char buff[1]; /* big trouble waiting to happen */
very_bad(buff);
return 0;
}
答案 0 :(得分:1)
对于问题的第一部分,它与操作系统中的页面大小有关。当然,该代码会导致&#34;未定义的行为&#34;。
这个答案提供了一个非常好的主意: why doesn't my program crash when I write past the end of an array?
此外,将c初始化为int会产生什么影响 而不是一个炭?声明会是((c = getchar())!=&#39; \ n&#39;&amp;&amp; c!= EOF)以4个字符为增量从getchar()读取?要么 字符的二进制表示是4个字节吗?
getchar()
的原型是:
int getchar ( void );
因此,当您使用c = getchar()
时,对getchar()
的每次调用都会读取STDIN中的一个字符,将该char
值转换为int
并将其返回,以分配给c
变量。