Błędy przy zwalnianiu dynamicznie zaalokowanej tablicy tablic w dynamicznie zaalokowanej strukturze.

0

Witam serdecznie!

Uczę się języka C i trochę zamotałem się w dynamicznej alokacji kilku rzeczy naraz.

Mój program ma mieć następującą budowę:
struktura mapy gry -> dwuwymiarowa tablica struktur komórek gry -> dwa pola ze stanem aktualnym i poprzednim.

Przy samym alokowaniu, wprowadzaniu danych czy ich wyświetlaniu nie pojawiają się problemy [EDIT: a jednak są przy odpowiednio dużych wymiarach np. 33x33],
natomiast próba zwolnienia pamięci sypie cały program, gdyż z całej funkcji destroyWorld() poprawnie wykonuje się jedynie free(world).

Będę bardzo wdzięczny za wskazówki, co robię źle, bo już nie mam pomysłu i chyba tylko sen może mi coś jeszcze podsunąć. ;)

Z góry dziękuję za odpowiedź i pozdrawiam!

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char prev;
    char curr;
} Cell;

typedef struct {
    int rows;
    int cols;
    Cell **cells;
} World;

World *initWorld(int h, int w)
{
    int i = 0;
    World *world = NULL;
    
    if( ( world = (World *) malloc(sizeof(World)) ) == NULL )
        return NULL;

    world->rows = h;
    world->cols = w;

    if( ( world->cells = (Cell **) malloc(sizeof(Cell)*h) ) == NULL )
        return NULL;

    for(; i < h; i++)
        if( ( world->cells[i] = (Cell *) malloc(sizeof(Cell)*w) ) == NULL )
            return NULL;

    return world;
}

void displayWorld(World *world)
{
    int i = 0, j = 0, h, w;
    h = world->rows;
    w = world->cols;

    for(i = 0; i < h; i++)
    {
        for(j = 0; j < w; j++)
            printf("%d ", world->cells[i][j].curr);
        printf("\n");
    }
}

void destroyWorld(World *world)
{
    int i = 0, h, w;
    h = world->rows;
    w = world->cols;

    for(; i < h; i++)
        free(world->cells[i]);
    free(world->cells);
    free(world);
}

int main()
{
    int height = 0, width = 0;
    World *world = NULL;

    printf("Podaj wysokosc:  ");
    scanf("%d", &height);
    printf("Podaj szerokosc: ");
    scanf("%d", &width);

    world = initWorld(height, width);

    displayWorld(world);

    destroyWorld(world);

    printf("\n\n");
    system("PAUSE");
    return 0;
}
1
if( ( world->cells = (Cell **) malloc(sizeof(Cell*)*h) ) == NULL )

Nie ma co przydzielać word dynamicznie:

World initWorld(int h,int w)
  {
   World world
   world.rows=h;
   world.cols=w;
   ...
   return world;
  }
...
World world=initWorld(height,width);
0

Wszystko działa! Niedopatrzenie, zmęczenie, nieważne. Wielkie dzięki. :D

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