首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用int或unsigned long long程序崩溃时,哪种数据类型可用于数组索引0到4000000

当我使用int或unsigned long long程序崩溃时,哪种数据类型可用于数组索引0到4000000
EN

Stack Overflow用户
提问于 2018-05-20 18:40:26
回答 3查看 157关注 0票数 0

求fibonnaci数列的偶数

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[4000000];
    int sum=0;
    int i;
    for(i=0;i<4000000;i++)
    {
       if(i==0)
       {
           a[0]=1;
       }
       else if(i==1)
       {
           a[1]=2;
       }
       else
       {
           a[i]=a[i-1]+a[i-2];
       }
       if(a[i]%2==0)
       {
           sum+=a[i];
       }
    //printf("a[%d]=%d\n",i,a[i]);
    }
    printf("sum=%d\n",sum);//
    return 0;
}

当我为a=10运行compile.But时,这段代码崩溃了。我尝试将类型更改为unsigned long long,并将格式说明符更改为%llu,但即使我将主数据类型更改为unsigned long long,代码仍会崩溃。我认为数字4000000对于int类型来说太大了,但当我搜索时,我从他的网站上的其他用户那里得到了以下代码

代码语言:javascript
复制
// Simple Program to print Fibonacci series in Console
#include <stdio.h>
int main() {
    int x=1,y=2,sum=0,limit=0,i=0,temp=0;
    printf("Enter Limit:");
    scanf("%d",&limit);

    if(limit==1)
        printf("%d",x);
    else if(limit>1) {
        printf("%d %d",x,y);
        if (limit>2) {
            while (i<limit-2) {
                temp=y;
                sum=x+y;
                x=temp;
                y=sum;
                printf(" %d",sum);
                i++;
            }
        }
    }      
    printf("\n");
    return 0;
 }

这段代码运行良好,我是一个初学者,一个自学成才的人,我不知道我的代码出了什么问题,是不是因为我使用了array.Please帮助来纠正这个问题。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-05-20 18:45:05

大多数实现对堆栈帧的大小有相当小的限制。如果您需要大型数组,请将其设置为静态或动态分配。

代码语言:javascript
复制
static int a[4000000];
票数 1
EN

Stack Overflow用户

发布于 2018-05-20 18:46:16

在大多数系统中,局部变量都是在堆栈上分配的。堆栈的大小有限,因此创建一个巨大的数组作为局部变量将使堆栈溢出。

而应使用动态内存,如:

代码语言:javascript
复制
int* a = malloc(4000000 * sizeof *a);
if (a == NULL)
{
    // no more memory
    exit(1);
}

// Now a can be used as an array, e.g. a[1234] = 42

... put your code here


// When done, deallocate memory like:
free(a);

也就是说,使用这么大的数组是没有意义的。简单的整数类型不能保存那么多斐波那契数的值。在计算中会有整数溢出,并且您的结果将是错误的。您可以使用int a[100];进行检查,然后打印计算值。你很快就会发现他们错了。

票数 1
EN

Stack Overflow用户

发布于 2018-05-20 19:36:41

如果你必须(出于某些原因)才能使用自动存储变量--增加堆栈的大小。

例如,这样做:

代码语言:javascript
复制
int SeStack(rlim_t size)
{
    struct rlimit rlim;
    if(!getrlimit(RLIMIT_STACK, &rlim))
    {
        if (rlim.rlim_cur <= size)
        {
            rlim.rlim_cur = size;
            return setrlimit(RLIMIT_STACK, &rlim);
        }
        else
        {
            return 0;
        }
    }
    return EPERM;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50433969

复制
相关文章

相似问题

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