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

时间:2014-10-10 12:52:59

标签: c segmentation-fault

为什么以下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;
}

1 个答案:

答案 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变量。