typ ** - co się stanie ze starą tablicą

0

Witam.
Napisałem pewną funkcję, która korzysta z tablicy wskaźników zadeklarowanej pierwotnie jako 'typ **'. Następnie jest tworzona zmienna lokalna tego samego typu. Za pomocą funkcji malloc() przypisuję jej obszar pamięci zwiększony o 1 * sizeof(typ *), tak że nowa tablica ma jeden element więcej niż stara. przepisuję wskaźniki do nowej oraz wykonuję kilka komend, mających na celu uzupełnienie danych związanych z nowym elementem, ale to nie dotyczy mojego pytania. Na końcu funkcja zmienia adres wskaźnika do tablicy wskaźników w zmiennej przekazanej jako parametr, na adres nowej tablicy, na którą wskazuje zadeklarowana zmienna lokalna. To wygląda tak

int new(struct grupa **tablica, int *i_tab, char *nazwa)
{
/*...*/
	struct grupa **nowa_tab;   //nowa tablica grup
/*...*/
	nowa_tab = (struct grupa **)malloc(sizeof(struct grupa *) * (*i_tab + 1));   //utworzenie tablicy wskaźników do grup powiększonej o 1 rekord
/*...*/
	nowa_tab[*i_tab] = (struct grupa *)malloc(sizeof(struct grupa));   //nowa grupa (i_tab nie jest ++, bo pełni funkcję licznika tablicy)
	tablica = nowa_tab;   //teraz tymczasowa zmienna nowa_tab może zostać skasowana
	*i_tab++;   //zwiększ licznik tablicy grup
	return (0);   //koniec

Teraz moje pytanko. Co się dzieje z pamięcią zajmowaną przez starą tablicę wskaźników? Czy mogę uwolnić ją pisząc gdzieś w środku funkcji

free(tablica);

? Czy wtedy nie zostanie zwolniona nie tylko stara tablica, ale również pamięć na którą wskazują wskaźniki będące elementami nowej tablicy, wskazuwana także przez stare? Napisałem krótki programik testowi i doszedłem do wniosku, że nie będę mógł użyć free(), lecz nie jestem przekonany.

0
lord_didger napisał(a)

Czy mogę uwolnić ją pisząc gdzieś w środku funkcji free(tablica);

Tak.

Czy wtedy nie zostanie zwolniona nie tylko stara tablica, ale również pamięć na którą wskazują wskaźniki będące elementami nowej tablicy, wskazuwana także przez stare?

Nie.

Napisałem krótki programik testowi i doszedłem do wniosku, że nie będę mógł użyć free(), lecz nie jestem przekonany.

Ja nie jestem przekonany do tej funkcji powyżej ;)

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