2016-04-25 98 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];