¿Cómo asignar dinámicamente una array 2D en C?

 

Las siguientes son diferentes formas de crear una array 2D en el montón (o asignar dinámicamente una array 2D).
En los siguientes ejemplos, hemos considerado ‘ r ‘ como número de filas, ‘ c ‘ como número de columnas y creamos una array 2D con r = 3, c = 4 y los siguientes valores 

  1  2  3  4
  5  6  7  8
  9  10 11 12 

1) Usar un solo puntero y una array 1D con aritmética de punteros: 
una forma simple es asignar un bloque de memoria de tamaño r*c y acceder a sus elementos usando aritmética de punteros simple. 
 

C

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int r = 3, c = 4;
 
    int* ptr = malloc((r * c) * sizeof(int));
 
    /* Putting 1 to 12 in the 1D array in a sequence */
    for (int i = 0; i < r * c; i++)
        ptr[i] = i + 1;
 
    /* Accessing the array values as if it was a 2D array */
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < c; j++)
            printf("%d ", ptr[i * c + j]);
        printf("\n");
    }
 
    free(ptr);
 
    return 0;
}

Producción: 

1 2 3 4
5 6 7 8
9 10 11 12

 
2) Usando una array de punteros 
Podemos crear una array de punteros de tamaño r. Tenga en cuenta que desde C99, el lenguaje C permite arrays de tamaño variable. Después de crear una array de punteros, podemos asignar memoria dinámicamente para cada fila.
 

C

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int r = 3, c = 4, i, j, count;
 
    int* arr[r];
    for (i = 0; i < r; i++)
        arr[i] = (int*)malloc(c * sizeof(int));
 
    // Note that arr[i][j] is same as *(*(arr+i)+j)
    count = 0;
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            arr[i][j] = ++count; // Or *(*(arr+i)+j) = ++count
 
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            printf("%d ", arr[i][j]);
 
    /* Code for further processing and free the
      dynamically allocated memory */
 
    for (int i = 0; i < r; i++)
        free(arr[i]);
 
    return 0;
}

Producción: 

1 2 3 4 5 6 7 8 9 10 11 12

3) Usando un puntero a un puntero 
Podemos crear una array de punteros también dinámicamente usando un puntero doble. Una vez que tenemos una array de punteros asignada dinámicamente, podemos asignar memoria dinámicamente y para cada fila como el método 2. 
 

C

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int r = 3, c = 4, i, j, count;
 
    int** arr = (int**)malloc(r * sizeof(int*));
    for (i = 0; i < r; i++)
        arr[i] = (int*)malloc(c * sizeof(int));
 
    // Note that arr[i][j] is same as *(*(arr+i)+j)
    count = 0;
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count
 
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            printf("%d ", arr[i][j]);
 
    /* Code for further processing and free the
       dynamically allocated memory */
 
    for (int i = 0; i < r; i++)
        free(arr[i]);
 
    free(arr);
 
    return 0;
}

Producción: 

1 2 3 4 5 6 7 8 9 10 11 12

4) Usando doble puntero y una llamada malloc 
 

C

#include<stdio.h>
#include<stdlib.h>
 
int main()
{
    int r=3, c=4, len=0;
    int *ptr, **arr;
    int count = 0,i,j;
 
    len = sizeof(int *) * r + sizeof(int) * c * r;
    arr = (int **)malloc(len);
 
    // ptr is now pointing to the first element in of 2D array
    ptr = (int *)(arr + r);
 
    // for loop to point rows pointer to appropriate location in 2D array
    for(i = 0; i < r; i++)
        arr[i] = (ptr + c * i);
 
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            arr[i][j] = ++count; // OR *(*(arr+i)+j) = ++count
 
    for (i = 0; i < r; i++)
        for (j = 0; j < c; j++)
            printf("%d ", arr[i][j]);
 
    return 0;
}

Producción: 

1 2 3 4 5 6 7 8 9 10 11 12

Gracias a Trishansh Bhardwaj por sugerir este cuarto método.
Este artículo es una contribución de Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

5) Usando un puntero a la array de longitud variable.

Las dimensiones de VLA están ligadas al tipo de la variable. Por lo tanto, uno forma un puntero a una array con una forma definida en tiempo de ejecución.
El puntero tiene que ser desreferenciado antes de subíndice con sintaxis (*arr)[i][j].
 

C

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int row = 3, col = 4, i, j, count;
 
    int (*arr)[row][col] = malloc(sizeof *arr);
     
    count = 0;
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            (*arr)[i][j] = ++count;
 
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            printf("%d ", (*arr)[i][j]);
 
    free(arr);
     
    return 0;
}

6) Usando un puntero a la primera fila de VLA

Similar a 5 pero permite la sintaxis arr[i][j].

C

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int row = 3, col = 4, i, j, count;
 
    int (*arr)[col] = calloc(row, sizeof *arr);
     
    count = 0;
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            arr[i][j] = ++count;
 
    for (i = 0; i < row; i++)
        for (j = 0; j < col; j++)
            printf("%d ", arr[i][j]);
 
    free(arr);
     
    return 0;
}

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *