2010-10-17 9 views
5
#include <stdio.h> 

const int str[1000] = {0}; 

int main(void) 
{ 
    printf("arr is %d\n", str[0]); 
    return 0; 
} 

tiene la siguiente salida:Las variables globales inicializadas declaradas como "const" van al segmento de texto, mientras que las declaradas "Static" van al segmento de datos. ¿Por qué?

[-exercises/adam/stack2]:size a.out 
    text data  bss  dec  hex filename 
    5133  272  24 5429 1535 a.out 

Considerando lo siguiente:

#include <stdio.h> 

static int str[1000] = {0}; 

int main(void) 
{ 
    printf("arr is %d\n", str[0]); 
    return 0; 
} 

Tiene el siguiente resultado:

[-exercises/adam/stack2]:size a.out 
    text data  bss  dec  hex filename 
    1080 4292  24 5396 1514 a.out 

Cuando no está inicializado la matriz - de nuevo va a texto segmento para "const" y para BSS para "estático".

La variable es global y debe ser accesible desde cualquier parte del ejecutable del que forma parte (porque no tiene "estática"), pero dada su variable no sé por qué se coloca en segmento de texto en lugar de datos ¿segmento?

+0

+1: Buena pregunta. Es posible que desee extenderlo a 'static const'. – Arun

Respuesta

6

Estás confundido. No hay dicotomía entre const y static; los dos son independientes Suponiendo que todos los datos se inicializa, tanto static const y externa (global) const irá en text y ambos no const Calificado static y no const Calificado externa irá en data.

En cuanto a bss, los formatos binarios modernos como ELF en realidad tienen bss separados para datos constantes y no constantes. La salida del comando size simplemente no lo muestra.

+0

Tienes razón. Gracias por la aclaración. – helpmelearn

3

Para permitir que funcione la protección de la memoria. Cualquier intento de escribir en un const activará una segfault.

1

Cuando se declara una variable const usted está diciendo al compilador que nunca se tiene la intención de cambiar su valor. Por otro lado, con la declaración hecha static en el ámbito de archivo, usted está diciendo al compilador que esa variable es privado a la unidad de compilación se ha declarado en, sino que funciona dentro de esa unidad de compilación todavía está permitido modificar esta variable.

Como Oli menciona en su answer, la ubicación de la variable const en el segmento permite que el sistema aplique la protección de acceso a la memoria. Además, considere un sistema embebido, en ese caso el segmento text se escribe normalmente en flash y es por lo tanto no modificable. Los segmentos data, bss, etc. se encuentran en la RAM y su modificación está permitida.

7

De Kernighan & Ritchie:

estática es un especificador de clase de almacenamiento. Otros especificadores de clase de almacenamiento son: auto, register, extern & typedef. El especificador estática da la objetos de clase de almacenamiento estático declarado. La declaración estática, aplicada a una variable o función externa, limita el alcance de ese objeto para el resto del archivo de fuente que está siendo compilado. Los objetos estáticos pueden ser locales a un bloque o externos a todos los bloques, pero en cualquiera de los casos conservar sus valores en la salida desde y volver a ingresar a las funciones y bloques .

Considerando que,

const es clasificatorio tipo. El otro calificador de tipo es volátil. El propósito de de const es anunciar los objetos que se pueden colocar en memoria de solo lectura, y tal vez a aumentar las oportunidades para la optimización .

Supongo que se puede inferir que estas dos palabras clave sirven para fines distintos; el de las variables const en text/code segment es bastante claro por su propósito.

+2

+1 para cotizar K & R –

1

Al poner los datos de const en la sección de texto, el compilador intenta forzar la constness.

Tenga en cuenta que la sección TEXTO se carga en las páginas de memoria marcadas solo como leídas en las tablas de páginas de MMU. Esto es para protegerse contra la corrupción accidental del código. Al poner datos const en la misma área, hace que los datos también se lean solo. Cualquier escritura en estos datos invocará excepciones.

Los datos no inicializados declarados estáticos entrarán en el segmento BSS para conservar espacio en el archivo ejecutable. Esta área está asignada en memoria por el cargador. Los datos inicializados declarados estáticos entrarán en el segmento de DATOS, que es de lectura-escritura.

Cuestiones relacionadas