【问题标题】:Why sublime text and VSCode not showing runtime error?为什么 sublime text 和 VSCode 不显示运行时错误?
【发布时间】:2020-12-12 02:02:33
【问题描述】:

以下面的代码sn-p为例,取n为9,数组a的元素为{5,5,4,5,5,5,4,5,6}。 Sublime 文本和 Visual Studio 代码显示正确的输出为 3,但 Leetcode 在线 ide 显示“运行时错误:索引 8 超出类型‘int [k]’的范围”。我想知道为什么 sublime text 和 visual studio code 没有显示运行时错误,如果有显示运行时错误的 ide/text 编辑器,请推荐给我。

    int k = n - 1;
    int temp[k];
    for (int i = 0 ; i < k ; i++)
    {
        temp[i] = (a[i] - a[i + 1]);
    }
    int res = INT_MIN;
    for (int i = 0 ; i < k ; )
    {
        int x = temp[i];
        int c = 0;
        while (x == temp[i])
        {
            i++;
            c++;
        }
        res = max(res, c + 1);
    }
    cout<<res;

【问题讨论】:

  • 您的代码具有未定义的行为,因此从技术上讲没有正确的输出(a[i + 1] 在最后一次迭代中超出范围)。显然,Leetcode 对数组进行边界检查。您需要找到具有该功能的编译器和运行时。您使用的编辑器无关紧要。
  • 索引越界错误是导致未定义行为的错误示例。因为行为是未定义的,所以 Leetcode 和你的编译器都是正确的。您不应期望不良程序以可预测的方式运行。这是使 C++ 编程变得困难的原因之一。

标签: c++ visual-studio-code sublimetext3


【解决方案1】:
int k = n - 1;
int temp[k];    // variable length array, must be either #define k <constant num>
                // or 'const int k'

C++ 标准不支持可变长度数组 (VLA)。 Sublime Text & VS Code 根本不重要,重要的是编译器。

您可能没有启用编译器警告,因此您看不到任何错误。您可以通过在编译选项中附加 -pedantic 标志来查看所有警告。

【讨论】:

  • 非常感谢。我很长时间以来一直在数组上使用这种类型的声明,但不知道这是不正确的。
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2015-04-23
  • 2018-11-16
相关资源
最近更新 更多