首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中的这段代码决定了一个数字是否是素数,它会导致大数崩溃。为什么?

C中的这段代码决定了一个数字是否是素数,它会导致大数崩溃。为什么?
EN

Stack Overflow用户
提问于 2021-12-20 23:39:53
回答 1查看 64关注 0票数 0

因此,这是代码,它的工作非常好,直到4-5位数。

代码语言:javascript
复制
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)和我一直在想,也许数组不能存储这么大的数据,但也许我错了。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-20 23:49:13

而不是像在行中那样在堆栈上分配内存。

代码语言:javascript
复制
double list[x];

使用动态分配,如

代码语言:javascript
复制
double* list = malloc(x * sizeof(double));

然后,在程序结束之前,不要忘记释放:

代码语言:javascript
复制
free(list);

原因是堆栈分配通常在大小上是非常有限的(MBs的顺序),并且当您分配超过这个限制时,堆栈就会溢出。另一方面,动态内存(堆)受操作系统的限制,通常是相当大的(受操作系统或物理+虚拟内存总量的限制)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70429176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档