Lokowanie pamieci w C

Lokowanie pamieci w C
seithar
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

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

Kopiuj
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:

Kopiuj
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?

edytowany 1x, ostatnio: seithar
twonek
wstaw kod między &lt;code=c&gt;&lt;/code&gt;
kaczus
  • Rejestracja:około 10 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Łódź
  • Postów:1402
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.


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie
edytowany 1x, ostatnio: kaczus
twonek
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 2 lata
  • Postów:2500
3
Kopiuj
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

Kopiuj
tab2[0][0] = -12;
tab[0][0] = 39393;
printf("%d\n", tab2[0][0]);
seithar
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

To wiele tłumaczy! dzięki :)

seithar
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 9 lat
  • Postów:7
0

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

Kopiuj
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: **

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

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

edytowany 1x, ostatnio: seithar
twonek
dlaczego nie wstawiasz kodu między &lt;code=c&gt;&lt;/code&gt;?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.