Пытаюсь освоить новый для себя c++ и пишу приложение "blackjack". На данный момент уже долгое время ломаю голову над этой ошибкой - Необработанное исключение по адресу 0x00CCA4F9 в ConsoleApplication3.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x0000000C.
Ошибка пошла после данных строчек кода
Файл game.cpp
struct Card{
SDL_Texture* texture;
SDL_Rect* rect;
SDL_Surface* surf;
};
Card deck[2];
int cardsInDeck = 0;
SDL_Rect cardSrc, cardDest;
int cardWidth = 32;
int cardHeight = 64;
...
void Game::addCard(const char* path, int xpos, int ypos)
{
deck[cardsInDeck].surf = IMG_Load(path);
deck[cardsInDeck].texture = SDL_CreateTextureFromSurface(renderer, deck[cardsInDeck].surf);
deck[cardsInDeck].rect->h = cardHeight;
deck[cardsInDeck].rect->w = cardWidth;
deck[cardsInDeck].rect->x = xpos;
deck[cardsInDeck].rect->y = ypos;
SDL_FreeSurface(deck[cardsInDeck].surf);
cardsInDeck++;
}
Файл main.cpp
game->addCard("assets/AS.png", 100, 100);
Полный код на GITHUB
Что тут голову ломать: очевидный доступ через null-указатель. Скорее всего на
deck[cardsInDeck].rect->h = cardHeight;
То есть у вас в этот момент deck[cardsInDeck].rect
- нулевой указатель. Смещение поля SDL_Rect::h
равно, если я не ошибаюсь, 12
, т.е. 0xC
. Это и есть ваша "запись по адресу 0x0000000C".
В честь чего у вас поле Card::rect
вообще является указателем? Это намеренно так сделано? И если это сделано намеренно, то вам сначала надо позаботиться о том, чтобы этот указатель куда-то указывал.
Собственно то почему этот код должен выбросить ошибку написано в статье: http://scrutatorme/post/2015/12/30/pointers_demystified_p2
Как динамически менять тип у вектора в структуре в зависимости от типа записываемого значения, в него могут записываться значения следующего...
Как можно извлечь одну запись из таблицы RethinkDB на Java? Я попробовал сделать так, как написано в документации: