我刚刚开始接触 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在你的代码中。外循环从 0
到 NUM_GRAPHIC_CHARS
包含,但您必须记住数组的索引从 0
到它们的大小减一,因此您超出了频率
数组的范围。
该越界条目的值(value)是多少?没有人知道,但由于它可能很大,您的内部循环可能需要相当长的时间,甚至可能看起来是无限的。
关于c - 为什么代码会进入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22782190/