Hola, me gustaria saber como definir una matriz de char en C de la siguiente forma:
char matriz[ num ][20]
(se que no se debe de declarar así sino con punteros, es para que lo visualicéis mas fácilmente)
Siendo num una variable del programa y 20 un numero fijo.
Es decir, con una dimensión fija y la otra dinámica, estoy intentando usar calloc() pero no se como "referirme" a cada una de las dimensiones. ¿Alguien me puede enviar un mini-fragmento de código haciéndolo?
Cuando usas malloc simplemente estás reservando memoria consecutiva, no tiene dimensiones, etc. Por lo tanto para reservarla simplemente haz el malloc de num * 20.
Luego eres tú el que, si quieres, tienes que tratarla como una matriz.
Hola MPLS,
Cita de: A.I. en 4 Noviembre 2015, 00:54 AM
Cuando usas malloc simplemente estás reservando memoria consecutiva, no tiene dimensiones, etc. Por lo tanto para reservarla simplemente haz el malloc de num * 20.
Luego eres tú el que, si quieres, tienes que tratarla como una matriz.
Tal y como te ha dicho A.I., esa es una de las maneras en la que puede hacerse lo que pides. Esto lo harías más o menos así:
int filas = 3, columnas = 3;
int* m = malloc(filas*columnas*sizeof(int));
De esta manera, si consideras que las filas se cuentan como 0, 1, ...., TOTAL_FILAS-1 y las columnas como 0, 1, ..., TOTAL_COLUMNAS-1, el índice de un elemento de la matriz vendrá dado por:
indice = fila * TOTAL_COLUMNAS + columna
Por ejemplo, si tienes una matriz 3x3, para acceder al elemento en la fila 0 y la columna 2, tendrías que hacer m[0*3+2] = m[2]. Si quieres acceder al elemento en la fila 2 y la columna 1, sería m[2*3+1] = m[7].
La otra manera de hacerlo es tratar a cada fila como un puntero a un array de N elementos, donde N son las columnas. Esto sería algo así:
int i, filas = 3, columnas = 3;
int** m = malloc(filas*sizeof(int*));
for (i=0; i<filas; i++) m[i] = malloc(columnas*sizeof(int));
En este caso, el acceso a un elemento de la matriz es más sencillo. Para acceder al elemento en la fila 0 y la columna 2 basta con hacer m[0][2]. Si quisieras acceder al elemento en la fila 2 y la columna 1 deberías hacer m[2][1].
Fíjate en ambos ejemplos el tipo de las variables usadas. En el primer caso,
m es un puntero a entero; mientras que en el segundo caso
m es un puntero a un puntero a entero.
Espero que te sirva de ayuda, un saludo!
No olvides usar free para liberar la memoria, cuano se un array de una sola dimension solo basta con
[code=c]free(arreglo)
pero cuando sean arrays de mas de una dimension hacer
//esto solo es valido para array bidimensionales
for(int i; i<columna;i++) free(arreglo[i]);//liberamos internamente
free(arreglo);
[/code]