假设我有一个大小为 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(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 访问所有分配的元素。
我的上述假设是否正确?
或者
我是否感到困惑/遗漏了什么?
编辑:如果有帮助,
我正在使用在 Intel Core 2 Duo(64 位 CPU)上安装 WinXP 的台式机。所以从 CPU 角度来说,访问超过 4 GB 的地址空间应该不是问题。应该启用哪些所有其他组件以支持 64 位,即
a.) 如何在编译时启用对 64 位的编译器支持(我使用的是 Visual Studio 2005 专业版)
b.) 操作系统支持 64 位 - 我使用的是 Windows XP Professional。
谢谢你。
-广告。