C语言 为什么动态分配使用更多的RAM?

soat7uwm  于 2023-05-16  发布在  其他
关注(0)|答案(1)|浏览(113)

在LeetCode上解决最长回文子串问题时,我发现在我的两个相同的解决方案中,使用动态分配的一个使用了244 MB的RAM,而另一个只使用了10 MB的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;
}
68de4m5k

68de4m5k1#

您正在堆栈上分配ps。如果这在leetcode中真的有效,那么显然leetcode既允许它自己的非常大的堆栈分配,以避免崩溃,而且leetcode没有将其计算为内存使用。简而言之,看起来你在以一种不允许的方式欺骗leetcode。244 MB是一个惊人的堆栈大小。C编译器的典型默认堆栈大小是8MB。

相关问题