在 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 位二进制文件的最大 malloc 大小?
编辑:如果我使用 -O3
激活优化器,则 64 位机器上的最大内存量为 20588。
最佳答案
您正在尝试将大于 2^31 的数字存储在带符号的 32 位 int
中。它不适合。使用 size_t
代替您传递给 malloc
的大小。将 i
的类型更改为 size_t
。
关于c - 在 64 位二进制文件上分配超过 2gb 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21132238/