Используя оригинальный указатель после 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
, Так я чувствую себя просто привередливым, чувствуя себя неловко по этому поводу?
Чтобы обобщить вопрос: если указатель свисает, безопасно ли использовать адрес, содержащийся в указателе, для каких-либо целей, например, для вычисления смещений? Благодарю.