C 流缓冲区大小小于输入流,但没有立即分段错误
为什么下面的C代码允许输入流在最终导致分段错误之前大于缓冲区的大小?使用大小为1的字符数组作为C 流缓冲区大小小于输入流,但没有立即分段错误,c,segmentation-fault,C,Segmentation Fault,为什么下面的C代码允许输入流在最终导致分段错误之前大于缓冲区的大小?使用大小为1的字符数组作为非常糟糕的的参数,这不就只允许输入1个字符吗 此外,将c初始化为int而不是char有什么意义?语句while((c=getchar())!='\n'&&c!=EOF)是否以4个字符的增量从getchar()读取?或者字符的二进制表示形式是4字节 注意:这是类中的文本,但不是HW #include <stdio.h> void very_bad(char* buffer) { int
非常糟糕的的参数,这不就只允许输入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;
}
#包括
无效非常坏(字符*缓冲区){
int c;/*NB:int而不是char,因为系统I/O函数
getchar()返回文件末尾的int值0xffffff*/
char*dest=缓冲区;
/*读取到换行符或文件结尾(标准输入为Control-Z)*/
而((c=getchar())!='\n'&&c!=EOF)
*dest++=c;/*在缓冲区中存储下一个字符并移动指针*/
printf(“%s\n”,缓冲区);
}
int main(){
char buff[1];/*等待发生的大麻烦*/
非常糟糕(buff);
返回0;
}
对于问题的第一部分,它与操作系统中的页面大小有关。当然,该代码会导致“未定义的行为”
这个答案给出了一个非常好的想法:
另外,将c初始化为int意味着什么
而不是一个字符?当((c=getchar())!=“\n”时,该语句将被删除&&
c!=EOF)是否以4个字符的增量从getchar()读取?或
字符的二进制表示形式是否为4字节
getchar()
的原型是:
int getchar ( void );
因此,当您使用c=getchar()
时,每次调用getchar()
都会从STDIN中读取一个字符,将该char
值转换为int
,并返回它,分配给c
变量。间隙区域存在以便对齐。一句话:UB-注释中解释了int
的基本原理getchar
读取单个字节,并将其无符号表示形式返回为0到255范围内的int。它返回特殊值EOF
,即-1,以指示流已用完。字符不能存储所有有效字符加上一个额外值,因此getchar
使用int
。(事实上,使用char
可能会错过文件的结尾。)