2010-12-21 14 views
1

Entschuldigen Sie die Anfängerstufe dieser Frage. Ich habe den folgenden einfachen Code, aber es scheint nicht zu laufen. Es wird ein Segmentierungsfehler angezeigt. Wenn ich den Zeiger durch einen einfachen Aufruf der tatsächlichen Variable ersetze, läuft es gut ... Ich weiß nicht warum.Warum ist dieser einfache Hallo Weltcode segfauling?

struct node 
{ 
int x; 
struct node *left; 
struct node *right; 
}; 

int main() 
{ 
struct node *root; 
root->x = 42; 
printf("Hello world. %d", root->x); 
getchar(); 
return 0; 
} 

Was ist falsch an diesem Code?

Antwort

10
struct node *root; 
root->x = 42; 

Sie dereferenzieren einen nicht initialisierten Zeiger. Zuzuteilen Speicher für den Knoten:

struct node *root = malloc(sizeof(struct node)); 

Sie auch einen Knoten auf dem Stapel zuweisen könnte:

struct node root; 
root.x = 42; 
+0

Also sollte ich es mit einer Art von Initialisierung voranstellen? Strukturknoten * root = new (Strukturknoten); oder so? – socks

+1

In diesem speziellen Fall würde ich einen "struct node root" anstelle eines Zeigers deklarieren und dann 'root.x' verwenden und' & root' an Funktionen übergeben, die einen Zeiger erwarten. Nicht immer ist dynamischer Speicher gerechtfertigt. –

-1

Nach struct node *root; Zeile hinzufügen die

root = (sturct node*) malloc(sizeof(struct node)); 

Auch vor Return 0 Linie die hinzufügen

free(root); 
1

Um einen Zeiger für den Zugriff auf etwas zu verwenden, muss der Zeiger auf dieses Objekt zeigen. Damit der Zeiger auf dieses Etwas zeigt, muss etwas existieren. Beim Erstellen eines Zeigers wird nichts erstellt, auf das er zeigen kann. Sie müssen dies explizit tun, entweder durch dynamische Zuweisung (malloc()), Stapelzuweisung (dh eine lokale Variable) oder durch Zeigen auf etwas, das bereits existiert (z. B. eine static Instanz, z. B. global; ein Wert, der als Parameter übergeben wurde) ; etc.).

Verwandte Themen