С++ нарушение прав доступа [закрыт]

132
18 апреля 2019, 18:00

Пытаюсь освоить новый для себя 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

Answer 1

Что тут голову ломать: очевидный доступ через null-указатель. Скорее всего на

deck[cardsInDeck].rect->h = cardHeight;

То есть у вас в этот момент deck[cardsInDeck].rect - нулевой указатель. Смещение поля SDL_Rect::h равно, если я не ошибаюсь, 12, т.е. 0xC. Это и есть ваша "запись по адресу 0x0000000C".

В честь чего у вас поле Card::rect вообще является указателем? Это намеренно так сделано? И если это сделано намеренно, то вам сначала надо позаботиться о том, чтобы этот указатель куда-то указывал.

READ ALSO
Почему код работает?

Почему код работает?

Собственно то почему этот код должен выбросить ошибку написано в статье: http://scrutatorme/post/2015/12/30/pointers_demystified_p2

183
Динамическое изменение типа std::vector

Динамическое изменение типа std::vector

Как динамически менять тип у вектора в структуре в зависимости от типа записываемого значения, в него могут записываться значения следующего...

166
PSQLException ошибка

PSQLException ошибка

При тестировании кода выдаёт exception

131
Выбор одной записи из RethinkDB на Java

Выбор одной записи из RethinkDB на Java

Как можно извлечь одну запись из таблицы RethinkDB на Java? Я попробовал сделать так, как написано в документации:

146