Нет необходимости free()
/ realloc()
.
Ваш char **frags
является указателем на список указателей, так что вы можете просто перетасовывать значения указателя без создания новых строк.
Просто убедитесь, что вы начинаете с дальнего конца списка и считаете в обратном порядке, или используете memmove()
:
void shift_frags(char **frags, int frag_len, int cur)
{
int i;
free(frags[frag_len]); /* because otherwise this is left dangling */
for(i = frag_len; i > cur; i--)
{
frags[i] = frags[i - 1];
}
}
или
void shift_frags(char **frags, int frag_len, int cur)
{
int n = frag_len - cur;
frags += cur;
free(frags[n]);
memmove(frags + 1, frags, n * sizeof(*frags)); /* nb: memmove(dst, src, n) */
}
NB: здесь возможна ошибка «один за другим», это зависит от семантики вашего значения frag_len и от того, знаете ли вы, что блок памяти frag
уже достаточно велик для размещения другого указателя.