我遇到以下代码问题:
#include <iostream.h>
#include <stdlib.h>
int main()
{
unsigned long long int i,j;
unsigned long long int *Array;
i=j=0;
Array=(unsigned long long int*)malloc(18446744073709551616);
for(i=0ULL;i<18446744073709551616;i++)
*(Array+i)=i;
std::cin>>j;
std::cout<<*(Array+j);
return 0;
}
我的编译器(Borland C ++ builder 6.0)给了我一个访问冲突错误。在编制该计划的阶段也有警告。我从未使用过unsigned long long int
,所以我不知道在这种情况下问题出在哪里。
答案 0 :(得分:1)
您面临的问题是由于malloc无法返回一个有效指针,该指针由于系统面临的内存限制而返回到所请求大小的内存块,因此malloc执行通常所做的操作当它无法分配所需的内存时 - 它返回nullptr。 (malloc reference here)
链接网页的最相关部分如下:
返回值: 成功时,指向由函数分配的内存块的指针。 此指针的类型始终为void *,可以将其强制转换为所需类型的数据指针,以便可以取消引用。 如果函数无法分配请求的内存块,则返回空指针。
您获得访问冲突错误的原因是您尝试在内存中使用指向空(因此无效)位置的指针。
将来,我建议您尝试分配更合理大小的内存块(例如,1kb,1mb等)。如果你想使用unsigned long long int,你应该考虑创建一些与数学有关的东西而不是内存操作。
<强>附录:强>
如果您想获得该类型的最大值,您应该执行以下操作:
如iBug所述,std::numeric_limits<unsigned long long int>::max();
输入的数字经历无符号整数溢出。无符号整数的整数溢出是已定义的行为,因此魔术值18446744073709551616的实际值为0;你是malloc'ing 0字节。
malloc'ing 0字节的行为如下(根据c标准):
如果请求的空间大小为零,则行为是实现定义的:返回空指针,或者行为就像大小是非零值一样,除了返回的指针不应该是用于访问对象。
您仍然无法推断返回的指针或将其用作对象。
暂且不说: *(Array + i) = i;
相当于Array[i] = i;
甚至i[Array] = i;
:)
答案 1 :(得分:0)
unsigned long long
是非负64位整数,其最高可能值为2 64 -1 = 1844674407370955161 5 。编译器可能不知道您的意思1844674407370955161 6 (值溢出)。
此外,2 64 等于16 EB,或16,777,216 TB。我不知道这么大的存储空间在哪里,即使它不是RAM。
所有malloc
可以做的是发现所请求的大小太大来分配并返回空指针。然后,当您尝试访问空指针时,会出现“访问冲突”错误。