执行main之前的分段错误

时间:2016-09-06 09:01:31

标签: c segmentation-fault

我正在练习c并且在主函数执行之前面临分段错误(“hi”不打印,甚至gdb没有提到错误行,除了调用来自main函数)。 有人可以帮助我从哪里出错?我尝试在网上找出并浏览错误,但无法找到我所拥有的代码类型。

   #include<stdio.h>

    int main(){
        printf("hi");
        double L,dx,dy,dt;

    scanf("%lf %lf %lf %lf",&L,&dx,&dy,&dt);

        int i,j;
        int x=L/dx;
        int y=L/dy;
        double ar[1000][1000];
        double o1=x/2;
        double o2=y/2;
        int D=2;
        double den[1000][1000];
        double den1[1000][1000];
        //printf("hi");

        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                if(i==o1 && j==o2)
                {
                ar[i][j]=1;
                den[i][j]=1;
                }
                else
                {
                    ar[i][j]=0;
                    den[i][j]=0;
                }
            }
        }
        //printf("hi");
        for(i=1;i<x-2;i++)
        {
            for(j=1;j<y-2;j++)
            {
                den1[i][j]=den[i][j]+((den[i+1][j]-den[i][j]+den[i-1][j]-den[i][j])/dx*dx+(den[i][j+1]-den[i][j]+den[i][j-1]-den[i][j])/dy*dy
                    )*dt+((den[i+1][j]-den[i][j]+den[i-1][j]-den[i][j])/dx*dx+(den[i][j+1]-den[i][j]+den[i][j-1]-den[i][j])/dy*dy)*dt;
            }
        }
        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                printf("%lf",ar[i][j]);
            }
            printf("\n");
        }
        printf("\n");
        for(i=0;i<x;i++)
        {
            for(j=0;j<y;j++)
            {
                printf("%lf",den1[i][j]);
            }
            printf("\n");
        }
        printf("\n");

        return 0;
    }

2 个答案:

答案 0 :(得分:7)

本地变量(包括数组)存储在堆栈中。 Linux上的默认堆栈大小为8MB。您的阵列中只有一个是800万字节,1000 * 1000 * 8(sizeof(double)是8)。你有三个这些数组。

使这些数组成为全局数据,或动态分配。

答案 1 :(得分:2)

您的函数可能会使用过多的堆栈内存,这些行由以下行引起:

double ar[1000][1000];
double den[1000][1000];
double den1[1000][1000];

解决方案:从堆中分配内存:

double* den = malloc( 1000 * 1000 * sizeof( double ));
etc.