无法访问对象指针数组

时间:2016-04-25 23:32:05

标签: c++ arrays

我正在编写一些代码来建模总线。代码有错误,我在以下代码段中简化了问题:

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;

导致访问不良?

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:-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];