Explicación detallada de la distribución del espacio de memoria en lenguaje C.

El espacio de memoria del lenguaje C se divide en los siguientes 5 bloques:

Segmento BSS: (segmento bss) generalmente se refiere a un área de memoria utilizada para almacenar variables globales no inicializadas en el programa . BSS es la abreviatura de Bloque en inglés iniciado por símbolo. El segmento BSS es una asignación de memoria estática.

Segmento de datos : el segmento de datos generalmente se refiere a un área de memoria utilizada para almacenar variables globales inicializadas en el programa. El segmento de datos es una asignación de memoria estática.
Segmento de código:  el segmento de código (segmento de código / segmento de texto) generalmente se refiere a un área de memoria utilizada para almacenar el código de ejecución del programa . El código de esta área es de sólo lectura . En los fragmentos de código, las constantes de cadena también pertenecen a esta sección.
Montón : El montón se utiliza para almacenar segmentos de memoria que se asignan dinámicamente durante la ejecución del proceso, su tamaño no es fijo y se puede expandir o reducir dinámicamente.
Pila (pila) : La pila también se llama pila. Además de almacenar las variables locales del programa, la pila se usa para pasar parámetros y devolver valores cuando se llama a una función. Debido a la característica de primero en entrar, último en salir de la pila, la pila es particularmente conveniente para guardar/restaurar la escena de la llamada.
Echemos un vistazo a estas 5 partes a través de una captura de pantalla del libro "Programación avanzada en entorno UNIX":

El lado izquierdo es la estructura organizativa interna del archivo ejecutable en el sistema UNIX/LINUX, y el lado derecho es la división del archivo ejecutable en el espacio de direcciones lógicas del proceso (es decir, la memoria). 


El primero es el área de la pila (pila), que el compilador asigna y libera automáticamente para almacenar valores de parámetros de funciones, valores de variables locales, etc. Opera como una pila en una estructura de datos. La aplicación para la pila es asignada automáticamente por el sistema. Por ejemplo, solicita una variable local int h dentro de la función. Al mismo tiempo, se juzga si el espacio aplicado es menor que el espacio restante de la pila. Si es menor que el espacio restante de la pila, cree espacio para él en la pila para proporcionar memoria para el programa. De lo contrario, se informará una excepción que indica un desbordamiento de la pila.    

El siguiente es el montón. Generalmente, el programador asigna y libera el montón. Si el programador no lo libera, el sistema operativo puede reclamarlo cuando finalice el programa. Tenga en cuenta que es diferente del montón en la estructura de datos y el método de asignación es similar a una lista vinculada. La aplicación del montón es operada por el propio programador. La función malloc se usa en C y el nuevo operador se usa en C ++. Sin embargo, el proceso de la aplicación del montón es más complicado: cuando el sistema recibe la aplicación del programa, atravesará y Registre la dirección de memoria libre en la lista vinculada para encontrar el primer nodo del montón con un espacio mayor que el espacio solicitado, luego elimine el nodo de la lista vinculada de nodos libres y asigne el espacio del nodo al programa. son algunos En este caso, la primera dirección del bloque de memoria recién aplicado registra el tamaño del bloque de memoria asignado este tiempo, de modo que el espacio de memoria se pueda liberar correctamente al eliminar, especialmente eliminar [].

El siguiente es el área de datos globales (área estática) (estática). Las variables globales y las variables estáticas se almacenan juntas. Las variables globales inicializadas y las variables estáticas están en un área, y las variables globales no inicializadas y las variables estáticas no inicializadas están en la misma área. Otra adyacente área. Además, en el área de constantes de texto, las cadenas constantes se colocan aquí y el sistema las libera una vez finalizado el programa. Finalmente, está el área de código del programa, que contiene el código binario del cuerpo de la función.

Pongamos un ejemplo:

int a = 0;                 // 全局初始化区
char *p1;                  // 全局未初始化区 


int main()
{
        int b;                     // 栈
        char s[] = "abc";          // 栈
        char *p2;                  // 栈
        char *p3 = "123456";       // 123456 在常量区,而 p3 在栈上

        static int c =0;          // 全局(静态)初始化区 

        p1 = (char *)malloc(10);

        p2 = (char *)malloc(20);  // 分配的10和20字节的区域就在堆区

        strcpy(p1, "123456");     // 123456 放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

        return 0;
}

Supongo que te gusta

Origin blog.csdn.net/gzg1500521074/article/details/50444845
Recomendado
Clasificación