为什么循环索引会超出循环界限

Shi*_*dou 6 c c++

最近,我遇到了超出循环约束的迭代问题。通过记录,我发现循环索引不能被循环绑定所限制。

经过进一步调试后,我发现这是因为cross_parray 在以下代码段之前的某个地方发生了超出范围的写入:

cv::Point2f cross_parray[8];
int cross_points_num = 0;
int j;

// ...

for(j = 0; j < cross_points_num; j++)
{
  printf("%d   Cross[%d]: %f %f\n", cross_points_num, j, cross_parray[j].x, cross_parray[j].y);
}        

Run Code Online (Sandbox Code Playgroud)

这是上面的输出printf

9   Cross[1718]: 239764258816.000000 0.049635
9   Cross[1719]: 56350172250112.000000 3277795840.000000
9   Cross[1720]: 245523097321472.000000 817.286072
9   Cross[1721]: 810850240.000000 0.000000
9   Cross[1722]: 4630804223985380483294822400.000000 17845644235931175201275904.000000
9   Cross[1723]: 279783113978270150157139968.000000 217149087997375045783066247168.000000
9   Cross[1724]: 16965729398885974016.000000 75876376993756550538537486778368.000000
9   Cross[1725]: 1125715943805045169979392.000000 257558259045784092672.000000
9   Cross[1726]: 71920725395007019893418622976.000000 263079777742056587264.000000
9   Cross[1727]: 18063601952671647256054595584.000000 17857709399654295200260188798976.000000
9   Cross[1728]: 286724012145286700981684214431744.000000 0.000000
9   Cross[1729]: 1157838373559229814725935104.000000 261926873829635784704.000000
9   Cross[1730]: 0.000000 0.000000
9   Cross[1731]: 0.000000 0.000000

Run Code Online (Sandbox Code Playgroud)

为什么超出范围的错误会导致怪异的执行,从而使循环索引超出循环界限?

for*_*818 3

一旦你的程序中出现了未定义的行为,所有的赌注都会失效(也就是你在 UB 的土地上)。实际上,写入越界可能会覆盖另一个变量,并导致越界访问后发生的任何事情产生不可预测的结果。