为什么动态分配使用更多内存?

问题描述 投票:0回答:1

在 leetcode 上解决最长回文子串问题时,我发现在我的两个相同的解决方案中,使用动态分配的一个最多使用 244mb 的 RAM,而另一个只使用 10mb 的 RAM。

静态分配方案(动态方案在代码评论区)

char * longestPalindrome(char * s){
    int n = strlen(s);
    int ps[n][n]; //int *ps = (int *)malloc(n * n * sizeof(int));
    memset(ps, 0, sizeof(ps[0][0]) * n * n);
    int maxi = 0, maxj = 0;
    for (int i = 0; i < n; i++)
    {
        ps[i][i] = 1; //ps[i*n+i] = 1;
    }
    for (int l = 2; l <= n; l++)
    {
        for (int i = 0; i <= n - l; i++)
        {
            int j = i + l - 1;
            if (i == j - 1)
            {
                if (ps[i][j] = (s[i] == s[j])) //if (ps[i*n+j] = (s[i] == s[j]))
                {
                    maxi = i;
                    maxj = j;
                }
            }
            else
            {
                if (ps[i][j] = (s[i] == s[j] && ps[i + 1][j - 1])) //if (ps[i*n+j] = (s[i] == s[j] && ps[(i + 1)*n+(j - 1)]))
                {
                    maxi = i;
                    maxj = j;
                }
            }
        }
    } //free(ps)
    char *p = &s[maxi];
    s[maxj + 1] = '\0';
    return p;
}
c dynamic-memory-allocation
1个回答
0
投票

您正在堆栈上分配

ps
。如果这在 leetcode 中确实有效,那么显然 leetcode 都允许使用其自己的非常大的堆栈分配来避免崩溃,并且 leetcode 不会将其计为内存使用。简而言之,您似乎在以一种不允许的方式欺骗 leetcode。 244 MB 是一个离谱的堆栈大小。 C 编译器的典型默认堆栈大小为 8 MB。

© www.soinside.com 2019 - 2024. All rights reserved.