Si, entendiste bien hasta ahi.
1)(char*)malloc(sizeof(char)*5);
Reserva memoria para 5 caracteres.
(char*)malloc(sizeof(char*)*5);
Reserva memoria para 5 PUNTEROS a caracteres (pero deberias hacer el casting a char **).
En realidad siempre reserva memoria simplemente, pero desde un punto de vista logico la diferencia seria esa con el casting correcto, en una PC con un S.O. de 32 bits, char = 1 byte, char *(y cualquier otro puntero) 4 bytes.
2) Reservas primero la memoria para los punteros a cadena y despues la memoria para las cadenas mismas.
1)(char*)malloc(sizeof(char)*5);
Reserva memoria para 5 caracteres.
(char*)malloc(sizeof(char*)*5);
Reserva memoria para 5 PUNTEROS a caracteres (pero deberias hacer el casting a char **).
En realidad siempre reserva memoria simplemente, pero desde un punto de vista logico la diferencia seria esa con el casting correcto, en una PC con un S.O. de 32 bits, char = 1 byte, char *(y cualquier otro puntero) 4 bytes.
2) Reservas primero la memoria para los punteros a cadena y despues la memoria para las cadenas mismas.
Código (cpp) [Seleccionar]
//reservar
char **lista = (char**)malloc(sizeof(char*) * 3);
for (int x = 0; x < 3; x++)
{
lista[x] = (char*)malloc(sizeof(char) * 5);
}
//usar
//liberar
for (int x = 0; x < 3; x++)
{
free(lista[x]);
}
free(lista);