我需要在我的C程序中分配超过4GB的内存(在Windows上运行 - 64位).
显然使用只是malloc没有解决问题.
我已经以这种方式阅读了之前的一些帖子,似乎VirtualAlloc可以解决我的问题.
我试图使用它,我不明白与此功能相关的所有参数.我想我需要准确定义应该分配内存的地址,但我不知道该怎么做.
是否有关于它的简单信息,或者我可以使用的简单示例?
我也不需要在一个块中分配所有内容,因此它可能更容易.还可以接受任何分配超过4GB内存的替代方法.
谢谢.
与您的陈述相反,malloc()将解决问题,假设您正在使用可以生成64位可执行文件的实现(包括编译器和库),并将其配置为执行此操作(即构建64位目标) .某些工具链能够构建64位目标,但默认情况下(例如,在关联的IDE中使用)将只生成32位可执行文件.
如果您正在构建一个32位目标(即生成一个32位可执行文件),那么,是的,malloc()将限制为4GB.可以在64位系统上执行32位可执行文件(假设操作系统允许这样做).但是,malloc()在这种情况下,该程序的使用仍将限制在4GB.
这意味着您需要确保拥有可以构建64位程序的编译器并使用它来构建64位目标.
当然,您应该问的另一个问题是,您是否真的需要在一个块中分配超过4GB的空间.虽然在某些情况下这是合适的,但通常情况下,需要这样做的程序是设计不良或懒惰的标志.
显然只使用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.