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

const int str[1000] = {0}; 

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

ha la seguente uscita:Le variabili inizializzate globali dichiarate come "const" vanno al segmento di testo, mentre quelle dichiarate "Statiche" vanno al segmento dati. Perché?

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

considerando quanto segue:

#include <stdio.h> 

static int str[1000] = {0}; 

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

Ha il seguente output:

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

Quando l'array è inizializzato - va di nuovo al testo segmento per "const" e per BSS per "statico".

La variabile è globale e dovrebbe essere accessibile da qualsiasi posizione nell'eseguibile di cui fa parte (a causa di nessun "statico"), ma data la sua variabile non so perché è collocata nel segmento di testo anziché dati segmento?

+0

+1: buona domanda. Potresti volerlo estendere a 'static const'. – Arun

risposta

6

Sei confuso. Non c'è dicotomia tra const e static; i due sono indipendenti. Supponendo che tutti i dati siano inizializzati, sia static const sia esterno (globale) const andranno in text e sia non const -qualificati static e non-const -all'interno qualificati andranno in data.

Per quanto riguarda lo bss, i moderni formati binari come ELF hanno in realtà uno bss separato per dati zero costanti e non costanti. L'output del comando size non lo mostra.

+0

Hai ragione. Grazie per il chiarimento. – helpmelearn

3

Per consentire il funzionamento della protezione della memoria. Qualsiasi tentativo di scrivere su un const attiverà un segfault.

1

Quando si dichiara una variabile const si sta dicendo al compilatore che non si intende modificare il suo valore. D'altra parte, con la dichiarazione static fatta nell'ambito del file, stai dicendo al compilatore che quella variabile è privata per l'unità di compilazione in cui è stata dichiarata, ma le funzioni all'interno di tale unità di compilazione possono ancora modificare questa variabile.

Come Oli menziona nel suo answer, l'individuazione della variabile const nel segmento text consente al sistema di applicare la protezione per l'accesso alla memoria. Inoltre, considera un sistema embedded, in tal caso il segmento text viene in genere scritto in flash e pertanto non modificabile. I segmenti data, bss si trovano nella RAM e la loro modifica è consentita.

7

Da Kernighan Ritchie &:

statica è una specifica classe di memoria. Altri specificatori di classe di memorizzazione sono: auto, registro, extern & typedef. Lo specificatore statico fornisce la classe di memoria statica degli oggetti dichiarata . La dichiarazione statica, applicata a una variabile o funzione esterna, limita l'ambito di quell'oggetto al resto del file sorgente in fase di compilazione. Gli oggetti statici possono essere locali a un blocco o esterno a tutti i blocchi, ma nel caso mantengono i loro valori attraverso l'uscita da e rientri nelle funzioni e nei blocchi .

considerando,

const è un qualificatore tipo. L'altro qualificatore tipo è volatile. Lo scopo di const di è quello di annunciare gli oggetti che possono essere inseriti nella memoria di sola lettura e forse a aumentare le opportunità di ottimizzazione .

Suppongo che si possa dedurre che entrambe queste parole chiave hanno scopi distinti; quello delle variabili const in text/code segment è piuttosto chiaro dal suo scopo.

+2

+1 per aver citato K & R –

1

Inserendo i dati di const nella sezione di testo, il compilatore sta cercando di imporre la costanza.

Ricordare che la sezione TESTO viene caricata nelle pagine di memoria contrassegnate come lette solo nelle tabelle della pagina MMU. Questo serve a prevenire la corruzione accidentale del codice. Inserendo i dati di const nella stessa area, rende anche quei dati letti. Qualsiasi scrittura su questi dati invocherà quindi eccezioni.

I dati non inizializzati dichiarati statici andranno nel segmento BSS per conservare spazio nel file eseguibile. Questa area è allocata in memoria dal caricatore. I dati inizializzati dichiarati statici andranno nel segmento DATA, che è in lettura-scrittura.

Problemi correlati