¿Me pueden ayudar a descubrir cómo asignar una matriz 2D en una llamada de asignación?

Traté de hacer:

int ** arr = (int **) malloc (num * num * sizeof (int *));

Pero no funciona.

num son las filas y columnas.

1
Aviel Ovadiya 30 abr. 2017 a las 22:10

3 respuestas

La mejor respuesta

¿Cómo puedo asignar dinámicamente array2D en 1 asignar C

Comencemos con lo que es una matriz 2D:
Ejemplo de una matriz 2D o "matriz 3 de la matriz 4 de int "

int arr1[3][4];
arr1[0][0] = this;

El código de OP declara un puntero al puntero al int, no una matriz 2D ni un puntero a una matriz 2D.
Por cierto, el yeso no es necesario.

int** arr = (int**)malloc(num * num * sizeof(int*));

El código puede asignar memoria para una matriz 2D y devolver un puntero a esa memoria. puntero a la matriz 5 de la matriz 6 de int

 int (*arr2)[5][6] = malloc(sizeof *arr2);
 if (arr2 == NULL) return EXIT_FAILURE;
 (*arr2)[0][0] = this;
 return EXIT_SUCCESS;

 // or with Variable Length Arrays in C99 and optionally in C11
 int (*arr3)[num][num] = malloc(sizeof *arr3);
 (*arr3)[0][0] = that;

Alternativamente, el código puede asignar memoria para una matriz 1D y devolver un puntero a esa memoria. puntero a la matriz 8 de int. A veces esto es a menudo lo que uno quiere con una matriz "asignar 2D", realmente un puntero a una matriz 1D

 int (*arr4)[8] = malloc(sizeof *arr4 * 7);
 arr4[0][0] = this;

 // or
 int (*arr5)[num] = malloc(sizeof *arr5 * num);
 arr5[0][0] = that;
5
chux - Reinstate Monica 30 abr. 2017 a las 21:30

Aunque pensé que el significado de un "conjunto de enteros en 2D" es inequívocamente algo así como int arr[10][10], la búsqueda en la web trajo consigo interpretaciones como "usar una matriz de punteros" o "usar un puntero a un puntero" (cf, por ejemplo, esta publicación). El resto de esta respuesta se basa en una matriz 2D de la forma int arr[r][c], donde r indica el número de filas y c el número de columnas por fila.

Si no se admiten matrices de longitud variable, al menos c debe ser una expresión constante (es decir, conocida en tiempo de compilación). r, por el contrario, también se puede definir en tiempo de ejecución, de modo que al menos el número de filas sea "dinámico". Una matriz 2D se puede representar como una matriz (probablemente incompleta) de matrices one-D:

#define COLS 3

void printArray(int array[][COLS], int rows) {
    for(int row=0; row<rows; row++) {
        for (int col=0; col<COLS; col++) {
            printf("%d ", array[row][col]);
        }
        printf("\n");
    }
}

int main() {

    typedef int oneD[COLS];

    int rows = 5;
    size_t myArray5RowsSize = rows*sizeof(oneD);
    oneD *myArray5Rows = malloc(myArray5RowsSize);
    memset(myArray5Rows,0,myArray5RowsSize);
    myArray5Rows[0][0] = 0;
    myArray5Rows[1][1] = 1;
    myArray5Rows[2][2] = 2;

    printArray(myArray5Rows, 5);

    return 0;
}
1
Stephan Lechner 30 abr. 2017 a las 21:18

Puede asignar una matriz 2D en una de 2 formas.

1: Matriz de punteros a matrices

Esto sería:

int rows = 10; 
int cols = 10;
int **array = malloc(rows * sizeof(int*));
for (int i = 0; i < rows; i++) {
    array[i] = malloc(cols * sizeof(int));
}

array ahora apuntará a una lista de punteros, cada uno de los cuales representa una fila, y esos punteros apuntarán a los elementos de la fila. En este caso, puede acceder a la enésima fila y la enésima columna con array[n][m]

2: Bloque continuo único

Este es probablemente el método que deseaba, donde podría hacerlo todo en una sola asignación. Esto requeriría que almacene la matriz 2D en una representación 1D.

int rows = 10; 
int cols = 10;
int *array = malloc(rows * cols * sizeof(int));

Luego puede almacenar y recuperar la enésima fila y la enésima columna con un desplazamiento: array[(n * cols) + m]

1
Chris Maes 24 nov. 2017 a las 07:05