Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 流缓冲区大小小于输入流,但没有立即分段错误_C_Segmentation Fault - Fatal编程技术网

C 流缓冲区大小小于输入流,但没有立即分段错误

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

为什么下面的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 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
可能会错过文件的结尾。)