asignar la matriz en C

quiero asignar una matriz.

es esta la única opción:

int** mat = (int**)malloc(rows * sizeof(int*))

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}
InformationsquelleAutor Idan | 2010-01-24

7 Kommentare

  1. 27

    Bueno, no nos dan una implementación completa. Supongo que quiso decir.

    int **mat = (int **)malloc(rows * sizeof(int*));
    for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));

    Aquí es otra opción:

    int *mat = (int *)malloc(rows * cols * sizeof(int));

    Entonces, que permite simular la matriz utilizando

    int offset = i * cols + j;
    //now mat[offset] corresponds to m(i, j)

    por orden principal de la fila y

    int offset = i + rows * j;
    //not mat[offset] corresponds to m(i, j)

    para la columna principal de pedidos.

    Una de estas dos opciones es realmente la mejor manera de manejar una matriz en C. Esto es debido a que ahora la matriz serán almacenados de forma contigua en la memoria y que se benefician de localidad de referencia. Básicamente, la caché de CPU será mucho más feliz con usted.

    • si su compilador soporta arreglos de longitud variable o si cols es una constante en tiempo de compilación, usted ni siquiera necesita para calcular los desplazamientos a ti mismo; si utiliza int (*mat)[cols] = malloc(rows * sizeof *mat), usted puede acceder a los elementos a través de mat[i][j] y todavía uso un bloque contiguo de memoria
    • Incluso ignorando el rendimiento, una única asignación también es preferible porque es más simple. Hay menos cosas para desasignar más tarde, y no hay necesidad de lidiar con parciales de los errores de asignación.
    • ¿No sería este un problema si cada malloc creado discontinuo bloques de memoria, haciendo que sus direcciones no de serie? Por ejemplo, la primera malloc podría devolver el puntero 0x635 y el otro mallocs podría volver punteros 0xA279, 0xB7DD, etc.. Si esto ocurre en un simple cálculo tal como se indicó anteriormente no iba a funcionar.
  2. 4

    lo que puedes hacer es

    int (*mat)[col];
    mat=(int (*)[col])malloc(sizeof(*mat)*row);

    y, a continuación, utilizar esta nueva matriz como mat[i][j]

  3. 2

    También puede utilizar calloc, que además de cero inicializar la matriz para usted. La firma es ligeramente diferente:

    int *mat = (int *)calloc(rows * cols, sizeof(int));
  4. 0

    Que puede colapso de una llamada a malloc, pero si usted desea utilizar una matriz 2d de estilo, usted todavía necesita el bucle for.

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

    No ha sido probado, pero usted consigue la idea. De lo contrario, me pegan con lo que Jason sugiere.

    • esto sólo funciona si sizeof (int) == sizeof (int *) – de lo contrario, el desplazamiento será malo, que en realidad podría estar equivocado, incluso si este es el caso
    • Buen punto, y que es fácil de evitar, pero como he dicho en mi respuesta, esto no está probado. Fijo que esta ahora.
  5. -1

    Para un N-Dimensional de la matriz se puede hacer esto:

    int *matrix = malloc(D1 * D2 * .. * Dn * sizeof(int)); //Di = Size of dimension i

    Para tener acceso a una matriz de células con la típica forma de hacer esto:

    int index = 0;
    int curmul = 1;
    int i;
    int indexes = {I1, I2, ..., In}; //Ii = Index in dimension i
    
    for(i = N-1; i >= 0; i--) {
        index = index + indexes(i) * curmul;
        curmul = curmul * Di;
    }

    (Nota: no probar ahora, pero debería funcionar. Traducido por mi código de Matlab, pero en Matlab índice empieza en 1, con lo que PUEDE que cometió un error (pero yo no lo creo))

    Divertirse!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea