是否可以使用C中的char迭代器进行FOR循环?

时间:2016-01-28 15:17:02

标签: c for-loop iterator char unsigned

我在使用unsigned char作为迭代器时遇到了问题。使用以下代码会导致卡在FOR循环中。 The output looks like this.

unsigned char i;
char * arr;
int * freq;
arr = (char *)(malloc(256*sizeof(char)));
freq = (int *)(malloc(256*sizeof(int)));
for (i=0; i<=255;i++){
    arr[i]=i;
    freq[i]=0;
    printf("%c",i);
}

我的问题是为什么会这样?是否因为使用unsigned char作为迭代器?

3 个答案:

答案 0 :(得分:9)

i <= 255

如果i的类型为unsigned char且该类型在您的平台上是8位(可能是这样),则表达式将始终为true并且您具有无限循环。但是,它是明确定义的行为。 unsigned char将简单地环绕,一旦达到255,它的值将再次从0开始。

解决方案当然很简单:将i的类型更改为int

为避免将来出现此类意外,请务必打开编译器的警告。如果我使用GCC编译伪造循环并将-Wall-Wextra标志传递给它,它会告诉我这个。

main.c: In function ‘main’:
main.c:5:17: warning: comparison is always true due to limited range of data type [-Wtype-limits]
   for (i = 0; i <= 255; ++i)
                 ^

答案 1 :(得分:0)

由于您的条件为i <= 255,当i变为255时,它将加1。 计算机上unsigned char的最大范围是[0,255],因此它只会再次回零。所以循环,永远持续下去。

此问题称为算术或integer overflow

答案 2 :(得分:0)

for循环执行以下操作:它执行初始化。然后它检查循环条件。如果循环条件为真,则执行循环,然后执行增量表达式。然后它再次检查循环条件。这字面意思它的作用。

当i = 255,并执行i ++时,编译器尝试将i设置为256,但由于它是无符号字符且可能是8位,因此256被截断为零。然后循环条件i <= 255再次成立。编译器遵循完全你告诉它做的事情,而不是你想要它做什么。