簡體   English   中英

當我使用int或unsigned long long程序崩潰時,什么數據類型可用於數組索引0到4000000

[英]What datatype can be used for array index 0 to 4000000 when i used int or unsigned long long my program crashes

用於查找斐波那契數列的偶數

#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而言,此代碼工作正常。 我嘗試將類型更改為unsigned 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;
 }

這段代碼很好用,我是一個初學者,而且是一個自學成才的人,我不知道我的代碼有什么問題,因為我使用了array.Please幫助糾正這一點。 謝謝。

大多數實現對堆棧幀的大小都有相當小的限制。 如果需要大型數組,請將其設為靜態或動態分配。

static int a[4000000];

在大多數系統上,局部變量在堆棧上分配。 堆棧的大小有限,因此創建一個巨大的數組作為局部變量將使堆棧溢出。

而是使用動態內存,例如:

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]; 然后打印計算出的值。 您很快就會發現它們是錯誤的。

如果你必須 (因某些原因)使用自動存儲變量-增加堆棧大小。

例如這種方式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM