在C中访问大于UINT_MAX * 4大小的内存?

时间:2009-06-16 12:46:05

标签: c pointers long-integer

假设我有一个大小为78719476736字节的数组。请注意,在我的C代码中使用malloc动态分配此数组。假设malloc在分配了这么多内存后返回一个有效的指针。此数组的大小超过UINT_MAX(4294967295),即无符号整数的最大限制(32位)

假设我的代码如下所示

int *buf;
buf = (int*)malloc(78719476736);

此处78719476736大于4 * UINT_MAX。

现在如果我必须引用buf的所有元素,那么因为buf是int *它将是32位,所以它将无法处理我使用malloc分配的所有内存元素(78719476736字节)

我的问题是不应该将上面的代码更改为使buf为long long(64位变量),因为只有long long变量才能解决我已经分配的大内存。

更改了代码,例如

unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);

实际上我认为,变量buf不应该再是指针,因为任何指针都是32位宽,因此它将无法访问78719476736字节。

所以它应该是一个普通的unsigned long long int,我将不得不将malloc返回指针值转换为unsigned long long int,如上面更改的代码所示,并使用buf访问所有已分配的元素。

我的上述假设是否正确?

我混淆/遗失了什么?

编辑:如果有帮助,

我正在使用英特尔酷睿2双核(64位CPU)上的WinXP桌面。因此,CPU智能访问超过4 GB的地址空间不应该是一个问题。应该为64位支持启用所有其他组件,即

a。)如何在编译时启用64位编译器支持(我使用的是Visual Studio 2005专业版)

b。)64位操作系统支持 - 我使用的是Windows XP Professional。

谢谢。

-AD。

6 个答案:

答案 0 :(得分:7)

  1. 您需要64位操作系统
  2. malloc接收size_t作为64位平台上64位的参数
  3. 最重要的是:你可以想到:我需要分配超过4G的内存吗?

答案 1 :(得分:5)

我认为你对指针是什么感到非常困惑。至少在通用系统上,指针的大小(不同值的数量,即不同地址的数量)与类型无关!

int *a;
short *b;
double *c;

a,b和c是指向不同类型的指针,但它们都具有相同的大小(例如,32位系统上的4个字节)。与32位相比,这正是64位系统的要点:能够从指针处理超过2 ** 32个位置。

此外,32位CPU在[1]中也不能在硬件中寻址超过4 Gb,并且相应的虚拟地址空间通常也限制为32位。因此,无论如何都不太可能使用8 Gb的内存。

[1]并非完全正确 - 例如,英特尔CPU具有扩展,因此32位CPU可以使用“扩展”地址。

答案 2 :(得分:4)

int*是指针类型。如果您所在的系统可以分配78719476736字节,则它可能至少有64位地址,即sizeof(int*) >= 8。指针大小与sizeof(int)无关。

答案 3 :(得分:1)

要处理超过4GB的内存,您需要一些选择内存的机制。因此,您需要将应用程序编译为64位,然后所有指针都将是64位宽。

访问超过4GB内存的唯一其他方法是使用额外的地址/内存选择器机制,就像在实时模式DOS时段中的段和偏移混乱一样。这当然取决于您的处理器架构。

答案 4 :(得分:1)

如果在64位Os上运行软件并使用64位编译器设置,则所有指针都将为64位。无需特别声明。

答案 5 :(得分:0)

这是不可能的,你的编译器和操作系统不支持,期间。

对于Windows,您可以查看_HEAP_MAXREQ

的文档

阅读一些选项,

64 bit large mallocs