Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

C Asignación de memoria dinámica

C Asignación dinámica de memoria

En este tutorial, aprenderá a asignar memoria dinámicamente en su programa C usando funciones de biblioteca estándar:malloc(), calloc(), free() y realloc().

Como sabe, una matriz es una colección de un número fijo de valores. Una vez que se declara el tamaño de una matriz, no puede cambiarlo.

A veces, el tamaño de la matriz que declaró puede ser insuficiente. Para resolver este problema, puede asignar memoria manualmente durante el tiempo de ejecución. Esto se conoce como asignación de memoria dinámica en programación C.

Para asignar memoria dinámicamente, las funciones de la biblioteca son malloc() , calloc() , realloc() y free() son usados. Estas funciones se definen en el <stdlib.h> archivo de encabezado.


C malloc()

El nombre "malloc" significa asignación de memoria.

El malloc() La función reserva un bloque de memoria del número especificado de bytes. Y devuelve un puntero de void que se pueden convertir en punteros de cualquier forma.


Sintaxis de malloc()

ptr = (castType*) malloc(size);

Ejemplo

ptr = (float*) malloc(100 * sizeof(float));

La instrucción anterior asigna 400 bytes de memoria. Es porque el tamaño de float es de 4 bytes. Y, el puntero ptr contiene la dirección del primer byte en la memoria asignada.

La expresión da como resultado un NULL puntero si la memoria no se puede asignar.


C calloc()

El nombre "calloc" significa asignación contigua.

El malloc() La función asigna memoria y deja la memoria sin inicializar, mientras que calloc() La función asigna memoria e inicializa todos los bits a cero.


Sintaxis de calloc()

ptr = (castType*)calloc(n, size);

Ejemplo:

ptr = (float*) calloc(25, sizeof(float));

La declaración anterior asigna espacio contiguo en la memoria para 25 elementos de tipo float .


C libre()

Memoria asignada dinámicamente creada con calloc() o malloc() no se libera solo. Debes usar explícitamente free() para liberar el espacio.


Sintaxis de libre()

free(ptr);

Esta sentencia libera el espacio asignado en la memoria apuntada por ptr .


Ejemplo 1:malloc() y free()

// Program to calculate the sum of n numbers entered by the user

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

int main() {
  int n, i, *ptr, sum = 0;

  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) malloc(n * sizeof(int));
 
  // if memory cannot be allocated
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  
  // deallocating the memory
  free(ptr);

  return 0;
}

Salida

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

Aquí, hemos asignado dinámicamente la memoria para n número de int .


Ejemplo 2:calloc() y free()

// Program to calculate the sum of n numbers entered by the user

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

int main() {
  int n, i, *ptr, sum = 0;
  printf("Enter number of elements: ");
  scanf("%d", &n);

  ptr = (int*) calloc(n, sizeof(int));
  if(ptr == NULL) {
    printf("Error! memory not allocated.");
    exit(0);
  }

  printf("Enter elements: ");
  for(i = 0; i < n; ++i) {
    scanf("%d", ptr + i);
    sum += *(ptr + i);
  }

  printf("Sum = %d", sum);
  free(ptr);
  return 0;
}

Salida

Enter number of elements: 3
Enter elements: 100
20
36
Sum = 156

C realloc()

Si la memoria asignada dinámicamente es insuficiente o más de lo necesario, puede cambiar el tamaño de la memoria previamente asignada usando el realloc() función.


Sintaxis de realloc()

ptr = realloc(ptr, x);

Aquí, ptr se reasigna con un nuevo tamaño x .


Ejemplo 3:realloc()

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

int main() {
  int *ptr, i , n1, n2;
  printf("Enter size: ");
  scanf("%d", &n1);

  ptr = (int*) malloc(n1 * sizeof(int));

  printf("Addresses of previously allocated memory:\n");
  for(i = 0; i < n1; ++i)
    printf("%pc\n",ptr + i);

  printf("\nEnter the new size: ");
  scanf("%d", &n2);

  // rellocating the memory
  ptr = realloc(ptr, n2 * sizeof(int));

  printf("Addresses of newly allocated memory:\n");
  for(i = 0; i < n2; ++i)
    printf("%pc\n", ptr + i);
  
  free(ptr);

  return 0;
}

Salida

Enter size: 2
Addresses of previously allocated memory:
26855472
26855476

Enter the new size: 4
Addresses of newly allocated memory:
26855472
26855476
26855480
26855484

Lenguaje C

  1. Memoria de solo lectura (ROM)
  2. Microprocesadores
  3. Gestión de memoria C++:nuevo y eliminar
  4. Cervoz actualiza la memoria DDR4-2666 de próxima generación
  5. C++ Asignación dinámica de arreglos con ejemplo
  6. Función calloc() en la biblioteca C con programa EJEMPLO
  7. Realloc () Función en la biblioteca C:¿Cómo usar? Sintaxis y ejemplo
  8. C - Gestión de memoria
  9. La fijación de precios dinámica en el comercio minorista tradicional es inevitable
  10. Memoria dinámica C++
  11. Java 10 - Asignación de montones