假设我有一个大小为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。
答案 0 :(得分:7)
答案 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)