Этот код (в котором я добавил пропущенную точку с запятой):
for(p=&(*L).elem[(*L).length-1];p>=q;--p)
*(p+1) = *p;
устанавливает p
для указания на последний назначенный элемент в массиве elem
.Затем *(p+1) = *p;
копирует этот последний элемент набора во вновь выделенное пространство (выделенное с realloc
) выше.(Под «назначенным элементом» я подразумеваю тот, для которого было назначено значение.)
Затем --p
уменьшает указатель, чтобы указать на предыдущий элемент.(Использование арифметики для указателей работает в единицах элементов массива.) Затем *(p+1) = *p;
копирует второй с последнего назначенный элемент в предыдущее пространство последнего назначенного элемента.Затем цикл продолжается в этом направлении, эффективно перемещая каждый элемент на один шаг вверх по массиву.
В конечном счете, цикл, по-видимому, предназначен для остановки, когда элемент с индексом i-1
был перемещен, как q
устанавливается на адрес этого элемента с q = &(*L).elem[i-1];
.
Однако он неисправен.Если i
равен единице, то q
указывает на первый элемент массива, и p
в конечном итоге достигнет этого элемента, а --p
попытается уменьшить значение p
до точки начала массива.Поведение этой попытки не определено стандартом C.(Предполагается, что L
указывает на начало массива. Возможно L
указывает на массив после его начала, и в этом случае эта проблема не возникает.)