2016-04-25 2 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] -> багаж' означает' (* биркаBox [2]). Багаж', правый? Так что это разыменования 'tagBox [2]'. Что указывает 'tagBox [2]'? – immibis

+0

Ahh, я понимаю это сейчас. Ваш комментарий делает это намного яснее. Благодаря! –

ответ

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.

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