【问题标题】:Why exception is thrown at the end of this code?为什么在这段代码的末尾抛出异常?
【发布时间】:2020-05-14 15:55:46
【问题描述】:
int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, k;
        cin >> n >> k;
        int* ar1 = new int[n];
        int* ar2 = new int[n];
        /*int ar1[n];
        int ar2[n];*/
        for (int i = 0; i < n; i++) {
            cin >> ar1[i];
        }
        for (int i = 0; i < n; i++) {
            cin >> ar2[i];
        }
        sort(ar1, ar1 + n);
        sort(ar2, ar2 + n, greater<int>());
        int sum = 0;
        for (int i = 0; i < n, k>0; i++) {
            if (ar1[i] < ar2[i]) {
                ar1[i] = ar2[i];
                k--;
            }
        }
        for (int i = 0; i < n; i++) {
            sum += ar1[i];
        }
        cout << sum << "\n";
    }
    return 0;
}

code.exe 中 0x77B6EC75 (ntdll.dll) 处的未处理异常:0xC000000D:向服务或函数传递了无效参数。 每当第一次编译此代码时,它都能正常工作,但第二次抛出异常。我已在 codeforces 上提交此代码,并在正确打印所有结果后打印 9720301

【问题讨论】:

  • 阅读comma operator - for (int i = 0; i &lt; n, k&gt;0; i++) 没有按照您的想法行事。

标签: c++ exception


【解决方案1】:

这个循环中的条件是错误的:

for (int i = 0; i < n, k>0; i++)

因为即使i&gt;=n 也可能失败(条件将评估i&lt;n,忽略它,仅检查k&gt;0)。

相反,您需要这样做:

for (int i = 0; i < n && k > 0; i++) 

检查是否满足两个条件。否则,您的索引可能超出arr1arr2 的范围,从而引发错误。 (这实际上是未定义的行为,所以任何事情都可能发生)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多