如果我按顺序执行而不是嵌套执行循环,则C代码会遇到意外的运行时错误

时间:2018-08-29 12:01:21

标签: c windows runtime-error

完整代码here。最初的问题here

由于某些原因,此代码可以完美运行:

 <p *ngFor="let item of items">{{item.name}}</p>

将内部的for替换为一个中断,然后在第一个for后面编写它,如下所示:

for (int i = n - 2; i > -1 ; i--)
{
    if (strcmp(s[i], s[i + 1]) < 0)
    {
        k = i;
        for (int j = n - 1; j > k; j--)
        {
           if (strcmp(s[k], s[j]) < 0)
           {
              l = j;
              swap(s, k, l);
              reverse_sequence(s, k + 1, n - 1);
              return 1;
           }
        }
    }
}

return 0;

出现运行时错误。两者都能正确打印排列。

这里甚至发生了什么事?

编辑:如果我添加

for (int i = n - 2; i > -1 ; i--)
{
    if (strcmp(s[i], s[i + 1]) < 0)
    {
        k = i;
        break;
    }
}
for (int j = n - 1; j > k; j--)
{
    if (strcmp(s[k], s[j]) < 0)
    {
        l = j;
        swap(s, k, l);
        reverse_sequence(s, k + 1, n - 1);
        return 1;
    }
}
return 0;

在第一个循环中的if之后,其行为符合预期。因此很明显,发生的事情是将s [-1](k初始化为-1)与某物进行比较,然后崩溃了。

2 个答案:

答案 0 :(得分:0)

如果内部for循环在某种程度上取决于外部for循环的控制表达式,则不能仅将嵌套的for循环替换为连续的for循环。

在这种情况下,内部for循环的控制表达式取决于k,它等于i,而外部循环的控制表达式取决于{{1 }}。

使用简单的for循环尝试一下,您将了解。 第二种情况下的运行时错误可能是由于某些超出范围的内存访问而引起的,因为i的值不再受k的值的限制。

答案 1 :(得分:0)

问题的根源是,当if (strcmp(s[i], s[i + 1]) < 0)始终为false时,嵌套循环会正确运行(内部的for循环未执行),但是连续的for循环将触发错误,因为以下for将会用等于-1的“ k”值执行(因为您说您用-1初始化k),然后您将进行数组外访问(str [-1])。

为修复连续的for循环而添加的if条件正是第一个嵌套循环隐式执行的操作:如果未找到,则什么也不做。