La allocazione e' esatta, ma il linguaggio C alloca solo memoria senza preoccuparsi di quello che ci metti. Se la variabile e' un puntatore a variabili di tipo Cella, NON puoi associare a loro una struttura di tipo diverso, punto. Ovvero, lo puoi fare, il linguaggio C non te lo impedisce, ma il programma non funzionera' mai. Questo e' uno dei grandi problemi del C, che e' anche il suo forte quando si scrivono programmi ottimizzati per l'accesso alla memoria (non per nulla e' ancora usato per applicazioni tipo database, device drivers e embedded)
Ad ogni modo: hai una memoria allocata, per elementi di tipo Cella.
Per accedere al puntatore del primo elemento, basta un: struct Cella *c = matrice;
Per accedere all'elemento [i,j] devi usare struct Cella *c = &matrice[i * colonne + j];
Una volta che hai il puntatore di un elemento, lo puoi cambiare come vuoi.