На первый взгляд я вижу две вещи (которые могут не решить основную причину, но на самом деле могут помочь в написании большего количества кода сохранения; -))
1.1 Если инициализация не удалась, вы возвращаете NULL, но вы делаетене проверять результат initializeDeck()
, но вызывать addCard
, даже если myDeck
равно NULL.Таким образом, в случае ошибки во время инициализации addCard
вызывает сбой при разыменовании myDeck
.
. Или выполните следующие действия в main()
:
[...]
if (myDeck)
addCard(myDeck);
[...]
или и даже лучше и выполнитекак в addCard
:
void addCard(struct deck * myDeck)
{
if (!myDeck) {
printf("invalid input\n");
return;
}
[...]
1.2 malloc()
возвращает NULL в случае неудачи, поэтому проверьте результат и не разыменовывайте его:
[...]
myDeck->cards = (struct card**) malloc ( sizeof(struct card) * myDeck->numCards );
if (NULL == myDeck->cards) {
printf("Failed to allocate 52 cards, exiting..\n");
[...]
Если присмотреться, вы поймете, что выочевидно, не уверен, как упорядочить ваши данные ...; -)
Эта строка
myDeck->cards = (struct card**) malloc ( sizeof(struct card) * myDeck->numCards );
должна выделять массив указателей, записи которых, в свою очередь, для каждой карты должны получать ассигнование памяти.
Итак, есть две ошибки:
2.1 Вы назначаете много памяти указателю, ссылающемуся на массив указателей на карточки.
2.2 Вам не хватает назначить память длясами карты.
Чтобы исправить 2.1, измените строку выше на:
myDeck->cards = (struct card**) malloc ( sizeof(struct card *) * myDeck->numCards );
Чтобы исправить 2.2, добавьте следующее в цикл, присваивая значения карт.
[...]
for (i = 0; i<DECK_SIZE; i++) {
myDeck->cards[i] = malloc(sizeof(struct card));
/* adding error checking here is left as an exercise ... */
myDeck->cards[i]->number = num;
[...]
Добавление этих двух исправлений продвигает вас дальше ...; -)
Подсказка: те же две ошибки, которые вы допустили при распределении колоды (2.1 и 2.2), вы делаете в коде добавления карты (addCard()
).
Кстати: разыгрывание результата malloc()
мне кажется ненужным, так как malloc()
return void *
, который совместим с любым указателем.
Во всяком случае, приведение типов в общем случае не является хорошей идеей, поскольку не позволяет компилятору указывать вам на что-то, что может быть не так, как должно быть.