我在'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;
}
答案 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
递减超过最小可表示int
值INT_MIN
。请注意,C没有像Python这样的任意长度整数。
未定义的行为意味着任何事情都可能发生,所有赌注都会被取消。在您的情况下,可能包裹到最大值。肯定int
INT_MAX
,因此比较失败并退出循环。 但这不是你可以依赖的!
从代码的文本和其他部分开始,您可能不希望减少i
,而是递增:i++
,因此它从0
计算到{{1 }}。请注意,您还应检查n - 1
是否有效范围,并要求用户再次输入有效值。例如,负上限是没用的(但也没有坏处)。