1 - Il doppio puntatore è richiesto in quanto querllo che stai creando non è una matrice ma solamente un aray di puntatori, ogniuno dei quali punta a sua volta a una array.
Quello che è effettivamente sbagliato è che:
1 - Vengono allocati troppi elementi, dovrebbe allocare spazio solamente per il numero di righe
2 - dovrebbe allocrae lo spazio per un puntatore int, ovvero sizeof(int *), e non sizeof(int)
matrice = malloc(righe*sizeof(int));
2 - Come vedi, tranne che tu stia utilizzando un compilatore C++ per compilare il tuo codice C, il cast del valore di ritorno della malloc non serve a nulla e porta solo guai, su cui non mi sembra il caso di dilungarmi ora.
3 - Per quanto riguarda la terza domanda, correggendo l'errore descritto nella prima, è necessario allocare le colonne (gli array a cui puntano i puntatori allocati precedentemente) delle righe della matrice: quel ciclo fa esattamente quello.
Vorrei comunque farti notare che quello che fa il tuo codice è tutto tranne che allocare una matrice: diciamo che fondamentalmetne frammenta in modo ottimale la memoria Una matrice è una "zona di memoria" contigua in cui le colonne sono ripetute per righe volte.
Infatti una matrice allocata dinamicamente andrebbe allocata come
int *matrice = malloc(righe*colonne*sizeof(int));
che è probabilmente quello che stava facendo chiunque abbia scritto quel pezzo di codice sbagliato
ancora meglio utilizzando
int *test = malloc(sizeof(int[righe][colonne]));
in questo modo la matrice può poi essere utilizzata facendo:
for (i = 0; i < righe; ++i)
{
for (j = 0; j < colonne; ++j)
{
printf("Inserire un numero per matrice[%d][%d]", i, j);
scanf("%d", &intMatrix[i*righe + j]);
}
}
Come ultima cosa tieni sempre presente che malloc &b co. possono fallire l'allocazione. Nel qual caso tornano NULL invece che un indirizzo utilizzabile, quindi
è mandatorio che venga controllato il valore ritornato da tali funzioni prima di utilizzarlo.
int *matrice = malloc(righe*colonne*sizeof(int));
if (matrice == NULL)
{
fprintf(stderr, "Allocazione fallita!!\n");
}