C 在某些特定情况下访问数组时发生运行时错误
我有下面的代码来生成一个数的素因子。除了一些数字外,它对所有数字都很好。我在这些数字中得到的错误是运行时错误,它位于第5行和第10行,当尝试访问“factors”数组时 还有为什么它在访问第15行和第18行中的“factors”数组时没有给出错误。 *这对于大于或小于48598496894的数字都非常有效,但对于48598496894则不然C 在某些特定情况下访问数组时发生运行时错误,c,arrays,pointers,runtime-error,prime-factoring,C,Arrays,Pointers,Runtime Error,Prime Factoring,我有下面的代码来生成一个数的素因子。除了一些数字外,它对所有数字都很好。我在这些数字中得到的错误是运行时错误,它位于第5行和第10行,当尝试访问“factors”数组时 还有为什么它在访问第15行和第18行中的“factors”数组时没有给出错误。 *这对于大于或小于48598496894的数字都非常有效,但对于48598496894则不然 void getfactors(unsigned long long n){ unsigned long long *factors,i=0,k=0
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;
}
void getfactors(无符号长n){
无符号长*因子,i=0,k=0;
//存储素因子的数组//
因子=(无符号长*)malloc(n*sizeof(无符号长));
//得到2,这是数字的因子//
而(n%2==0){
系数[k++]=2;//第5行
n=n/2;
}
//得到这个数的其他素数因子//
对于(i=3;i2)
系数[k++]=n;//第15行
printf(“%d\n\n”,k);
//打印所有因素//
对于(i=0;i您应该在malloc
之后检查factors是否为NULL
,以防分配失败。您还需要调用free
来释放分配的内存。如果您对代码进行注释以解释您的预期行为,这也会有所帮助
为了解决您的问题,我建议您在调试时检查数组索引。如果您在开始时使用较小的输入值,直到您知道您的算法有效为止,这可能会更容易
还有一点是您是否需要factors数组?如果函数的目的是打印基本因子,您不能在找到它们时打印它们吗
编辑
我认为@BLUEPIXY在评论中已经暗示了这个问题。malloc
的输入参数是size\u t
。在我的电脑上size\u t
是32位的值。如果在你的平台上是这样,那么你试图分配的内存块的大小太大。检查(n*sizeof(unsigned long-long))>SIZE_MAX
。正如我前面提到的,您可以在找到因子时打印它们并删除数组吗?调试告诉您什么?可能是文字数48598496894
被解释为负数?@Jongware-无论如何,为什么我在尝试访问因子数组时出现运行时错误?请检查>尺寸(尺寸)
@sclarke8--我已经对代码进行了注释。这对大于或小于48598496894的数字都非常有效,只是对48598496894无效。感谢您对代码进行注释。我已经更新了我的答案;我希望这会有所帮助。@sclarke9-实际上,我需要先打印素数因子的数量,然后打印因子本身,为此我有e将因子存储在某个地方……大小不是问题,因为正如我所说的,对于小于或大于48598496894的数字,代码都可以正常工作。