Ni, non necessariamente un vero e proprio array bidimensionale, ma in generale un "jagged array". Normalmente quello che dici viene implementato come un vettore di puntatori, ciascuno dei quali punta ad un vettore. Tipicamente si fa una cosa di questo genere:
codice:
size_t w=10, h=15;
int ** arr;
arr=malloc(h*sizeof(int*));
for(size_t i=0; i<h; i++)
arr[i]=malloc(w*sizeof(int));
a questo punto arr punta ad un vettore di 15 puntatori, ciascuno dei quali punta ad un vettore di 10 puntatori; questa roba può in un certo senso essere vista come un array bidimensionale, specie visto che la sintassi per accedere agli elementi è ben quella:
codice:
arr[4][7]=42; /* imposta il settimo elemento del quarto vettore */
(per deallocare:
codice:
for(size_t i=0; i<h; i++)
free(arr[i]);
free(arr);
)