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 或总物理内存 + 虚拟内存的数量)。