执行 N >= 10^7 的代码时出现分段错误(核心转储)错误

Segmentation fault(core dumped) error while executing code for N >= 10^7

本文关键字:错误 分段 转储 核心 代码 gt 执行      更新时间:2023-10-16

我正在尝试为Codechef的Bytelandian Gold Coins编写代码。该代码适用于n < 10^7,但给出了更高值的分割错误。我寻找的数据类型可以容纳更大的数字,但这也没有用。我当然认为我的代码没有问题,但是递归树也许变得太大了,无法处理编译器。这是代码。

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
lli divide(lli n, lli dp[])
{
    lli ans = 0;
    if (n == 0)
        return 0;
    if (dp[n] != 0)
        return dp[n];
    lli m1 = floor(divide(n / 2, dp));
    lli m2 = floor(divide(n / 3, dp));
    lli m3 = floor(divide(n / 4, dp));
    lli sum = m1 + m2 + m3;
    ans = max(sum, n);
    dp[n] = ans;
    return ans;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        lli n;
        cin >> n;
        lli dp[n + 1] = { 0 };
        lli ans = divide(n, dp);
        cout << ans << endl;
    }
}

我认为在这一行中,一个大数组分配在堆栈上:

lli dp[n + 1] = {0};

这可能是segfault的原因。您可能需要将其更改为std::vector。例如:

std::vector<lli> dp(n + 1, 0);

另外,您也许可以使其静态或使用new[]分配(也许只需一次用于所有测试,以最大程度地减少开销,并且您需要记住使用delete[]正确清洁它(。

@sbarzowski提到的,当您做

lli dp[n+1] = {0}

您要求在堆栈上进行内存分配。在堆栈上分配内存,尽管导致访问时间更快,但导致内存不足。而是在堆上使用内存分配。为此,您可以使用new操作员。有关堆栈与堆分配的详细说明,请检查:https://www.geeksforgeeks.org/stack-vs-vs-heap-memory-allocation/

此外,建议在处理要一起存储的大量元素时使用std::vectorstd::array。参考:大量元素的向量与数组?