在C中分配超过4GB的内存

jac*_*ack 3 c

我需要在我的C程序中分配超过4GB的内存(在Windows上运行 - 64位).
显然使用只是malloc没有解决问题.

我已经以这种方式阅读了之前的一些帖子,似乎VirtualAlloc可以解决我的问题.
我试图使用它,我不明白与此功能相关的所有参数.我想我需要准确定义应该分配内存的地址,但我不知道该怎么做.
是否有关于它的简单信息,或者我可以使用的简单示例?

我也不需要在一个块中分配所有内容,因此它可能更容易.还可以接受任何分配超过4GB内存的替代方法.

谢谢.

Pet*_*ter 6

与您的陈述相反,malloc()将解决问题,假设您正在使用可以生成64位可执行文件的实现(包括编译器和库),并将其配置为执行此操作(即构建64位目标) .某些工具链能够构建64位目标,但默认情况下(例如,在关联的IDE中使用)将只生成32位可执行文件.

如果您正在构建一个32位目标(即生成一个32位可执行文件),那么,是的,malloc()将限制为4GB.可以在64位系统上执行32位可执行文件(假设操作系统允许这样做).但是,malloc()在这种情况下,该程序的使用仍将限制在4GB.

这意味着您需要确保拥有可以构建64位程序的编译器并使用它来构建64位目标.

当然,您应该问的另一个问题是,您是否真的需要在一个块中分配超过4GB的空间.虽然在某些情况下这是合适的,但通常情况下,需要这样做的程序是设计不良或懒惰的标志.


Art*_*Art 5

显然只使用malloc并不能解决问题.

为什么?size_t应该足够大,以涵盖您的程序可访问的所有地址空间,malloc需要a size_t,并且没有标准的理由说明它为什么不起作用.

遗憾的是我现在不能在Windows机器上尝试这个,但是在Linux机器上这个程序工作正常(表明C中没有任何限制会阻止你这样做):

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

int
main(int argc, char **argv)
{
    size_t sz = 40000000000;
    char *a = malloc(sz);

    memset(a, 'a', sz);

    printf("%.4s", &a[sz-5]);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我分配40GB,用字母"a"填充它然后访问它只是为了看到事情有效.他们这样做.(警告:不要在没有这么多内存的机器上运行这个程序,当你过度使用内存时,系统可能会非常不满意).

这个程序是否适合您(尺寸调整到您的硬件可以做什么,显然)?如果是,那么您可能会遇到原型或数据类型的问题,而不是问题malloc.

  • @HansPassant你似乎暗示sz被截断了.您认为截断发生在哪里? (4认同)
  • @HansPassant LL 在这里完全没有必要。您可能需要阅读 C99 或 C11 标准的第 6.4.4.1 节。特别是表示“整数常量的类型是可以表示其值的相应列表中的第一个”的位。没有后缀的十进制常量列表包含 long long。 (2认同)