El modelo de memoria en lenguaje C es un sistema de almacenamiento de objetos en lenguaje C [1] .
La forma en que se almacena un objeto en C define su vida útil, la parte del tiempo de ejecución del programa durante la cual existe el objeto o se reserva espacio para él. El objeto tiene una dirección permanente y conserva su último valor. Está prohibido acceder a un objeto que ha dejado de existir, mientras que si se utilizó un puntero al trabajar con un objeto, su valor permanece indefinido.
Hay tres formas de almacenar objetos [1] : automático, estático y dinámico .
Propiedad | Auto | Estático | Dinámica |
---|---|---|---|
Anuncio | Objeto sin ataduras y sinstatic | Tiene vinculación interna o externa , o se declara con un calificadorstatic | Resaltado conmalloc |
tiempo de existencia | El bloque en el que se declara el objeto. | Todo el tiempo que el programa se está ejecutando | De llamada mallocen llamadafree |
Inicialización | Falta si no hay una inicialización explícita | Ocurre una vez antes de que comience el programa. | parcialmente en casocalloc |
El tamaño | Fijo, inmutable | Fijo, inmutable | Cualquiera, cambiable |
Colocación típica | Registros de pila o procesador | Segmento de memoria separado | montón |
Un objeto estático se puede inicializar explícitamente o se puede usar la inicialización predeterminada.
Al usar la función, calloctodos los objetos son nulos excepto los números de punto flotante y los punteros [2] .
Las expresiones sin valor l que se refieren a una matriz que es miembro de una estructura ( struct) o unión ( union) tienen un tiempo de vida limitado por la evaluación de esa expresión [1] .
Las cadenas C que inicializan punteros char*tienen un tipo de almacenamiento estático y no deben cambiarse [3] .
Ningún objeto puede estar en la memoria dinámica sin instrucciones explícitas del programador. Para trabajar con memoria dinámica, existen las funciones malloc, calloc, reallocy free. Dado que las funciones que asignan memoria toman un tamaño en una variable de tipo size_t, la cantidad máxima de memoria asignada está limitada SIZE_T_MAX[1] .
Las funciones mallocy callocasignan memoria que, después de su uso, debe liberarse con una llamada a free. Una vez liberado, el valor del puntero permanece indefinido . La función reallocdevuelve un puntero al bloque de memoria modificado, si la solicitud no se puede satisfacer, el tamaño del bloque de memoria no cambia [1] .
#incluir <stdlib.h> void foo ( void ** ptr , size_t size ) { * ptr = realloc ( * ptr , tamaño + 128 ); /* pérdida de memoria si realloc devuelve NULL */ si ( !* punto ) { ... } }Cuando se trabaja con memoria dinámica, es posible que se produzcan fugas de memoria y errores de bloques dobles.