data = malloc(4*sizeof(double*));
for(i=0; i<n; ++i)
data[i] = malloc( n*sizeof(*data[i]) );

Here you allocate 4 pointers to double, but then you try to access from 0 to n (which is decidedly...