我正在编写一些代码来建模总线。代码有错误,我在以下代码段中简化了问题:
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;
导致访问不良?
答案 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::array
或std::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];