kesalahan segmentasi sebelum eksekusi main

Saya berlatih c dan menghadapi kesalahan segmentasi sebelum fungsi utama dijalankan ("hi" tidak dicetak dan bahkan gdb tidak menyebutkan baris kesalahan kecuali panggilan tersebut dari fungsi utama). bisakah seseorang membantu saya dari mana kesalahannya? Saya mencoba mencari tahu dan mencari kesalahan secara online tetapi tidak dapat menemukan jenis kode yang saya miliki.

   #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 sumber
comment
hai tidak mencetak Coba printf("hi\n");   -  person πάντα ῥεῖ    schedule 06.09.2016
comment
hapus tag c++ - Anda menggunakan C bukan C++   -  person UnholySheep    schedule 06.09.2016


Jawaban (2)


Variabel lokal, termasuk array, disimpan di stack. Ukuran tumpukan default di Linux adalah 8MB. Hanya satu array Anda saja yang berukuran 8 juta byte, 1000 * 1000 * 8 (sizeof(double) adalah 8). Anda memiliki tiga array ini.

Jadikan array ini global, atau alokasikan secara dinamis.

person Some programmer dude    schedule 06.09.2016
comment
Hai, saya tahu ini adalah thread yang sangat lama. Apa yang akan Anda rekomendasikan untuk memahami masalahnya? GDB tentu saja tidak mengatakan apa pun tentang hal itu. Terima kasih! - person HCSF; 03.09.2018
comment
@HCSF Stack overflow seperti ini hampir mustahil untuk ditangkap. Praktik pengkodean yang baik, alat analisis statis, dan tinjauan kode sangat membantu mencegahnya. Hal ini mungkin dapat dilakukan dengan menggunakan alat seperti Valgrind atau yang serupa. - person Some programmer dude; 03.09.2018

Fungsi Anda mungkin menggunakan terlalu banyak memori tumpukan, yang disebabkan oleh baris berikut:

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

Solusi: Alokasikan memori dari heap:

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