2016-04-25 12 views
0

Ich schreibe ein wenig Code, um einen Bus zu modellieren. Der Code hat einen Fehler und ich habe das Problem im folgenden Ausschnitt vereinfacht:Problem beim Zugriff auf Array von Objektzeigern

struct luggageTag{ 
    int seat; 
    bool luggage; 
}; 

int main(){ 

    luggageTag *tagBox[36]; 
    tagBox[2]->luggage = true; // EXC_BAD_ACCESS on this line 
} 

Warum ist es, dass die Linie

tagBox[2]->luggage = true; 

Ergebnisse in einem schlechten Zugang?

+1

'tagBox [2] -> Gepäck' bedeutet '(* tagBox [2]). Gepäck', richtig? So dereferenziert 'tagBox [2]'. Was zeigt 'tagBox [2]'? – immibis

+0

Ahh, ich verstehe es jetzt. Dein Kommentar macht es viel klarer. Vielen Dank! –

Antwort

0

Ein Zeiger eine Variable wie jede andere viel ist, mit der Ausnahme, dass für einen Zeiger, T* ptr, wird sein Wert erwartet die Adresse eines sein, Instanz von T im Speicher.

Sie haben ein Array nicht initialisierter Variablen erstellt - Sie haben sie nicht auf etwas ausgerichtet.

Denken Sie an einen Zeiger als Post-it-Notiz mit der Lage eines Dinges darauf. Was Sie getan haben, ist 36 leere Post-It-Notizen von der Spitze des Stapels zerrissen.

Sie müssen einige Gepäcktags erstellen, auf die Sie verweisen können, aber Sie sind auch dafür verantwortlich, diese Objekte freizugeben.

struct luggageTag{ 
    int seat; 
    bool luggage; 
}; 

int main(){ 
    luggageTag *tagBox[36]; 
    for (size_t i = 0; i < 36; ++i) { 
     tagBox[i] = new luggageTag; 
    } 
    tagBox[2]->luggage = true; 
    // memory leak unless you do: 
    // for (size_t i = 0; i < 36 ; ++i) 
    // delete tagBox[i]; 
} 

Alternativ Sie einen Zeiger auf ein Array von 36 Gepäckanhänger schaffen könnte:

struct luggageTag{ 
    int seat; 
    bool luggage; 
}; 

int main(){ 
    luggageTag *tagBox = new luggageTag[36]; 
    tagBox[2]->luggage = true; 
    // ... 
    delete [] tagBox; // free the memory 
} 

Ist dies nicht Teil einer Schule Übung ist, können Sie bei Verwendung eines std::array oder std::vector suchen.

0

Weil tagBox[2] ein Zeiger ist, aber er zeigt nirgends, und Sie versuchen, es zu dereferenzieren.

Sie müssen es zuerst irgendwo Punkt zu machen, zum Beispiel:

luggageTag tag; 
tagBox[2] = &tag; 

Aber es sei denn, es gibt einen bestimmten Grund, warum Sie Zeiger benötigen würden, geben Sie einfach die tatsächlichen Objekte direkt im Array speichern könnte:

luggageTag tagBox[36]; 
     //^remove * 
tagBox[2].luggage = true; // no EXC_BAD_ACCESS! 
     //^dot, not arrow operator 

Jetzt muss das Array-Element nicht mehr auf etwas ausgerichtet werden.

-1

Sie müssen alle Objekte in der Anordnung zuzuordnen:

luggageTag *tagBox[36]; 
for(int i=0; i<36; i++) 
     tagBox[i] = new luggageTag; 

tagBox[2]->luggage = true; 

for(int i=0; i<36;i++) 
     delete tagBox[i]; 
Verwandte Themen