Devi resettare k a zero prima del secondo giro...
In ogni caso, per casi come questi un idioma comune è scrivere la funzione in modo che accetti l'array di destinazione come argomento e restituisca il numero di elementi trovati; se viene passato NULL, si limita a contare gli elementi.
Dall'esterno della funzione si fa una prima chiamata per sapere il numero di elementi necessario, si alloca la memoria e poi si chiama nuovamente la funzione questa volta passandole l'array:
codice:
int conta(unsigned int **mat,int nrighe, int ncolonne, int * dest){
int i,j,k=0;
for (i=0; i<nrighe; i++) {
for (j=0; j<ncolonne; j++) {
if (mat[i][j] % 5 == 0) {
if(dest!=NULL)
dest[k]=mat[i][j];
++k;
}
}
}
return k;
}
/* ... da fuori ... */
int n=conta(mat, nrighe, ncolonne, NULL);
int * dest = calloc(n, sizeof(int));
cont(mat, nrighe, ncolonne, dest);
nota tra l'altro che questo evita confusioni su chi debba deallocare la memoria (è il chiamante che gestisce il tutto) e consente più flessibilità al chiamante sulla scelta di come allocare la memoria in questione.