2016-05-06 15 views
2

ich habe ein Problem bei der Prüfung, ob Zeiger in meiner Struktur ist null, es ist mein Code:überprüfen Zeiger in struct NULL ist

zone* z = malloc(sizeof(zone)); 
z->cases = malloc(sizeof(Case)*300); 

for(i = 0; i < 300; i++) 
{ 
    Case* c = z->cases[i]; 

    if(c->fourmilier) // HERE IS RAISE SEGMENTATION FAULT 
    { 
     if(read(&nbTypeFourmib, sizeof(unsigned char))==-1) { 
      exit(EXIT_FAILURE); 
     } 
    } 
} 

Meine Struktur:

typedef struct { 
    unsigned short foodSpawnfreq; 
    unsigned short foodUnit; 
    unsigned char sourceFood; 
    Case** cases; 
    TypeFourmi** TypeFourmi; 
    TypeFourmi** TypeBibibte; 
} zone; 

typedef struct{ 
    fourmiliere* fourmilier; 
    bibite* bibit; 
    fourmis* fourmi; 
    char obstacle; 
} Case; 

Antwort

0

Sie struct den Typ angegeben von case zu Case** sein. Sie weisen ihm jedoch eine Case* zu.

Was Sie tun müssen, ist die Veränderung:

z->cases = malloc(sizeof(Case)*300); 

To ...

z->cases = malloc(sizeof(Case*)*300); 

Und in Ihrem Schleife ...

z->cases[i] = malloc(sizeof(Case)); 

// initialise data 

Case* c = z->cases[i]; 
+0

danke :) es ist ok :) – pilout

+0

Es wäre viel einfacher sein Typ 'Fall zu ändern **' zu 'Case *', und verwenden Sie stattdessen 'Case * c = & z-> cases [i]; '. – user694733

+0

@ user694733 ja, aber es ist schwer zu sagen, was das Endziel dieses Codes ist, also ging ich einfach mit der direkten Route – OMGtechy

0

Versuchen Sie, diese

if((NULL != c) && c->fourmilier) 

Ich denke, dass man tatsächlich so etwas wie

z->cases = new Case[300]; 

brauchen statt

z->cases = malloc(sizeof(Case)*300); 
+0

Die ursprüngliche Frage sieht aus wie C (und deshalb habe ich es so markiert), und wenn das der Fall ist ist kein 'neues' Schlüsselwort :) – OMGtechy

+0

Ich habe nicht auf Tags geachtet :( – GMichael