2016-04-25 7 views
0

バスをモデル化するためのコードを少し書いています。コードにエラーがあると、私は次のスニペットでは、問題を単純化していますオブジェクトポインタの配列へのアクセスに問題があります

struct luggageTag{ 
    int seat; 
    bool luggage; 
}; 

int main(){ 

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

なぜそれが悪いのアクセスでライン

tagBox[2]->luggage = true; 

が結果ということですか?

+1

'tagBox [2] - >荷物は'(* tagBox [2])。荷物 'を意味します、そうですか?したがって、 'tagBox [2]'を逆参照します。 'tagBox [2]'は何を指していますか? – immibis

+0

ああ、今理解しています。あなたのコメントははるかに明確になります。ありがとう! –

答えて

0

、その値は、のアドレスであることが期待されますメモリ内のTのインスタンス

初期化されていない変数の配列を作成しましたが、何も指していません。

ポインターは、ポストイットノートと考えることができます。あなたがしたことは、スタックの上から36の空白のポストイットノートが引き裂かれたことです。

あなたは指すようにいくつかの荷物タグを作成する必要がありますが、それらのオブジェクトを解放する責任もあります。

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]; 
} 

またあなたは36個の荷物タグの配列へのポインタを作成することができます。これは学校の運動の一部ではない場合

struct luggageTag{ 
    int seat; 
    bool luggage; 
}; 

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

、あなたはstd::arraystd::vectorを使用して見たいかもしれません。

0

tagBox[2]はポインタですが、どこにも指さないため、逆参照しようとしています。

あなたが例えば、それは最初にどこかを指し示すようにする必要があります:

luggageTag tag; 
tagBox[2] = &tag; 

しかし、あなたは、ポインタを必要とする特別な理由がありますしない限り、あなたは、単に配列に直接実際のオブジェクトを格納できます。

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

これで、配列要素を最初に何かを指すようにする必要はありません。

-1

あなたは、アレイ内のすべてのオブジェクトを割り当てる必要があります:ポインタ、T* ptrのためにことを除いて、ポインタがずっと他のどのような変数がある

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]; 
関連する問題