2013-07-10 10 views
8

Angenommen, der folgende Code:c structs, Zeiger und Speicherzuordnung für Felder

struct c { 
    char* name; 
}; 

int main(int argc, char *argv[]) { 
    struct c c1; 
    c1.name = "Ana"; 
    printf ("%s\n",c1.name); 
    return 0; 
} 

Meine erste Reaktion zu denken gewesen wäre, dass ich etwas Platz zuzuweisen erforderlich, entweder auf dem Heap oder durch eine explizite char name[] = "Anna" , aber mein Beispiel oben funktioniert. Speichert der Compiler diese Zeichenfolge nur im Datensegment und zeigt auf sie? Mit anderen Worten, ist das so ein

struct c { 
    char* name = "Ana"; 
}; 

Danke.

Antwort

8
struct c c1; 
c1.name = "Ana"; 

Sie haben keine Erinnerung hier reservieren, da Sie den Zeiger c1.name Punkt auf eine Stringliteral und Stringliterale haben Dauer statische Speicher machen werden. Dies ist nicht kompatibel zu:

char name[] = "Anna"; 

Da in diesem Fall Speicher zugewiesen wird, um den Stachel wörtlichen zu speichern und dann die Stringliteral "Anna" ist name in das Array kopiert. Was Sie mit der Struktur Zuordnung zu tun ist c1.name = "Ana" ähnlich wie wenn Sie das tun:

char *name = "Anna"; 

das heißt der Zeiger Punkt wörtlichen in einen String machen.

+1

+1 für die tatsächliche Beantwortung der Frage –

+2

In Ordnung, ich denke, ich verstehe es. Was dies verdeutlicht, ist Ihre "statische Speicherdauer", was bedeutet, dass sie sich zur Kompilierungszeit tatsächlich im Datensegment befindet, und dann weiß der Compiler offensichtlich, wohin er zeigen soll. Vielen Dank. –

3

Ich bin neu in C, aber von dem, was ich denke, das wie genau das gleiche sein könnte

char *cThing; 
cThing = "Things!"; 

wo printf("%s\n", cThing); dann drucken: „Die Dinge“, außer dass Sie den Mauszeiger in einer Struktur sind zu deklarieren.

+1

Ich gebe dir einen Siegpunkt :) Ich finde es erstaunlich, dass du die Intuition hattest und ein gutes einfaches Beispiel benutzt hast, um es zu kommunizieren. Gut gemacht :) –