为什么C中的无限循环无限循环?

时间:2016-06-14 11:13:01

标签: c infinite-loop

我在'C'程序下面运行,它有一个无限循环。我看到CPU使用'top'命令达到了近99%。然后突然程序停止了。我很想知道系统中的规则导致它停止。

我在阿尔卑斯山的码头图像下运行:3.1(+一些模块)我只是简单地开始它的灰烬(alpine's bash)。
另外,我找不到ulimit。

#include <stdio.h>
int main() {
    int marks[10],i,n,sum=0;
    printf("Enter number of students: ");
    scanf("%d",&n);
    for(i = 0; i < n; --i) {
        //printf("Enter marks of student%d: ",i+1);
        int c;
        c = 5;
        int a;
        a = c;
    }
    return 0;
}

2 个答案:

答案 0 :(得分:10)

正如你所提到的,你可以期望这产生一个无限循环,至少n是正的。

您所看到的行为是由您的计数器缠绕造成的:当它达到INT_MIN时,--i的结果为INT_MAX(至少,GCC的默认设置为英特尔风格的CPU - 这未在C中定义,见下文)并且i<n失败。

所以你的程序使用100%的一个CPU,从0倒计时到INT_MIN,然后回绕到INT_MAX并停止。

您可以添加

printf("%d\n", i);

return行之前,以便在循环退出时查看i的值。

请注意,这是undefined behaviour in C ...如果使用-O2编译它,至少使用GCC 5.3,程序永远不会退出循环,因为优化器决定退出条件永远不会到达,如果n为正(.L4: jmp .L4),则将循环编译为紧密的无限循环。

答案 1 :(得分:3)

你的循环本身并不是无限的。你原则上可以达到一个终止条件。 CPU负载发生,只是因为循环在结束之前运行(可能)> 2000000000次迭代。

首先,您不检查scanf的结果。如果失败,则n未指定。

更糟糕的是,由于有符号整数上溢/下溢,您的代码会调用未定义行为(UB)。您将i递减超过最小可表示intINT_MIN。请注意,C没有像Python这样的任意长度整数。

未定义的行为意味着任何事情都可能发生,所有赌注都会被取消。在您的情况下,可能包裹到最大值。肯定int INT_MAX,因此比较失败并退出循环。 但这不是你可以依赖的!

从代码的文本和其他部分开始,您可能不希望减少i,而是递增:i++,因此它从0计算到{{1 }}。请注意,您还应检查n - 1是否有效范围,并要求用户再次输入有效值。例如,负上限是没用的(但也没有坏处)。