在64位二进制文​​件上,超过2gb的分配失败

时间:2014-01-15 08:16:29

标签: c linux memory-management malloc

在一台64位的linux机器上,我编写了以下小型C程序:

#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    #define BLOCK_SIZE (1024*1024)
    int i;

    for (i = 1; ; i++)
    {
        char *p = (char *)malloc(i * BLOCK_SIZE);
        if (p == 0)
            break;
        *p = 13;
        free(p);
    }

    printf ("Allocated max %d MB\n", (i - 1));

    return 0;
}

如果我用-O0 -m64编译它,我可以在我的桌面系统上分配2047 MB​​。如果我使用-O0 -m32 3829 MB编译相同的程序。

为什么32位二进制文​​件的最大malloc大小比同一台机器上的64位二进制文​​件大?

编辑:如果我使用-O3激活优化器,64位计算机上的最大内存量为20588。

1 个答案:

答案 0 :(得分:10)

您正尝试在签名的32位int中存储大于2 ^ 31的数字。这个不合适。请使用size_t代替传递给malloc的尺寸。将i的类型更改为size_t