Asignación dinámica

void * malloc(size_t size);

La función malloc reserva size espacio de memora y devuelve un puntero a la memoria reservada o NULL en caso de no poder hacer dicha reserva.

Para poder hacer uso de esta función debemos incluir el archivo stdlib.h en la cabecera de nuestro programa con #include<>.



#include<stdio.h>

int main(void){

      int var1;

      var1 = 456;
      printf("El valor de var1 es: %d\n",var1);
      return 0;
}

Este programa de ejemplo declara una variable entera llamada var1, le asigna el valor 456 y lo muestra en pantalla mediante la función printf. El programa sabe de antemano que cantidad de memoria debe utilizar/reservar para guardar datos en este caso para albergar un entero. Pero,  ¿y si no supiéramos de antemano cuantos elementos necesita el usuario?

El siguiente programa pregunta al usuario cuántos elementos va a ingresar y reserva suficiente memoria para albergarlos.

#include<stdio.h>
#includ<stdlib.h>

int main(void){

      int num_element;
      int *ptr_int;
      puts("Cuantos elementos va a ingresar");
      scanf("%d", &num_element);

      ptr_int = (int *)malloc(sizeof(int) * num_element);
      if(ptr_int == NULL){
            puts("No hay espacio de memoria suficiente en memoria");
            return 1;
      }
      for(i = 0; i< num_element; i++){

            printf("Escribe el elemento [%d] a introducir ", i);
            scanf("%d", &ptr_int[i]);      //Utilizamos la notación de array para movernos por la
            printf("\n");                           //memoria asignada

      }
      free(ptr_int);
      return 0;
}

C no provee de ningún sistema de control sobre la posición del puntero, por lo que es responsabilidad del programador controlar que no va más allá de la memoria asignada. El overflow dará error en ejecución del programa, no en compilación.

La memoria asignada dinámicamente hay que liberarla una vez que no la necesitemos, para ello disponemos de la función free() a la cual se le pasa como parámetro el puntero.

Dentro de la familia de funciones de asignación de memoria tenemos las funciones realloc() y calloc()