La función ft_memcpy puede copiar un array bidimensional porque en C, los arrays bidimensionales (o multidimensionales) están almacenados en memoria lineal. Esto significa que, aunque conceptualmente los vemos como una matriz de filas y columnas, en memoria están organizados como una secuencia continua de elementos.

Cómo se almacenan los arrays bidimensionales en memoria

En C, un array bidimensional como:

int array[3][4];

se almacena en memoria como una secuencia lineal de elementos:

array[0][0], array[0][1], array[0][2], array[0][3],
array[1][0], array[1][1], array[1][2], array[1][3],
array[2][0], array[2][1], array[2][2], array[2][3]

Es decir, los elementos se almacenan fila por fila (orden de filas o "row-major order"). Esto es importante porque permite que funciones como ft_memcpy puedan copiar un array bidimensional como si fuera un bloque continuo de memoria.

Por qué ft_memcpy funciona con arrays bidimensionales

Cuando pasas un array bidimensional a una función como ft_memcpy, lo que realmente estás pasando es un puntero al primer elemento del array. Por ejemplo:

int array[3][4];
ft_memcpy(dest, array, sizeof(array));

Aquí, array se convierte en un puntero al primer elemento (&array[0][0]), y sizeof(array) calcula el tamaño total del array en memoria (en este caso, 3 * 4 * sizeof(int) bytes). Como los datos están almacenados de forma continua, ft_memcpy puede copiar todos los elementos correctamente.

Ejemplo práctico

Supongamos que tienes un array bidimensional y quieres copiarlo a otro:

#include <stdio.h>
#include <string.h>

int main(void)
{
    int src[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int dest[3][4];

    // Copiar el array usando memcpy
    memcpy(dest, src, sizeof(src));

    // Imprimir el array copiado
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            printf("%d ", dest[i][j]);
        }
        printf("\\n");
    }

    return 0;
}

Resultado

El programa imprimirá:

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

Esto demuestra que memcpy puede copiar un array bidimensional porque los datos están almacenados de forma continua en memoria.

Nota sobre punteros dobles (int **)

Si usas un puntero doble (int **) en lugar de un array bidimensional, la memoria no necesariamente será continua. Esto se debe a que un puntero doble generalmente apunta a un conjunto de punteros, y cada uno de esos punteros puede apuntar a bloques de memoria separados. En este caso, ft_memcpy no funcionará correctamente porque los datos no están organizados de forma lineal. Tendrías que copiar cada fila por separado.