Non ho controllato molto bene il codice. In ogni caso, compilando il codice, ho trovato i seguenti errori:
1. Per poter leggere un double usando scanf è necessario usare il formato %lf e non %f. Devi quindi correggere la corrispondente riga di lettura degli elementi della matrice.
2. Nel seguente codice f è un puntatore, ma tu lo confronti con un intero. Dovresti scrivere *f nella riga in cui effettui il confronto o potresti andare incontro a strani comportamenti.
c = localmaxval(n, M, f);
for (k = 0; k < f; k++)
printf("%f", c[k]);
Ci sono però alcune cose che il compilatore non mi ha segnalato. La seguente riga potrebbe infatti causare diversi problemi in alcuni compilatori C.
scanf("%d", &n);
double M[n][n];
La possibilità di usare dimensioni conosciute a runtime per definire la dimensione di un array è infatti un'aggiunta "recente" (recente più per via del flop della penultima versione dello standard che per il tempo passato dal suddetto standard) tutt'altro che priva di aspetti negativi. Il principale di questi problemi è che l'allocazione della memoria è nascosta al programmatore e non credo esistano modi per verificarne il successo. Considerando che nel tuo codice non effettui alcun controllo sul valore passato in input, sarebbe a mio parere meglio utilizzare altre tecniche più esplicite (e comunque verificare la dimensione passata in input).
Nessuna di queste cose risolve però il problema con il tuo codice e uno studio più attento è necessario.