Programación en lenguaje C - gestión de memoria

Manejo de memoria dinámica en lenguaje C. El lenguaje C proporciona varias funciones para la asignación y administración de memoria. Estas funciones se pueden encontrar en el archivo de encabezado <stdlib.h> .

En lenguaje C, la memoria se gestiona a través de variables de puntero. Un puntero es una variable que almacena una dirección de memoria que puede apuntar a una variable de cualquier tipo de datos, incluidos números enteros, números de punto flotante, caracteres y matrices. El lenguaje C proporciona algunas funciones y operadores que permiten a los programadores operar en la memoria, incluida la asignación, liberación, movimiento y copia.

Nota: El tipo void * representa un puntero sin tipo. C y C++ estipulan que el tipo void * se puede convertir en cualquier otro tipo de puntero a través de la conversión de tipos.

asignar memoria dinámicamente

Al programar, es más fácil definir una matriz si conoce su tamaño de antemano. Por ejemplo, una matriz que almacena nombres de personas puede contener hasta 100 caracteres, por lo que puede definir la matriz de la siguiente manera:

char name[100];

Sin embargo, si no sabe de antemano la longitud del texto que necesita almacenar, por ejemplo, si desea almacenar una descripción detallada sobre un tema. Aquí, debemos definir un puntero que apunte a un carácter cuyo tamaño de memoria requerido no está definido y luego asignar la memoria de acuerdo con la demanda, como se muestra a continuación:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 200 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student in class 10th");
   }
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Name = Zara Ali
Description: Zara ali a DPS student in class 10th

El programa anterior también se puede escribir usando calloc() , simplemente reemplace malloc con calloc, como se muestra a continuación:

calloc(200, sizeof(char));

Al asignar memoria dinámicamente, tiene control total y puede pasar valores de cualquier tamaño. Y esas matrices con un tamaño predefinido no pueden cambiar el tamaño una vez definido.

Redimensionar y liberar memoria

Cuando el programa sale, el sistema operativo liberará automáticamente toda la memoria asignada al programa. Sin embargo, se recomienda que llame a la función free() para liberar la memoria cuando no la necesite.

Alternativamente, puede aumentar o disminuir el tamaño de un bloque de memoria asignado llamando a la función realloc() . Veamos de nuevo el ejemplo anterior usando las funciones realloc() y free():


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
   char name[100];
   char *description;
 
   strcpy(name, "Zara Ali");
 
   /* 动态分配内存 */
   description = (char *)malloc( 30 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcpy( description, "Zara ali a DPS student.");
   }
   /* 假设您想要存储更大的描述信息 */
   description = (char *) realloc( description, 100 * sizeof(char) );
   if( description == NULL )
   {
      fprintf(stderr, "Error - unable to allocate required memory\n");
   }
   else
   {
      strcat( description, "She is in class 10th");
   }
   
   printf("Name = %s\n", name );
   printf("Description: %s\n", description );
 
   /* 使用 free() 函数释放内存 */
   free(description);
}

Cuando el código anterior se compila y ejecuta, produce el siguiente resultado:

Name = Zara Ali
Description: Zara ali a DPS student.She is in class 10th

Puede probar sin reasignar memoria adicional, la función strcat() generará un error porque no hay suficiente memoria disponible para almacenar la descripción.

Funciones y operadores de gestión de memoria de uso común en lenguaje C

  • Función malloc(): utilizada para asignar memoria de forma dinámica. Toma un parámetro, el tamaño de la memoria que se asignará en bytes, y devuelve un puntero a la memoria asignada.

  • función free(): utilizada para liberar la memoria previamente asignada. Toma como argumento un puntero a la memoria a liberar y marca esa memoria como no utilizada.

  • Función calloc(): utilizada para asignar memoria dinámicamente e inicializarla a cero. Toma dos parámetros, el número de bloques de memoria para asignar y el tamaño de cada bloque de memoria en bytes, y devuelve un puntero a la memoria asignada.

  • Función realloc(): utilizada para reasignar memoria. Toma dos argumentos, un puntero previamente asignado y un nuevo tamaño de memoria, y luego intenta cambiar el tamaño del bloque de memoria previamente asignado. Devuelve un puntero a la memoria reasignada si el ajuste fue exitoso, o un puntero nulo en caso contrario.

  • Operador sizeof: se utiliza para obtener el tamaño (en bytes) de un tipo de datos o variable.

  • Operador puntero: Se utiliza para obtener el valor de la dirección de memoria o variable a la que apunta el puntero.

  • Operador &: Se utiliza para obtener la dirección de memoria de una variable.

  • * operador: se utiliza para obtener el valor de la variable a la que apunta el puntero.

  • -> operador: utilizado para el acceso de puntero a los miembros de la estructura, la sintaxis es puntero->miembro, que es equivalente a (*puntero).miembro.

  • Función memcpy(): se utiliza para copiar datos del área de memoria de origen al área de memoria de destino. Toma tres parámetros, un puntero al área de memoria de destino, un puntero al área de memoria de origen y el tamaño de los datos que se copiarán en bytes.

  • Función memmove(): Similar a la función memcpy(), pero puede manejar regiones de memoria superpuestas. Toma tres parámetros, un puntero al área de memoria de destino, un puntero al área de memoria de origen y el tamaño de los datos que se copiarán en bytes.

No existe una diferencia esencial entre malloc y calloc.La memoria no inicializada después de malloc se puede inicializar con memset.

La principal diferencia es que malloc no inicializa la memoria asignada y calloc inicializa la memoria asignada a cero.

La diferencia menor es que calloc devuelve una matriz, mientras que malloc devuelve un objeto.

Calloc es igual a malloc y luego a memset, por lo que malloc es más eficiente que calloc.

La forma de llamada de la función malloc para asignar espacio de memoria: (especificador de tipo *) malloc (tamaño).

La función de asignación de espacio de memoria calloc calloc también se utiliza para asignar espacio de memoria.

¿Por qué usar malloc más y rara vez calloc?

Porque calloc ha inicializado la memoria (todo inicializado a 0),

calloc es equivalente a

p = malloc();

conjunto de memoria (p, 0, tamaño);

En comparación con malloc, hay más operaciones para escribir ceros en la memoria y, a veces, necesitamos escribir ceros, pero la mayoría de las veces no es así.

 

Supongo que te gusta

Origin blog.csdn.net/shiwei0813/article/details/131464998
Recomendado
Clasificación