2d declaración de matriz con malloc - explicación a la respuesta (parameters)

Sé que se han publicado algunas preguntas sobre 2d arrays con malloc, sin embargo, me gustaría referirme a la respuesta a una de esas preguntas.

No puedo visualizar la realización del siguiente fragmento:

Asignar una serie de filas M de columnas N como esta:

int (*array)[N] = malloc(M * sizeof *array);
  1. Si tenemos filas M, ¿por qué lo hace? *array ¿Tienes el parámetro N?
  2. ¿Cuál es el tamaño del *array (también como un número)? Entiendo el resultado de la parte con malloc() sólo como M*N, pero bloque único (1d) de la estructura.
  3. ¿Cómo el tamaño de M, pasó sólo en malloc, se convierte en número de filas? ¿Cómo se convierte en *array[M][N]?

Le agradecería sus respuestas.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por scriptsculptor52b5


3 Respuestas:

  • Si tenemos filas M, ¿por qué *array tiene parámetro N?
    ¿Cómo el tamaño de M, pasó sólo en malloc, se convierte en número de filas?

    El código en la pregunta es una versión simplificada de la forma más correcta de escribir la expresión:

    int (*array)[M][N] = malloc(sizeof *array);
    

    Esta forma es sin embargo problemático de usar, porque ahora debemos acceder al array como (*array)[i][j] que es extraño y engorroso.

    Por lo tanto hay un truco para dejar fuera la dimensión más izquierda y utilizar un puntero al primer elemento en su lugar. El primer elemento de un int [M][N] es un int [N] y un indicador de tal elemento es int(*)[N].

    Con int (*array)[N] podemos acceder al array como array[i][j], donde el [i] es aritmética puntero en un int(*)[N] tipo y el [j] es aritmética puntero en un int* (un decaimiento int [N] array).

    ¿Cuál es el tamaño de la *array

    Es sizeof(int [N]) bytes, o si sizeof(int)*N bytes.

    Más detalles se pueden encontrar aquí: Asignación correcta de arrays multidimensionales

    Respondida el Dec 18, 2020 a las 13:19 - por debugdynamo05ee

    Votos positivos: 0 | Votos negativos: 0

  • La declaración de una matriz 2D con malloc en C puede ser un poco confusa al principio, pero trataré de explicarlo de manera clara.

    En la línea de código que mencionas:

    c
    int (array)[N] = malloc(M  sizeof array);
    

    Aquí están las respuestas a tus preguntas:

    • Cuando declaramos `int (array)[N]`, estamos declarando un puntero a un array de tamaño N de tipo entero. Por lo tanto, `array` se refiere al primer elemento de ese array, que tiene N elementos. En este caso, N es el número de columnas de la matriz.
    • El tamaño de `array` (también conocido como el tamaño de cada fila de la matriz) es N, que es el número de columnas. El tamaño total de la matriz, es decir, el número de elementos en total, sería M N. Sin embargo, estamos asignando memoria para las filas primero y luego podemos acceder a las columnas a través de `array`.
    • Cuando hacemos `malloc(M sizeof array)`, estamos asignando memoria para M filas de tamaño `*array` (es decir, N elementos enteros). Debido a la declaración del puntero `array`, la memoria que se asigna es para M filas de tamaño N, lo que es equivalente a tener un array de tamaño `array[M][N]`.

    En resumen, con esta declaración y asignación de memoria, estamos creando un puntero a un array de tamaño N de conjunto con M filas. Esta es una forma de simular una matriz 2D en C utilizando malloc.

    Respondida el Dec 19, 2020 a las 13:21 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 1. ¿Por qué el parámetro *array tiene N columnas?

    El parámetro <strong>array es un puntero a una matriz de N columnas. Esto se debe a que int (</strong>array)[N] es una declaración de tipo que define un puntero a una matriz de enteros con N columnas.

    2. ¿Cuál es el tamaño de *array?

    El tamaño de <strong>array es el tamaño de un puntero en tu sistema. Por lo general, esto es de 4 u 8 bytes, dependiendo de si estás utilizando un sistema de 32 bits o de 64 bits, respectivamente.

    3. ¿Cómo el tamaño de M se convierte en número de filas y en </strong>array[M][N]?*

    El tamaño de M no se convierte en el número de filas. En cambio, la asignación de memoria malloc(M </strong> sizeof <strong>array) asigna un bloque de memoria lo suficientemente grande para M punteros a matrices de N columnas.

    El siguiente código muestra cómo usarías la memoria asignada:

    c
    int (array)[N] = malloc(M  sizeof array);
    
    // Accede a la fila i de la matriz
    int (row_i)[N] = array + i;
    
    // Accede al elemento j de la fila i
    int element_ij = (row_i)[j];
    

    En este código, array es un puntero a la primera fila de la matriz. Cada fila está representada por un puntero a una matriz de N columnas. Para acceder a una fila particular, puedes utilizar el operador + para desplazarte por el puntero array. Para acceder a un elemento particular dentro de una fila, puedes utilizar la sintaxis (<strong>row_i)[j].

    Ejemplo:

    Supongamos que tenemos M = 3 y N = 4. La asignación de memoria malloc(M </strong> sizeof <strong>array) asignará un bloque de memoria de tamaño 3 </strong> sizeof(int (<strong>array)[N]). Esto creará espacio para 3 punteros a matrices de enteros de 4 columnas cada una.

    La siguiente matriz representaría la memoria asignada:

    
    | array[0] | array[1] | array[2] |
    

    Cada array[i] es un puntero a una matriz de 4 enteros. Para acceder a la fila 1, puedes usar array[0]. Para acceder al elemento 2,3 en la fila 1, puedes usar (</strong>array[0])[2].

    Respondida el Dec 19, 2020 a las 13:29 - por Gemini

    Votos positivos: 0 | Votos negativos: 0