asignar matriz en C

3 minutos de lectura

avatar de usuario
idan

Quiero asignar una matriz.

es esta la unica opcion:

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

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}

  • No lanzar el resultado de malloc en C

    – phuclv

    02/04/2016 a las 11:51

avatar de usuario
jason

Bueno, no nos diste una implementación completa. Supongo que quisiste decir.

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

Aquí hay otra opción:

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

Luego, simulas la matriz usando

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

para ordenar filas principales y

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

para ordenar las columnas principales.

Una de estas dos opciones es en realidad la forma preferida de manejar una matriz en C. Esto se debe a que ahora la matriz se almacenará de forma contigua en la memoria y se beneficiará de localidad de referencia. Básicamente, el caché de la CPU estará mucho más feliz contigo.

  • si su compilador admite matrices de longitud variable o si cols es una constante de tiempo de compilación, ni siquiera necesita calcular las compensaciones usted mismo; si utiliza int (*mat)[cols] = malloc(rows * sizeof *mat)puede acceder a los elementos a través de mat[i][j] y seguir usando un bloque contiguo de memoria

    – Cristóbal

    24 de enero de 2010 a las 20:52

  • Incluso ignorando el rendimiento, también es preferible una asignación única porque es más simple. Hay menos cosas para desasignar más adelante y no hay necesidad de lidiar con errores de asignación parcial.

    – jamesdlin

    24 de enero de 2010 a las 21:11

  • ¿No sería esto un problema si cada malloc creara bloques de memoria discontinuos, haciendo que sus direcciones no fueran seriales? Por ejemplo, el primer malloc podría devolver el puntero 0x635 y los otros mallocs podrían devolver los punteros 0xA279, 0xB7DD, etc. Si esto sucede, un cálculo simple como el indicado anteriormente no funcionaría.

    – Bruno Felipe

    29 de noviembre de 2013 a las 0:16

Las otras respuestas ya las cubrieron, pero para completar, las preguntas frecuentes de comp.lang.c tienen una entrada relevante:

¿Cómo puedo asignar dinámicamente una matriz multidimensional?

lo que puedes hacer es

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

y luego usar esta nueva matriz como tapete[i][j]

También puede usar calloc, que además inicializará la matriz en cero por usted. La firma es ligeramente diferente:

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

¿Qué tal simplemente:

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

lata colapsarlo en una llamada a malloc, pero si desea usar un estilo de matriz 2d, aún 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;
}

Sin probar, pero entiendes la idea. De lo contrario, me quedaría con lo que sugiere Jason.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad