2015-12-20 20 views
11

Ich möchte fragen, wie C die Variablen in C gespeichert sind?Wie wird ein Variablenname in C gespeichert?

deutlicher betrachten Sie den folgenden Code sein:

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

Zum Beispiel hier in welchen Speicher C speichert die Namen der variablen Orten.

zB &a=0x12A7 (angenommen) &b=0x123B1, wie und wo speichert die Variablennamen, in denen der Speichername a gespeichert ist?

Antwort

12

C speichert den Namen der Variablen nicht. Es ist der Compiler, der die Namen der Variablen in der Symboltabelle des Compilers speichert.
Diese Datenstruktur wird vom Compiler erstellt und gepflegt.
Ein example einer Symboltabelle für das Snippet

// 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; 
} 

mindestens folgende Symbol enthalten:

enter image description here

+3

Eine Symboltabelle ist ein Compiletime-Konstrukt, es spiegelt keine Laufzeiteigenschaften wider. Map-Dateien und Debug-Informationen sind Quellen verfügbar, um eine Vorstellung von Symbolnamen für Orte zu bekommen, aber sie sollten nicht aus dem Programm heraus verwendet werden. RTTI und andere Formen von Introspektion sind, aber C hat keine Form davon –

18

Variablennamen müssen nicht gespeichert werden! Der Compiler kann sie vollständig loswerden. Stellen Sie sich vor, wenn der Compiler sehr clever ist, kann er das gesamte Programm auf diese reduzieren:

int main(){ 
    return 0; 
} 

Beachten Sie, dass die Wirkung dieses Programms ist es genau das gleiche wie das Original, und jetzt gibt es keine Variablen überhaupt nicht! Keine Notwendigkeit, sie jetzt zu benennen, oder?

Auch wenn die Variablen in Ihrem Code tatsächlich verwendet wurden, sind ihre Namen nur eine bequeme Schreibweise, wenn Sie das Programm schreiben, aber sie werden vom Prozessor nicht benötigt, wenn sie Ihren Code ausführen. Soweit ein Mikroprozessor betrifft, eine Funktion wie folgt aus:

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

könnte in kompilierten Code zur Folge haben, dass dies der Fall ist, in irgendeiner hypothetischen einfachen Befehlssatzarchitektur (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 

Je länger Geschichte ist, dass Variablennamen manchmal für Debugging-Zwecke gespeichert werden. Wenn Sie zum Beispiel GCC verwenden, können Sie die -g Option übergeben, um eine "Symboltabelle" auszugeben, die Dinge wie Variablennamen zum Debuggen enthält. Aber es ist nicht notwendig, einfach ein Programm auszuführen, und es ist nicht durch den Sprachstandard abgedeckt - es ist ein Implementierungsmerkmal, das sich je nach Plattform unterscheidet.

+0

ok Ich habe eine Idee –

-1

Ok zuerst ab, wenn Sie diese mit C auf Straße nur bekommen Sie Ihren Kopf ist wo zu starten: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml

Aber das ist praktischer als Ihre Frage. Um das zu beantworten, fragen wir zuerst, warum Variablen Adressen haben. Der Grund hier ist der Stapel. Damit ein Programm ausgeführt werden kann, müssen Rückrufe an den entsprechenden Puffer gerichtet werden, damit die Teile alle wie vorgesehen zusammenpassen. Nun zu dem, was ich glaube, war die ursprüngliche Frage, das ist, wie die tatsächliche Adresse entschieden wird, für die Antwort zu müssen Sie verstehen, wie der Prozessor den Haufen implementiert.

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

„Da die genaue Position der Zuweisung im Voraus nicht bekannt ist, wird der Speicher indirekt, in der Regel über einen Zeiger Bezug genommen wird. Den spezifischen verwendeten Algorithmus zugegriffen, um den Speicherbereich zu organisieren und verteilen und DEALLOCATE chunks ist mit dem Kernel miteinander verknüpft ...“

Womit wir wieder auf die praktische Seite der Dinge mit der Abstraktion bringt Zeiger:

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

Hope tis gibt Ihnen ein wenig klareres Bild von dem, was unter der Haube ist:)

Happy Coding.

Verwandte Themen