为什么在此代码的末尾引发异常?

时间:2020-05-14 15:55:46

标签: c++ exception

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:无效的参数传递给服务或函数。每次首次编译此代码时,它都能正常工作,但第二次引发异常。我已经在codeforce上提交了此代码,并且在正确打印所有结果后,它会打印 9720301

1 个答案:

答案 0 :(得分:4)

此循环中的条件错误:

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

因为它甚至在i>=n时也可能失败(条件将评估i<n,将其忽略,仅检查k>0)。

相反,您需要这样做:

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

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