为什么代码进入无限循环

时间:2014-04-01 09:46:55

标签: c arrays for-loop getchar

我刚开始使用C,并且一直遵循Kernighan和Ritchie的“The C Programming Language”第2版。我正在解决练习1.14打印字符频率的直方图。继承我的代码

#include<stdio.h>
#define FIRST_GRAPHIC_CHAR 32
#define LAST_GRAPHIC_CHAR 126
#define NUM_GRAPHIC_CHARS (LAST_GRAPHIC_CHAR - FIRST_GRAPHIC_CHAR + 1)
int main(void)
{
  int c,thisval,maxval,i,j;
  int frequency[NUM_GRAPHIC_CHARS] = { 0 };
  c=getchar();
  while(c>=FIRST_GRAPHIC_CHAR && c<=LAST_GRAPHIC_CHAR && c != '\n')
    {
      ++frequency[c-FIRST_GRAPHIC_CHAR];
      c=getchar();
    }
  printf("CASE \t\tOccurences\n");
  for(i=0;i<=NUM_GRAPHIC_CHARS;i++)
  {
    if(i+FIRST_GRAPHIC_CHAR == ' ')
    {
      printf("<space> |\t");
      for(j=0;j<frequency[i];j++)
       {
          printf("*");
       }
      printf("\n");
     }
   else
   {
     printf("%c \t|\t",i+FIRST_GRAPHIC_CHAR);
     for(j=0;j<frequency[i];j++)
     {
        printf("*");
     }
     printf("\n");
    } 
  }
 return(0);
 }

现在我的问题是,当我运行此代码时,程序进入无限循环但是当我使用表达式时

j<frequency[i] istead of
j<=frequency[i] 
在for循环中

它完美地工作。现在我无法理解它为什么会进入无限循环?确定代码是否有问题。

1 个答案:

答案 0 :(得分:1)

您的代码中有undefined behavior。外部循环从0NUM_GRAPHIC_CHARS 包含,但你必须记住,数组的索引从0到它们的大小减一,所以你走出去frequency数组的边界。

该越界条目的价值是什么?没有人知道,但由于它可能很大,你的内环可能需要相当长的时间,甚至可能看起来无限。