Lokowanie pamieci w C

0

Jesli zaalokuje pamięć dla dwuwymiarowej tablicy dynamicznej w następujący sposob:

int i;
int **tab;
int w, k; //wiersze i kolumny
tab=(int**)malloc(w*sizeof(int*);
for(i=0;i<n;i++)
{
tab[i]=(int*)malloc(k*sizeof(int*);
}

a następnie utworzę nową tablicę oraz przypiszę wartość pierwszej tablicy, do tablicy numer 2, w następujący sposób:

int **tab2;
tab2=tab;

**to czy w ten sposób pamięć zostaje przydzielona dla tablicy numer 2 automatycznie? **

Jeśli nie, to dlaczego funkcja printf(); po iteracji w pętli for, wyświetla na ekranie prawidłowo wartości liczb całkowitych, takie jakie posiada tablica pierwsza?

3

Nie nie zostanie przydzielona automatycznie pamięć dla tab2.
Funkcja printf wyświetla prawidłowo, bo tab2 wskazuje na ten sam adres co tab1.

Konkluzja:
Do powtórki wskaźniki.

ps: żeby zobaczyć, że jest źle - zmień coś w tablicy tab i wyświetl tab2.

3
tab[i]=(int*)malloc(k*sizeof(int*));

powinno być sizeof(int)

to czy w ten sposób pamięć zostaje przydzielona dla tablicy numer 2 automatycznie?
Nie, wskaźnik tab2 będzie wskazywać na to samo co tab.

Jeśli nie, to dlaczego funkcja printf(); po iteracji w pętli for, wyświetla na ekranie prawidłowo wartości liczb całkowitych, takie jakie posiada tablica pierwsza?
Patrz wyżej.

Inaczej mówiąc, wykonaj taki ciąg instrukcji

tab2[0][0] = -12;
tab[0][0] = 39393;
printf("%d\n", tab2[0][0]);
0

To wiele tłumaczy! dzięki :)

0

A czy jest możliwość zmiany zarezerwowanej pamięci dla tab? Przykładowo zarezerwowałem:

int **tab;
int w, k; //wiersze i kolumny
tab=(int**)malloc(w*sizeof(int*);
for(i=0;i<n;i++)
{
tab[i]=(int*)malloc(k*sizeof(int);
}

**A teraz chce zmniejszyć w zmiennej tab ilość miejsca zarezerwowanej na wiersze. Czy muszę zwolnić całą pamięć w następujący sposób: **

for(i=0;i<n;i++)
{
free(tab[i]);
}
free(tab);

**a następnie zaalokować ją ponownie? **

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