Значение переменной перезаписывается - PullRequest
0 голосов
/ 11 января 2019

Здравствуйте, я работаю над игрой, написанной на C с SDL2. Я создал структуру игрока, которая имеет указатель на SDL_Rect. Но похоже, что значение прямоугольника перезаписывается, что вы можете увидеть на скриншоте.

Консоль игры, первые два журнала - это значения, которые она должна содержать

Вот структура Player:

struct Player* createPlayer(int x, int y, int width, int height, SDL_Texture* texture) {
  struct Player* player = (struct Player*) malloc(sizeof(struct Player));
  SDL_Rect rect = {x, y, width, height};

  player->rect = ▭
  player->texture = texture;
  printf("%d\n", player->rect->x);
  return player;
}

Вот основная функция:

struct Player* player = createPlayer(0, 0, 128, 128, texture);
bool running = true;
printf("%d\n", player->rect->x);
while(running) {
  SDL_Event event;

  // UPDATE PLAYERS AND STUFF HERE

  while(SDL_PollEvent(&event)) {
    switch(event.type) {
      case SDL_QUIT:
        running = false;

        break;
    }
  }

  SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
  SDL_RenderClear(renderer);

  // RENDER PLAYERS AND STUFF HERE
  printf("%d\n", player->rect->x); <- This is where the different values come from
  SDL_RenderCopy(renderer, player->texture, NULL, player->rect);

  //

  SDL_RenderPresent(renderer);
}

1 Ответ

0 голосов
/ 11 января 2019

Вы назначаете указатель на локальную переменную:

  SDL_Rect rect = {x, y, width, height};

  player->rect = &rect;

Локальная переменная будет недействительной, как только она выйдет из области видимости (при достижении конца функции), и любой указатель на нее будет указывать на недопустимую память -> неопределенное поведение.

Написать ...

  SDL_Rect rect = {x, y, width, height};

  player->rect = malloc(sizeof(SDL_Rect);
  *player->rect = rect;
...