long long int数组指针这个数组的算术

时间:2017-08-16 21:44:41

标签: c++ arrays

我遇到以下代码问题:

#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,所以我不知道在这种情况下问题出在哪里。

2 个答案:

答案 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可以做的是发现所请求的大小太大来分配并返回空指针。然后,当您尝试访问空指针时,会出现“访问冲突”错误。