在某些特定情况下访问阵列时出现运行时错误

时间:2014-09-08 06:27:28

标签: c arrays pointers runtime-error prime-factoring

我有以下代码来生成数字的素数因子。它除了一些以外的所有数字都能正常工作。我在这些数字中遇到的错误是运行时错误,它位于第5行和第10行,在尝试访问'因素' 数组时

以及为什么在访问'因素时不会出错?第15和18行的数组。 *这对于大于和小于48598496894的数字都是完美的,只是不适用于48598496894。

void getfactors(unsigned long long n){
    unsigned long long *factors,i=0,k=0;

    //array to store prime factors//
    factors=(unsigned long long *)malloc(n*sizeof(unsigned long long));

    //getting 2's which are factors of the number//
    while(n%2==0){
        factors[k++]=2;  //line 5
        n=n/2;
    }

    //getting other prime factors of the number//
    for(i=3;i<=sqrt(n);i=i+2){
        while(n%i==0){
            factors[k++]=i;  //line 10
            n=n/i;
        }
    }

    //last prime factor of number//
    if(n>2)
        factors[k++]=n;  //line 15
    printf("%d\n\n",k);

    //printing all factors//
    for(i=0;i<k;i++)
        printf("%llu\n",factors[i]);  //line 18
}
int main()
{
    getfactors(48598496894);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

如果分配失败,您应该在NULL之后检查因素不是malloc。您还需要调用free以释放您在完成后分配的内存。如果您评论您的代码以解释您的预期行为,也会有所帮助。

要解决您的问题,我建议您在调试时检查数组索引。如果您使用较小的输入值,那么在您知道算法有效之前可能会更容易。

另一点是你是否需要因素数组?如果函数的目的是打印素数因子,你不能在找到它们时打印它们吗?

修改

我认为@BLUEPIXY在评论中暗示了这个问题。 malloc的输入参数是size_t。在我的PC上size_t是32位值。如果您的平台上出现这种情况,那么您尝试分配的内存块的大小就太大了。检查是否(n*sizeof(unsigned long long)) > SIZE_MAX。正如我之前提到的,您是否可以在找到它们时打印因子并取消数组?