概ね >84 に同意。>73 は確かにバグってるんだけどね。

>94
問い詰められるのはおまいだ。
>top[0] = (double *)malloc(sizeof(double) *M*N);
なんだから、メモリの確保自体はしてあるだろ?
落ち着いて図でも描いてみるべし。

>73
×for(i=1; i<M; i++) top[i] = top[i-1]+M;
○for(i=1; i<M; i++) top[i] = top[i-1]+N;
これでいけると思われ。
でも、どうせなら malloc(sizeof(double*)*M+sizeof(dobule)*M*N) にして
malloc 1回にしたい気もする。
あー、けどアラインメントを考えるとうまくいかない環境もあるか。