top = (double **)malloc(sizeof(double *) * M);
なのに、
topに1万回も書き込めば何があっても不思議じゃない。