ข้อผิดพลาดในการแบ่งส่วนก่อนดำเนินการหลัก

ฉันกำลังฝึก c และเผชิญกับข้อผิดพลาดในการแบ่งส่วนก่อนที่ฟังก์ชันหลักจะดำเนินการ ( "hi" ไม่ได้พิมพ์และแม้แต่ gdb ก็ไม่ได้กล่าวถึงบรรทัดข้อผิดพลาดยกเว้นว่าการโทรนั้นมาจากฟังก์ชันหลัก) ใครสามารถช่วยฉันได้จากข้อผิดพลาดมาจากไหน? ฉันพยายามค้นหาและค้นหาข้อผิดพลาดทางออนไลน์ แต่ไม่พบประเภทรหัสที่ฉันมี

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

person vanquishers    schedule 06.09.2016    source แหล่งที่มา
comment
สวัสดี ไม่ได้พิมพ์ ลอง printf("hi\n");   -  person πάντα ῥεῖ    schedule 06.09.2016
comment
ลบแท็ก c++ - คุณกำลังใช้ C ไม่ใช่ C++   -  person UnholySheep    schedule 06.09.2016


คำตอบ (2)


ตัวแปรภายในเครื่อง รวมถึงอาร์เรย์ จะถูกจัดเก็บไว้ในสแต็ก ขนาดสแต็กเริ่มต้นบน Linux คือ 8MB อาร์เรย์ของคุณเพียงตัวเดียวเท่านั้นที่มีขนาด 8 ล้านไบต์ 1,000 * 1,000 * 8 (sizeof(double) คือ 8) คุณมี สาม ของอาร์เรย์เหล่านี้

ทำให้อาร์เรย์เหล่านี้เป็นแบบสากลหรือจัดสรรแบบไดนามิก

person Some programmer dude    schedule 06.09.2016
comment
สวัสดีฉันรู้ว่านี่เป็นกระทู้เก่ามาก คุณจะแนะนำอะไรเพื่อให้เขานึกถึงปัญหาดังกล่าว GDB ไม่ได้พูดอะไรเกี่ยวกับเรื่องนี้อย่างแน่นอน ขอบคุณ! - person HCSF; 03.09.2018
comment
@HCSF Stack ล้นแบบนี้แทบจะเป็นไปไม่ได้เลยที่จะตรวจจับ แนวทางปฏิบัติในการเขียนโค้ดที่ดี เครื่องมือวิเคราะห์แบบคงที่ และการตรวจสอบโค้ดสามารถช่วยป้องกันไม่ให้เกิดปัญหาได้ตั้งแต่แรก อาจเป็นไปได้โดยใช้เครื่องมือเช่น Valgrind หรือที่คล้ายกัน - person Some programmer dude; 03.09.2018

ฟังก์ชันของคุณอาจใช้หน่วยความจำสแต็กมากเกินไป ซึ่งเกิดจากบรรทัดเหล่านี้:

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

วิธีแก้ไข: จัดสรรหน่วยความจำจากฮีป:

double* den = malloc( 1000 * 1000 * sizeof( double ));
etc.
person SurvivalMachine    schedule 06.09.2016