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

C 当我在程序崩溃时使用int或unsigned long long时,数组索引0到4000000可以使用什么数据类型,c,arrays,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) {

求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;
}
#包括
#包括
int main()
{
INTA[4000000];
整数和=0;
int i;
对于(i=0;i1){
printf(“%d%d”,x,y);
如果(限制>2){

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

static int a[4000000];

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

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* 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;
}
int SeStack(rlim\t大小)
{
结构rlimit-rlim;
if(!getrlimit(RLIMIT_STACK,&rlim))
{

if(rlim.rlim_cur如果您必须(出于某些原因)使用自动存储变量-增加堆栈大小

例如:

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;
}
int SeStack(rlim\t大小)
{
结构rlimit-rlim;
if(!getrlimit(RLIMIT_STACK,&rlim))
{

if(rlim.rlim_cur)对于堆栈来说可能太大了。最好分配动态内存。编译不是为了运行。您的代码在运行时会崩溃。UNIX上的堆栈大小通常为8 MiB,Windows上则更小。您试图分配接近16 MiB的内存;随后会发生崩溃。将变量设为全局变量,或使用动态内存(
malloc()
et al)。与您观察到的崩溃无关,但最常见的是索引数组(未签名的!)
size\t
将是选择的类型。它对于堆栈来说可能太大。最好分配动态内存。不运行编译。您的代码在运行时会崩溃。UNIX上的堆栈大小通常为8 MiB,Windows上的堆栈大小通常较小。您尝试分配接近16 MiB的内存,然后会发生崩溃。请将变量设为全局变量,或使用动态内存(
malloc()
等)。与您观察到的崩溃无关,但最常用的索引数组(无符号!)
size\u t
将是一种选择。