Wskaźniki a zmienne lokalne

2015-01-08 22:42
0

Załóżmy, że w funkcji muszę usunąć pierwszy element z listy. Każdy element listy ma zaalokowaną w innej funkcji pamięć.

.....
usuwanie(&lista);
......

void usuwanie(struct **lista)
{
    .......
    struct cos_tam *tmp;
    tmp=(*lista)->next;
    free(*lista);
    *lista=tmp;
    .....
}

Co się właściwie dzieje, gdy wykonam instrukcję *lista=tmp? Jako nowy początek listy zostaje wskazana zmienna tmp, która istnieje tylko w obrębie funkcji. Domyślam się, że poza funkcją obszar pamięci zmiennej tmp jest już dostępny bez ograniczeń i w miejsce wskazywane przez listę mogą wejść bzdury. Czy fakt, że mi to działa zawdzięczam wyłącznie szczęściu?

Pozostało 580 znaków

2015-01-08 23:15
 element* usuwanie(struct element *K)
{
   if(!K) return K;
   struct element *H=K->next;
   free(K);
   return H;
}

Ponazywaj te zmienne normalnie i sensowanie a nie "cos_tam", trzeba sie doomyslac.
*lista=tmp; powoduje przypisanie dla wskaznika na poczatek listy wartosci zmiennej tmp.
Dlatego wlasnie korzystasz z podwojnego wskaznika zeby moc operowac na zmiennej,
ktora jest w innym obszarze pamieci. Ja przesylam swoja funkcje bez podwojnego wskaznika.

edytowany 1x, ostatnio: lookacode1, 2015-01-08 23:17
Powiedział: - "Ponazywaj te zmienne normalnie i sensowanie ..." i zamienił nazwy lista i tmp na K i H odpowiednio. - _13th_Dragon 2015-01-09 01:10

Pozostało 580 znaków

2015-01-08 23:28
0

*lista=tmp; powoduje przypisanie dla wskaznika na poczatek listy wartosci zmiennej tmp.

No tak, racja. Dzięki wielkie.

dodanie znacznika <quote> - @furious programming

edytowany 1x, ostatnio: furious programming, 2015-01-09 00:46
Do cytowania używaj znaczników &lt;quote&gt; - furious programming 2015-01-09 00:46

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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