Dziwne zachowania wskaźnika w klasie

Odpowiedz Nowy wątek
2011-08-08 17:19
0

Mam taki kod:

game.h:

#ifndef GAME_H
#define GAME_H

class Game
{
 public:
  Game(int arg_y, int arg_x, int arg_how_much);
  int y, x, how_much;
  int (*ptr)[3];
  void drawBoard();
};
#endif

game.cpp:

#include "game.h"
#include <iostream>

using namespace std;

Game::Game(int arg_y, int arg_x, int arg_how_much)
{
  int tab[3][3];

  for(int j = 0; j < y;j++) //zerowanie
  {
   for(int i = 0; i < x;i++)
   {
    tab[i][j] = 0;
   }
  }

  tab[0][0] = 1; //ustawienie testowych wartosci
  tab[1][1] = 2;
  tab[2][2] = 3;

   ptr = tab;

  for(int j = 0; j < y;j++) //print calej tabeli
 {
  for(int i = 0; i < x;i++)
  {
   cout<<"{"<<ptr[i][j]<<"}";
  }
  cout<<endl;
 }
}

void Game::drawBoard()
{
 cout<<endl;
 for(int j = 0; j < y;j++) //print tabeli
 {
  for(int i = 0; i < x;i++)
  {
   cout<<"{"<<ptr[i][j]<<"}";
  }
  cout<<endl;
 }
}

main.cpp:

#include "game.h"

int main()
{
 Game *game = new Game(3, 3, 3);
 game->drawBoard();
 return 0;
}

i jako output otrzymuje:

{1}{0}{0}
{0}{2}{0}
{0}{0}{3}

{1}{2293528}{4210790}
{4210790}{4199782}{0}
{0}{1875677920}{3}

I teraz moje pytanie: dlaczego gdy odwołuje sie do tablicy przez wskaźnik w pierwszym przypadku(w konstruktorze) wszystko jest ok, tabelka wyglada tak jak powinna, a gdy w funkcji do tego stworzonej(gdzie kod jest identyczny), na ekranie mam jakies random wartości?

Pozostało 580 znaków

2011-08-08 17:26
1

Pewnie dlatego, że po wyjściu z konstruktora tablica tab przestaje istnieć, ptr pokazuje na zwolniony obszar pamięci.


Pozostało 580 znaków

2011-08-08 18:23
0

Tablice zadeklarowane poprzez np. int tab[3][3] są usuwane. Użyj od razu wskaźników i operatora new do utworzenia tablic.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0