Используя оригинальный указатель после realloc?

Я читал Ричарда Ризановый (май 2013) O 'Рейли книга "Понимание и использование указателей Си "и у меня есть вопрос о некотором коде в нем, на странице 87.

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

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

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

Я надеюсь, что имена переменных говорят сами за себя; если нужен контекст, я буду редактировать, чтобы предоставить весь кусок кода, а не только этот отрывок.

Мой вопрос о линииcurrentPosition = newBuffer + (currentPosition - buffer);, Мое пониманиеrealloc() является то, что, когда новое распределение успешно, первоначально выделенная память освобождается. Если это правильно, то рассматриваемая строка использует висячие указатели, не так ли? И то и другоеbuffer а такжеcurrentPosition на RHS этого выражения указатели на память, которая была освобождена.

Мой инстинкт был бы переписать это, чтобы избежать использования висячих указателей с помощьюlength, который в конце концов уже вокруг. Я хочу заменить эти две последние строки на:

buffer = newBuffer;
currentPosition = buffer + length;

Тем не менее, предположительно, код как написано работает, потому что два указателя все еще содержат адреса (хотя и мусора), и смещение между этими двумя адресами все еще может быть вычислено как способ переназначенияcurrentPosition, Так я чувствую себя просто привередливым, чувствуя себя неловко по этому поводу?

Чтобы обобщить вопрос: если указатель свисает, безопасно ли использовать адрес, содержащийся в указателе, для каких-либо целей, например, для вычисления смещений? Благодарю.

Ответы на вопрос(2)

Ваш ответ на вопрос