He declarado una matriz char **arr; Cómo inicializar la memoria para la matriz de caracteres 2D.
memoria dinámica para matriz de caracteres 2D
Una forma es hacer lo siguiente:
char **arr = (char**) calloc(num_elements, sizeof(char*));
for ( i = 0; i < num_elements; i++ )
{
arr[i] = (char*) calloc(num_elements_sub, sizeof(char));
}
Está bastante claro lo que está sucediendo aquí: en primer lugar, está inicializando una matriz de punteros, luego, para cada puntero en esta matriz, está asignando una matriz de caracteres.
Podrías envolver esto en una función. Tendrá que liberarlos () también, después de su uso, así:
for ( i = 0; i < num_elements; i++ )
{
free(arr[i]);
}
free(arr);
Creo que esta es la forma más fácil de hacer las cosas y coincide con lo que necesitas.
-
Yo usaría “arr” en lugar de “char” para la primera llamada. Y “**arr” en lugar de “char” para la llamada en el bucle.
– Andréi Ciobanu
10 de abril de 2010 a las 18:01
-
Al hacer asignaciones múltiples, la memoria no será continua. ¿Funcionará bien al incrementar un puntero para acceder al valor?
– Ankur
10 de abril de 2010 a las 18:05
-
@Ankur solo dentro de un fila de la matriz 2D
– Alex Jasmín
10 de abril de 2010 a las 18:11
-
@Andrei Yo también, (@Ankur: esto es para garantizar que no mezcle los tipos), pero creo que lo que he hecho aquí es más claro para una explicación.
– usuario257111
10 de abril de 2010 a las 18:22
alex jazmin
Hay dos opciones para asignar una matriz de tipo char **
He transcrito estos 2 ejemplos de código del Preguntas frecuentes sobre comp.lang.c (que también contiene una buena ilustración de estos dos tipos de matrices)
Opción 1 – Hacer una asignación por fila más uno para los punteros de fila.
char **array1 = malloc(nrows * sizeof(char *)); // Allocate row pointers
for(i = 0; i < nrows; i++)
array1[i] = malloc(ncolumns * sizeof(char)); // Allocate each row separately
opcion 2 – Asignar todos los elementos juntos y asignar los punteros de fila:
char **array2 = malloc(nrows * sizeof(char *)); // Allocate the row pointers
array2[0] = malloc(nrows * ncolumns * sizeof(char)); // Allocate all the elements
for(i = 1; i < nrows; i++)
array2[i] = array2[0] + i * ncolumns;
También puede asignar sólo un bloque de memoria y usa algo de aritmética para llegar al elemento [i,j]
. Pero entonces usarías un char*
No un char**
y el código se complica. p.ej arr[3*ncolumns + 2]
en lugar de arr[3][2]
Es posible que esté mejor con una matriz unidimensional:
char *arr = calloc(WIDTH*HEIGHT, sizeof(arr[0]));
for (int y=0; y<HEIGHT; y++)
for (int x=0; x<WIDTH; x++)
arr[WIDTH*y+x] = 2*arr[WIDTH*y+x];
free(arr);
Usa el siguiente truco:
typedef char char2D[1][1];
char2D *ptr;
ptr = malloc(rows * columns, sizeof(char));
for(i = 0; i < rows; i++)
for(j = 0; j < columns; j++)
(*ptr)[i][j] = char_value;
char **array;
int row,column;
char temp='A';
printf("enter the row");
scanf("%d",&row);
printf("enter the column");
scanf("%d",&column);
array=(char **)malloc(row*sizeof(char *));
for (int i=0;i<row;i++)
{
array[i]=(char*)malloc(column*sizeof(char));
}
Raúl
Por matriz de caracteres 2D, si se refiere a una matriz de cadenas, entonces se puede hacer de la siguiente manera.
int nChars = 25; // assuming a max length of 25 chars per string
int nRows = 4;
int nCols = 6;
char *** arr = malloc(nRows * sizeof(char **));
int i;
int j;
for(i = 0; i < nCols; ++i)
{
arr[i] = malloc(nCols * sizeof(char *));
}
for(i = 0; i < nRows; ++i)
{
for(j = 0; j < nCols; ++j)
{
arr[i][j] = malloc(nChars * sizeof(char));
sprintf(arr[i][j], "Row %d Col %d", i, j);
}
}
Para imprimir la matriz de caracteres 2D (matriz de cadenas (matrices de caracteres))
for(i = 0; i < nRows; ++i)
{
for(j = 0; j < nCols; ++j)
{
printf("%s ", arr[i][j]);
}
printf("\n");
}
El resultado es
Row 0 Col 0 Row 0 Col 1 Row 0 Col 2 Row 0 Col 3 Row 0 Col 4 Row 0 Col 5
Row 1 Col 0 Row 1 Col 1 Row 1 Col 2 Row 1 Col 3 Row 1 Col 4 Row 1 Col 5
Row 2 Col 0 Row 2 Col 1 Row 2 Col 2 Row 2 Col 3 Row 2 Col 4 Row 2 Col 5
Row 3 Col 0 Row 3 Col 1 Row 3 Col 2 Row 3 Col 3 Row 3 Col 4 Row 3 Col 5
c-faq.com/~scs/cclass/int/sx9b.html
– Yktula
10 de abril de 2010 a las 19:04