Я читал новый (май 2013) O'Reilly книгу «Понимание и использование C указателей» Ричард Риз, и у меня есть вопрос о какой-то код в нем, на странице 87.Использование исходного указателя после realloc?
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
. Так что я просто пронзительный, чувствуя себя неловко об этом?
Чтобы обобщить вопрос: как только указатель свисает, безопасно ли использовать адрес, содержащийся в указателе, для любых целей, например вычисления смещений? Благодарю.
В момент перераспределения длина 'length 'больше размера буфера (' maximumLength' до корректировки). Вы должны использовать 'currentPosition = buffer + length - 1', если я правильно интерпретирую значения. – Casey
Я проверил это, прежде чем публиковать вопрос. Код книги инициализирует «length» и «currentPosition» равным нулю. 'length' увеличивается в первом условном выражении, поэтому он всегда один за индексом последнего добавленного элемента. 'currentPosition' - это то, где новый элемент должен быть добавлен, и после добавления добавляется. Это не то, как я бы написал код для начала, но принимая код как заданный, 'buffer + length' верен. – verbose
Итак, 'currentPosition' является предварительно скомпонованным' buffer + length'? Я стою исправлен (и немного недоумеваю из-за избыточности). – Casey