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]