2016-12-23 4 views
0

Ich versuche, eine Push-Funktion für eine verknüpfte Liste zu implementieren, aber das folgende Programm verursacht einen Segmentierungsfehler. Ich frage mich ein paar Dinge: Was ist der Standardwert für Eigenschaften einer Struktur? Es scheint, dass ich den Wert head->next manuell auf NULL setzen muss. Was ist der Standardwert von head->next dann?Standardwerte für Eigenschaften von C Struct

Ich glaube, der Grund, warum das Programm bricht, weil in der Push-Funktion, head->next != NULL es so dann die Leitung führt head = head->next, die mich führt zu fragen, was der Wert von head->next ist, wenn es nicht NULL ist und warum dies bewirkt, dass ein Segmentierungsfehler?

typedef struct Node { 
    struct Node *next; 
    int data; 
} Node; 

void push(Node *head, int data); 

int main() 
{ 
    struct Node *head = malloc(sizeof(Node)); 
    head->data = 1; 

    // Works when I uncomment this line 
    // head->next = NULL; 

    push(head, 2); 
    return 0; 
} 

/* Insert */ 
void push(Node *head, int data) { 
    while (head != NULL) { 
     if (head->next == NULL) { 
      Node *n = malloc(sizeof(Node)); 
      n->data = data; 
      head->next = n; 
      break; 
     } 
     head = head->next; 
    } 
} 
+0

Zwei downvotes und keine Kommentare? In dem Bemühen, Ihnen zu helfen - Sie werden wahrscheinlich aus Mangel an Forschungsaufwand abgelehnt (wahrscheinlich?), Weil, wie die folgende Antwort sagt, "Lesen sie vor der Zuweisung ist undefiniertes Verhalten", das ist relativ allgemein bekannt, als alle C-Tutorial, vor allem eines auf verknüpften Listen, hätte Ihnen wahrscheinlich gesagt. –

Antwort

6

was ist der Standardwert für Eigenschaften einer Struktur?

C-Standard bezieht sich auf struct Felder als Mitglieder, nicht Eigenschaften.

Mitglieder von struct s in C haben definierte Werte in drei Situationen:

  • Wenn Sie struct s in statischem/globalem Speicher zuweisen, oder
  • Wenn Sie Elementwerte durch eine initializer liefern, oder
  • Sie verwenden eine Speicherzuweisungsroutine, die den Speicher ausfüllt.

In allen anderen Fällen struct Mitglieder müssen vor der ersten Verwendung zugewiesen werden; Lesen sie vor der Zuweisung ist undefiniertes Verhalten. In Ihrer Situation ist struct im dynamischen Speicher durch malloc zugewiesen. Dies bedeutet, dass seine Mitglieder explizit zugewiesen werden müssen.

Wenn Sie calloc von malloc wechseln, struct ‚s Speicher wäre für Sie werden auf Null gesetzt:

Node *n = calloc(1, sizeof(Node)); 
+3

Hinweis zur Terminologie: Der C-Standard bezieht sich auf 'struct' _members_, nicht _properties_. Es könnte eine gute Idee sein, die Standardbegriffe zu verwenden, da unübliche Ausdrücke oft Verwirrung stiften (Eigenschaften einer 'struct' im C-Kontext können Qualifier oder Spezifizierer sein). – Olaf

+1

@Olaf Das stimmt. Ich blieb bei OPs Terminologie, um die Antwort für ihn leichter verständlich zu machen, aber ich denke, es ist keine schlechte Idee, auch die Terminologie zu korrigieren. Danke für den Kommentar! – dasblinkenlight