Bueno, tal cual lo cuentas, tu código ya está haciendo eso.
Eso si, tienes que tener en cuenta que no estás copiando el contenido de los punteros sino que estás copiando los punteros en sí... eso quiere decir que un cambio en uno de los elementos de la matriz conlleva a que dicho cambio se va a reflejar en las otras "filas" de la matriz. Por ejemplo, un cambio en el contenido apuntado por [0][1] se reflejará también en [1][1], [2][1], [3][1], ...
Me explico:
Código C++:
Ver originalint var = 4;
int* ptr1 = &var;
int* ptr2 = &var;
*ptr1 = 8;
printf( "%d %d %d", var
, *ptr1
, *ptr2
);
El ejemplo anterior va a imprimir "8 8 8"...
Por otro lado, dado que cada vez que incrementas el tamaño de la matriz la vuelves a rellenar de cero como si no tuviese valores previos, puedes cambiar tranquilamente el realloc por un malloc y un free... realloc tiene la mala costumbre de hacer una copia de la región vieja de memoria a la nueva... te puedes ahorrar ese tiempo si no lo necesitas.