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.