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

gol*_*ean 0 c pointers long-integer

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

假设我的代码看起来像下面的东西,例如

int *buf;
buf = (int*)malloc(78719476736);
Run Code Online (Sandbox Code Playgroud)

这里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);
Run Code Online (Sandbox Code Playgroud)

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

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

我在上面的假设中是否正确?

要么

我混淆/遗失了什么吗?

编辑:如果有帮助,

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

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

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

谢谢.

-广告.

Art*_*yom 7

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


Dav*_*eau 5

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

int *a;
short *b;
double *c;
Run Code Online (Sandbox Code Playgroud)

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

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

[1]并非完全正确 - 例如Intel CPU具有扩展,因此32位CPU可以使用"扩展"地址.