Tablica dynamiczna dwuwymiarowa - malloc

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?

  1. 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.

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)
     }
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.

0

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().

0

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

Pozdrawiam.

0

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

0

F5

0

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

0

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

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