Tablica dynamiczna dwuwymiarowa - malloc

Odpowiedz Nowy wątek
2013-06-19 19:50
0

Witam!

Chciałbym się dowiedzieć, czy dobrze stworzyłem tablicę dynamiczną gdzie n - to liczba wierszy a m - liczba kolumn. Opierałem się na źródłach internetowych.


    int **tab;
    int m,n;

    tab = malloc(n*sizeof(int*));

    if(tab==NULL){
        printf("Bład alokacji!");
        return 1;
    }
    for(i=0;i<n;i++){
        tab[i] = malloc(m*sizeof(int*));
    }
      if(tab[i]==NULL){
        printf("Bład alokacji");
        return 1;
    } 

Chciałbym dowiedzieć się i zrozumieć działanie funkcji malloc.

1) Dlaczego tworzymy zmienną **tab z dwoma gwiazdkami?
2) Dlaczego w deklaracji:

 malloc(m*sizeof(int*)); 

przy int jest gwiazdka?

3) Czy deklaracja:

 tab = malloc(n*sizeof(int*));

tworzy wiersze a w kolejnej

  for(i=0;i<n;i++){
        tab[i] = malloc(m*sizeof(int*));
    } 

podczepia pod każdy kolejny wiersz wymaganą ilość kolumn o długości n? Nie mogę zrozumieć działania tych deklaracji.

Pozdrawiam.

edytowany 2x, ostatnio: didus1, 2013-06-19 19:53

Pozostało 580 znaków

2013-06-19 20:02
1

W C/C++ nie da się stworzyć dynamicznie tablicy więcej niż jednowymiarową. Ale można stworzyć tablice tablic:

   int **tab; // tablica int -> int *; tablica tablic int -> int **
   int Y,X; // nie używać żadnych m,n,i,j bo za chwilę się pogubisz co jest wierszem a co kolumną. Używać Y,X Rows,Cols Height,Width itp
   tab=malloc(Y*sizeof(int*)); // Y-sztuk elementów każdy z których jest tablicą int czyli int *
   for(int y=0;y<Y;++y) // nie używać bez sensu operacji przyrostkowych
     {
      tab[y]=malloc(X*sizeof(int)); // X-sztuk elementów każdy z których jest int (tu miałeś błąd)
     }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-06-19 20:11
0

Dzięki za szybką odpowiedź.
Co do warunków:

if(tab==NULL) i tab[i]==NULL 

to sprawdzanie czy pamięć została przydzielona jest poprawne tak?

Jeszcze mam pytanie, czy jak na końcu programu dopisze " free(tab); ", to zwolnienie pamięci w taki sposób zadziała ? Gdzie w ogóle znajduje się deklaracja funkcji free?

Pozdrawiam.

Pozostało 580 znaków

2013-06-19 21:09

Warunki poprawne tylko że tab[i]==NULL nie wiedzieć czemu masz poza pętlą.
free - <stdlib>
Trzeba w pętli zwolnić free(tab[y]); a na końcu free(tab).
Zasada jest prosta free() masz wywołać tyle razy ile wywołałeś malloc() a parametrem każdego free() ma być to co zwrócił odpowiedni malloc().


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-06-19 21:10
0

W przypadku użytych oznaczeń Y i X to Y - liczba wierszy a X - liczba kolumn tak? Bo się gubię w tym.

Pozdrawiam.

No fakt m,n to się nie pogubisz! A wiesz jak się oznaczają współrzędne gdzie jest zazwyczaj Y a gdzie X ? - _13th_Dragon 2013-06-19 21:15
No to pytam czy X - kolumny a Y - wiersze? Dla pewności... - didus1 2013-06-19 21:16

Pozostało 580 znaków

2013-06-19 22:15
0

Podbijam pytanie Czy X to kolumny a Y wiersze...

Pozostało 580 znaków

2013-06-20 10:10
0

F5

Pozostało 580 znaków

2013-06-20 10:39
0

X i Y to wymiary tablicy. Możesz sobie je interpretować jak chcesz, np. jako kierunek osiowo-krawędziowy i obrotowo-opaczny.

Pozostało 580 znaków

2013-06-20 10:46
0

Czyli patrząc na układ współrzędnych Y - tworzy wierszy a X - tworzy kolumny. Dobrze interpretuje?

edytowany 1x, ostatnio: didus1, 2013-06-20 10:46

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