Używasz oryginalnego wskaźnika po realloc?

Czytałem nową książkę O'Reilly Richarda Reese'a (maj 2013) „Understanding and Using C Pointers”, a ja mam pytanie o jakiś kod w niej, na stronie 87.

if (++length > maximumLength) {
    char *newBuffer = realloc (buffer, maximumLength += sizeIncrement);

    if (newBuffer == NULL) {
        free (buffer);
        return NULL;
    }

    currentPosition = newBuffer + (currentPosition - buffer);
    buffer = newBuffer;
}

Mam nadzieję, że nazwy zmiennych są oczywiste; jeśli potrzebny jest kontekst, będę edytować, aby dostarczyć cały fragment kodu, a nie tylko ten fragment.

Moje pytanie dotyczy liniicurrentPosition = newBuffer + (currentPosition - buffer);. Moje zrozumienierealloc() jest tak, że gdy nowa alokacja powiedzie się, pierwotnie przydzielona pamięć zostaje zwolniona. Jeśli to prawda, to linia, o której mowa, używa zwisających wskaźników, prawda? Obiebuffer icurrentPosition w RHS tego wyrażenia są wskaźniki do pamięci, która została zwolniona.

Moim instynktem byłoby przepisanie tego, aby uniknąć używania zwisających wskaźników za pomocąlength, który przecież już jest w pobliżu. Chcę zastąpić te dwie ostatnie linie:

buffer = newBuffer;
currentPosition = buffer + length;

Jednak przypuszczalnie kod w formie napisanej działa, ponieważ dwa wskaźniki nadal przechowują adresy (chociaż śmieci), a przesunięcie między tymi dwoma adresami można nadal obliczyć jako sposób ponownego przypisaniacurrentPosition. Czy jestem po prostu nieufny w tym, że czuję się nieswojo?

Aby uogólnić pytanie: czy wskaźnik jest zwisający, czy bezpieczne jest użycie adresu zawartego we wskaźniku do jakiegokolwiek celu, takiego jak obliczanie przesunięć? Dzięki.

questionAnswers(2)

yourAnswerToTheQuestion