2016-04-25 80 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])。luggage',對吧?所以它解除引用tagBox [2]'。 'tagBox [2]'指向什麼? – immibis

+0

啊,我現在明白了。你的評論使得它更清晰。謝謝! –

回答

0

指針是很像任何其它變量,不同之處在於爲指針,T* ptr,其值預計是一個地址記憶中的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

您需要分配的所有對象的陣列中:

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