Lenguaje C (gestión de memoria)

Inicializar espacio de memoria

#include <malloc.h> Importar archivo de encabezado

  memset: llene el espacio de memoria con un byte constante
  memcpy: copie el espacio de memoria
  memmove: copie el espacio de memoria
  memcmp: compare el espacio de memoria
  memchr: busque un carácter en el espacio de memoria
    Si está tratando con una cadena, cambie el comienzo de 'mem' a 'str', Porque esto es para procesar espacio de memoria;


Gestión de memoria flexible

void * malloc (size_t size); // Solicitar espacio de memoria dinámica; (void se puede convertir a cualquier tipo de datos)
 // Función: aplicar al sistema para asignar bytes de tamaño de espacio de memoria y devolver un puntero a este espacio, por ejemplo : 
Int * ptr = ( int *) malloc ( sizeof ( int )); // Heap memory 

void  free ( void * ptr); // Liberar espacio de memoria dinámica;
 // Debido a que el espacio de memoria aplicado dinámicamente existe en el montón, entonces Si no se libera activamente, se guardará hasta que el programa se cierre
 // rol: libere el espacio de memoria señalado por el parámetro ptr, siempre que el espacio deba ser aplicado por las funciones malloc, calloc, realloc
 // Nota: si el parámetro es NULL, no ejecute Cualquier operacion. Esta función no modifica el valor del parámetro PTR, así que después de la llamada aún está apuntando al lugar original
 // realidad basta con soltar el derecho a utilizar la dirección, los datos de dirección almacenados, de hecho, no se destruye, sino que se define en las variables del lenguaje C debe ser inicializado De lo contrario, los datos son los datos basura utilizados por la dirección variable la última vez;

void * calloc (size_t nmemb, size_t size); // Aplicar e inicializar una serie de espacios de memoria
 // Función: solicitar nmemb espacio de memoria continua de saze de longitud e inicializar a 0; a saber: 
int * ptr = ( int *) calloc (N, sizeof ( int )); // Equivalente a 
int * ptr = ( int *) malloc (N * sizeof ( int )); 
memset (ptr, 0 , N * sizeof ( int )); 

void * realloc ( nulo * ptr, tamaño_t tamaño); //Reasignar espacio de memoria (generalmente usado para alargamiento dinámico)
 // Función: ptr apunta a un espacio reasignado, suelte el bloque de memoria anterior y copie los datos en el nuevo espacio. 
Si el parámetro ptr es NULL, es equivalente a llamar a malloc (tamaño );
 // El parámetro de tamaño es 0; y el parámetro ptr no es NULL, lo que equivale a llamar a free (ptr)

Nota: Si el parámetro ptr no es NULL; entonces debe ser el espacio asignado dinámicamente por malloc, calloc, realloc


Pérdida de memoria

  Debido a que el espacio asignado para el programa se aplica dinámicamente, el programa se elimina

    1. Fuga de memoria implícita (el bloque de memoria usado no se libera a tiempo con la función libre);
    2. La dirección del bloque de memoria se pierde (la dirección asignada se pierde, por lo que no se puede liberar a tiempo después de haberse agotado)


Reglas de diseño de memoria

  De bajo a las direcciones más altas almacenadas: segmento de código -> segmento -> segmento BSS -> Heap -> pila
    segmento de código : se refiere generalmente utiliza para mantener el período de la ejecución del código región de descarga , y se ha determinado antes de que el programa se está ejecutando;
    datos Segmento : generalmente se usa para almacenar variables globales inicializadas y variables estáticas locales ;
    segmento bss : generalmente se usa para almacenar un área de memoria de variables globales no inicializadas en el programa . (Se inicializará automáticamente a 0 antes de ejecutarse)
    Montón : se utiliza para almacenar el segmento de memoria asignado dinámicamente durante la operación del proceso . El tamaño no es fijo y puede expandirse y contraerse dinámicamente. (Aplicación dinámica y liberación de memoria)
    Pila : El área de memoria donde se ejecuta la función , generalmente Comparta la misma área con el montón ( variables locales, parámetros de función, valor de retorno de función )

  La diferencia entre el montón y la pila:
    aplicación : aplicación manual del montón; el sistema asigna automáticamente la pila;
    liberación: aplicación manual del montón; el sistema libera la pila automáticamente;
    ciclo de vida: montón de aplicación dinámica a liberación activa; (se puede acceder a las variables locales entre funciones; Es decir, volver a la función de llamada, la función de llamada puede continuar utilizándose). La pila comienza desde la llamada de función y termina cuando la función regresa; (las variables locales entre funciones no son accesibles entre sí)
    Dirección de desarrollo: el montón y otras secciones son bajas Dirección para el desarrollo de direcciones altas; la
    pila es lo opuesto, desde el desarrollo de direcciones altas hasta las direcciones bajas (empuje la pila);


Grupo de memoria

  Al liberar memoria aplicada dinámicamente; primero colóquelo en el grupo de memoria, puede usar directamente la memoria en el grupo de memoria cuando solicite memoria la próxima vez;
  porque cuando solicita dinámicamente la memoria, el programa necesita acceder a la memoria, lo que hace que la eficiencia sea menor ;

  (Disponible con una lista individualmente vinculada)
—————————————————————————————————————————————— ---------
campo de bits

  Especifique el número binario ocupado ( un byte ocupa ocho bits binarios ); (Solo el tipo int y el campo de bits de soporte de tipo booleano)
    unsigned int a: 2; La declaración aquí no puede firmarse, y ocupar dos bits binarios => como máximo se puede expresar
  Nota para 3 : El ancho del campo de bits no puede exceder la longitud del tipo en el que se basa [el int de arriba solo ocupa como máximo 32 bits binarios]

Supongo que te gusta

Origin www.cnblogs.com/TianLiang-2000/p/12712454.html
Recomendado
Clasificación