2015-12-20 31 views
11

Voglio chiedere come C le variabili sono memorizzate in C?Come viene memorizzato un nome di variabile in C?

Per essere più chiari considerare il seguente codice:

int main() { 
    int a = 1, b; 
    b = a + 2; 
    return 0; 
} 

Per esempio qui in quali C memoria memorizza i nomi dei luoghi variabili.

ad esempio, se &a=0x12A7 (supponiamo) &b=0x123B1, allora come e dove memorizza i nomi delle variabili come in cui il nome di memoria a viene memorizzato?

risposta

12

C non memorizza il nome delle variabili. È il compilatore che memorizza i nomi delle variabili nella tabella dei simboli del compilatore.
Questa struttura dati viene creata e gestita dal compilatore.
Un example di una tabella dei simboli per il frammento di

// Declare an external function 
extern double bar(double x); 

// Define a public function 
double foo(int count) 
{ 
    double sum = 0.0; 

    // Sum all the values bar(1) to bar(count) 
    for (int i = 1; i <= count; i++) 
     sum += bar((double) i); 
    return sum; 
} 

possono contenere almeno il seguente simbolo:

enter image description here

+3

Una tabella dei simboli è un costrutto compiletime, non riflette le proprietà di runtime. I file mappa e le informazioni di debug sono fonti disponibili per avere un'idea dei nomi dei simboli per le posizioni, ma non sono stati pensati per essere utilizzati all'interno del programma. RTTI e altre forme di introspezione sono, ma C non ne ha alcuna forma –

18

Non è necessario memorizzare i nomi delle variabili! Il compilatore può sbarazzarsi di loro interamente. Immaginate, se il compilatore è abbastanza intelligente, può ridurre l'intero programma a questo:

int main(){ 
    return 0; 
} 

Nota che l'effetto di questo programma è esattamente lo stesso del vostro originale, e ora non ci sono variabili a tutti! Non c'è bisogno di nominarli ora, vero?

Anche se le variabili nel codice sono state effettivamente utilizzate, i loro nomi sono puramente una notazione conveniente quando si scrive il programma, ma non sono necessari dal processore quando esegue il codice. Per quanto riguarda un microprocessore è interessato, una funzione come questa:

int foo(int x, int y) { 
    int z = x + y; 
    return z * 2; 
} 

Potrebbe risultare in codice compilato che fa questo, in qualche ipotetica semplice set di istruzioni (ISA):

ADD # consumes top two values on stack (x and y), pushes result (z) 
PUSH 2 # pushes 2 on stack 
MULT # consumes top two values on stack (z and 2), pushes result 
RET 

La storia più è che i nomi delle variabili sono a volte memorizzati per scopi di debug. Ad esempio, se stai utilizzando GCC, puoi passare l'opzione -g per emettere una "tabella dei simboli" che contiene cose come i nomi delle variabili per il debug. Ma non è necessario semplicemente per eseguire un programma, e non è coperto dallo standard di lingua - è una funzionalità di implementazione che differisce dalla piattaforma.

+0

ok Ho qualche idea –

-1

Ok prima di tutto se si è appena trovato la testa su stretto con C questa è da dove cominciare: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

Ma questo è più pratico della tua domanda. Per rispondere, prima chiediamo perché le variabili hanno indirizzi. Il perché qui è lo stack. Affinché un programma possa funzionare, le chiamate di ritorno devono essere indirizzate al buffer appropriato in modo che i pezzi si adattino tutti come previsto. Ora, per quello che credo fosse la domanda originale, è così che viene deciso l'indirizzo effettivo, per la risposta a ciò dovresti capire come il processore sta implementando l'heap.

https://en.wikipedia.org/wiki/Memory_management

"Poiché la posizione precisa della dotazione non è noto in anticipo, la memoria si accede indirettamente, di solito attraverso un riferimento di puntatore. L'algoritmo specifico utilizzato per organizzare l'area di memoria e allocare e blocchi deallocare è interconnessi con il kernel ..."

il che ci riporta al lato pratico delle cose con l'astrazione di puntatori:

https://en.wikipedia.org/wiki/C_dynamic_memory_allocation

La speranza ti dà un quadro un po 'più chiaro di ciò che è sotto il cofano:)

Happy codding.