Core dumped - dynamiczna alokacja pamięci

0

Hej!

Piszę program do swojej pracy licencjackiej i mam problem z dynamiczną alokacją pamięci dla dwóch tablic dwuwymiarowych. Najpierw w ramach testu zaalokowałam je statycznie, ale wtedy już dla L=30 wyskakiwał core dump - dla mniejszych wszystko było w porządku. Teraz naruszenie ochrony pamięci wyskakuje za każdym razem i nie mam pojęcia dlaczego, tak naprawdę dopiero uczę się dynamicznie alokować pamięć. Wklejam cały kod, razem z moimi chaotycznymi i może niezbyt jasnymi dla szerszego grona obliczeniami, bo może ktoś znajdzie powód wyskakiwania błędu w miejscu, w którym się go nie spodziewam. :)

 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>



int main(int argc, char *argv[]){

    int L=atoi(argv[1]);

    double **source_x = (double**)malloc(L * sizeof(double*));
    int i;

    for (i=0; i<L; i++){
        source_x[i] = (double*)malloc(L * sizeof(double));
    }

    double **source_y = (double**)malloc(L * sizeof(double*));

    for (i=0; i<L; i++){
        source_y[i] = (double*)malloc(L * sizeof(double));
    }

    double b, q; 
    double A[2][2]; // macierz deformacji
    double dx_dy, dx_dx, dy_dy, dy_dx;
    double det, tr;


    b=1;
    q=0.7;

    int j;
    double x, y;
    double alfa_x, alfa_y; 
    double k1, k2;


    for (i=0; i<L*L; i++){

            x=1.*i;

        for (j=0; j<L*L; j++){

            y=1.*j;

            alfa_x=((b*pow(q, 2)*x)/(sqrt(pow(q, 2)*pow(x, 2)+pow(y, 2))));
            alfa_y=((b*y)/(sqrt(pow(q, 2)*pow(x, 2)+pow(y, 2))));

            source_x[i][j]=x-alfa_x;
            source_y[i][j]=y-alfa_y;

        }
    }
    for (i=1; i<L*L-1; i++){

        x=1.*i;

        for (j=1; j<L*L-1; j++){

            y=1.*j;

            dx_dy=(source_x[i][j+1]-source_x[i][j-1])/(2.);
            dx_dx=(source_x[i+1][j]-source_x[i-1][j])/(2.);
            dy_dy=(source_y[i][j+1]-source_y[i][j-1])/(2.);
            dy_dx=(source_y[i+1][j]-source_y[i-1][j])/(2.);

            A[0][0]=dx_dx;
            A[0][1]=dx_dy;
            A[1][0]=dy_dx;
            A[1][1]=dy_dy;

            det=A[0][0]*A[1][1]-A[0][1]*A[1][0];
            tr=A[0][0]+A[1][1];

            if(det>0 && tr<0)
                printf("%d  %d\n", i, j);
            k1=(1-det)/2.;
            k2=(b*pow(q, 2)*(pow(x, 2)+pow(y, 2))/(2*pow(pow(q, 2)*pow(x, 2)+pow(y, 2), 1.5)));
            printf("k1=%lf, k2=%lf\n", k1, k2);
        }
     }



    for (i=0; i<L; i++){
        free(source_x[i]);
    }
    free(source_x);

    for (i=0; i<L; i++){
        free(source_y[i]);
    }
    free(source_y);

    return 0;
}

Byłabym bardzo wdzięczna, gdyby ktoś mi pomógł. :)

0

A czego ty się niby spodziewasz? Robisz sobie tablice o rozmiarze LxL a następnie masz pętle:
for (i=0; i<L*L; i++){ oraz for (j=0; j<L*L; j++){
czyli zarówno i jak i j będą z przedziału 0..L2 a powinny być z 0..L

0

Pisząc tutaj na pewno spodziewam się tego, że ktoś spostrzeże błąd, którego mi spostrzec się nie udało, ale niekoniecznie tego, że będzie na mnie naskakiwał.
Niemniej dziękuję za wyłapanie tego, pomogło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1