2016-05-24 12 views
2

Weiß jemand, warum das Mitglied Node_ptr next; macht die Elemente des Arrays poly[1] und poly[2] den falschen Wert anzeigen? Wenn ich Node_ptr next; von der Struktur (struct node) zu entfernen, ich bin in der Lage den richtigen Wert für den Indizes 1 und 2Struktur, Array-Anzeige falsche Werte

hier zu bekommen, ist mein Code:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct node *Node_ptr; 
struct node { 
    int coef; 
    int exp; 
    Node_ptr next; 
    }; 

int main() 
{ 
    struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; 
    struct node p2_terms[] = {3, 1990, 2, 1492, 11, 5}; 

    struct node poly[20]; 
    poly[0] = p1_terms[0]; 

    poly[1] = p1_terms[1]; 

    poly[2] = p1_terms[2]; 

    printf("Your polynomials are: \n%dx^%d+%dx^%d+%dx^%d", poly[0].coef, poly[0].exp, poly[1].coef, poly[1].exp, poly[2].coef, poly[2].exp); 

    int siz = sizeof(poly); 
    printf("\n\nSize of the array: %d bytes \n",siz); 
    return 0; 
} 
+3

'{10, 1000, 5, 14, 1, 0};' falsche Initialisierungsliste. -> '{{10, 1000}, {5, 14}, {1, 0}}' – BLUEPIXY

Antwort

8

Zitiert C11, Kapitel §6.7. 9, (emphasis Mine)

Jede Verstrebung umschlossene Initialisiererliste hat ein zugeordneten aktuelles Objekt. Wenn keine Bezeichnungen vorhanden sind, werden Unterobjekte des aktuellen Objekts in der Reihenfolge zum Typ des aktuellen Objekts initialisiert: Arrayelemente in aufsteigender Reihenfolge, Struktur Elemente in Deklarationsreihenfolge und das zuerst benannte Mitglied einer Union. [...]

Also, im Grunde in der Initialisierung

struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; 

die Array-Größe ist 2. Es erzeugt zwei Elemente struct node so p1_terms[2] Zugriff aus gebundenem Zugriff ist die undefined behavior aufruft.

Das heißt, initialisiert der Initialisierung die Strukturelemente in Ordnung, das heißt, für den obigen Fall werden die Elementwerte wie

sein
p1_terms[0].coef = 10; 
p1_terms[0].exp= 1000; 
p1_terms[0].next= 5; // see here.... 

und dies ist sicherlich nicht was Sie wollen. Sie müssen die Initialisiererliste wie

struct node p1_terms[] = {{10, 1000}, {5, 14}, {1, 0}}; 

zu vermeiden next immer initialisiert verwenden.

Verwandte aus dem gleichen Kapitel

Wenn das Aggregat oder Vereinigung enthält Elemente oder Elemente, die Aggregate oder Gewerkschaften sind, diese Regeln gelten rekursiv für subaggregates oder Gewerkschaften enthalten. Wenn der Initialisierer einer unteraggregierten oder enthaltenen Union mit einer linken geschweiften Klammer beginnt, initialisieren die von eingeschlossenen Initialisierer, dass die Klammer und ihre passende rechte Klammer die Elemente oder Elemente des Unteraggregats oder der enthaltenen Union initialisieren. [...]

+0

Danke für die schnelle Antwort. Weißt du, wie man es repariert? –

+1

Danke!Das half mir zu verstehen, was vor sich ging und suchte nach einer Lösung. –

+0

Dies gilt seit 89 Standard – GRC

1

Ihr Initialisierungscode struct node p1_terms[] = {10, 1000, 5, 14, 1, 0}; berücksichtigt den Zeiger für den nächsten Knoten nicht. Tatsächlich initialisiert es den 1. Zeiger auf 5 und den zweiten auf 0, was definitiv nicht das ist, was Sie wollen. Wenn Sie dann mit der poly[2] = p1_terms[2]; auf eine dritte verweisen, sind im Initialisierer keine Daten mehr vorhanden, so dass Sie auf zufällige Daten zeigen, die über den Inhalt Ihres Arrays hinausgehen. Wenn Sie die Node_ptr next; herausnehmen. 2 Knoten werden pro Knoten verbraucht, also funktioniert es wie vorgesehen.