Mi ci sono messo d'impegno perchè mi piace l'allocazione dinamica davvero tanto...
ed ecco quello che è saltato fuori a me...
prova a darci un'occhiata, perchè secondo me è più o meno quello che ti serve...
Notare ovviamente l'uso di un puntatore a puntatore...
DA NOTARE che le colonne sono sempre allocate da zero (mai riallocate!), ma che puoi comunque modificarle prima della compilazione cambiando la riga col define... (attenzione alle free, non sono sicuro che funzionino bene)...
Nota bene anche che per allocare le righe nuove e le colonne ci sono sempre le stesse tre righe di codice... fai una funzione e via! :P
codice:
#include <stdlib.h>
#include <stdio.h>
#define COLONNE 3 //qui puoi cambiare il numero di colonne in qualsiasi momento...
int main(){
int **rows2; //puntatore a puntatore a intero.
int rows=1; //numero di righe
int j,i; //contatori
rows=1; //parto da una riga
printf("Alloco memoria per riga %d\n",rows-1);
rows2 = (int**)malloc(rows * sizeof(int*)); //alloco memoria per puntatore riga (memoria per la riga)
*(rows2+(rows-1)) = (int*)malloc(COLONNE*sizeof(int)); //alloco memoria per interi o meglio alloco la memoria per le colonne
/*provo a inserire qualche valore*/
rows2[0][0]=999;
rows2[0][1]=888;
rows2[0][2]=555;
rows++; //aggiungo una riga
printf("Alloco memoria per riga %d\n",rows-1);
rows2 = (int**)realloc(rows2,rows*sizeof(int*)); //riallogo le righe
rows2[rows-1] = (int*)malloc(COLONNE*sizeof(int)); //alloco le colonne
/*provo a inserire qualche valore*/
rows2[1][0]=777;
rows2[1][1]=666;
rows2[1][2]=444;
/*aggiungo ancora una riga... sarebbe comodo fare una funzione per queste tre righe di codice...*/
rows++; //aggiungo una riga
printf("Alloco memoria per riga %d\n",rows-1);
rows2 = (int**)realloc(rows2,rows*sizeof(int*));//rialloco le righe
rows2[rows-1] = (int*)malloc(COLONNE*sizeof(int)); //alloco le colonne
/*provo a inserire qualche valore*/
rows2[2][0]=333;
rows2[2][1]=222;
rows2[2][2]=111;
/*stampa valori matrice*/
for(i=0;i<=rows-1;i++)
{
j=0;
while(j<COLONNE)
{
printf("%d ",rows2[i][j]);
j++;
}
printf("\n");
}
/*Libero memoria*/
for(i=0;i<=rows-1;i++)
{
free(rows2[i]);
}
free(rows2);
/*conclusione*/
printf("\nFINE\n\n");
system("pause");
}