2016-09-05 14 views
1

Ich habe den folgenden Code. Es scheint, dass die Lesesequenz falsch ist. Irgendeine Hilfe?Double Dereferenz in struct C

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct punct{ 
int x; 
int y; 
}COORD; 

typedef struct nod{ 
COORD *coord; 
struct nod *urm; 
}NOD; 
int main() 
{ 
    NOD *head= malloc(sizeof(NOD)); 
    scanf("%d", &head->coord->x); 
    scanf("%d", &head->coord->y); 
    printf("%d, %d", head->coord->x , head->coord->y); 

    return 0; 
} 

Ich habe erfolgreich nur das x-Feld der Struktur head->coord unter Verwendung von zugreifen verwaltet, und von dem, was ich das ist das Problem mit meinem Code berichten. Ich bin bereits auf dem ersten Feld der ersten Struktur, so dass ich nicht auf x/y zugreifen kann.

+4

Wo initialisierst du 'head-> coord'? –

+0

Versuchen Sie es mit der richtigen Paranthese: 'scanf ("% d ", & ((head-> coord) -> y));' –

+0

@OliverCharlesworth Danke, habe nicht darüber nachgedacht. Dachte, ich habe es mit der Initialisierung des Kopfes abgedeckt. –

Antwort

2

Sie haben head->coord nicht initialisiert. Die Dereferenzierung nicht initialisierter Zeiger führt zu undefined behaviour. Sie tun müssen, um so etwas wie:

head->coord = malloc(sizeof (COORD)); 

Sie sollten auch den Rückgabewert von malloc() für Fehler überprüfen.

4

Sie haben die Koordi - nierungsvariable nicht initialisiert, daher sollten Sie auch etwas Speicherplatz dafür reservieren.

head->coord = malloc(sizeof (COORD));

Aber in diesem Fall könnte es am besten sein KOORD in NOD zu setzen, anstatt darauf zu verweisen!

So:

typedef struct nod{ 
    COORD coord; 
    struct nod *urm; 
}NOD; 

Sie sollten wirklich nur einen Zeiger machen, wenn Sie das Objekt viel oder wenn es ein komplexeres Objekt tauschen werden.

+1

Einbetten der 'COORD' direkt scheint hier korrekt. Wenn es sich um ein Array von 'COORD'-Werten handeln würde, müssten Sie ebenfalls zählen. –

+0

@ JonathanLeffler Sagen wir, ich möchte ein Array von COORD erstellen. Wie erzeuge ich eine Verbindung zwischen zB einem Array 'COORD ** A = malloc (n * sizeof (COORD *));', wobei n die Anzahl der x, y-Paare und eine Liste von Typ NOD-Elementen ist. Ich dachte an ein for bis head ist NULL, wo head der Anfang meiner Liste ist, wobei ich bei jeder Iteration 'A [i] -> x = head-> coord-> x' und' A [i] - > y = Kopf-> Koordi-> y'. Irgendwelche Gedanken? –

+0

@AlexPostolache: Annahme einer Struktur wie: 'typedef struct nod {size_t num_coords; COORD * Koordination; struct nicken * urm; } NOD; ', dann würden Sie' NOD * nod = malloc (sizeof (* nod)) definieren; if (nod == 0) {... Fehler ...; } nod-> coord = malloc (n * sizeof (* nod-> coord)); if (nod-> coord == 0) {... Fehler ...; frei (nicken); } nod-> num_coords = n; nick-> urm = 0; 'oder in der Nähe. Damit wird das Koordinatenfeld zugewiesen, das von der Struktur verwendet werden soll: 'nick-> coord [0]' .. 'nod-> coord [nod-> num_coords - 1]' sind gültige Referenzen. –