c - 为什么代码会进入无限循环

标签 c arrays for-loop getchar

我刚刚开始接触 C,并且一直在关注 Kernighan 和 Ritchie 所著的《C 编程语言》第二版。我正在解决练习 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 循环中它工作得很好。现在我无法理解为什么它会进入无限循环?请告诉代码是否有问题。

最佳答案

您有undefined behavior在你的代码中。外循环从 0NUM_GRAPHIC_CHARS 包含,但您必须记住数组的索引从 0 到它们的大小减一,因此您超出了频率数组的范围。

该越界条目的值(value)是多少?没有人知道,但由于它可能很大,您的内部循环可能需要相当长的时间,甚至可能看起来是无限的。

关于c - 为什么代码会进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22782190/

相关文章:

objective-c - Clean NSLog - 没有时间戳和程序名称

c++ - 将新值写入数组

php - 如何在 PHP 中检索 2 个标记之间的数组值?

c# - 将 Array 与多个读取器线程 + 写入器一起使用

python - python 一次进行更多迭代

c - 为什么 gcc 为用户级和内核级代码产生不同的汇编结果

c - ./a.out : error while loading shared libraries: libgsl. so.23: 无法打开共享对象文件: 没有那个文件或目录

c++ - 确定系统制表位长度

iphone - 循环遍历 NSArray 中的 NSString

python - 按行解析数据框