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

标签 c windows runtime-error

完整代码here 。初始问题here .

出于某种原因,此代码运行完美:

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 并将其写在第一个 for 之后,如下所示:

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 (i == 0 && k == -1)
        return 0;

在第一个循环中的 if 之后,它的行为符合预期。所以很明显,发生的情况是它将 s[-1](k 初始化为 -1)与某些东西进行比较,然后崩溃。

最佳答案

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

您添加的用于修复连续 for 循环的 if 条件正是第一个嵌套循环隐式执行的操作:如果未找到,则不执行任何操作。

关于如果我顺序执行 for 循环而不是嵌套执行,C 代码会遇到意外的运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52076961/

相关文章:

c - Arduino Due Sam3X8E 访问定时器值

c - 我对 fgets() 和 strtok() 的使用对于解析多行输入是否不正确?

c# - 我想从使用 c# 运行的 Windows 框中通过 ssh 运行命令

windows - Android Studio 到 Git 可执行文件的路径

Visual Studio 2013 的 scanf_s 和 printf 中的 C 计算器错误

c++ - memmove 不动

c - 从不兼容的指针类型传递参数 1 of 'x'

windows - Vagrant 停止了工作。拒绝访问

asp.net - 运行时错误根本不知道该怎么办,我对这些事情没有经验

spring - Controller Spring MVC中的错误处理