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.
谢谢.
-广告.
我认为你对指针是什么感到非常困惑.至少在通用系统上,指针的大小(不同值的数量,即不同地址的数量)与类型无关!
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可以使用"扩展"地址.