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

标签 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 位二进制文​​件的最大 malloc 大小?

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

最佳答案

您正在尝试将大于 2^31 的数字存储在带符号的 32 位 int 中。它不适合。使用 size_t 代替您传递给 malloc 的大小。将 i 的类型更改为 size_t

关于c - 在 64 位二进制文​​件上分配超过 2gb 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21132238/

相关文章:

c++ - 我可以使用为某种类型指定的分配器在 C++ 中分配另一种类型的对象吗?

c - 将 mmap 与 PROT_NONE 与 PROT_READ 结合使用之间是否存在性能差异?保护写入

c - 如何在 C 中迭代这个系列 5 6 7 6 5 6 7 6 5 6 7 6 5...?

c - Windows 中 C 的咨询锁定接口(interface)

c - SIGALRM、间隔计时器和 sleep() 问题

linux - 嵌入式 linux 上的 QT5 eglfs(TI am355x evm 入门套件)

linux - 即使在命令末尾使用 >/dev/null 2>&1 后仍获取 "No such file or directory"

linux - 无法让 cv2 工作 - 即使是最基本的代码

c++ - 为什么递归内存释放这么慢?

node.js - 在 Node.js 中,数据什么时候存储在堆上?