当我使用int或unsigned long long我的程序崩溃时,可以使用什么数据类型的数组索引0到4000000

时间:2018-05-20 10:40:26

标签: c arrays

寻找偶数的fibonnaci系列

#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,这段代码工作正常。 我尝试将类型更改为无符号long long和格式说明符到%llu仍然代码崩溃,即使我将主数据类型更改为unsigned long long它不工作我认为数字4000000对于int类型来说太大但是当我搜索时从他的网站上的其他用户那里得到了这个代码

// 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;
 }

这段代码工作得很好 我是初学者和自学者我不知道我的代码有什么问题是因为我使用了一个数组。请帮助纠正这个问题。 谢谢。

3 个答案:

答案 0 :(得分:1)

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

static int a[4000000];

答案 1 :(得分:1)

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

而是使用动态内存,如:

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];进行检查,然后打印计算出的值。你很快就会发现他们错了。

答案 2 :(得分:0)

如果您必须(由于某些原因)使用自动存储变量 - 请增加堆栈大小。

例如这样:

for (int k = 0; k < amountofpoints; k+=1)
{
    newGraph.Series[item.name].Points.AddXY(0,0)
}