For循环的最后一次迭代中的分段错误
问题描述:
我正在编写一些代码,用于根据每个组件的等级和权重计算学生的最终成绩。当下面的for循环应该退出时,我遇到了分段错误。For循环的最后一次迭代中的分段错误
for (i = 0; i < course.numOfSchemes; i++){
printf("Marking scheme# %u \n", i);
for (j = 0; j < course.numOfComponents; j++){
printf(" Enter %s weight: ",course.components[j]);
scanf("%f", &course.weights[i][j]);
}
printf("End: %u \n \n",i);
}
printf("rrr");
所以,假设course.numOfSchemes = 2和course.numOfComponents = 3,这是一个试运行是什么样子。你会注意到循环从头到尾都是两次,但文本“rrr”永远不会被打印出来。因此,我假定在循环尝试退出时发生的检查期间发生故障。
Marking scheme# 0
Enter A weight: 20
Enter B weight: 30
Enter C weight: 50
End: 0
Marking scheme# 1
Enter A weight: 40
Enter B weight: 40
Enter C weight: 20
End: 1
Segmentation fault (core dumped)
答
printf()
在调用之后不刷新,除非在格式字符串中有换行符。很可能,你printf()
后有一些其他的代码,会导致缓冲区溢出,像这样:
printf("printed\n");
printf("not printed");
char a[1];
for (int i = 0; i < 100; i++)
{
a[i] = 0xff;
}
所以这个样品的输出将是这样的:
printed
Segmentation fault (core dumped)
+0
谢谢!我疯了! – 2014-10-16 18:09:33
尝试'的printf(“RRR \ n“);' – BLUEPIXY 2014-10-16 16:36:49
如果你按照@BLUEPIXY的建议,你可能会发现你的段错误事实上发生在后面。 stdout通常是行缓冲的,当程序突然终止时,缓冲区通常不会被刷新。 – 2014-10-16 16:45:49
'course.weights'是'float'类型的数组吗? – 2014-10-16 16:50:49