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) 
+1

尝试'的printf(“RRR \ n“);' – BLUEPIXY 2014-10-16 16:36:49

+0

如果你按照@BLUEPIXY的建议,你可能会发现你的段错误事实上发生在后面。 stdout通常是行缓冲的,当程序突然终止时,缓冲区通常不会被刷新。 – 2014-10-16 16:45:49

+0

'course.weights'是'float'类型的数组吗? – 2014-10-16 16:50:49

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