memoria dinámica para matriz de caracteres 2D

4 minutos de lectura

He declarado una matriz char **arr; Cómo inicializar la memoria para la 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

avatar de usuario
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));
}

avatar de usuario
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  

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad