Per poter lavorare con matrici bisogna come prima cosa tenerle in memoria. Ci sono diversi modi di farlo, ma vedremo che la scelta più conveniente è una sola.
Se le dimensioni della matrice sono note a priori, quando si scrive il programma, la matrice può essere dichiarata staticamente con una istruzione del tipo double a[100][100]. Se si sceglie questa soluzione, il compilatore riserva una zona di memoria contenente 100*100 double adiacenti. L'elemento (i+1,j+1) della matrice è a[i][j]. Si noti che quest'ultima espressione viene automaticamente tradotta dal compilatore in a[i*100+j], a sua volta tradotta in *(a+i*100+j).
L'inconveniente di questo metodo è dovuto al fatto che quasi sempre la dimensione è nota solo al tempo dell'esecuzione, ed il C standard non prevede che si possa allocare una matrice con dimensioni non costanti.
Per utilizzare dimensione non costante, la memoria per la matrice va allocata dinamicamente a tempo di esecuzione. L'equivalente della soluzione precedente diventa
double *a; a = calloc(n*n, sizeof *a);Però adesso per accedere agli elementi dobbiamo usare la notazione a[i*n+j], perché il compilatore non saprebbe come trattare la notazione più naturale a[i][j]. Questa soluzione è da evitare soprattuto perché alloca un unico blocco di memoria, e se le matrici che trattiamo sono molto grandi non è facile trovare un unico blocco libero.