c – memoria dinámica

Hola a todos, muchas gracias a todos por brindar ayuda. Ahora quiero saber sobre doble puntero. Estoy haciendo código como este:

int main() { int **a; a = (int*)malloc(sizeof(*int)*5); for (i=0;i<5;i++) { a[i] = malloc(sizeof(int)*3); } } 

Ahora no sé si lo estoy haciendo bien. ¿Cómo puedo poner valores en este tipo de matriz? ¿Alguien puede explicar este concepto con el ejemplo? Gracias por adelantado.

Bueno, ha asignado una matriz equivalente en tamaño a:

 int a[5][3]; 

Así que para ingresar valores simplemente haces esto:

 a[0][0] = 1234; 

Lo que pondría un valor en la primera columna de la primera fila y

 a[4][2] = 9999; 

pondría otro valor en la última columna de la última fila.

Ya que está usando malloc, también debe recorrer un [i] de i = 0 a 4, y free(a[i]); y luego free(a); o su progtwig perderá memoria.

Muy bien … lo que tienes aquí, básicamente, es un puntero, es decir, la dirección de una dirección. Puede utilizar este tipo de variable cuando se trata de matrices.

Las dos primeras líneas de tu código son equivalentes a:

 int* a[5]; // Declaration of an array of 5 integer pointers (a[0] till a[4]). 

Un código C “puro” no usa una variable para el tamaño de una matriz, por lo que usa el malloc cuando quiere editar dinámicamente el tamaño de la matriz.

Es decir, si en su código no va a cambiar el tamaño de sus arreglos, está utilizando una forma muy compleja para lograr un objective muy simple. Usted podría simplemente escribir:

 int a[5][3]; 

Pero si no sabe el tamaño de su matriz, tiene que usar mallocs (y luego, gratis). Lo que estás haciendo, básicamente, es:

  • Declarar una matriz de matriz;
  • Asignación de la memoria para x número de PUNTERO a matrices de enteros;
  • Para cada uno de estos PUNTOS, asignando memoria para y enteros.

Ahora que has hecho esto, puedes usar tus matrices normalmente. Por ejemplo :

 a[1][0] = 1; 

significará: en la primera matriz [1], la primera fila [0] es 1.

La única diferencia con una statement estándar como la de arriba, sin los mallocs, es que ya que asignó memoria, tendrá que liberarla. Por eso no quieres perder tu variable a **. Al final de su función, la variable de puntero a puntero se destruirá, pero no la memoria que asignó.