C 中的这段代码决定一个数字是否是素数,当数字很大时会崩溃。为什么?
This code in C which decides if a number is a prime number crashes with large numbers. Why?
这就是代码,在 4-5 位数字之前它都可以正常工作。
int main()
{
int x;
printf("Enter a number: ");
scanf("%d", &x);
double list[x];
int i;
for(i=0;i<x;i++){
list[ i ] = i+1;
}
double z;
int q;
double list2[x];
for(q=0;q<x;q++){
z=x/list[q];
if (z == floor(z)){
list2[q] = z;
}
else {
list2[q] = 0;
}
}
printf("\n--------------\n");
int n;
double nulla = 0.00000000;
int zero = 0;
for(n = 0; n < x; n++)
{
if (fabs(list2[n]-0.00)==0.00){
zero++;
}
}
if(zero == x-2){
printf("It is a prime number");
}
else{
printf("It is not a prime number");
}
printf("\n--------------\n");
return 0;
}
但是如果我输入例如 987521。它只会给出这条消息:Process returned -1073741571 (0xC00000FD)
我一直在想也许数组不能存储这么大的数据,但也许我错了。有什么想法吗?
而不是在堆栈上分配内存,就像您在行中所做的那样
double list[x];
使用动态分配,喜欢
double* list = malloc(x * sizeof(double));
然后,在程序结束之前,不要忘记释放:
free(list);
原因是堆栈分配的大小通常非常有限(以 MB 为单位),一旦分配超过该限制就会溢出堆栈。另一方面,动态内存(堆)受操作系统限制,并且通常可能非常大(受限于 OS 或总物理内存 + 虚拟内存的数量)。
这就是代码,在 4-5 位数字之前它都可以正常工作。
int main()
{
int x;
printf("Enter a number: ");
scanf("%d", &x);
double list[x];
int i;
for(i=0;i<x;i++){
list[ i ] = i+1;
}
double z;
int q;
double list2[x];
for(q=0;q<x;q++){
z=x/list[q];
if (z == floor(z)){
list2[q] = z;
}
else {
list2[q] = 0;
}
}
printf("\n--------------\n");
int n;
double nulla = 0.00000000;
int zero = 0;
for(n = 0; n < x; n++)
{
if (fabs(list2[n]-0.00)==0.00){
zero++;
}
}
if(zero == x-2){
printf("It is a prime number");
}
else{
printf("It is not a prime number");
}
printf("\n--------------\n");
return 0;
}
但是如果我输入例如 987521。它只会给出这条消息:Process returned -1073741571 (0xC00000FD)
我一直在想也许数组不能存储这么大的数据,但也许我错了。有什么想法吗?
而不是在堆栈上分配内存,就像您在行中所做的那样
double list[x];
使用动态分配,喜欢
double* list = malloc(x * sizeof(double));
然后,在程序结束之前,不要忘记释放:
free(list);
原因是堆栈分配的大小通常非常有限(以 MB 为单位),一旦分配超过该限制就会溢出堆栈。另一方面,动态内存(堆)受操作系统限制,并且通常可能非常大(受限于 OS 或总物理内存 + 虚拟内存的数量)。